2015-11-11 88 views
1

我有一個users表,其中有username列,並且此列中有B樹索引。當我檢查以下查詢的解釋計劃時:select username from users where username like 'A%'我可以看到Oracle對索引執行索引範圍掃描以提取所需信息,這是絕對可以的,但在索引範圍掃描過程中,Oracle使用以下謂詞:access(username like 'A%')filter(username like 'A%')Oracle中的相同過濾器和訪問謂詞解釋計劃

爲什麼Oracle使用它們兩個?他們完全一樣,所以我認爲其中一個就足夠了。

回答

0

這不回答,只是一些組鏈接和報價:

訪問謂詞(「訪問」) 訪問謂詞表達的啓動和停止的葉節點遍歷的條件。

索引過濾器謂詞(用於索引操作的「過濾器」) 僅在葉節點遍歷期間應用索引過濾器謂詞。它們不會影響啓動和停止條件,也不會縮小掃描範圍。

表級過濾器謂詞(用於表操作的「過濾器」) 在表級別上評估不屬於索引一部分的列的謂詞。要做到這一點,數據庫必須首先加載表中的行。

簡而言之,湯姆凱特說:

訪問意味着我們使用的東西來「訪問」數據 - 我們只「訪問」的相關數據。 過濾器意味着我們正在獲得更多的數據,然後我們需要它,並在我們得到它之後對其進行過濾。該過濾器將被應用於所有的行和只有那些通過過濾器

https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:7807480400346035212

還有在Oracle YouTube頻道良好的視頻:https://www.youtube.com/watch?v=K0f2Yzue7yw

0

甲骨文公司(IMO)的理念是相對你期望什麼。 FILTER謂詞不僅在明顯的情況下減少,但有時擴展與額外的過濾條件。

小例子

select * from tst where c1 like 'A%' and c1 like '%A' 

產量

2 - access("C1" LIKE 'A%') 
    filter("C1" IS NOT NULL AND "C1" LIKE 'A%' AND "C1" LIKE '%A') 

所以額外NOT NULL約束添加。

我只能推測,過濾器處理是比較便宜的訪問(在內存中),所以雙重檢查比少數CPU週期好。 Oracle還必須處理一些特殊情況,例如訪問集羣表,這些訪問可能會提供比謂詞更多的特殊情況。