日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時間:2025/3/12 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

要寫出高效的SQL,那麼必須必須得清楚SQL執(zhí)行路徑,介紹如何提高SQL性能的文章很多,這裡不再贅述,本人來談?wù)勅绾螐?減少SQL回表次數(shù) 來提高查詢性能,因為回表將導(dǎo)致掃描更多的數(shù)據(jù)塊。

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

舉個例子:

select a from test_db where b=5

A、假設(shè)b上沒有索引

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

2、從數(shù)據(jù)塊中找到記錄,並且進行過濾

可想而知,沒有索引將會導(dǎo)致掃描該表所有數(shù)據(jù)塊,性能低下

B、 假設(shè)b上有索引

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

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

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

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

例如分頁需要回表,一般盡量在索引上分頁,然後返回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

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

1、先查詢內(nèi)層語句 select * from table t where b=? and c=?,假設(shè)返回1000行數(shù)據(jù)

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

3、再根據(jù)rowid取回表查詢數(shù)據(jù),最壞的情況是這1000行數(shù)據(jù)分布在1000個塊中,則需要讀取1000塊。那麼算上上面的8塊總共堯都區(qū)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 可以全部從索引中獲得數(shù)據(jù),由於索引有序,差不多也是8塊讀

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

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

總結(jié)

以上是生活随笔為你收集整理的oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。