我有一个DISTINCT子句来删除重复的值。 如果有多个表达式,性能如何? 例如:
SELECT DISTINCT city, state
FROM customers
WHERE total_orders > 10
ORDER BY city;
这会执行全表扫描吗?
答案 0 :(得分:2)
DBMS在认为合适时执行全表扫描。
在您的示例中,当DBMS认为使用total_orders > 10
它只会获得非常少的行并且该列上有索引时,它将使用该索引来访问表记录。在第二步中,它将应用DISTINCT
然后排序(或在使行不同时即时排序)。如果DBMS认为它将使用total_orders > 10
获得太多记录,则可能决定进行全表扫描。 (然后应用DISTINCT
和ORDER BY
)。所以无论情况如何,DISTINCT
都不会改变任何事情。
如果您有total_orders
+ City
+ state
的索引,DBMS可能会决定根本不访问该表,因为所有数据都存在于索引中,甚至在需要的订单。但是,DBMS在没有DISTINCT
的情况下也会这样做。
如果您有state
+ total_orders
+ City
的索引(即错误的订单;无法直接应用WHERE
子句),DBMS仍可能决定只阅读索引,但不太可能。而且:DBMS会在没有DISTINCT
的情况下做同样的事情。
如果你没有索引,DBMS当然必须进行全表扫描,因为没有索引可以绕过它。好吧,我想这不用说: - )
答案 1 :(得分:1)
这会执行全表扫描吗?
检查 EXPLAIN PLAN 。
EXPLAIN PLAN FOR your_query;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
由优化器决定执行查询的最佳计划。由于过滤谓词中使用的列没有索引,因此除了 FTS 之外没有其他选项( F ull T 能 S 可以)。