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:
Şimdi sağdaki "Zorla Planı" nı tıklayıp her iki görünümü de yenileyeceğim:
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:
İ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">
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" ...>
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">