oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園

要寫出高效的SQL,那麼必須必須得清楚SQL執行路徑,介紹如何提高SQL性能的文章很多,這裡不再贅述,本人來談談如何從 減少SQL回表次數 來提高查詢性能,因為回表將導致掃描更多的數據塊。

我們大家都知道,數據庫表中數據存儲都是以塊為單位,稱為數據塊;表中每行數據都有唯一的地址標誌ROWID。

舉個例子:

select a from test_db where b=5

A、假設b上沒有索引

1、那麼該條SQL將進行表掃描,掃描所有該表的數據塊

2、從數據塊中找到記錄,並且進行過濾

可想而知,沒有索引將會導致掃描該表所有數據塊,性能低下

B、 假設b上有索引

1、那麼該條SQL將進行索引掃描,在索引中找到b=5的位置,一般只需要掃描3個塊左右就找到了

2、獲得所有b=5的行的rowid

3、根據rowid再查詢數據(這就是回表),如果數據量少,那麼回表次數就少,如果需要的數據全部在索引中,那麼就不會再回表了,例如a也在索引中,如果a不在索引中,那麼仍然要回表一次查出a。

經驗:如果有可能的話,盡量只在索引上查詢,不用回表或者只少量回表。

例如分頁需要回表,一般盡量在索引上分頁,然後返回rowid,再通過rowid進行回表查詢。

下面是一個常用的分頁語句:

Select * from (select row_number over(order by a) rn,t.* from table t where b=? And c=?) where rn>=1 and rn <=20

我們分析一下(假設索引是b,c,a):

1、先查詢內層語句 select * from table t where b=? and c=?,假設返回1000行數據

2、通過索引找到這1000行數據的rowid,因為索引是連續的,假設這1000行數據的索引分布在5個塊中,則差不多為8塊讀

3、再根據rowid取回表查詢數據,最壞的情況是這1000行數據分布在1000個塊中,則需要讀取1000塊。那麼算上上面的8塊總共堯都區1000+8=1008塊

我們換一種寫法:

Select * from table t,

(select rid from (select rowid rid,row_number over(order by a) rn from table where b=? And c=?)

where rn>=1 and rn<=20) tmp

Where tmp.rid=t.rowid

再來分析一下:

1、最裡層的sqlselect rid from (selectrowidrid,row_numberover(order by a)rnfrom table where b=? And c=?) wherern>=1 andrn<=20 可以全部從索引中獲得數據,由於索引有序,差不多也是8塊讀

2、分頁之後,只有20行數據,再根據這20行的rowid回表查詢數據,最壞情況是20行都在20個不同塊中,那麼總共20+8=28

從以上分析可以看出,有效的利用索引,減少回表次數,可以大大提高SQL性能,值得大家去花功夫了解一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle执行计划的概念,SQL语句性能调整之ORACLE的执行计划

对于CBO优化器&#xff1a;CBO根据统计信息选择驱动表&#xff0c;假如没有统计信息&#xff0c;则在from 子句中从左到右的顺序选择驱动表。这与RBO选择的顺序正好相反。这是英文原文(CBO determines join order from costs derived from gathered statistics. If there are n…

今日头条PHP开发工程师面试,今日头条2018春招研发岗第一次笔试题解

第一题&#xff1a;双指针&#xff1a;#include using namespace std;typedef long long ll;const int N 1e67;int a[N];int main(){int n,k;scanf("%d%d",&n,&k);for(int i0;isort(a, an);n unique(a, an) -a;int r 0, ans0;for(int l0; l{while(rif(rn)…

oracle 序列验证脚本,oracle 生成序列脚本

今天在移植一个项目的的数据库时,要移动所有的序列,下面就是一个如何生成序列脚本的语句方法一:SELECT CREATE SEQUENCE ||SEQUENCE_NAME|| INCREMENT BY ||INCREMENT_BY || START WITH ||LAST_NUMBER|| MAXVALUE ||MAX_VALUE || CACHE ||CACHE_SIZE|| ORDER NOCYCLE ;FROM u…

php打开EXCEL过慢,打开excel很慢,编辑某个工作表很卡

一些啰嗦的话&#xff1a;同事一个office ,excel档有五个工作表&#xff0c;打开时非常慢的。进去后其中只要点击到两个工作表其中一个就很卡甚至没响应。试用wps打开流畅。但她坚持要用office说用惯了&#xff0c;没办法女人。这个文档接近3M&#xff0c;都是一些数据也没见有…

linux 如何清理垃圾文件,Linux系统怎样清理垃圾文件

大家都用过windows&#xff0c;在使用windows系统的过程中系统会变得越来越慢。而对于windows下饱受诟病的各种垃圾文件都需要自己想办法删除&#xff0c;不然系统将会变得越来越大&#xff0c;越来越迟钝!windows怎么清理垃圾相信大家都知道的&#xff0c;那么linux下怎么清理…

linux vim命令跳到67行,Linux学习之Vim/Vi使用(十三)

Linux学习之Vim/Vi使用Vim/Vi简介Vim/Vi工作模式Vim/Vi基本使用Vim/Vi应用技巧Vim/Vi简介Vim/Vi是一个功能强大的全屏幕文本编辑器&#xff0c;是Linux/UNIX上最常用的文本编辑器&#xff0c;它的作用是建立、编辑、显示文本文件。Linux下的编辑器最常用的就是vim或者vi文本编辑…

linux查看端口属性,linux如何查看系统属性指令?

linux是一款非常免费资源的操作系统&#xff0c;但是很多用户不知道怎么查看系统信息&#xff0c;今天小编就给大家带来了linux查看系统属性指令分享。喜欢的快点下载吧。linux查看系统属性指令分享1、查看cpu信息查看所有cpu信息&#xff1a;cat /proc/cpuinfo查看cpu类型&…

linux命令提示符不同,Linux命令提示符如何按照自己的习惯修改?

原本的 [rootlocalhost ]$ 看久了难免让人厌倦。如果按自己的习惯修改&#xff0c;既能看着舒服&#xff0c;又能提高“逼格”。下面小编就为大家详细介绍Linux命令提示符如何按照自己的习惯修改方法&#xff0c;希望能对大家有所帮助!美化Bash1、在目录下&#xff1a;vim .bas…

ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建

Ubuntu14.04开发环境搭建嵌入式开发过程中很重要的一环节就是开发环境的搭建&#xff0c;开发环境搭建的好可以很好的提高开发效率。其中关键的一部就是挂载运行程序&#xff0c;对于程序的挂载运行需要借助NFS服务器&#xff0c;下面介绍windows和linux操作系统下NFS服务器的搭…

linux arm下硬件驱动程序放哪里,Arm-Linux摄像头驱动程序的移植

Arm开发板上摄像头的移植有两种方法&#xff1a;第一&#xff0c;将驱动程序添加到内核&#xff0c;通过编译内核&#xff0c;烧写到板子上&#xff1b;第二种&#xff0c;通过动态加载摄像头驱动模块的方法进行硬件的驱动。作者首先在PC的linux系统进行摄像驱动程序的移植&…

linux一级常用目录,小蚂蚁学习Linux(3)——Linux一级目录说明和常用命令解释...

根目录下的一级目录解释说明&#xff1a;/etc 配置文件目录 /home 普通用户家目录/bin 命令保存目录 /lib 系统库保存目录/boot 启动目录&#xff0c;启动相关文件 /mnt 系统挂载目录/dev 设备文件保存目录 /media…

linux一键打包工具,常见压缩与打包工具

第二周作业1、Linux上的文件管理类命令都有哪些&#xff0c;其常用的使用方法及其相关示例演示。2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。3、请使用命令行展开功能来完成以下练习&#xff1a;(1)、创建/tmp目录下的&#xff1a;a_c, a_d,…

Linux+c+线程的属性,C ++中的多线程

多线程是多任务的一种特殊形式&#xff0c;多任务是一种功能&#xff0c;它使您的计算机可以同时运行两个或多个程序。通常&#xff0c;多任务有两种类型&#xff1a;基于进程和基于线程。基于进程的多任务处理程序的并发执行。基于线程的多任务处理并发执行同一程序的各个部分…

linux shell 除法运算符,Linux shell 基本运算符详解

shell 支持多种运算符1.算数运算符2.关系运算符3.布尔运算符4.字符串运算符5.文件测试运算符原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 expr&#xff0c;expr 最常用。expr 是一款表达式计算工具&#xff0c;使用它能完成表…

linux下如何为redis配置path,linux环境下如何启动redis

启动redisredis可执行文件说明&#xff1a;redis-server&#xff1a;redis服务器redis-cli&#xff1a;redis命令行客户端redis-benchmark&#xff1a;redis性能测试工具redis-check-aof&#xff1a;aof文件修复工具redis-check-dump&#xff1a;rdb文件检查工具1、直接启动直接…

linux从别的主机下载,从局域网内的其他Linux主机下载文件

Step 0本机与目标机都需要安装有openssh-server在本机与目标机上以root用户身份执行service ssh status # Debian上是ssh&#xff0c;openSUSE上是sshd&#xff0c;可以在键入ssh后紧接着按一下Tab键以自动补全该服务名# 或service --status-all | grep ssh # 通用可查看ssh服务…

linux runqueue定义,linux – 了解rt_rq(实时runqueue)内核中数据成员的使用

以下是v3.5.4中的实时运行队列结构struct rt_rq {struct rt_prio_array active;unsigned int rt_nr_running;#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHEDstruct {int curr; /* highest queued rt task prio */#ifdef CONFIG_SMPint next; /* next highest */#end…

Linux7安装gi报错,Redhat 7.6安装11G RAC GI时遇到此类报错

环境&#xff1a;Redhat Linux 7.6 Oracle 11.2.0.4 RAC现象&#xff1a;图像化安装过程中&#xff0c;按照提示执行root.sh脚本&#xff0c;报错中断。1. 具体现象[rootmm1903 ~]# /u01/app/11.2.0/grid/root.shPerforming rootuser operation forOracle 11gThe following en…

c语言修改字符串c2133,通过create_string_buffer、create_unicode_buffer让C语言具备修改字符串的能力...

字符串的修改我们知道C中不存在字符串这个概念&#xff0c;python中的字符串在C中也是通过字符数组来实现的。我们说在C中创建一个字符数组有两种方式&#xff1a;char *s1 "hello world";char s2[] "hello world";这两种方式虽然打印的结果是一样的&…

c语言中O空字符,OC语言中字符串的使用

可变字符串//插入字符串NSMutableString*string1 [NSMutableStringstringWithString:"字符串"];[string1insertString:"可变"atIndex:0];//在string的第0个位置插入NSLog("string %",string1);//可变字符串//删除字符串NSMutableString*string2…