【问题标题】:Oracle seems to ignore all the hints I give it (using sqldeveloper)Oracle 似乎忽略了我给它的所有提示(使用 sqldeveloper)
【发布时间】:2021-02-05 05:43:45
【问题描述】:

我刚刚写出了我的全部问题,由于某种原因,所有内容都被随机删除了,所以我们在这里提供一个超级总结版本。

我对提示很陌生,而且很少有人教我,我在网上做了很多阅读和观看 Youtube 视频,但我没有找到一个有足够的示例和可视化来帮助我的视频,所以如果出现以下情况,我深表歉意我只是做错了。

所以这些是我尝试过的提示(我尝试过 USE_NLUSE_NL_WITH_INDEXLEADING,但后来注意到 CBO 自动使用了这些提示,这很好):

    /*+ USE_MERGE(sale_saracl CUSTOMER_saracl) */ 

使用此查询:

    SELECT AVG(s.sellprice), s.qty, s.custid  
    FROM CUSTOMER_saracl c, sale_saracl s
    WHERE c.custid = s.custid 
    GROUP BY (s.qty,  s.custid) 
    HAVING AVG(s.sellprice) > (
      SELECT MIN(AVG(price)) 
      FROM  product_saracl 
      WHERE pname LIKE 'FA%'
      GROUP BY price
    );

这些是表格:

    CREATE TABLE CUSTOMER_SARACL( 
    
        CustID         NUMBER(8) NOT NULL,
        FIRST_NAME     VARCHAR2(15),
        SURNAME     VARCHAR2(15),
        ADDRESS     VARCHAR2(20),
        PHONE_NUMBER NUMBER(12)) 
    
        CLUSTER CUST_SALESARACL(CustID); 
    
    CREATE TABLE PRODUCT_SARAHCL( 
    
        ProdID     NUMBER(10) NOT NULL,
        PName    Varchar2(6),
        PDesc    Varchar2(15),
        Price    Number(8),
        QOH        Number(5))
    
    CREATE TABLE SALE_SARACL( 
    
        SaleID     NUMBER(10) NOT NULL,
        SaleDate    DATE,
        Qty            Number(5),
        SellPrice    Number(10),
        CustID        NUMBER(8),
        ProdID        NUMBER(10)) 
    
        CLUSTER CUST_SALESARACL(CustID); 

我正在使用的索引:

    CREATE INDEX customer_index ON CUSTOMER_saracl(custid);

查看执行计划时,添加任何提示时它不会改变一点,这就是我遇到的问题。

使用USE_MERGE 提示的查询计划:

这里是带有使用合并提示的查询的自动跟踪结果的粘贴箱:https://pastebin.pl/view/b72a9a9d

谢谢大家!

【问题讨论】:

  • 这个查询有什么问题?你有任何性能问题吗?为什么你认为你的暗示计划会比优化器选择的更好?尝试在您的桌子上收集统计信息。根据您的模型,在任何情况下都不需要使用 NL,因为您不过滤客户或销售,hashjoin 就足够了。
  • 对于赋值,我们必须使用一个没有被使用的提示来表明该提示改变了执行计划。
  • 最好为您的查询提供提示,因为 oracle 可能会忽略很多事情。提示不是“强制”方法,而是指令。此外,跟踪优化步骤有助于了解 oracle 选择一个或另一个运算符的原因。
  • 这是一个很好的观点,对于我的大多数查询,我绝对会在未来遵循这一点。谢谢!我现在正在运行自动跟踪,我将通过图片链接在此评论中发布结果。
  • 这里是带有使用合并提示的查询的自动跟踪结果的粘贴箱:pastebin.pl/view/b72a9a9d

标签: sql oracle oracle-sqldeveloper hint


【解决方案1】:

除非custid 用于过滤(我对此表示怀疑),否则不需要“加入”。您可能会获得更好的执行计划:

SELECT AVG(s.sellprice), s.qty, s.custid  
FROM sale_saracl s
GROUP BY (s.qty,  s.custid) 
HAVING AVG(s.sellprice) > (SELECT MIN(AVG(ps.price)) 
                           FROM product_saracl ps
                           WHERE ps.pname LIKE 'FA%'
                           GROUP BY price
                          );

【讨论】:

  • 感谢您的建议,非常感谢!你知道为什么优化器不会使用我的提示吗?我需要能够为这篇论文解释它。
猜你喜欢
  • 2016-11-11
  • 1970-01-01
  • 2021-10-28
  • 2016-09-30
  • 2016-03-16
  • 2014-02-03
  • 2012-03-11
  • 2013-09-07
  • 2016-08-12
相关资源
最近更新 更多