首页 > 其他分享 >【优化】INDEX FULL SCAN (MIN/MAX)访问路径

【优化】INDEX FULL SCAN (MIN/MAX)访问路径

时间:2024-04-07 17:44:19浏览次数:21  
标签:INDEX FULL SCAN max MIN 索引

Oracle对单独使用max或min函数时给出了一种非常高效的访问路径,就是“INDEX FULL SCAN (MIN/MAX)”,该方法可以避免索引的全部读取,进一步提高数据结果的获取效率。
通过这个实验简单记录一下。

1.创建测试表

 create table T
(
  x INTEGER,
  y INTEGER,
  z INTEGER
);

 

我们先创建一个包含百万条记录的表t,在t表的第一个字段x上有主键(或者唯一索引)

  创建唯一索引

create unique index CUX.CUX_INDEX_UNIOX01 on T (X);

批量插入100W条记录

select rownum, to_char(rownum+10),to_char(rownum+10)from dual connect by level <= 1000000;

查询:

select count(*) from t;

 

 

2.查看一下max函数对应的执行计划

 


3.“INDEX FULL SCAN (MIN/MAX)”访问路径
此处SQL优化器不但可以识别到使用索引扫描可以提速,而且针对特定的max函数(或min函数)使用特有的“INDEX FULL SCAN (MIN/MAX)”访问路径来快速获取最大值(或最小值)。
使用这种访问路径获得最大值时,可以不必将所有的索引内容预读一遍,而是从索引尽量靠后的记录开始读,这样便可以更加快速地获得最大值。

4.如果max和min函数同时使用会有什么的执行计划呢?
select min(x), max(x) from t;

 

 

5、采用全表连接可以优化查询时间

 select max(t.x) from t union all select min(xt.x) from t xt)

 

 

 



通过上面的执行计划可见,min(x)和max(x)函数同时使用时是无法使用“INDEX FULL SCAN (MIN/MAX)”的。原因很简单,同一张表既想得到最小值又想得到最大值只能将所有的数据预读一遍才知道。此时SQL优化器给出的方法是“INDEX FAST FULL SCAN”。也就是说仅用索引本身就可以回答这个问题,无需访问表t,这也是一种高效获得数据的方法,类似于将原来的大表重新构造了一个以索引形式存在的“小表”。

标签:INDEX,FULL,SCAN,max,MIN,索引
From: https://www.cnblogs.com/ivenlin/p/18119552

相关文章

  • spring boot admin服务端配置邮件通知、钉钉通知
    根据下面的可选项配置邮件表格6.邮件提醒配置的可选项属性名说明面若防治spring.boot.admin.notify.mail.enabled开启邮件提醒truespring.boot.admin.notify.mail.ignore-changes要忽略的状态变化,使用逗号分割。格式是:"<from-status>:<to-status>"。......
  • 组合数学——Min-Max容斥
    Min-Max容斥,即$$\max(S)=\sum_{T\inS,T\neq\emptyset}(-1)^{|T|-1}\min(T)$$接下来证明上面那个式子是对的。定义\(S\)中共有\(N\)个元素,由大到小分别为\(s_1,s_2,\dots,s_N\),\(T_i\)为所有\(S\)大小为\(i\)的子集。所有元素都大于\(s_i\)且大小为\(j\)的子集......
  • 使用miniforge平替anaconda,重建airflow服务
    背景因公司通知不能使用anaconda,可以采用miniforge作为开源平替,因之前环境搭建使用的就是anaconda,当前需要卸载并替换成miniforge。那为什么一定要用这个呢,其实也不是一定,而是用这个搭建环境比较省事,如果没用这个,我当前环境的python版本过低,解决这个问题耗费的时间会更久,所以最......
  • 碉堡了!DBMind SQL Rewriter 可以进行SQL自动改写
    MogDB3.1版本在AI4DB方面又有很大的增强,其中有一个非常重要的组件DBmind,引入了一个SQL改写工具即SQLRewriter。根据预先设定的规则,将查询语句转换为更为高效或更为规范的形式,使得查询效率得以提升。这里我们就为大家简单演示一下其具体的用法。首先准备一下环境MogDB......
  • 解决VSCode打开终端Terminal闪退的问题
    原文连接:https://blog.csdn.net/birdfly2015/article/details/135013758一、背景在新电脑上使用了VSCode,但是一打开Terminal,Terminal马上就消失了,在网上找了很久,都没有找到对应的分析二、解决思路首先,是从这个文档中找到了灵感,这个文档里面汇集了大部分的问题,如果有其他问题可以......
  • JetBrains RubyMine 2024.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE
    JetBrainsRubyMine2024.1(macOS,Linux,Windows)-最智能的Ruby与RailsIDE请访问原文链接:JetBrainsRubyMine2024.1(macOS,Linux,Windows)-最智能的Ruby与RailsIDE,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsRubyMine-最智能的Ru......
  • 关于LayuiAdmin单页版 点击 生成新的 tab标签页
    挠头一小时,解决一秒钟直接上代码html<buttonclass="layui-btnlayuiadmin-btn-useradmin"id="openNewTabBtn">添加</button>js layui.use(['element','table','jquery'],function(){ var$=layui.$ var......
  • AISing Programming Contest 2021(AtCoder Beginner Contest 202)
    D-aabababaa根据题意从左往右进行分析如果当前该字母为a那么存在两种情况一种为b的数量为0一种为剩余的k的数量小于右边所有情况的总和其总和对应为C(剩余的长度,b的个数)反之则为b点击查看代码intget(intx,inty){intans=1;for(inti=1;i<=y;i++){ans=(x-i......
  • P10245 Swimming Pool题解
    P10245SwimmingPool题意给你四条边\(abcd\),求这四条边是否可以组成梯形。思路这显然是一道简单的普通数学题。判断是否能构成梯形只需看四条边是否能满足,上底减下底的绝对值小于两腰之和且大于两腰之差。证明过程如图,\(AB=a\),\(BC=b\),\(CD=c\),\(AD=d\)。过点\(D\)......
  • P10244 String Minimization 题解
    P10244StringMinimization题意给你四个长度为\(n\)的字符串,分别是\(abcd\)。你可以选择一个\(i\)然后交换\(a[i]\)和\(c[i]\),并交换\(b[i]\)和\(d[i]\)。求在\(a\)的字典序尽量小的前提下,\(b\)字典序最小是什么。思路本题并不难。只需要在\(a[i]>c[i]\)......