博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4. 尽可能不用Distinct
阅读量:4968 次
发布时间:2019-06-12

本文共 1102 字,大约阅读时间需要 3 分钟。

大多数情况下,Distinct函数都会导致对最终结果集完成一次排序,因此,这就成为成本最昂贵的排序之一。Distinct一直是SQL语言中成本最高的函数之一。不过,对于DB2 V9,优化工具会尽量利用索引来消除为确定唯一性所带来的排序,其方法类似于目前用Group By语句完成优化时的做法。不过,实际上不必在SQL中使用Distinct,完全可以使用其他方式重写查询来得到同样的结果,这样做往往更为高效。开发人员现在都很喜欢用Distinct,很多人在所有语句上都会加上Distinct来确保不出现重复。不过这种代码的效率很低。在对应用调优时,我首先要做的事情之一就是审查源代码,找出所有包含Distinct的语句,了解这些查询是否确实会得到重复的结果,查看这个Distinct是否会导致一个排序,然后重写这些语句。通过对每晚批量作业的全面分析,就能很容易地大幅减少批量处理周期时间。不过要记住,如果查询中包含Distinct,只要不会因此导致执行一个排序,这个查询可能也很高效。

要从结果集消除重复,可以尝试下面的做法:

使用Group By(V9之前),这会利用关联索引来消除为确定唯一性所导致的排序。

使用一个In或Exists子查询重写查询。如果某个表可能导致重复(由于是一对多关系),但是这个表中并不包含结果集将返回的数据,这种情况下这种方法就很适用。

例如,给定当前参与项目的一组员工。其中很多员工可能同时参加了多个项目,不过我们希望他们只出现一次。以下查询:

 

  1. SELECT DISTINCT E.EMPNO, E.LASTNAME  
  2. FROM EMP         E,  
  3.     EMPPROJACT  EP  
  4. WHERE E.EMPNO = EP.EMPNO 

可以重写为:

 

  1. SELECT E.EMPNO, E.LASTNAME  
  2. FROM EMP         E,  
  3.     EMPPROJACT  EP  
  4. WHERE E.EMPNO = EP.EMPNO  
  5. GROUP BY E.EMPNO, E.LASTNAME 

也可以重写为:

 

  1. SELECT E.EMPNO, E.LASTNAME  
  2. FROM EMP  E  
  3. WHERE EXISTS  
  4.         (SELECT 1  
  5.          FROM   EMPPROJACT  EP  
  6.          WHERE E.EMPNO = EP.EMPNO) 

还可以重写为:

 

  1. SELECT E.EMPNO, E.LASTNAME  
  2. FROM EMP  E  
  3. WHERE E.EMPNO IN  
  4.         (SELECT EP.EMPNO  
  5.           FROM   EMPPROJACT  EP)  

转载于:https://www.cnblogs.com/xiaotu/p/3185528.html

你可能感兴趣的文章
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
MongoDB的简单使用
查看>>
hdfs 命令使用
查看>>
prometheus配置
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
python 多进程和多线程的区别
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>