SQL优化器如何处理主键上的Select Distinct?例如
员工表- (EmpId int主键,EmpName)
select distinct EmpId from Employee.
考虑到EmpId已经是distinct关键字,优化器会拒绝distinct关键字吗?
发布于 2012-02-16 05:40:15
在Oracle 11g下尝试,它们产生了不同的结果。
select USERID from TPM_USER产生:
SELECT STATEMENT 7.0 7 242479 667 2668 7 ALL_ROWS
TABLE ACCESS (FULL) 7.0 7 242479 667 2668 1 TPMDBO TPM_USER FULL TABLE ANALYZED 1 和:
select distinct USERID from TPM_USER产生:
SELECT STATEMENT 8.0 7 24725738 667 2668 8 ALL_ROWS
HASH (UNIQUE) 8.0 7 24725738 667 2668 1 UNIQUE
TABLE ACCESS (FULL) 7.0 7 242479 667 2668 1 TPMDBO TPM_USER FULL TABLE ANALYZED 1 如果不清楚的话,USERID是TPM_USER上的主键。
更新:
我有点恼火Oracle会这么愚蠢,所以我在我们的生产服务器上尝试了同样的查询,它的数据大约是它的1000倍。这一次,两个查询计划是相同的(两次都使用了索引,并且没有执行全表扫描)。这让我相信规划者在决定走哪条路线时会考虑到表的统计数据。
生产(使用或不使用DISTINCT):
SELECT STATEMENT 3.0 3 461492 3521 14084 3 ALL_ROWS
INDEX (FAST FULL SCAN) 3.0 3 461492 3521 14084 1 TPMDBO TPM_USER_PK FAST FULL SCAN INDEX (UNIQUE) ANALYZED 发布于 2012-02-16 05:37:25
尝试使用DISTINCT关键字和不使用DISTINCT关键字并比较执行计划。
SQL Server将为两者生成相同的计划。YMMV用于其他RDBMS。
发布于 2012-02-16 05:36:16
你的问题不可能有固定的规则,每个数据库都可以用自己的方式处理这个问题。您必须查看数据库的查询执行计划。
但我相信现代生产数据库,如Oracle,MySQL,Postgres,...只需忽略不同的单词,只迭代索引(而不是表)。
https://stackoverflow.com/questions/9301745
复制相似问题