问题描述
我只是写下了我的全部问题,由于某种原因,所有内容都被随机删除了,所以这里有一个超级汇总的版本。
我对提示非常陌生,对此却很少受教,我在网上阅读了大量内容并观看了Youtube视频,但是我找不到一个能够提供足够示例和可视化效果的视频,因此我深表歉意。我只是做错了。
这些是我尝试过的提示(我尝试过USE_NL
,USE_NL_WITH_INDEX
和LEADING
,但随后发现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
谢谢大家!
解决方法
除非使用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
);