SELECT UNIT_PRICE
FROM ORDER_DETAIL
WHERE QUANTITY IN (100, 200, 300) OR
DISCOUNT = 0.01;
我的问题:
EXPLAIN PLAN FOR SELECT UNIT_PRICE FROM ORDER_DETAIL WHERE QUANTITY IN (100, 200, 300) OR DISCOUNT = 0.01;`
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
CREATE INDEX OD_IDX_QD ON ORDER_DETAIL(QUANTITY, DISCOUNT);
EXPLAIN PLAN FOR SELECT UNIT_PRICE FROM ORDER_DETAIL WHERE QUANTITY IN (100, 200, 300) OR DISCOUNT = 0.01;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
DROP INDEX OD_IDX_QD;
在这种情况下如何正确添加索引
1条答案
按热度按时间ddarikpa1#
您的查询包含或,这就是您无法获取索引范围扫描的原因。您可以为折扣再创建一个索引并添加提示或扩展,在这种情况下,您将通过两个索引范围扫描(或扩展转换)获得union all
(oracle 12.2+:https://blogs.oracle.com/optimizer/optimizer-transformations:-或扩展)
或者,如果您的oracle版本很旧,可以使用hint use \u concat:
更新:评论不方便回答您的其他问题,所以我在这里回答:
因为您的查询包含或:
如果您分析您的查询,您可以发现这与
其中union all的第一部分可以使用您的索引,因为它从该列开始,而不是从第二部分开始,因为您没有为索引的第一列提供范围。在这种情况下,oracle可以使用index skip scan,但在这种情况下它不起作用。所以你需要另一个索引。