Terminology

“SARGable”這個詞的真正含義是什麼?

  • December 3, 2019

SQL Server 使用者使用術語*“sargable”*。我想知道“sargable”是否有一個與實現無關的客觀定義。

例如,WHERE foo LIKE '%bar%'許多人說它是不可搜尋的,但一些 RDBMS能夠在此類查詢上使用索引。那麼*“不可分割”*是什麼意思呢?

其他參考

“sargable”一詞最早由 P. Griffiths Selinger 等人提出。在ACM 發表的 1979 年論文“關係數據庫管理系統中的訪問路徑選擇”中。對於非 ACM 成員,該論文的副本位於http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

該術語在本段中定義:

索引和段1掃描都可以選擇採用一組謂詞,稱為搜尋參數(或 SARGS),在返回給 RSI 2呼叫者之前將其應用於元組。如果元組滿足謂詞,則返回;否則掃描將繼續,直到找到滿足 SARGS 的元組或耗盡段或指定的索引值範圍。這通過消除對可以在 RSS 中有效拒絕的元組進行 RSI 呼叫的成本來降低成本。並非所有謂詞都具有可以成為 SARGS 的形式。sargable謂詞是一種形式(或可以放入形式)“列比較運算符值”。SARGS 以析取範式表示為此類謂詞的布爾表達式。

換句話說,一個 sargable 謂詞可以由儲存引擎(訪問方法)通過直接觀察表或索引記錄來解析。相反,不可分割的謂詞需要更高級別的 DBMS 才能採取行動。例如,WHERE lastname = 'Doe'儲存引擎可以通過簡單地查看lastname每條記錄的欄位內容來決定結果。另一方面,WHERE UPPER(lastname) = 'DOE'需要 SQL 引擎執行一個函式,這意味著儲存引擎必須將它讀取的所有行(前提是它們與可能的其他可搜尋謂詞匹配)返回給 SQL 引擎進行評估,從而產生額外的 CPU 成本.

從原始定義中可以看出,sargable predicates 不僅可以應用於索引掃描,還可以應用於表(System R 術語中的段)掃描,只要滿足“列比較運算符值”的條件,因此它們可以是由儲存引擎評估。Db2 確實是這種情況,它在很多方面都是 System R 的後代:

索引 sargable 謂詞不用於括起搜尋,但如果選擇一個,則從索引中評估,因為謂詞中涉及的列是索引鍵的一部分。這些謂詞也由索引管理器評估。

數據可搜尋謂詞是索引管理器無法評估但可以由數據管理服務 (DMS) 評估的謂詞。通常,這些謂詞需要訪問基表中的各個行。如有必要,DMS 將檢索評估謂詞所需的列,

在 SQL Server 中,sargable 謂詞只是那些可以使用索引查找來解決的事實,這可能是由其儲存引擎無法在表掃描期間應用此類謂詞決定的。

Sargable 和 non-sargable 謂詞有時分別被描述為“階段 1”和“階段 2”謂詞(這也來自Db2 術語)。階段 1 謂詞可以在查詢處理的最低級別進行評估,同時讀取表或索引記錄。匹配階段 1 條件的行(如果有)將被發送到評估的下一個級別,階段 2。


1 – System R中的段是表元組的物理儲存;段掃描在某種程度上等同於其他 DBMS 中的表掃描。

2 – RSI – RSS 3 Interface,一個面向元組的查詢介面。與本次討論相關的介面函式是 NEXT,它返回匹配查詢謂詞的下一行。

3 – RSS,即研究儲存系統,System R 的儲存子系統。

對我來說,SARGable 意味著 SQL Server 可以使用您的搜尋謂詞執行索引查找。

您不能只說 DBMS 可以“利用”索引,因為使用非 sargable 謂詞,SQL Server 最終可能會掃描非聚集索引。

引用自:https://dba.stackexchange.com/questions/162263