Oracle SQL建立有效索引減少回表

2021-06-09 18:24:55 字數 1549 閱讀 3627

回表:在資料中,當查詢資料的時候,在索引中查詢索引後,獲得該行的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效能。

Oracle SQL建立有效索引減少回表

oracle sql建立有效索引減少回表 回表 在資料中,當查詢資料的時候,在索引中查詢索引後,獲得該行的rowid,根據rowid再查詢表中資料,就是回表。在資料庫中,資料的儲存都是以塊為單位的,稱為資料塊,表中每一行資料都有唯一的位址標誌rowid。每次使用sql進行查詢的時候,都要掃瞄資料塊,...

建立有效鏈結的關鍵

建立有效鏈結的關鍵 這篇文章是圍繞鏈結來講的,你得了解下其它可促進seo成功的一些因素,像文字元件,它包含了各類可使用的單詞和短語,你的目標觀眾很可能會用這類詞進行搜尋查詢,且這類元件的流行度與指向 的鏈結的數量和質量是息息相關的。其中最重要的 需要記住的 也是大部分 開發商一開始都覺得比較困惑的是...

建立有效的CRM系統

客戶管理系統可以有效把客戶資訊集中在企業的資料庫裡。並且客戶的資料可以被公司各個部門共享,無論是客戶是否聯絡過企業還是企業聯絡過客戶或者客戶增加購買過產品等,這些資訊都是會被記錄的,同時這些資料可以被每乙個和客戶交流的部門管理者都可以查詢到的,讓這個客戶在購買產品的同時還能得到企業的整體的關懷。這只...