首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中,Select Distinct如何处理主键?

在SQL中,Select Distinct如何处理主键?
EN

Stack Overflow用户
提问于 2012-02-16 05:31:49
回答 5查看 5K关注 0票数 0

SQL优化器如何处理主键上的Select Distinct?例如

员工表- (EmpId int主键,EmpName)

select distinct EmpId from Employee.

考虑到EmpId已经是distinct关键字,优化器会拒绝distinct关键字吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-16 05:40:15

在Oracle 11g下尝试,它们产生了不同的结果。

代码语言:javascript
复制
select USERID from TPM_USER

产生:

代码语言:javascript
复制
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                                       

和:

代码语言:javascript
复制
select distinct USERID from TPM_USER

产生:

代码语言:javascript
复制
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                                       

如果不清楚的话,USERIDTPM_USER上的主键。

更新:

我有点恼火Oracle会这么愚蠢,所以我在我们的生产服务器上尝试了同样的查询,它的数据大约是它的1000倍。这一次,两个查询计划是相同的(两次都使用了索引,并且没有执行全表扫描)。这让我相信规划者在决定走哪条路线时会考虑到表的统计数据。

生产(使用或不使用DISTINCT):

代码语言:javascript
复制
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                                            
票数 3
EN

Stack Overflow用户

发布于 2012-02-16 05:37:25

尝试使用DISTINCT关键字和不使用DISTINCT关键字并比较执行计划。

SQL Server将为两者生成相同的计划。YMMV用于其他RDBMS。

票数 5
EN

Stack Overflow用户

发布于 2012-02-16 05:36:16

你的问题不可能有固定的规则,每个数据库都可以用自己的方式处理这个问题。您必须查看数据库的查询执行计划。

但我相信现代生产数据库,如Oracle,MySQL,Postgres,...只需忽略不同的单词,只迭代索引(而不是表)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9301745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档