溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

oracle 執(zhí)行計(jì)劃 access和filter的區(qū)別

發(fā)布時(shí)間:2020-06-27 18:33:09 來源:網(wǎng)絡(luò) 閱讀:5685 作者:lych528 欄目:關(guān)系型數(shù)據(jù)庫

These two terms in the Predicate Information section indicate when the data source is reduced. Simply, access means only retrieve those records meeting the condition and ignore others. Filter means after you already got the data, go through them all and keep those meeting the condition and throw away the others.

1 access: 直接獲取那些滿足條件的數(shù)據(jù),拋棄其他不滿足的數(shù)據(jù)
2 filter: 你已經(jīng)有了一些數(shù)據(jù),對(duì)這些已經(jīng)有的數(shù)據(jù)應(yīng)用filter,得到滿足filter的數(shù)據(jù)。

很多博客論壇都有如下結(jié)論:
access表示這個(gè)謂詞條件的值將會(huì)影響數(shù)據(jù)的訪問路徑(表or索引),而filter表示謂詞條件的值并不會(huì)影響數(shù)據(jù)訪問路徑,只起到過濾的作用。

但是這個(gè)結(jié)論很是含糊,而且容易歧義。很多人一看顯示filter 就認(rèn)為oracle沒有訪問索引路徑的選擇,肯定走全表掃描進(jìn)行數(shù)據(jù)擇取。真的是這樣嗎?

可以模擬如下場(chǎng)景:
create table test(aa int ,bb int ) as select rownum,rownum from dba_objects;(10w數(shù)據(jù)量)
create index .... 在aa上創(chuàng)建索引
select count(aa) from test where aa<500 ----access,index range scan
select count(aa) from test where aa<50000 ----- filter,index fast full scan
select count(bb) from test where aa<50000 ----filter ,table full scan
select aa,bb from test where aa<500 and bb=5
1 -- filter (bb=5)
2 --access(aa<500)
當(dāng)然如果bb上建立了索引,那么filter,access的位置可能就會(huì)發(fā)生變化

明顯access與filter跟是否走索引還是全表掃描無關(guān)。
上面access走索引范圍掃描原因在于我只掃描到aa<500的index block我就返回結(jié)果了,而走索引快速掃描是對(duì)整個(gè)index做了掃描,相當(dāng)于就是對(duì)10W條aa值對(duì)應(yīng)的index block都進(jìn)行掃描。那么這樣區(qū)別就很明顯了,filter其實(shí)可以認(rèn)為在數(shù)據(jù)擇取的過程中可能做了一些無用功,最終拋棄自己不需要的數(shù)據(jù)來擇取最終需要的數(shù)據(jù),而access 在數(shù)據(jù)擇取方面更有針對(duì)性。也就是說access只是更傾向走索引(前提是索引存在而且合理的情況下)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI