DISTINCT是否使用多个表达式执行全表扫描?

时间:2016-02-29 09:27:20

标签: sql oracle

我有一个DISTINCT子句来删除重复的值。 如果有多个表达式,性能如何? 例如:

SELECT DISTINCT city, state
FROM customers
WHERE total_orders > 10
ORDER BY city;

这会执行全表扫描吗?

2 个答案:

答案 0 :(得分:2)

DBMS在认为合适时执行全表扫描。

在您的示例中,当DBMS认为使用total_orders > 10它只会获得非常少的行并且该列上有索引时,它将使用该索引来访问表记录。在第二步中,它将应用DISTINCT然后排序(或在使行不同时即时排序)。如果DBMS认为它将使用total_orders > 10获得太多记录,则可能决定进行全表扫描。 (然后应用DISTINCTORDER 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 可以)。