日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

定制執(zhí)行計劃(pg_hint_plan)

RDS PostgreSQL提供pg_hint_plan插件,可以通過特殊的注釋語句提示,使PostgreSQL改變其既定的執(zhí)行計劃。

您可以加入RDS PostgreSQL插件交流釘釘群(103525002795),進(jìn)行咨詢、交流和反饋,獲取更多關(guān)于插件的信息。

前提條件

  • 實例大版本為RDS PostgreSQL 10或以上版本。

    說明

    如果無法創(chuàng)建該插件,請先升級內(nèi)核小版本

  • 使用該插件前,需要將pg_hint_plan加入到shared_preload_libraries參數(shù)中。

    您可以使用RDS PostgreSQL參數(shù)設(shè)置功能,為shared_preload_libraries參數(shù)添加pg_hint_plan。具體操作,請參見設(shè)置實例參數(shù)

  • 該插件無法在DMS上使用,請使用其他客戶端連接RDS PostgreSQL實例使用。

背景信息

PostgreSQL使用基于代價的優(yōu)化器,優(yōu)化路線使用統(tǒng)計數(shù)據(jù)而非固定的規(guī)則。對于一條SQL語句,優(yōu)化器會評估每一種可能的代價并最終選擇代價最低的去執(zhí)行,優(yōu)化器會盡力選擇最好的執(zhí)行計劃,但是由于其并不了解數(shù)據(jù)中可能存在的一些內(nèi)在連接關(guān)系,這些執(zhí)行計劃可能并不完美。使用pg_hint_plan插件以特殊的注釋形式來提示SQL語句應(yīng)該如何執(zhí)行,可以優(yōu)化執(zhí)行計劃。

注釋提示

pg_hint_plan的注釋以/*+開頭,以*/結(jié)束。提示語句包括提示名和接下來括號包裹的參數(shù),以空格作為分界。為了可讀性,每一個提示語句都可以重新?lián)Q行。

示例

HashJoin作為連接方法,并且使用序列掃描SeqScan來掃描表pgbench_accounts。

 /*+
    HashJoin(a b)
    SeqScan(a)
  */
 EXPLAIN SELECT *
    FROM pgbench_branches b
    JOIN pgbench_accounts a ON b.bid = a.bid
   ORDER BY a.aid;

返回如下結(jié)果:

                                      QUERY PLAN
---------------------------------------------------------------------------------------
 Sort  (cost=31465.84..31715.84 rows=100000 width=197)
   Sort Key: a.aid
   ->  Hash Join  (cost=1.02..4016.02 rows=100000 width=197)
         Hash Cond: (a.bid = b.bid)
         ->  Seq Scan on pgbench_accounts a  (cost=0.00..2640.00 rows=100000 width=97)
         ->  Hash  (cost=1.01..1.01 rows=1 width=100)
               ->  Seq Scan on pgbench_branches b  (cost=0.00..1.01 rows=1 width=100)
(7 rows)

提示表

雖然可以使用注釋提示的方式對SQL語句進(jìn)行提示,但是當(dāng)SQL語句不可編輯時,這種提示方式就很不方便。對于這種情況,可以將提示放在一張?zhí)厥獾谋韍int_plan.hints中。這個表包含了下列字段。

說明

創(chuàng)建pg_hint_plan插件的用戶默認(rèn)擁有提示表的權(quán)限,提示表的優(yōu)先權(quán)高于注釋提示。

字段

描述

id

提示ID號,唯一且自動填充。

norm_query_string

與要提示的查詢匹配的模式。查詢中的常量必須替換為?。空格在模式中很重要。

application_name

應(yīng)用會話的名稱,置空表示任意應(yīng)用。

hints

提示語句,不需要注釋標(biāo)記。

示例命令如下:

INSERT INTO hint_plan.hints(norm_query_string, application_name, hints)
    VALUES (
        'EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;',
        '',
        'SeqScan(t1)'
    );
INSERT 0 1
postgres=# UPDATE hint_plan.hints
postgres-#    SET hints = 'IndexScan(t1)'
postgres-#  WHERE id = 1;
UPDATE 1
postgres=# DELETE FROM hint_plan.hints
postgres-#  WHERE id = 1;
DELETE 1

提示類型

根據(jù)提示短語影響執(zhí)行計劃的方式,可以分為如下六類:

  • 掃描方法提示

    掃描方法提示對目標(biāo)表強(qiáng)制執(zhí)行特定的掃描方法。pg_hint_plan通過表格的別名(如果存在的話)來識別目標(biāo)表。掃描方法是SeqScanIndexScanNoSeqScan等。

    掃描提示對普通表、繼承表、無日志表、臨時表和系統(tǒng)表有效,對外部表、表函數(shù)、常量值語句、通用表達(dá)式、視圖和子查詢無效。

    示例命令如下:

    /*+
        SeqScan(t1)
        IndexScan(t2 t2_pkey)
     */
    SELECT * FROM table1 t1 JOIN table table2 t2 ON (t1.key = t2.key);
  • 連接方法提示

    連接方法提示強(qiáng)制指定相關(guān)表格聚合在一起的方法。

    連接方法提示對普通表 、繼承表、無日志表、臨時表、外部表、系統(tǒng)表、表函數(shù)、常量值命令和通用表達(dá)式有效,對視圖和子查詢無效。

  • 連接順序提示

    連接順序提示指定兩個或多個表的連接順序。這里有兩種強(qiáng)制指定方法:

    • 強(qiáng)制執(zhí)行特定的連接順序,但不限制每個連接級別的方向。

    • 強(qiáng)制連接方向。

    示例命令如下:

    /*+
        NestLoop(t1 t2)
        MergeJoin(t1 t2 t3)
        Leading(t1 t2 t3)
     */
    SELECT * FROM table1 t1
        JOIN table table2 t2 ON (t1.key = t2.key)
        JOIN table table3 t3 ON (t2.key = t3.key);
  • 行號糾正提示

    行號糾正提示會糾正由于計劃器限制而導(dǎo)致的行號錯誤。

    示例命令如下:

    /*+ Rows(a b #10) */ SELECT... ;     //設(shè)置連接結(jié)果的行號為10。
    /*+ Rows(a b +10) */ SELECT... ;     //行號增加10。
    /*+ Rows(a b -10) */ SELECT... ;     //行號減去10。
    /*+ Rows(a b *10) */ SELECT... ;     //將行號擴(kuò)大至原來的10倍。
  • 并行執(zhí)行提示

    并行提示會指定并行的執(zhí)行計劃。

    并行執(zhí)行提示對普通表、繼承表、無日志表和系統(tǒng)表有效,對外部表、常量從句、通用表達(dá)式、視圖和子查詢無效。視圖的內(nèi)部表可以通過其真實名稱或別名指定目標(biāo)對象。

    下面兩個示例說明在每個表上執(zhí)行查詢的方式不同:

    • 方式一

      explain /*+ Parallel(c1 3 hard) Parallel(c2 5 hard) */
             SELECT c2.a FROM c1 JOIN c2 ON (c1.a = c2.a);

      返回如下結(jié)果:

                                        QUERY PLAN                                   
      -------------------------------------------------------------------------------
       Hash Join  (cost=2.86..11406.38 rows=101 width=4)
         Hash Cond: (c1.a = c2.a)
         ->  Gather  (cost=0.00..7652.13 rows=1000101 width=4)
               Workers Planned: 3
               ->  Parallel Seq Scan on c1  (cost=0.00..7652.13 rows=322613 width=4)
         ->  Hash  (cost=1.59..1.59 rows=101 width=4)
               ->  Gather  (cost=0.00..1.59 rows=101 width=4)
                     Workers Planned: 5
                     ->  Parallel Seq Scan on c2  (cost=0.00..1.59 rows=59 width=4)
    • 方式二

      EXPLAIN /*+ Parallel(tl 5 hard) */ SELECT sum(a) FROM tl;

      返回如下結(jié)果:

                                          QUERY PLAN                                  
      -----------------------------------------------------------------------------------
       Finalize Aggregate  (cost=693.02..693.03 rows=1 width=8)
         ->  Gather  (cost=693.00..693.01 rows=5 width=8)
               Workers Planned: 5
               ->  Partial Aggregate  (cost=693.00..693.01 rows=1 width=8)
                     ->  Parallel Seq Scan on tl  (cost=0.00..643.00 rows=20000 width=4)
  • 設(shè)置臨時GUC參數(shù)

    在計劃的時候臨時改變GUC參數(shù)。執(zhí)行計劃中的GUC參數(shù)會有預(yù)期的效果,除非提示語句與其他計劃沖突。同樣的GUC參數(shù)設(shè)置以最后一次為準(zhǔn)。

    示例命令如下:

    /*+ Set(random_page_cost 2.0) */
    SELECT * FROM table1 t1 WHERE key = 'value';

所有提示支持的格式如下表。

類別

格式

說明

掃描方法提示

SeqScan(table)

強(qiáng)制序列掃描。

TidScan(table)

強(qiáng)制TID掃描。

IndexScan(table[ index...])

強(qiáng)制索引掃描,可以指定某個索引。

IndexOnlyScan(table[ index...])

強(qiáng)制僅使用索引掃描,可以指定某個索引。

BitmapScan(table[ index...])

強(qiáng)制使用Bitmap掃描。

NoSeqScan(table)

強(qiáng)制不使用序列掃描。

NoTidScan(table)

強(qiáng)制不使用TID掃描。

NoIndexScan(table)

強(qiáng)制不使用索引掃描。

NoIndexOnlyScan(table)

強(qiáng)制不使用索引掃描,僅掃描表。

NoBitmapScan(table)

強(qiáng)制不使用Bitmap掃描。

連接方法提示

NestLoop(table table[ table...])

強(qiáng)制使用嵌套循環(huán)連接。

HashJoin(table table[ table...])

強(qiáng)制使用散列連接。

MergeJoin(table table[ table...])

強(qiáng)勢使用合并連接。

NoNestLoop(table table[ table...])

強(qiáng)制不使用嵌套循環(huán)連接。

NoHashJoin(table table[ table...])

強(qiáng)制不使用散列連接。

NoMergeJoin(table table[ table...])

強(qiáng)制不使用合并連接。

連接順序提示

Leading(table table[ table...])

強(qiáng)制連接的順序。

Leading(<join pair>)

強(qiáng)制連接的順序和方向。

行號糾正提示

Rows(table table[ table...] correction)

糾正由指定表組成的聯(lián)接結(jié)果的行號。可用的校正方法為絕對值#<n>、加法+ <n>、減法-<n>和乘法* <n><n>是strtod函數(shù)可以讀取的數(shù)字。

并行執(zhí)行提示

Parallel(table <# of workers> [soft|hard])

強(qiáng)制或禁止并行執(zhí)行指定表。 <worker#>是所需的并行工作程序數(shù)量,0表示禁止并行執(zhí)行。

第三個參數(shù)如果是soft(默認(rèn)),表示僅更改max_parallel_workers_per_gather并將其他所有內(nèi)容留給計劃器選擇; 如果是hard,表示所有相關(guān)參數(shù)都會被強(qiáng)制指定。

設(shè)置臨時GUC參數(shù)

Set(GUC-param value)

規(guī)劃器運行時,將GUC參數(shù)設(shè)置為該值。

更多pg_hint_plan的介紹請參見PostgreSQL官方文檔