İstatistikleri pending olarak topla, test et ve yayınla
OracleİstatistikKomut
-- 1) Tablo icin yayinlamayi kapat (yeni istatistik pending'e gider):
EXEC DBMS_STATS.SET_TABLE_PREFS('MUSTERI_APP', 'SIPARIS', 'PUBLISH', 'FALSE');
EXEC DBMS_STATS.GATHER_TABLE_STATS('MUSTERI_APP', 'SIPARIS');
-- 2) Pending ve yayindaki degerleri karsilastir:
SELECT owner, table_name, partition_name, num_rows,
TO_CHAR(last_analyzed,'YYYY-MM-DD HH24:MI') AS last_analyzed
FROM dba_tab_pending_stats
WHERE owner = 'MUSTERI_APP';
SELECT num_rows, last_analyzed FROM dba_tables
WHERE owner = 'MUSTERI_APP' AND table_name = 'SIPARIS';
-- 3) Yalnizca bu session'da pending istatistiklerle planlari dene:
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;
EXPLAIN PLAN FOR SELECT COUNT(*) FROM musteri_app.siparis WHERE durum = 7;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(format => 'BASIC +ROWS'));
ALTER SESSION SET optimizer_use_pending_statistics = FALSE;
-- 4a) Iyiyse yayinla:
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('MUSTERI_APP', 'SIPARIS', no_invalidate => FALSE);
-- 4b) Kotuyse at:
-- EXEC DBMS_STATS.DELETE_PENDING_STATS('MUSTERI_APP', 'SIPARIS');
-- 5) Normal davranisa don:
EXEC DBMS_STATS.SET_TABLE_PREFS('MUSTERI_APP', 'SIPARIS', 'PUBLISH', 'TRUE');Ne yapar?
PUBLISH=FALSE tercihiyle toplanan istatistikler sözlüğe değil pending alanına yazılır; diğer session'lar etkilenmez. Test session'ında optimizer_use_pending_statistics ile planlar doğrulanır, sonra tek komutla yayınlanır veya atılır.
Ne zaman kullanılır?
Kritik OLTP tablolarında istatistik yenilemesinin planlara etkisini canlıda risksiz denemek için; büyük veri yüklemesi sonrası kontrollü geçişte.
Dikkat
Lisans gerektirmez. PUBLISH=FALSE kaldığı sürece otomatik görevin topladıkları da pending'de birikir ve hiç yayınlanmaz; işin sonunda tercihi TRUE'ya döndürmeyi unutma. EXPLAIN PLAN tahmindir; mümkünse sorguyu gerçekten çalıştırıp DISPLAY_CURSOR ile bak.