Local index or Global index?_local index和global index-程序员宅基地

技术标签: 性能  Oracle  分区  

某物流客户系统查询快递单的SQL,IO消耗为TOP 1:

SQL如下:

select id,op_code, to_char(create_time, :"SYS_B_1") as create_time,...

from T_EXP_OP_RECORD_CONTAINER  

where status <> :"SYS_B_4" and  ID = :1 and rownum = :"SYS_B_5";

其中T_EXP_OP_RECORD_CONTAINER 表是一个在Create_time字段按天进行一级分区、在op_code字段按地区二级分区的分区表,ID字段保存的是快递单号信息,字段上存在索引。

SQL中出现了"SYS_B_n" 字样的绑定变量,这是因为数据库参数的cursor_sharging被设置为FORCE(强烈建议保持默认值EXACT),SQL中使用的常量值被强制转换成了绑定变量。rownum=后面的常量被强制转换成了绑定变量,这个值根据常识可以判断为1,因为只有1才有意义。

快递单号基本上是唯一的,这样的SQL,正常执行时间应该在1毫秒左右,而下图使用awrsqrpt收集的SQL实际执行情况是:每次执行耗时1.236秒。

SQL执行计划如下:

看到上面的执行计划后,就会明白平均执行时间是1秒多正常了:这个查询要到6030个local index里面检索数据,平均每个local index至少要扫描3个buffers 才能判断记录是否存在,因为有rownum=1 谓词条件,最好的情况是扫描local index的第一个分支就找到了结果,不再继续扫描下去;最差的情况是扫描到 local index 的最后一个分支才找到结果,或是没有找到结果。

一般情况下,local index索引的使用,需要配合分区字段一起做谓词条件,才能只扫描少数的索引分支。而这个SQL由于业务原因,不能增加分区字段作为谓词条件。这种情况就需要将local index改成Global index,才会使SQL性能达到最佳。

但是,因为该表非常庞大(表和索引占用的空间达到T级),需要定期删除(转移)历史分区,只保留最近一年的数据,如果创建的是global index,删除历史分区后,需要对global index进行重建,维护时间窗口很难完成(有多个类似表)。这是个两难的问题。

    

针对快递业务的特点,老虎刘给出的建议是:

  • 仍使用local index,重建表,减少分区数量:按天分区改为按月分区,不要子分区;
  • 因为很少有用户会查询1个月以上的快递单,该表只保留最近2个月分区数据,其他数据转移到历史分区,正常情况只需要最多扫描2个分区,而不是原来的6030个分区。
  • 通过plsql实现查询:当前分区没有查询到结果,再去查询历史分区。这样也能保证超过2个月的快递单也能正常查询。

 

总结:

分区表,到底选择global index还是local index,需要根据具体的业务和运维的实际需求而定。不需要删除历史分区数据的分区表,可以创建global index(如基础数据表);需要定期删除历史分区的分区表,最好是创建local index,如果遇到分区字段无法成为查询条件时,建议尽量减少分区数,避免过多的local index 扫描,影响SQL性能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hehuyi_In/article/details/106152118

智能推荐

java代码动态注入与class文件热加载实现_java 运行时 注入新类-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏18次。一、java代码动态注入在本文中,我们将研究如何将Java代码动态加载到正在运行的jvm中。 该代码可能是全新的,或者我们可能想更改程序中某些现有代码的功能。(在开始之前,您可能想知道为什么到底有人会这样做。显而易见的示例是规则引擎之类的东西。规则引擎希望为用户提供添加或更改规则的能力,而不必重新启动规则。您可以通过将DSL脚本作为规则注入规则库来执行此操作,这种方法的真正问题在于,必须对DSL脚本进行解释,使其运行起来极其缓慢。然后可以像程序中的任何其他代码一样编译和运行该程序,效率将提高几个数量级。_java 运行时 注入新类

用pip安装pymongo模块报错:Could not find a version that satisfies the requirement pymongo(from version:)-程序员宅基地

文章浏览阅读10w+次,点赞28次,收藏40次。安装VN.PY时,进行到安装pymongo步骤出现错误Could not find a version that satisfies the requirement pymongo(from version:)_could not find a version that satisfies the requirement pymongo (from versio

YV12,I420,YUV420P的区别-程序员宅基地

文章浏览阅读43次。2019独角兽企业重金招聘Python工程师标准>>> ..._yv12和iyuv的区别

ubuntu安装neo4j数据库-直接安装与docker方式_neo4j: line 418: /data/workspace/datafactory/neo4j-程序员宅基地

文章浏览阅读568次。本文介绍了ubuntu下分别使用源安装和docker安装neo4j的方法添加下载源安装wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add -echo 'deb https://debian.neo4j.org/repo stable/' | sudo tee /etc/apt/sources...._neo4j: line 418: /data/workspace/datafactory/neo4j/neo4j-community-3.4.5/run

正则表达式(一)——验证电话号码_判断电话号码的正则表达式-程序员宅基地

文章浏览阅读3.3w次。正则表达式:注意:1.比如你要验证电话号码是否正确,要求是:以1开头,第2位是3,5,8,总共11位 正则表达式应该书写成 ^[1]+[3,8]+\d{9}$package com.ld.num;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Telephone {..._判断电话号码的正则表达式

Unity3D项目程序加密-VirboxProtector加壳工具_unity shield加壳-程序员宅基地

文章浏览阅读6k次。各位Unity3D的开发者,你还为你的代码被反编译而头疼, 混淆和加密已经失效,为内存dump代码而烦恼?是否辛苦制作的游戏被盗版被抄袭而烦恼? 是否害怕算法被别人参考要把算法写成C++而费劲周折?快来使用深思数盾外壳保护(Sense Shield Virbox Protector ) 专门处理Unity3D的代码加密和授权保护。 背景: 大家都知道Unit_unity shield加壳

随便推点

MySQL 团队开发规范_group by后面的字段最好是索引列-程序员宅基地

文章浏览阅读83次。数据库对象命名规范数据库对象数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。数据库对象全局命名规范1、命名使用具有意义的英文词汇,词汇中间以下划线_group by后面的字段最好是索引列

Java入门到精通——第十五单元 多态(没有十四哦)_多态技能目标-程序员宅基地

文章浏览阅读67次。第十五单元 多态昨日知识点回顾本单元知识点概述本单元教学目标(Ⅰ)重点知识目标(Ⅱ)能力目标本单元知识详讲15.1 多态15.1.1 概念引入★★★15.1.2 多态的定义★★★15.1.3 多态体的体现★★★★15.1.4 多态的好处★★★★★15.1.5 向上转型★★★★★15.1.6 向下转型★★★★★15.1.7 转型的使用场景★★★★★15.1.8 转型的异常★★★15.2 接口多态的综合案例15.2.1 案例分析★★★15.2.2 案例实现★★★本单元知识总结昨日知识点回顾接口的概念?接_多态技能目标

热点!《北京市电子印章推广应用行动方案(试行)》发布_电子印章推广方案-程序员宅基地

文章浏览阅读220次。12月4日,北京市经济和信息化局、市政务服务管理局、市公安局联合印发《北京市电子印章推广应用行动方案(试行)》(以下简称《行动方案》)。《行动方案》提出,以“统一管理、分步实施、政府带动、并行过渡”为原则,以政务服务领域电子印章应用为突破口,推进电子印章在企业提交可信材料、政府全程在线审批等业务场景中的便捷应用,逐步构建“互联网+”环境下政府管理和服务方式;鼓励政府和企业使用存储在云端的电子印章(简称云章),减少纸质材料和实体印章使用,建立程序更便利、资源更集约的政务服务新模式。《行动方.._电子印章推广方案

Android实现退出整个程序的方法_activity直接退出整个app-程序员宅基地

文章浏览阅读1.3k次。这里采用任务栈管理器的方式,即利用一个单例模式的Activity栈来管理所有Activity。实现步骤 1. 自定义 Application类,储存每一个Activity,并实现关闭所有Activity的操作;import android.app.Activity;import android.app.Application;import java.util.LinkedList;import java.util.List;public class..._activity直接退出整个app

【GUI软件】小红书评论采集:自动采集10000多条,含二级评论!-程序员宅基地

文章浏览阅读1.3k次,点赞14次,收藏15次。为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!我用python开发了一个爬虫采集软件,可自动抓取小红书评论数据,并且含二级评论数据。通过把已有代码部分封装成class类,供tkinter界面调用。好的日志功能,方便软件运行出问题后快速定位原因,修复bug。完整python源码及exe软件,微信公众号"软件界面采用tkinter开发。,一名10年程序猿。_小红书评论采集

cuda java_在Nvidia GPU上使用Java(CUDA)-程序员宅基地

文章浏览阅读1k次。小编典典首先,你应该意识到CUDA不会自动加快计算速度这一事实。在一方面,由于GPU编程是一门艺术,它可以是非常,非常具有挑战性得到它的权利。另一方面,因为GPU仅适合某些类型的计算。这听起来可能令人困惑,因为你基本上可以在GPU上进行任何计算。关键当然是你是否会实现良好的加速。这里最重要的分类是问题是任务并行还是数据并行。粗略地说,第一个是指多个线程正在或多或少地独立执行各自任务的问题。第二个问..._java调用nvidia显卡