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

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

设法改变访问路径一个SQL语句如果进行引发排序的操作,通常会进行全部范围扫描。如下面的SQL语句:Select*fromproductwhereitem_cdlike‘AB%’andcategorylike‘C%&...

设法改变访问路径
 
       一个SQL语句如果进行引发排序的操作,通常会进行全部范围扫描。如下面的SQL语句:
Select * from product where item_cd like ‘AB%’ and category like ‘C%’
order by item_cd desc;
由于存在排序操作,因此无法进行局部范围扫描。但是我们知道,如果在字段item_cd上建立有索引的话,那么就可以利用索引是排好序的特性,来避免order by操作,从而避免排序的发生进而引导优化器进行局部范围数据扫描。  www.2cto.com  
但是在CBO优化器下,即使item_cd字段上存在索引,由于CBO成本模型对索引的评估,我们也无法确保进行局部范围扫描来避免order by操作。因此就必须使用能够确保使用索引扫描数据,同时又能避免排序操作的Hints。因此可以如下改写原SQL语句:
Select /* +index_desc(product item_index)*/ *
From product
Where item_cd like ‘AB%’ and category like ‘C%’;
       通过应用Hints来保证优化器针对item字段上的item_index索引进行倒序扫描,这样可以利用索引的有序性,同时因为是倒序扫描,所以可以直接获取数据并填充批量数组,而避免了因为要进行倒序排序,而进行的结果集的二次处理,即避免了全局范围扫描,启用了局部范围扫描。
但是如果需要针对item_cd和category字段进行排序,那么由于在两个字段上的查询条件都是like因此又无法进行局部范围扫描了。此时可以将item_cd和category字段建成一个复合索引来实现局部范围扫描。
上述语句属于驱动查询条件和排序条件一致的情况,但在实际工作中还会经常遇到,驱动查询条件和排序字段不一致的情况。如下面的语句:
Select ord_dept,ordqty*100 from order where ord_date like ‘2005%’
Order by ord_dept desc;  www.2cto.com  
此处驱动查询条件是ord_date,排序字段是ord_dept,因此此时无法进行局部范围扫描。此时可以通过改变查询条件的角色来实现局部范围扫描,如下所示:
Select/*+ INDEX_DESC(a ord_dept_index) */
Ord_dept,ordqty*100
From product
Where ord_date like ‘2005%’ and ord_dept>’’;
通过条件ord_dept>’’实现驱动查询条件与排序字段相同,而且通过使用ord_dept字段的索引来实现局部范围扫描,此时ord_dept变成驱动查询条件,而且可知满足该驱动查询条件的范围很大,同时满足现在过滤条件ord_date like ‘2005%’的数据范围也很大,因此根据局部范围扫描性能策略矩阵可知,当前启用局部范围数据扫描后性能会得到很大提升。
 
 
 
摘自 javacoffe的专栏

推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
author-avatar
亲爱的某某骗子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有