過濾條件不下推
本文介紹過濾條件不下推的使用場景與方法。
功能介紹
云原生數(shù)據(jù)倉庫AnalyticDB MySQL版在創(chuàng)建表時,默認為所有的字段創(chuàng)建了索引,使數(shù)據(jù)過濾的效率更高。然而在某些場景中,使用索引過濾數(shù)據(jù)不一定能得到較好的性能,甚至會影響整體性能。此時不建議繼續(xù)使用索引進行數(shù)據(jù)過濾。雖然用戶可以手動刪除某些字段的索引,但這種做法可能導致需要使用索引時卻沒有索引可用的問題。云原生數(shù)據(jù)倉庫AnalyticDB MySQL版過濾條件不下推功能,可以在查詢級別或?qū)嵗墑e暫時蔽掉某些字段的過濾條件下推能力,帶來更好整體查詢收益。
以下場景不建議使用索引過濾數(shù)據(jù):
數(shù)據(jù)唯一值少。數(shù)據(jù)唯一值較少,意味著數(shù)據(jù)經(jīng)過過濾后返回的數(shù)據(jù)仍然很多,那么使用索引進行數(shù)據(jù)過濾的效果可能不一定好。
磁盤IO壓力大。如果用戶業(yè)務的查詢特征是占用較多的IO資源,或者數(shù)據(jù)寫入較多導致占用了較多IO資源,那么使用索引進行數(shù)據(jù)過濾時,存在磁盤IO資源的爭搶,過濾效果也可能較差。
同時有多個條件下推,且下推的條件中有LIKE、字符串比較等比較復雜的操作時,會對存儲節(jié)點相關(guān)資源消耗很大,影響整體的性能。
查看過濾條件是否下推
您可以通過執(zhí)行頁面查看過濾條件是否下推。
在查詢的執(zhí)行計劃頁簽,單擊包含TableScan算子的Stage。
說明進入執(zhí)行計劃頁簽的步驟,請參見查看診斷結(jié)果。
單擊查看Stage計劃。
在Stage計劃頁面,單擊TableScan算子。
在右側(cè)屬性中,查看是否顯示PushedDownFilter屬性。如果顯示,表示該過濾條件已下推;否則表示沒有下推的過濾條件。
說明通過執(zhí)行計劃,也可以確認過濾條件是否下推。
彈性模式的集群,您可以查看下游Stage的執(zhí)行計劃中是否顯示Filter算子。如果顯示則表示該算子相關(guān)的過濾條件沒有下推。
預留模式的集群,您可以查看當前Stage計劃中是否顯示Filter算子。如果顯示則表示該算子相關(guān)的過濾條件沒有下推。
查詢級別關(guān)閉特定字段的過濾條件下推能力
針對某個查詢,使用Hint關(guān)閉某些字段的過濾條件下推。只對使用了Hint的查詢生效,其他查詢不受影響。
語法
內(nèi)核版本為3.1.4及以上,請使用下面的Hint:
/*+ filter_not_pushdown_columns=[Schema1.table1:colName1|colName2;Schema2.table2:colName1|colName2] */
內(nèi)核版本為3.1.4以下,請使用下面的Hint:
/*+ no_index_columns=[table1.colName1;colName2,table2.colName1] */
關(guān)閉特定字段的過濾條件下推能力既支持對同一個數(shù)據(jù)庫中的表使用Hint,也支持對不同數(shù)據(jù)庫中的表使用Hint。當3.1.4以下版本,跨庫使用Hint時,需要保證兩個庫中的表名不同,否則Hint可能會影響到不需要生效的表。3.1.4及以上版本的Hint通過Schema.table區(qū)分不同表,對不同庫中相同表名的表使用Hint時,不會影響查詢結(jié)果。
查詢內(nèi)核版本的方法,請參見如何查看實例版本信息。如需升級內(nèi)核版本,請聯(lián)系技術(shù)支持。
示例
示例1:
以3.1.4及以上的內(nèi)核版本為例,當前查詢,包含數(shù)據(jù)庫
test01
的表table01
中字段id
和product
的過濾條件不會下推。/*+ filter_not_pushdown_columns=[test01.table01:id|product] */
示例2:
以3.1.4及以上的內(nèi)核版本為例,當前查詢,包含數(shù)據(jù)庫
test01
的表table01
中字段id
、product
,數(shù)據(jù)庫test02
的表table03
中字段key
的過濾條件不會下推。/*+ filter_not_pushdown_columns=[test01.table01:id|product;test02.table03:key] */
示例3:
以3.1.4以下的內(nèi)核版本為例,當前查詢,包含表
table02
中字段id
和product
,表table03
中字段key
的過濾條件不會下推。/*+ no_index_columns=[table02.id;product,table03.key] */
集群級別關(guān)閉特定字段的過濾條件下推能力
您可以執(zhí)行以下命令,對當前集群的所有查詢,關(guān)閉特定字段的過濾條件下推能力。
語法
關(guān)閉特定字段的過濾條件下推能力既支持對同一個數(shù)據(jù)庫中的表使用Hint,也支持對不同數(shù)據(jù)庫中的表使用Hint。當3.1.4以下版本,跨庫使用Hint時,需要保證兩個庫中的表名不同,否則Hint可能會影響到不需要生效的表。3.1.4及以上版本的Hint通過Schema.table區(qū)分不同表,對不同庫中相同表名的表使用Hint時,不會影響查詢結(jié)果。
查詢內(nèi)核版本的方法,請參見如何查看實例版本信息。如需升級內(nèi)核版本,請聯(lián)系技術(shù)支持。
示例
以3.1.4及以上的內(nèi)核版本為例,當前集群的所有查詢中,只要過濾條件包含數(shù)據(jù)庫test02
的表table02
中字段id
,該過濾條件就不下推。
set adb_config filter_not_pushdown_columns=[test02.table02:id]