Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Miglioramento dei piani di interrogazione di Aurora Postgres SQL
Migliora la gestione del piano di interrogazione valutando le prestazioni del piano e definendo i piani. Per ulteriori informazioni sul miglioramento dei piani di query, consulta i seguenti argomenti.
Valutazione delle prestazioni del piano
Dopo che l'ottimizzatore acquisisce i piani come non approvati, utilizza la funzione apg_plan_mgmt.evolve_plan_baselines
per confrontare i piani in base alle prestazioni effettive. A seconda dell'esito degli esperimenti sulle prestazioni, puoi modificare lo stato di un piano da non approvato ad approvato o rifiutato. Puoi invece decidere di utilizzare la funzione apg_plan_mgmt.evolve_plan_baselines
per disabilitare temporaneamente un piano se non soddisfa i requisiti.
Approvazione dei piani migliori
Nell'esempio seguente viene illustrato come modificare lo stato dei piani gestiti per l'approvazione utilizzando la funzione apg_plan_mgmt.evolve_plan_baselines
.
SELECT apg_plan_mgmt.evolve_plan_baselines ( sql_hash, plan_hash, min_speedup_factor := 1.0, action := 'approve' ) FROM apg_plan_mgmt.dba_plans WHERE status = 'Unapproved';
NOTICE: rangequery (1,10000)
NOTICE: Baseline [ Planning time 0.761 ms, Execution time 13.261 ms]
NOTICE: Baseline+1 [ Planning time 0.204 ms, Execution time 8.956 ms]
NOTICE: Total time benefit: 4.862 ms, Execution time benefit: 4.305 ms
NOTICE: Unapproved -> Approved
evolve_plan_baselines
-----------------------
0
(1 row)
L'output mostra un rapporto delle prestazioni per l'istruzione rangequery
con i binding di parametri 1 e 10.000. Il nuovo piano non approvato (Baseline+1
) è migliore del piano migliore approvato in precedenza (Baseline
). Per confermare che il nuovo piano è ora Approved
, controlla la visualizzazione apg_plan_mgmt.dba_plans
.
SELECT sql_hash, plan_hash, status, enabled, stmt_name FROM apg_plan_mgmt.dba_plans;
sql_hash | plan_hash | status | enabled | stmt_name
------------+-----------+----------+---------+------------
1984047223 | 512153379 | Approved | t | rangequery
1984047223 | 512284451 | Approved | t | rangequery
(2 rows)
Il piano gestito ora include due piani approvati che rappresentano la baseline del piano dell'istruzione. Puoi anche chiamare la funzione apg_plan_mgmt.set_plan_status
per impostare direttamente il campo di stato di un piano su 'Approved'
, 'Rejected'
, 'Unapproved'
o 'Preferred'
.
Rifiuto o disabilitazione dei piani più lenti
Per rifiutare o disabilitare i piani, passa 'reject'
o 'disable'
come parametro di operazione alla funzione apg_plan_mgmt.evolve_plan_baselines
. Questo esempio disabilita qualsiasi piano Unapproved
acquisito che è più lento per almeno il 10 percento del miglior piano Approved
per l'istruzione.
SELECT apg_plan_mgmt.evolve_plan_baselines(
sql_hash,
-- The managed statement ID
plan_hash,
-- The plan ID
1.1,
-- number of times faster the plan must be
'disable'
-- The action to take. This sets the enabled field to false.
) FROM apg_plan_mgmt.dba_plans WHERE status = 'Unapproved' AND
-- plan is Unapproved
origin = 'Automatic';
-- plan was auto-captured
Puoi anche impostare direttamente un piano su rifiutato o disabilitato. Per impostare direttamente il campo abilitato di un piano su true
o false
, chiama la funzione apg_plan_mgmt.set_plan_enabled
. Per impostare direttamente il campo di stato di un piano su 'Approved'
, 'Rejected'
, 'Unapproved'
o 'Preferred'
, chiama la funzione apg_plan_mgmt.set_plan_status
.
Per eliminare i piani non validi e che si prevede rimangano non validi, utilizza la funzione apg_plan_mgmt.validate_plans
. Questa funzione consente di eliminare o disabilitare i piani non validi. Per ulteriori informazioni, consulta Convalida dei piani.
Correzione dei piani mediante pg_hint_plan
L'ottimizzatore di query è progettato per trovare un piano ottimale per tutte le istruzioni e nella maggior parte dei casi trova un buon piano. Tuttavia, occasionalmente potresti realizzare che esiste un piano molto migliore di quello generato dall'ottimizzatore. Due modi consigliati per far sì che l'ottimizzatore generi il piano desiderato includono l'uso dell'pg_hint_plan
estensione o l'impostazione delle variabili Grand Unified Configuration (GUC) in Postgre: SQL
pg_hint_plan
estensione — Specificate un «suggerimento» per modificare il funzionamento del planner utilizzando l'estensione di Postgre. SQLpg_hint_plan
Per installare e ottenere ulteriori informazioni su come utilizzare l'estensionepg_hint_plan
, consulta la documentazione di pg_hint_plan. GUCvariabili: sostituisci uno o più parametri del modello di costo o altri parametri dell'ottimizzatore, come o.
from_collapse_limit
GEQO_threshold
Quando utilizzi una di queste tecniche per imporre all'ottimizzatore di query di utilizzare un piano, puoi utilizzare anche la gestione del piano di query per acquisire e imporre l'utilizzo del nuovo piano.
È possibile utilizzare l'pg_hint_plan
estensione per modificare l'ordine di join, i metodi di join o i percorsi di accesso per un'SQListruzione. Si utilizza un SQL commento con una pg_hint_plan
sintassi speciale per modificare il modo in cui l'ottimizzatore crea un piano. Ad esempio, si supponga che l'SQListruzione problem abbia un join bidirezionale.
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
Quindi, supponiamo che l'ottimizzatore scelga l'ordine di join (t1, t2), ma si sa che l'ordine di join (t2, t1) è più veloce. Il seguente hint forza l'ottimizzatore a utilizzare l'ordine di join più veloce, (t2, t1). Includi EXPLAIN in modo che l'ottimizzatore generi un piano per l'SQListruzione ma senza eseguirla. (output non mostrato).
/*+ Leading ((t2 t1)) */ EXPLAIN SELECT * FROM t1, t2 WHERE t1.id = t2.id;
I passaggi seguenti illustrano come utilizzare pg_hint_plan
.
Per modificare il piano generato dall'ottimizzatore e acquisire il piano utilizzando pg_hint_plan
-
Attivare la modalità di acquisizione manuale.
SET apg_plan_mgmt.capture_plan_baselines = manual;
-
Specificate un suggerimento per la SQL dichiarazione di interesse.
/*+ Leading ((t2 t1)) */ EXPLAIN SELECT * FROM t1, t2 WHERE t1.id = t2.id;
Al termine dell'esecuzione, l'ottimizzatore acquisisce il piano nella visualizzazione
apg_plan_mgmt.dba_plans
. Il piano acquisito non include la speciale sintassi dei commentipg_hint_plan
perché la gestione del piano di query normalizza l'istruzione rimuovendo i commenti iniziali. -
Visualizzare i piani gestiti utilizzando la visualizzazione
apg_plan_mgmt.dba_plans
.SELECT sql_hash, plan_hash, status, sql_text, plan_outline FROM apg_plan_mgmt.dba_plans;
Impostare lo stato del piano su
Preferred
. In questo modo si assicura che l'ottimizzatore scelga di eseguirlo invece di selezionare un piano dall'insieme dei piani approvati quando il piano a costo minimo non è giàApproved
oPreferred
.SELECT apg_plan_mgmt.set_plan_status(
sql-hash
,plan-hash
, 'preferred' );-
Disattivare l'acquisizione del piano manuale e applicare l'utilizzo dei piani gestiti.
SET apg_plan_mgmt.capture_plan_baselines = false; SET apg_plan_mgmt.use_plan_baselines = true;
Ora, quando viene eseguita l'SQListruzione originale, l'ottimizzatore sceglie un
Approved
piano or.Preferred
Se il piano a costo minimo non èApproved
oPreferred
, l'ottimizzatore sceglierà il pianoPreferred
.