慎用Distinct
来源:互联网 发布:手机淘宝社区在哪 编辑:程序博客网 时间:2024/06/05 16:12
大多数情况下,Distinct函数都会导致对最终结果集完成一次排序,因此,这就成为成本最昂贵的排序之一。Distinct一直是SQL语言中成本最高的函数之一。不过,对于DB2V9,优化工具会尽量利用索引来消除为确定唯一性所带来的排序,其方法类似于目前用GroupBy语句完成优化时的做法。不过,实际上不必在SQL中使用Distinct,完全可以使用其他方式重写查询来得到同样的结果,这样做往往更为高效。开发人员现在都很喜欢用Distinct,很多人在所有语句上都会加上Distinct来确保不出现重复。不过这种代码的效率很低。在对应用调优时,我首先要做的事情之一就是审查源代码,找出所有包含Distinct的语句,了解这些查询是否确实会得到重复的结果,查看这个Distinct是否会导致一个排序,然后重写这些语句。通过对每晚批量作业的全面分析,就能很容易地大幅减少批量处理周期时间。不过要记住,如果查询中包含Distinct,只要不会因此导致执行一个排序,这个查询可能也很高效。
要从结果集消除重复,可以尝试下面的做法:
使用GroupBy(V9之前),这会利用关联索引来消除为确定唯一性所导致的排序。
使用一个In或Exists子查询重写查询。如果某个表可能导致重复(由于是一对多关系),但是这个表中并不包含结果集将返回的数据,这种情况下这种方法就很适用。
例如,给定当前参与项目的一组员工。其中很多员工可能同时参加了多个项目,不过我们希望他们只出现一次。以下查询:
SELECTDISTINCTE.EMPNO,E.LASTNAME
FROMEMPE,
EMPPROJACTEP
WHEREE.EMPNO=EP.EMPNO
可以重写为:
SELECTE.EMPNO,E.LASTNAME
FROMEMPE,
EMPPROJACTEP
WHEREE.EMPNO=EP.EMPNO
GROUPBYE.EMPNO,E.LASTNAME
也可以重写为:
SELECTE.EMPNO,E.LASTNAME
FROMEMPE
WHEREEXISTS
(SELECT1
FROMEMPPROJACTEP
WHEREE.EMPNO=EP.EMPNO)
还可以重写为:
SELECTE.EMPNO,E.LASTNAME
FROMEMPE
WHEREE.EMPNOIN
(SELECTEP.EMPNO
FROMEMPPROJACTEP)
- 慎用Distinct
- 慎用!
- 慎用""
- 序时薄打开非常慢--慎用DISTINCT(在选择大量字段的情况下)
- distinct
- Distinct
- distinct
- distinct
- distinct
- distinct
- distinct
- distinct
- distinct
- distinct
- distinct
- DISTINCT
- distinct
- distinct
- C#启动其它程序
- c/c++ 动态申请数组
- 使用jpa报No query defined for that name错误
- Unity3D教程:如何利用Shader实现钻石渲染效果
- [BFS Tarjan_LCA 生成树] CERC 2016 H Hangar Hurdles
- 慎用Distinct
- python镜像
- php----(简1)后台强制用户退出
- linux的waitpid函数
- Image Super-Resolution Using Deep Convolutional Networks
- UNIX网络编程——原始套接字SOCK_RAW
- 排序算法——交换排序
- 关于使用跟踪程序结果控制摄像头运动的一些记录
- Bit Reversal and Permutation