Okunabilir ikincil mecralarda zorunlu planlar


14

Bir plan bir Kullanılabilirlik Grubundaki birincil için zorunlu tutulursa, ikincil bir alanda yürütülen sorgulara uygulanır mı?

Her iki plan zorlama olasılığını da içeren cevaplar arıyorum:

QS zorla planlarının devam etmediğini, ancak dokümantasyonda yetkili bir şey bulamadığını veya plan kılavuzları hakkında bir şey bulamadığını gösteren aşağıdakileri okudum.

Varlığı olacağını zorlama kesin kanıt Use Planveya PlanGuideNameve PlanGuideDBikincil yürütme planında özellikleri.

Yanıtlar:


18

Sorgu Deposu planı zorlaması ikincil alandaki sorguları ETKİLEMEZ

Bir planı birincil plana zorlamak için Sorgu Deposu'nu kullanmak kesinlikle planı ikincil plana zorlamak gibi görünüyor .

Prod olmayan bir sunucuda bir sorgu çalışan ve sonra sp_query_store_flush_db(hangi ikincil arasında eşitlemek için veri almak için gerekli) ile sorgu deposu kızarma denedim . Soldaki ikincil kısım ("salt okunur" olma konusundaki daire şeklinde uyarıyı ve sağdaki birincil notu not edin:

query store UI ekran görüntüsü

Şimdi sağdaki "Zorla Planı" nı tıklayıp her iki görünümü de yenileyeceğim:

her iki zorunlu planı gösteren sorgu deposu kullanıcı arayüzünün ekran görüntüsü

Yani "zorlama" en azından altta yatan Sorgu Deposu tablolarında taşınır. Bu, OP'de alıntılanan makalelerin, sorgu zorlamanın bir yük devretme sonrasında yerinde kalması gerektiği noktasını ifade ettiği düşünüldüğünde mantıklıdır:

Soru: Veritabanı Birincil çoğaltmadan ikincil Çoğaltma'ya yük devretme sırasında QDS, FORCED Plan bilgilerini tutacak mı?

Yanıt: Evet, QDS Zorunlu Plan bilgilerini sys.query_store_plan tablosunda depolar, bu nedenle yük devretme durumunda yeni Birincil'de aynı davranışı görmeye devam edersiniz.

Peki zorlama davranışı gerçekten gerçekleşiyor mu? Şimdi aynı sorguyu her iki sunucuda da çalıştıracağım. Birincil olarak, beklendiği gibi, "UsePlan" özniteliği plan XML'sinde bulunur:

<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
           CompileCPU="78" CompileMemory="2104" UsePlan="true">

Ve kullanıcı arayüzünde:

SSMS'deki yürütme planının "kullanım planı" özelliğini gösteren ekran görüntüsü

İkincil bilgisayarda (farklı sunucu adını not edin) plan zorlanmadı . Aynı plan XML snippet'i:

<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32" 
           CompileCPU="28" CompileMemory="1656">

"kullanım planı" özelliğini göstermeyen SSMS'deki yürütme planının ekran görüntüsü

Plan Kılavuzları ikincil alandaki sorguları ETKİLEMEZ

Ben bu kodu (tablo isimleri masum korumak için değiştirildi) kullanarak birincil plan planı oluşturdu:

EXEC sp_create_plan_guide 
    @name = 'plan-guide-test',
    @stmt = N'SELECT TOP (1000) * 
FROM dbo.TableName t 
WHERE 
    NOT EXISTS 
    (
        SELECT NULL 
        FROM dbo.OtherTable o 
        WHERE t.Id = o.TableName
    );',
    @type = N'SQL',
    @module_or_batch = NULL,
    @hints = N'OPTION (MAXDOP 1)';

Plan rehberi, elbette, yürütme planının da gösterdiği gibi, birincil üzerinde etkiliydi:

<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
            PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>

SSMS'deki yürütme planının ekran rehberi özelliklerini gösteren ekran görüntüsü

Bu noktada plan rehberinin ikinciye çoğaltıldığını doğruladım.

İkincide aynı sorguyu çalıştıran yürütme planında, bir plan kılavuzu tarafından zorlandığının tüm işaretleri eksik:

<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
            QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA" 
            RetrievedFromCache="true" SecurityPolicyApplied="false">

XML'de yürütme planının eksik plan kılavuzu özniteliklerine sahip ekran görüntüsü

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.