DBAtlas · Veritabanı operasyon atlası

Cursor cache'teki iyi planı SQL Plan Baseline olarak yükle

OraclePerformans

Komut

-- 1) SQL'in planlarini ve performansini karsilastir:
SELECT sql_id, child_number, plan_hash_value, executions,
       ROUND(elapsed_time/1e3/NULLIF(executions,0),1) AS ms_per_exec,
       sql_plan_baseline
FROM   v$sql
WHERE  sql_id = '<sql_id>';

-- 2) Secilen planı baseline olarak yukle:
SET SERVEROUTPUT ON
DECLARE
  n PLS_INTEGER;
BEGIN
  n := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
         sql_id          => '<sql_id>',
         plan_hash_value => <plan_hash_value>,
         fixed           => 'NO',
         enabled         => 'YES');
  DBMS_OUTPUT.PUT_LINE(n || ' plan yuklendi');
END;
/

-- 3) Baseline'i dogrula:
SELECT sql_handle, plan_name, origin, enabled, accepted, fixed, reproduced,
       TO_CHAR(last_executed,'YYYY-MM-DD HH24:MI') AS last_exec
FROM   dba_sql_plan_baselines
WHERE  signature = (SELECT exact_matching_signature FROM v$sql
                    WHERE sql_id = '<sql_id>' AND ROWNUM = 1);
-- Sonraki calistirmalarda v$sql.sql_plan_baseline dolu olmali.

Ne yapar?

SQL Plan Management ile seçilen planı kabul edilmiş (ACCEPTED) baseline yapar; optimizer artık yalnızca baseline'daki kabul edilmiş planları kullanır, yeni bulduğu planları evolve edilene kadar beklemeye alır.

Ne zaman kullanılır?

Plan regresyonunda bilinen iyi plana dönmek için, upgrade/istatistik değişikliği öncesi kritik SQL'lerin planlarını korumak için.

Dikkat

Enterprise Edition'da ek lisans gerekmez (SE2'de SQL başına tek baseline planı ile sınırlıdır). ADMINISTER SQL MANAGEMENT OBJECT yetkisi gerekir. Baseline, SQL metninin birebir aynısına (signature) uygulanır; literal kullanan SQL'lerde işe yaramaz. Planda kullanılan index düşürülürse plan üretilemez (REPRODUCED=NO) ve optimizer serbest kalır. OPTIMIZER_USE_SQL_PLAN_BASELINES=TRUE olmalı (varsayılan).

DBAtlas'ta aç →

İlgili