क्वेरी स्टोर योजना मजबूर करने से माध्यमिक पर प्रश्न प्रभावित नहीं होते हैं
प्राथमिक पर एक योजना को लागू करने के लिए क्वेरी स्टोर का उपयोग करना निश्चित रूप से ऐसा लगता है कि यह माध्यमिक पर योजना को मजबूर करता है।
मैंने एक गैर-ठेस सर्वर पर एक क्वेरी चलाने की कोशिश की, और फिर क्वेरी स्टोर को फ्लश करने के साथ sp_query_store_flush_db
(जो कि माध्यमिक में डेटा को सिंक करने के लिए आवश्यक था)। यहां बाईं ओर माध्यमिक है ("केवल पढ़ने के लिए" के बारे में परिकल्पित चेतावनी पर ध्यान दें), और दाईं ओर प्राथमिक:
अब मैं दाईं ओर "Force Plan" पर क्लिक करूंगा, और फिर दोनों दृश्य ताज़ा करूंगा:
तो "मजबूर" कम से कम अंतर्निहित क्वेरी स्टोर तालिकाओं में किया जाता है। यह समझ में आता है, यह देखते हुए कि ओपी में उद्धृत लेख इस बात को स्पष्ट करते हैं कि फेलओवर के बाद क्वेरी की बाध्यता को यथावत रहना चाहिए:
प्रश्न: क्या QDS प्राथमिक प्रतिकृति से द्वितीयक प्रतिकृति तक डेटाबेस विफलता का पता लगा सकते हैं?
उत्तर: हाँ, QDS sys.query_store_plan तालिका में योजना संबंधी जानकारी संग्रहीत करता है, इसलिए विफलता के मामले में आपको नए प्राथमिक पर समान व्यवहार दिखाई देता रहेगा।
लेकिन क्या जबरदस्ती का व्यवहार वास्तव में होता है? अब मैं दोनों सर्वर पर एक ही क्वेरी चलाऊंगा। उम्मीद के मुताबिक प्राथमिक, "UsePlan" विशेषता एक्सएमएल योजना में है:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
CompileCPU="78" CompileMemory="2104" UsePlan="true">
और UI में:
द्वितीयक पर (विभिन्न सर्वर नाम पर ध्यान दें), योजना को मजबूर नहीं किया गया था । यहाँ एक ही योजना XML स्निपेट है:
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32"
CompileCPU="28" CompileMemory="1656">
योजना मार्गदर्शिकाएँ माध्यमिक पर प्रश्नों को प्रभावित नहीं करती हैं
मैंने इस कोड का उपयोग करके प्राथमिक पर एक योजना मार्गदर्शिका बनाई (तालिका नाम निर्दोष की रक्षा के लिए बदल दिए गए):
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)';
योजना गाइड, निश्चित रूप से, प्राथमिक पर प्रभावी थी, जैसा कि निष्पादन योजना द्वारा स्पष्ट किया गया था:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>
मैंने इस बिंदु पर पुष्टि की कि योजना मार्गदर्शिका को माध्यमिक में दोहराया गया था।
द्वितीयक पर समान क्वेरी चल रही है, निष्पादन योजना एक योजना गाइड द्वारा मजबूर होने के सभी संकेतों को याद कर रही है:
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA"
RetrievedFromCache="true" SecurityPolicyApplied="false">