oracle 索引回表,oracle 索引简单总结

建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块)。leaf中存在索引列的值、长度、和所在rowid,茎块存了指向具体茎块的指针,root块同理。这是逻辑上的划分实际上根据表中数据量的多少可能会存在多层,但是索引整体上层次较低,例如一张500G的表数据量达到几百亿条,这时候它的索引只有6层。

在查询结果返回多的情况下使用索引会浪费更多的代价,另外如果一张表有五个字段,我们在三个字段上建上btree索引。那样效率只会更低。可考虑使用位图索引

索引的三大特点:

1.索引数的高度一般较低

2.索引由索引列存储的值及rowid组成

索引SELECT * FROM T WHERE ID = 1会导致索引回表的产生,若不需要看全部数据可用SELECT ID FROM T WHERE ID= 1或可建多列的复核索引,但是复核索引最好不要超过3列的复核。在更新操作不频繁的情况下可考虑使用索引组织表

3.索引本身是有序的

减少ORDER BY、DISTINCT排序所浪费的COST

聚合因子:

建立索引的列的顺序与索引自动排序的列的顺序的不对应度被称为聚合因子,聚合因子越大索引回表读越浪费时间(索引回表读不可避免的情况下)

oracle 执行计划分类:

1、TABLE ACCESS FULL   全表扫描

2、INDEX FAST FULL SCAN   索引快速扫描   (不考虑排序COUNT(ID), SUM(ID), AVG(ID),列必须非空或IS NOT NULL)

3、INDEX FULL SCAN   索引全扫   (SELECT ID FROM T WHERE ID = 120)

4、INDEX FULL SCAN(MIN/MAX)  最大值最小值索引全扫  (SELECT MAX(ID) FROM T)

5、TABLE ACCESS BY INDEX ROWID  索引回表读   (SELECT * FROM T WHERE ID = 1)

6、INDEX RANGE SCAN   索引范围扫描   (SELECT * FROM T WHERE ID 

7、BITMAP INDEX FAST FULL SCAN  位图索引快速扫描  (不考虑排序COUNT(ID), SUM(ID), AVG(ID),位图快速索引扫描速度非常快将近是普通索引的百倍.列不必非空)

btree索引优化简介

T表  字段:OBJECT_ID, OBJECT_NAME

单列索引:

CREATE INDEX IDX1_OBJECT_ID ON T(OBJECT_ID);

COUNT(*)、SUM、AVG优化:

改为COUNT(OBJECT_ID)查询,但是必须保证OBJECT_ID列非空。可用如下方法告知oracle可走IDX1_OBJECT_ID索引:

1、SELECT COUNT(OBJECT_ID) FROM T WHERE OBJECT_ID IS NOT NULL;

2、设置字段非空

MAX/MIN优化:

根据第三个特性有序排列,所以MAX/MIN的查询代价会非常小。

SELECT MAX(OBJECT_ID) FROM T; 不需加上IS NOT NULL; 使用执行计划:INDEX FULL SCAN(MIN/MAX);

ORDER BY、DISTINCT排序优化:

SELECT * FROM T WHERE OBJECT_ID 

未建立索引的情况下会进行排序产生TEMPSPC;

建立索引的情况下不需要产生排序 会使用IDX1_OBJECT_ID索引

位图索引

创建语法:

CREATE BITMAP INDEX IDX_BITM_T_STATUS ON T(STATUS);

适用在更新非常少的表,建立在重复度较高的列(性别)

存储结构:

位图索引存储的是比特位值

函数索引:

CREATE TABLE T AS SELECT * FROM DBA_OBJECT;

CREATE INDEX IDX_OBJECT_ID ON T(OBJECT_ID);

CREATE INDEX IDX_OBJECT_NAME ON T(OBJECT_NAME);

CREATE INDEX IDX_CREATED ON T(CREATED);

SELECT * FROM T WHERE UPPER(OBJECT_NAME) = 'T';

普通的BTREE索引,如果在对列做运算的条件下是无法使用索引查询的,会使用TABLE ACCESS FULL;

创建语句:

CREATE INDEX IDX_UPPER_OBJ_NAME ON(UPPER(OBJECT_NAME));

SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';

函数索引的TYPE是:FUNCTION-BASED NORMAL;

函数索引的cost比全表扫描要小,但是比普通的索引要大的多。

SELECT * FROM T WHERE OBJECT_ID - 10<30;

这时候如果在object_id列建立普通索引时无法使用的。oracle会默认使用全表扫描的方式进行查询。可有以下两个思路进行优化:

1、SELECT * FROM T WHERE OBEJCT_ID 

2、在OBJECT_ID - 10上建立函数索引

写sql时要注意规范,很多语句是等价的。

SELECT * FROM T WHERE SUBSTR(OBJECT_NAME,1,4) = 'CLUS'   =    SELECT * FROM T WHERE OBJECT_NAME LIKE 'CLUS%';

SELECT * FROM T WHERE TRUNC(CREATED) >= TO_DATE('2012-10-02', 'YYYY-MM-DD') AND TRUNC(CREATED) <= TO_DATE('2012-10-03','YYYY-MM-DD')

=

SELECT * FROM T WHERE CREATED >= TO_DATE('2012-10-02', 'YYYY-MM-DD') AND CREATED 

;

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

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

相关文章

oracle查效能,【DataGuard】Oracle 11g物理Active Data Guard实时查询(Real-time query)特性...

在Oracle 11g以前版本中的的Data Guard物理备用数据库&#xff0c;可以以只读的方式打开数据库&#xff0c;但此时Media Recovery利用日志进行数据同步的过程就停止了&#xff0c;如果物理备用数据库处于恢复的过程中数据库就不能打开查询&#xff0c;也就是说日志应用和只读打…

oracle sequence last_number,关于oracle序列的LAST_NUMBER

这是正常的,是的.从documentation for the all_sequences data dictionary view开始,last_number是&#xff1a;Last sequence number written to disk. If a sequence uses caching, the number written to disk is the last number placed in the sequence cache. This numbe…

oracle存储过程日志打印,如何在oracle存储过程中逐行打印

我正在执行一个存储过程&#xff0c;但它在某个时候失败了&#xff0c; 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败&#xff0c;所以想要在执行时逐行输出。 例如&#xff1a;如何在oracle存储过程中逐行打印create or replace-- decaring required varia…

linux依赖包在哪个目录,命令-Linux cmd在jar中搜索类文件,而与jar路径无关

Linux&#xff0c;演练以在许多jar中查找类文件。转到包含下面的jar的目录。ericdev /home/el/kafka_2.10-0.8.1.1/libs $ lsblah.txt metrics-core-2.2.0.jarjopt-simple-3.2.jar scala-library-2.10.1.jarkafka_2.10-0.8.1.1-sources.jar zkclient-0.3.jarkafka_2.10-0.8.1.1…

linux 挂在iso文件,linux 挂载iso文件安装文件 与 网络yum的搭建

挂载1.首先&#xff0c;创建文件作为挂载点mkdir /文件名/2.mount /iso/rhel-server-7.3-x86_64-dvd.iso /dir/将/iso目录下的镜像挂载到 /dir/文件上3. cd /etc/yum.repos.d/ 进入文件4. rm -fr * 删除目录下所有文件5.vim yum.repo 编辑文件内容6. rhe17.3] 说明namerhe17.3 …

微软引入linux内核,微软内部已在讨论Linux内核中加入exFAT的可能性

微软的exFAT文件系统已经有十多年的历史了&#xff0c;虽然已经有了一些突破&#xff0c;但是主流Linux内核仍然不支持此文件系统&#xff0c;即使它出现在更多的SD卡和其他设备上。但现在又重新努力将exFAT驱动程序引入Linux内核&#xff0c;有一个开发人员对为exFAT添加一个新…

linux内核ddr初始化,X-007-UBOOT-DDR的初始化(Bubblegum-96平台)

X-007-UBOOT-DDR的初始化(Bubblegum-96平台)作者&#xff1a;wowo 发布于&#xff1a;2016-7-21 22:47分类&#xff1a;X Project1. 前言到目前为止&#xff0c;“X Project”在Bubblegum-96平台上的代码&#xff0c;都是运行在SRAM中。由于SRAM的size很小(最多也就96KB)&#…

linux message日志只有4k,linux命令查看日志

首先介绍几个日志查看种常用的简单命令&#xff1a;1、tailtail 命令可用于查看文件的内容&#xff0c;有一个常用的参数 -f 常用于查阅正在改变的日志文件。tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上&#xff0c;并且不断刷新&#xff0c;只要 filena…

linux emule 编译 wx-config --libs,LeezPi-RK3399_Android9编译说明

# LeezPi-RK3399_Android9固件编译[TOC]## 准备工作编译 Android 对机器的配置要求较高&#xff1a;* 64 位 CPU* 16GB 物理内存交换内存* 30GB 空闲的磁盘空间用于构建&#xff0c;源码树另外占用大约 25GB官方推荐 Ubuntu 14.04 操作系统&#xff0c;经测试&#xff0c;Ubunt…

linux 4.4内核特性,Linux Kernel 4.4.19 LTS长期支持版发布

原标题&#xff1a;Linux Kernel 4.4.19 LTS长期支持版发布摘要&#xff1a;近日&#xff0c;内核开发者Greg Kroah-Hartman公布了长期支持的Linux 4.4 Kernel系列第19个维护版本的细节。Linux 4.4是目前最新的LTS内核分支&#xff0c;被Arch Linux, Solus和Ubuntu Linux等众多…

linux 软件源 概念,Linux 软件源介绍

陈科肇1.软件源简介软件源是Linux系统免费的应用程序安装仓库&#xff0c;很多的应用软件都会这收录到这个仓库里面&#xff0c;按类型分则有&#xff1a;1).软件仓库&#xff1a;各类软件的二进制包和源代码2).ISO镜像&#xff1a;发行版的ISO文件软件源可以是网络服务器&…

linux 设备 major 253,redhat5.5测试环境中使用udev配置raw设备

在redhat 5中&#xff0c;是通过udev来管理raw设备的。 那么udev如何知道raw设备&#xff0c; 就是通过MAJOR和 MINOR。 如果我们只写&#xff1a;ACTION"add", KERNEL"sda", RUN"/bin/raw /dev/raw/raw1 %N"那么Udev就无法识别出raw设备&#x…

linux系统如何拨号上网连接,教你在Linux下如何使用ADSL拨号上网

教你在Linux下如何使用ADSL拨号上网发布时间:2007-10-29 10:22:09来源:红联作者:demon一、如果是新手刚开始使用Linxu的话&#xff0c;可用图形界面&#xff1a;办法&#xff1a;直接在网络里建立新的拨号连接即可二、使用文本模式的话&#xff1a;如果存在文件 /usr/sbin/pppd…

linux git diff patch,拿到git patch要怎麼用一般patch指令merge?

如果你的codebase工作環境沒有使用git作管理, 你要怎麼做從git產生的patch呢?首先要先知道diff 與 patch 的關係, 傳統的linux裡面, .patch檔案是透過diff產生的Diff 和 Patch 的簡易操作使用筆記:(參考: Tsung’s Blog)diff -Naur file1 file2 > project.patch # Diff 產生…

c语言汇编混编,c语言与汇编混编写法

R13 (stack pointer)R14 (Link Register)R15 (program counter)c语言中内嵌汇编的规则&#xff1a;内嵌汇编器与armasm的区别&#xff1a;访问全局变量&#xff1a;unsigned char LDRB/ STRBunsigned short LDRH/STRHunsigned int LDR/…

c语言中entern int x y,关于extern和int main()的结构有关问题

关于extern和int main()的结构问题本帖最后由 hashcat 于 2015-09-20 12:34:50 编辑这是c实现md5加密的代码&#xff0c;报错部分是两处extern&#xff0c;其实也就是两处extern需要改动&#xff0c;但是试了半天&#xff0c;没搞懂要怎么改...#include #include #define MD5_R…

关于c语言的英文论文,C语言论文外文翻译.doc

C语言论文外文翻译C语言论文外文翻译ASP.NET Technique1. Building ASP.NET PagesASP.NET and the .NET FrameworkASP.NET is part of Microsofts overall .NET framework, which contains a vast set of programming classes designed to satisfy any conceivable programming…

用C语言创建多个用户,实现支持多用户在线的FTP程序(C/S)

1 importjson2 importos3 importshelve4 importstruct5 importsubprocess67 from conf importsettings8 from lib importcommon91011 classHandlerRequest:12 """处理用户请求."""13 max_packet_size 819214 encoding utf-81516 struct_fmt i…

android 代理 wifi热点,android wifi热点默认网关

原贴&#xff1a;https://blog.csdn.net/jingzitakk66/article/details/89146696项目需求&#xff0c;android端创建热点&#xff0c;电脑端连接此热点后用socket实现数据传输&#xff0c;PC端获取网卡时无法判断多网卡情况下哪个IP为需要的IP&#xff0c;所以搜了下&#xff0…

android实现电话功能实验报告,安卓开发实验报告-20210407005833.docx-原创力文档

文档编制序号&#xff1a;[KKIDT-LLE0828-LLETD298-POI08]文档编制序号&#xff1a;[KKIDT-LLE0828-LLETD298-POI08]安卓开发实验报告安卓开发实验报告目录页面跳转长按图标抖动以及显示删除页面跳转功能&#xff1a;通过点击button实现2个activity之间的跳转。1.设置监听器监听…