全部產品
Search
文件中心

AnalyticDB:過濾條件不下推

更新時間:Jul 06, 2024

本文介紹過濾條件不下推的使用情境與方法。

功能介紹

雲原生資料倉儲AnalyticDB MySQL版在建立表時,預設為所有的欄位建立了索引,使資料過濾的效率更高。然而在某些情境中,使用索引過濾資料不一定能得到較好的效能,甚至會影響整體效能。此時不建議繼續使用索引進行資料過濾。雖然使用者可以手動刪除某些欄位的索引,但這種做法可能導致需要使用索引時卻沒有索引可用的問題。雲原生資料倉儲AnalyticDB MySQL版過濾條件不下推功能,可以在查詢層級或執行個體層級暫時蔽掉某些欄位的過濾條件下推能力,帶來更好整體查詢收益。

以下情境不建議使用索引過濾資料:

  • 資料唯一值少。資料唯一值較少,意味著資料經過過濾後返回的資料仍然很多,那麼使用索引進行資料過濾的效果可能不一定好。

  • 磁碟IO壓力大。如果使用者業務的查詢特徵是佔用較多的IO資源,或者資料寫入較多導致佔用了較多IO資源,那麼使用索引進行資料過濾時,存在磁碟IO資源的爭搶,過濾效果也可能較差。

  • 同時有多個條件下推,且下推的條件中有LIKE、字串比較等比較複雜的操作時,會對儲存節點相關資源消耗很大,影響整體的效能。

查看過濾條件是否下推

您可以通過執行頁面查看過濾條件是否下推。

  1. 在查詢的執行計劃頁簽,單擊包含TableScan運算元的Stage。

    說明

    進入執行計劃頁簽的步驟,請參見查看診斷結果

  2. 單擊查看Stage計劃

  3. 在Stage計劃頁面,單擊TableScan運算元。

  4. 在右側屬性中,查看是否顯示PushedDownFilter屬性。如果顯示,表示該過濾條件已下推;否則表示沒有下推的過濾條件。sql-exe-plan-attribute

    說明

    通過執行計畫,也可以確認過濾條件是否下推。

    • 彈性模式的叢集,您可以查看下遊Stage的執行計畫中是否顯示Filter運算元。如果顯示則表示該運算元相關的過濾條件沒有下推。

    • 預留模式的叢集,您可以查看當前Stage計劃中是否顯示Filter運算元。如果顯示則表示該運算元相關的過濾條件沒有下推。

查詢層級關閉特定欄位的過濾條件下推能力

針對某個查詢,使用Hint關閉某些欄位的過濾條件下推。只對使用了Hint的查詢生效,其他查詢不受影響。

文法

  • 核心版本為3.1.4及以上,請使用下面的Hint:

    /*+ filter_not_pushdown_columns=[Schema1.table1:colName1|colName2;Schema2.table2:colName1|colName2] */
  • 核心版本為3.1.4以下,請使用下面的Hint:

    /*+ no_index_columns=[table1.colName1;colName2,table2.colName1] */
重要
  • 關閉特定欄位的過濾條件下推能力既支援對同一個資料庫中的表使用Hint,也支援對不同資料庫中的表使用Hint。當3.1.4以下版本,跨庫使用Hint時,需要保證兩個庫中的表名不同,否則Hint可能會影響到不需要生效的表。3.1.4及以上版本的Hint通過Schema.table區分不同表,對不同庫中相同表名的表使用Hint時,不會影響查詢結果。

  • 查詢核心版本的方法,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。

樣本

  • 樣本1:

    以3.1.4及以上的核心版本為例,當前查詢,包含資料庫test01的表table01中欄位idproduct的過濾條件不會下推。

    /*+ filter_not_pushdown_columns=[test01.table01:id|product] */
  • 樣本2:

    以3.1.4及以上的核心版本為例,當前查詢,包含資料庫test01的表table01中欄位idproduct,資料庫test02的表table03中欄位key的過濾條件不會下推。

    /*+ filter_not_pushdown_columns=[test01.table01:id|product;test02.table03:key] */
  • 樣本3:

    以3.1.4以下的核心版本為例,當前查詢,包含表table02中欄位idproduct,表table03中欄位key的過濾條件不會下推。

    /*+ no_index_columns=[table02.id;product,table03.key] */

叢集層級關閉特定欄位的過濾條件下推能力

您可以執行以下命令,對當前叢集的所有查詢,關閉特定欄位的過濾條件下推能力。

文法

  • 核心版本為3.1.4及以上版本,請使用下方語句:

    set adb_config filter_not_pushdown_columns=[Schema1.tableName1:colName1|colName2;Schema2.tableName2:colName1|colName2]
  • 核心版本為3.1.4以下,請使用下面的語句:

    set adb_config no_index_columns=[tableName1.colName1;colName2,tableName2.colName1]
重要
  • 關閉特定欄位的過濾條件下推能力既支援對同一個資料庫中的表使用Hint,也支援對不同資料庫中的表使用Hint。當3.1.4以下版本,跨庫使用Hint時,需要保證兩個庫中的表名不同,否則Hint可能會影響到不需要生效的表。3.1.4及以上版本的Hint通過Schema.table區分不同表,對不同庫中相同表名的表使用Hint時,不會影響查詢結果。

  • 查詢核心版本的方法,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。

樣本

以3.1.4及以上的核心版本為例,當前叢集的所有查詢中,只要過濾條件包含資料庫test02的表table02中欄位id,該過濾條件就不下推。

set adb_config filter_not_pushdown_columns=[test02.table02:id]