热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析Oracle数据扫描OracleSQL优化引导局部扫描方法(5)

解析Oracle数据扫描OracleSQL优化引导局部扫描方法(1)http://www.2cto.com/database/201205/130424.html;解析Oracle数据扫描OracleSQL优化引导局部扫描方法(2)http://www.2cto.com/database/201205/130...

解析Oracle数据扫描Oracle SQL优化引导局部扫描方法(1)
http://www.2cto.com/database/201205/130424.html
解析Oracle数据扫描Oracle SQL优化引导局部扫描方法(2)
http://www.2cto.com/database/201205/130428.html;
解析Oracle数据扫描Oracle SQL优化引导局部扫描方法(3)
http://www.2cto.com/database/201205/130432.html;
解析Oracle数据扫描Oracle SQL优化引导局部扫描方法(4)
http://www.2cto.com/database/201205/130439.html
 
利用嵌套视图实现局部范围数据扫描
 
        很显然有些SQL语句只能进行全部范围数据扫描,而无法直接进行局部范围数据扫描,如:排序操作和分组统计操作。这些操作的执行特点决定了必须要得到全部数据范围内的数据,才能够得到最后的执行结果。
 
        但是面对这种SQL语句,我们虽然不能直接引导它们进行局部范围数据扫描,但是我们可以采用间接的手段将这些语句引导成按照局部范围扫描来执行。我们所采取的手段就是利用嵌套视图工具,即可以将使用全部范围扫描的部分捆绑在嵌套视图中,以确保视图之外的部分按照局部范围的方式来使用内部视图返回的数据。该方法的关键就是要从宏观角度出发,寻找出阻止实现局部范围扫描方式的部分,并将这些部分放入嵌套视图中去。这与传统的从表中实现局部范围扫描的主要区别在于,从表中进行局部范围扫描时,所扫描的数据是物理存放在表所在的数据段中的,而通过嵌套视图进行局部范围数据扫描,所扫描的数据来源于动态执行内部嵌套视图查询语句获得的,因此通过嵌套视图来进行局部范围数据扫描转换时,整体语句的执行性能很大程度上取决于内部嵌套视图的查询性能。  www.2cto.com  
 
通过如下示例来看一下如何利用嵌套视图实现局部范围扫描,见如下语句:
 
Select a.deptname,b.empno,b.emp_name,c.sal_ym,c.sal_tot
 
From dept a,employee b,salary c
 
Where a.deptno=b.deptno and c.empno=b.empno
 
And a.location=’BeiJing’ and a.job=’mgr’ and c.sal_ym=’201112’
 
Order by a.dept_name,b.hire_date,c.sal_ym;
 
        该语句实现三张表的关联查询,三张表分别代表部门、员工、员工工资三类信息,该语句实现查询工作与北京的职位为经理的员工在2011年12月的工资信息,并且最终的结果按照部门名称、入职时间和工资月进行排序。该域的实现方式是一种最直接最简单的实现方式,一目了然很直观。但是如果仔细推敲,我们就会发现,内部执行时隐藏着影响查询性的不合理因素。首先该查询最后要求进行排序,那么可知语句无法按照局部范围扫描执行;其次该语句执行3表关联,我们稍加分析一下便可知道,通常一个公司的部门表和员工表的数据量不会太大,但是一个公司的员工工资表通常会包含很大的数据量,因为每个员工的工资会随着工作年限及职位以及某些特殊贡献的不同,通常会有多条不同的工资记录信息,而且该信息量会随着公司管理要求复杂性和公司员工数量扩张而急速扩展。因此如果使用员工表employee与工资表salary进行关联,关联之后的数据行可能会急剧增加,如果这时对这个急剧增加的数据行进行排序并输出结果,那么可想而知最终无法获得较快的执行速度。此时如果我们首先将数据量较小的dept表和employee表进行关联并对其结果进行排序,然后再与salary进行关联,并且此时使用salary表的empno和sal_ym字段进行过滤,同时将这两个字段设计为salary表的复合主键,那么此时不但可以获得同样的查询结果,而且也可以在很大程度上提高查询执行性能。因此我们可以如下所示来改写上述SQL语句:
  www.2cto.com  
Select/*+ ordered,use_nl(x,y) */ x.deptname, x.hire_date,x.empno,x.emp_name,y.sal_ym,y.sal_tot
 
From(select a.deptname,b.empno,b.emp_name
 
From dept a,employee b
 
Where a.deptno=b.deptno And a.location=’BeiJing’ and a.job=’mgr’
 
Order by a.dept_name,b.hire_date) x,salary y
 
Where y.empno=x.empno and y.sal_ym=’201112’;
 
该语句中通过Hint保证嵌套视图中的查询被优先执行,然后其结果与salary表进行关联,先对数据量较小的表进行全部范围数据扫描执行两表关联,然后按照局部范围扫描方式在对数据量较大的表进行处理。在该操作中除了引导进行局部范围扫描外,关键过滤字段的索引选择性对最终的查询性能也有很大的作用。如dept表的location和job字段,以及salary表的(empno, sal_ym)复合主键,如果这些字段上拥有合适的索引,那么会对最终的查询性能起到很大的帮助。
 
       下面我们看一下如何引导分组操作进行局部范围扫描,引导分组操作的进行局部范围扫描的一种方式就是使用标量子查询。看如下语句:
 
Select a.product_cd,a.product_name,b.avg_stock
 
From product a,
 
    (select product_cd,sum(stock_qty)/10 avg_stock
 
     From prod_stock  www.2cto.com  
 
     Where stock_date between to_date(‘2010-06-01’,’yyyy-mm-dd’) and
 
                            to_date(‘2011-04-01’,’yyyy-mm-dd’)
 
     group by product_cd) b
 
where b.product_cd=a.product_cd
 
and a.category_cd=’20’;
 
由于该语句按照全部范围扫描的方式来对大范围的prod_stock数据进行分组操作,因此执行性能较差,但我们可以通过使用标量子查询引导该语句进行局部范围扫描,来提升查询性能。见如下改写后的语句:
 
Select a.product_cd,a.product_name,(select sum(stock_qty)/10
 
                               From prod_stock b
 
                               Where b.product_cd=a.product_cd
 
 stock_date between to_date(‘2010-06-01’,’yyyy-mm-dd’) and
  www.2cto.com  
                                to_date(‘2011-04-01’,’yyyy-mm-dd’)
 
) avg_stock
 
From product a
 
Where a.category_cd=’20’;
 
此处应该注意的是,标量子查询并不是所有的版本都会支持,所以使用之前要进行测试确认。
 
 
 
摘自 javacoffe的专栏

推荐阅读
  • 程序员妻子吐槽:丈夫北漂8年终薪3万,存款情况令人意外
    一位程序员的妻子在网上分享了她丈夫在北京工作八年的经历,月薪仅3万元,存款情况却出乎意料。本文探讨了高学历人才在大城市的职场现状及生活压力。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • [论文笔记] Crowdsourcing Translation: Professional Quality from Non-Professionals (ACL, 2011)
    Time:4hoursTimespan:Apr15–May3,2012OmarZaidan,ChrisCallison-Burch:CrowdsourcingTra ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
author-avatar
淡漠少_341
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有