Sargable 与 谓语下推 (predicate pushdown) 简介
關鍵詞:SQL優化 , sargable , pushdown filter , predicate pushdown
?
Sargable
Sargable = Search ARGument ABLE ,即SQL中可利用數據庫自身索引優勢對查詢條件進行執行性能優化。換句話說,即可以利用存儲層的索引優勢來優化的查詢條件。wikipedia: https://en.wikipedia.org/wiki/Sargable
典型的案例就是SQL中的WHERE條件,一個條件單元一般是一個函數作用于一個列/字段的數據;ORDER BY, GROUP BY, HAVING 等有時候也可Sargable。
- Sargable operators: =, >, <, >=, <=, BETWEEN, LIKE, IS [NOT] NULL
- Sargable operators that rarely improve performance: <>, IN, OR, NOT IN, NOT LIKE
?
通常一個操作是否可Sargable比較好判斷,當你足夠了解存儲層,你便知道這個操作是否可以轉化為基于索引的查詢或變成一些謂語下推(pushdown filter) 的方式。
但是多個操作聯合的時候就麻煩了,多個操作的邏輯聯合主要包括AND和OR,特殊的還有NOT,不考慮自定義函數。
predicate pushdown (謂語下推、謂語前推)
有時英語表示為 pushdown filter (下推過濾),是一個來自關系型數據庫的術語,最近也廣泛被NoSQL所借用。比較詳細一個示例解釋見Hive https://cwiki.apache.org/confluence/display/Hive/FilterPushdownDev。
Hive的解釋:Predicate pushdown is a term borrowed from relational databases even though for Hive it is predicate pushup. The basic idea is to process expressions as early in the plan as possible.
通俗理解,就是在實際數據讀取和SQL實際執行之前預先執行條件語句進行預處理和過濾。
## Why we need to understand Sargable
在很多SQL查詢場景中,并不是所有的where都能得到優化,如果你的where語句是不可優化的,很可能你動輒就做了一個掃全表的操作。很多入門學習使用MySQL的人因為玩的量比較小,所以一般都沒關注這點,等到量上去幾百萬千萬了,才發現字段需要做索引使其可優化。而另一個更需要關注的場景是Hive這類SQL like數據查詢引擎。很多這類查詢引擎套了層SQL接口,但底層不一定做了針對性優化。比如Hive雖然可以通過StorageHandler來支持不同的存儲層(HDFS/HBase/ES等),但是像HBase和ES,一個不小心就是full scan,全部拿回來做mapreduce,在mr中才進行where的過濾。
對于不同的存儲數據庫來說,Sargable Operators不完全一樣,比如HBase支持按前綴過濾的Scan Filter,而ES默認是不支持的;ES支持OR操作的索引查詢,HBase的FilterList是AND的關系。因此想去做針對性優化時,熟悉Hive的Operators和數據庫能支持的predicate pushdown或索引查詢都是不可或缺的。
另外還有的情況是,對于SQL語義一樣的兩條不同寫法的查詢,優化支持可能會不一樣;有些查詢條件看起來可優化但因為存儲層支持的原因變得不可優化了。前者有一定工作經驗的人都能理解,不然為什么需要做SQL查詢優化和管理;后者一定程度上可以說是個坑,尤其對于使用者。對于后者要么給于更清晰的使用和文檔指引,要么幫助做一些SQL查詢計劃的優化。但這樣一來的話優化的也有限,而且不通用了(像hive-ql就是通用的)。所以解決方案見仁見智,還是要根據需求場景來決定。
?
?
本文只是個引子,在數據倉庫的需求越來越大的市場下,這種優化是需要被人重視的。
轉載于:https://www.cnblogs.com/lhfcws/p/6611830.html
總結
以上是生活随笔為你收集整理的Sargable 与 谓语下推 (predicate pushdown) 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab拟合RMSE,Matlab拟
- 下一篇: 国外LEAD赚钱教程:EMU篇(五)国外