增加Distinct后查询效率反而提高
日期:2007年11月18日 作者: 查看:[大字体 中字体 小字体]-
只有增加DISTINCT关键字,Oracle必然需要对后面的所有字段进行排序。以前也经常发现由于开发人员对SQL不是很理解,在SELECT列表的20多个字段前面添加了DISTINCT,造成查询基本上不可能执行完成,甚至产生ORA-7445错误。所以一直向开发人员强调DISTINCT给性能带来的影响。
没想到开发人员在测试一条大的SQL的时候,告诉我如果加上了DISTINCT,则查询大概需要4分钟左右可以执行完,如果不加DISTINCT,则查询执行了10多分钟,仍然得不到结果。
首先想到的是可能DISTINCT是在子查询中,由于加上了DISTINCT,将第一步结果集缩小了,导致查询性能提高,结果一看SQL,发现DISTINCT居然是在查询的最外层。
由于原始SQL太长,而且牵扯的表太多,很难说清楚,这里模拟了一个例子,这个例子由于数据量和SQL的复杂程度限制,无法看出二者执行时间上的明显差别。这里从两种情况的逻辑读对比来说明问题。
首先建立模拟环境:
SQL> CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS
2 WHERE OWNER = 'SYS'
3 AND OBJECT_TYPE NOT LIKE '%BODY'
4 AND OBJECT_TYPE NOT LIKE 'JAVA%';Table created.
SQL> CREATE TABLE T2 AS SELECT * FROM DBA_SEGMENTS WHERE OWNER = 'SYS';
Table created.
SQL> CREATE TABLE T3 AS SELECT * FROM DBA_INDEXES WHERE OWNER = 'SYS';
Table created.
SQL> ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (OBJECT_NAME);
Table altered.
SQL> CREATE INDEX IND_T2_SEGNAME ON T2(SEGMENT_NAME);
Index created.
SQL> CREATE INDEX IND_T3_TABNAME ON T3(TABLE_NAME);
Index created.
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T1', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T2', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T3', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)
PL/SQL procedure successfully completed.
仍然沿用上面两篇文章例子中的结构,看看原始SQL和增加DISTINCT后的差别:
SQL> SET AUTOT TRACE
- [1] [2] [3] 下一页
-
- 增加Distinct后查询效率反而提高 相关文章:
- ·Windows磁盘配额来增强系统安全
- ·Google2007年十大增长最快关键词
- ·网页中使用多线程来增强用户体验
- ·Google Gmail新增加邮件彩色标签功能
- ·增强Windows效率的免费软件10个
- ·如何点亮QQ新增的滔滔图标
- ·为动态生成html元素增加事件处理
- ·Windows Vista销量猛增至8800万
- ·Vista/Office 07带动软件市场增长
- ·内容拷贝增加版权信息的JavaScript代码
- 增加Distinct后查询效率反而提高 相关软件
- ·《华夏》4.0版增量手动补丁包
- ·《魔兽》地图:远征诺森德V0.98+AI增强版
- ·周国平作品精选集 增订版
- ·可爱淘作品集(增强版)
- ·漫谈投资组合的几何增值理论
- ·增长的极限
- ·成长力和增长力
- ·心雨企业人力资源管理系统 2004 V7.0 增强版
- ·2003年司考新增法律法规
- ·三国志10中文版 官方中文资料光盘内新增50个历史名将全集
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:数据库性能优化JOIN方法说明
精品推荐
热点TOP10
- ·SQL Server 练习题
- ·MS-SQL开发常用汇总和t-sql技巧集锦
- ·查询及删除重复记录的方法大全
- ·SQL server 2005安装问题汇总
- ·MS SQL的一些经典常用操作语句汇总
- ·SQL语法大全
- ·掌握SQL Server数据库的实用技巧
- ·解决用sa登录sql 2005失败的问题
- ·SQL Server建立应用程序安全性和程序角色
- ·轻松掌握使用 SQL Server 浏览器
- ·SQL Server安全问题全攻略之口令
- ·SQL Server 2005 中的分区表和索引
- ·sql server2000导入mdf文件
- ·一个复合查询方法
- ·如何创建SQL Server 2000故障转移群集
- ·SQL Server 2000企业版安装教程(1)
- ·SQL Server 2005 Reporting Services 初次使用感受
- ·使用用于SQL Server的IIS虚拟目录管理实用工具
- ·SQL Server中函数的用法两种
- ·改进SQL Server数据库系统安全五步走
特别推荐
- ·结束SQL注入隐患3招
- ·掌握SQL Server数据库的实用技巧
- ·SQL的简单查询
- ·快速解决SQL Server“安全疑难”相关问题
- ·SQL Server 2005:你应知道的13件事
- ·实例解析:减少SQL日志大小的三个好方法
- ·使用SQL2000将现有代码作为Web服务提供
- ·sql server 2000数据库置疑的解决方法
- ·SQL Server安全问题全攻略之口令
- ·XP上不能安装MicrosoftSQLSERVER2000吗
- ·解析Microsoft Sql Server中的like语句
- ·推荐;适合SQL初学者学习的SQL FAQ集锦
- ·SQL Server 2005 中的分区表和索引
- ·查询及删除重复记录的方法大全
- ·详细介绍优化SQL Server 2000的设置
- ·关于SQL SERVER 日志满的处理方法
- ·使用SQL Server 2000索引视图提高性能
- ·SQL server 2005安装问题汇总
- ·解决用sa登录sql 2005失败的问题
- ·简单三步走堵死SQL Server注入漏洞
