最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

OracleSQL建立有效索引减少回表

来源:动视网 责编:小采 时间:2020-11-09 11:11:27
文档

OracleSQL建立有效索引减少回表

OracleSQL建立有效索引减少回表:回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。在数据库中,数 回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。 在数据库
推荐度:
导读OracleSQL建立有效索引减少回表:回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。在数据库中,数 回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。 在数据库


回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。在数据库中,数

回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。

在数据库中,数据的存储都是以块为单位的,称为数据块,表中每一行数据都有唯一的地址标志ROWID。每次使用SQL进行查询的时候,都要扫描数据块,找到行所在的ROWID,再扫描该表的数据块。回表将会导致扫描更多的数据块。

例如:SELECT a,b,cFROM TEST_DB WHERE b=1

在该查询语句执行的时候,可分为两种情况:

A. 在b上没有建立索引

如果在b上没有建立索引,那么该条SQL语句执行时,要进行全表扫描,扫描所有该表中的数据块。从该数据块中找到记录,并进行过滤。在没有索引时,查找数据会导致扫描表中所有数据块,性能较低。

B. 在b上建立索引

如果在b上建立索引,那么在执行该条SQL语句时,先进行索引扫描,在索引中找到b=1所在的位置(一般只需要扫描3个块数据即可),获得改行的ROWID,根据其ROWID再查询数据(回表),如果所查找的数据量较少,则回表次数就少。如上面的例子,要查询的数据只有b在索引中,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行数据的索引分布在3个数据块中,一般需要读取6个数据块。再根据ROWID取回表查询数据,最差的情况是这1000行数据分布在1000个数据块中,则需要读取1000块。那么总共需要读取的数据块区为1006块。

如果我们换另外一种写法:

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

在例子中,最里层的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,可以全部在索引中获取到数据,和上面一样,也差不多为6数据块。分页之后,只有20行数据,在更具这20行的ROWID回表查询数据,最坏的情况是20行都在20个不同块中,那么总共也只扫描26块数据块。

因此,有效的利用索引,可以减少回表的次数,大大提升SQL性能。

文档

OracleSQL建立有效索引减少回表

OracleSQL建立有效索引减少回表:回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。在数据库中,数 回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。 在数据库
推荐度:
标签: 数据库 oracle 索引
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top