では、テーブルサイズまたは実行計画のコストに基づいてePQを使用するかどうかを決定できます。
背景情報
ePQは、実行時間が長い複雑なOLAPクエリを処理するのに適していますが、実行時間が短い単純なOLTPクエリには適していません。 短期間のクエリでは、接続の確立、データの交換、計算ノード間の接続の解放のオーバーヘッドがパフォーマンスを低下させます。 では、テーブルサイズまたは実行計画のコストに基づいてePQを使用するかどうかを決定できるため、パフォーマンスを向上させるための適切な実行モードを選択できます。
注意事項
コストしきい値とテーブルサイズしきい値は、次のオブジェクトまたは操作に対してのみ指定できます。
共通テーブル
パーティション分割されたテーブル
具体化されたビュー
ePQヒントなしのクエリ (
/* + PX() */)
Parameters
パラメーター | 説明 |
polar_px_min_pg_plan_cost | ePQを有効にするための実行プランの最小コスト。 有効な値: 0 ~ 999999999999 デフォルト値: 50000 ePQは、単一ノードの実行プランコストのコストがこのしきい値未満の場合、無効になります。 |
polar_px_min_table_scan_size | ePQを有効にするための最小テーブルサイズ。 有効な値: 0 ~ 2147483647 デフォルト値: 100 MB。 クエリに含まれるすべてのテーブルのサイズがこのしきい値未満の場合、ePQは無効になります。 |
polar_px_force_use | クエリにePQを強制するかどうかを指定します。 有効な値:
|
使用法
データを準備します。
CREATE TABLEテスト (id INT); INSERT INTOテストSELECT generate_series(1、1000); 分析テスト;実行計画のコストを照会します。
ePQを明示的に無効にし、単一のノードで実行プランを照会します。
SET polar_enable_pxオフ; テストからの選択カウント (*) を説明します。 クエリ計画 -------------------------------------------------------------- 集計 (コスト=17.50 .. 17.51行=1幅=8) -> Seqテストでスキャン (コスト=0.00 .. 15.00行=1000幅=0) (2行)上記の実行計画では、各行の
cost=xxx .. xxxは、現在の演算子の推定実行コストを示します。 起動コストは前に表示されます..そして総費用はそれの後に表示されます。 最上位の演算子の総コストは、このクエリの総実行コストと見なすことができます。 たとえば、前の実行プランの17.51は合計実行コストです。 単一ノードの実行プランの合計コストは、polar_px_min_pg_plan_costパラメーターで定義されたコストしきい値よりも低いため、ePQが有効になっていてもePQは使用されません。SET polar_enable_pxをオンにします。テストからの選択カウント (*) を説明します。 クエリ計画 -------------------------------------------------------------- 集計 (コスト=17.50 .. 17.51行=1幅=8) -> Seqテストでスキャン (コスト=0.00 .. 15.00行=1000幅=0) (2行)テーブルサイズを照会します。
pg_relation_size関数を使用して、テーブルサイズを照会できます。SELECT pg_size_pretty(pg_relation_size('test')); pg_size_pretty ---------------- 40 kB (1行)上記の結果は、
testテーブルのサイズが40 kBであることを示しています。これは、polar_px_min_table_scan_sizeパラメーターで定義されたテーブルサイズのしきい値よりも低くなっています。 したがって、ePQが有効になっている場合でも、テストテーブルのみを参照するクエリではePQは使用されません。SET polar_enable_pxをオンにします。テストAS a、テストAS b、テストAS cからの選択カウント (*) WHERE a.id > b.id AND b.id > c.id; クエリ計画 ---------------------------------------------------------------------------------- 集計 (コスト=5292822.50 .. 5292822.51行=1幅=8) -> ネストされたループ (コスト=0.00 .. 5015045.00行=111111000幅=0) 参加フィルター :( b.id > c.id) -> ネストされたループ (コスト=0.00 .. 15032.50行=333333幅=4) 参加フィルター :( a.id > b.id) -> Seqテストaのスキャン (コスト=0.00 .. 15.00行=1000幅=4) -> マテリアライズ (コスト=0.00 .. 20.00行=1000幅=4) -> Seqスキャンテストb (コスト=0.00 .. 15.00行=1000幅=4) -> マテリアライズ (コスト=0.00 .. 20.00行=1000幅=4) -> Seqテストcのスキャン (コスト=0.00 .. 15.00行=1000幅=4) (10行)指定されたしきい値を無視します。
コストしきい値とテーブルサイズしきい値を無視するには、
polar_px_force_useパラメーターを使用してクエリにePQを強制します。SET polar_enable_pxをオンにします。polar_px_force_useをオンに設定します。テストからの選択カウント (*) を説明します。 クエリ計画 ------------------------------------------------------------------------------------- 集計の完了 (コスト=0.00 .. 431.00行=1幅=8) -> PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 431.00行=1幅=8) -> 部分集約 (コスト=0.00 .. 431.00行=1幅=8) -> 部分Seqテストスキャン (コスト=0.00 .. 431.00行=167幅=1) Optimizer: PolarDB PX Optimizer (5行)データを挿入し、実行計画のコストを照会します。
ePQを有効にするための条件を満たすようにテーブルにデータを挿入します。
INSERT INTOテストSELECT generate_series(1、10000000); 分析テスト;testテーブルのサイズが、polar_px_min_table_scan_sizeパラメーターで定義された最小テーブルサイズを超えています。SELECT pg_size_pretty(pg_relation_size('test')); pg_size_pretty ---------------- 348 MB (1行)実行プランのコストも、
polar_px_min_pg_plan_costパラメーターで定義された最小コストを超えています。SET polar_enable_pxオフ; テストからの選択カウント (*) を説明します。 クエリ計画 ----------------------------------------------------------------------------------------- 集計の完了 (コスト=97621.42 .. 97621.43行=1幅=8) -> 収集 (コスト=97621.21 .. 97621.42行=2幅=8) Workers Planned: 2 -> 部分集約 (コスト=96621.21 .. 96621.22行=1幅=8) -> テスト時のパラレルSeqスキャン (コスト=0.00 .. 86205.77行=4166177幅=0) (5行)ePQが有効になっている場合、上記のクエリにはePQが使用されます。
SET polar_enable_pxをオンにします。polar_px_force_useをオフに設定します。テストからの選択カウント (*) を説明します。 クエリ計画 -------------------------------------------------------------------------------------- 集計の完了 (コスト=0.00 .. 470.76行=1幅=8) -> PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 470.76行=1幅=8) -> 部分集約 (コスト=0.00 .. 470.76行=1幅=8) -> 部分Seqテストスキャン (コスト=0.00 .. 467.66行=1666471幅=1) Optimizer: PolarDB PX Optimizer (5行)