Oracle似乎忽略了我给出的所有提示使用sqldeveloper

问题描述

我只是写下了我的全部问题,由于某种原因,所有内容都被随机删除了,所以这里有一个超级汇总的版本。

我对提示非常陌生,对此却很少受教,我在网上阅读了大量内容并观看了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提示的查询计划:

Plan

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

谢谢大家!

解决方法

除非使用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
                          );

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...