कैश (आलसी स्पूल) सीटीई परिणाम के लिए एक योजना गाइड बनाएं


19

मैं सामान्य रूप से पहले एक क्वेरी का निर्माण करके योजना गाइड बनाता हूं जो सही योजना का उपयोग करता है, और इसे उसी क्वेरी के पार कॉपी करता है जो नहीं करता है। हालांकि, कभी-कभी यह मुश्किल होता है, खासकर अगर क्वेरी बिल्कुल समान नहीं है। खरोंच से योजना गाइड बनाने का सही तरीका क्या है?

SQLKiwi ने SSIS में योजनाओं का उल्लेख किया है, SQL सर्वर के लिए एक अच्छी योजना बनाने में सहायता करने का एक तरीका या उपयोगी उपकरण है?

प्रश्न में विशिष्ट उदाहरण यह CTE: SQLFiddle है

with cte(guid,other) as (
  select newid(),1 union all
  select newid(),2 union all
  select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other;

क्या परिणाम बनाने का कोई तरीका है जो बिल्कुल 3 अलग-अलग है guidऔर अधिक नहीं है? मैं CTE- प्रकार के प्रश्नों के साथ योजना गाइडों को शामिल करके भविष्य में बेहतर उत्तर देने में सक्षम होने की उम्मीद कर रहा हूं, जो कुछ SQL सर्वर CTE quirks को दूर करने के लिए कई बार संदर्भित होते हैं।


जवाबों:


14

क्या परिणाम बनाने के लिए कोई तरीका है जो वास्तव में 3 अलग-अलग गाइड के साथ आता है और अधिक नहीं? मैं CTE- प्रकार के प्रश्नों के साथ योजना गाइडों को शामिल करके भविष्य में बेहतर उत्तर देने में सक्षम होने की उम्मीद कर रहा हूं, जो कुछ SQL सर्वर CTE quirks को दूर करने के लिए कई बार संदर्भित होते हैं।

आज नहीं। गैर-पुनरावर्ती सामान्य टेबल एक्सप्रेशन (CTE) को इन-लाइन व्यू डेफिनेशन के रूप में माना जाता है और ऑप्टिमाइज़ेशन से पहले उनके द्वारा संदर्भित प्रत्येक स्थान पर तार्किक क्वेरी ट्री में विस्तारित किया जाता है। आपकी क्वेरी के लिए तार्किक पेड़ है:

LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC 
    LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
        LogOp_Join
            LogOp_ViewAnchor
                LogOp_UnionAll
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const

            LogOp_ViewAnchor
                LogOp_UnionAll
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
                    LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const

अनुकूलन शुरू होने से पहले दो दृश्य एंकर और छह कॉल को आंतरिक फ़ंक्शन पर ध्यान दें newid। फिर भी, बहुत से लोग मानते हैं कि आशावादी को यह पहचानने में सक्षम होना चाहिए कि विस्तारित उप-पेड़ मूल रूप से एक संदर्भित वस्तु थे और तदनुसार सरल थे। सीटीई या व्युत्पन्न तालिका के स्पष्ट भौतिककरण की अनुमति देने के लिए कई कनेक्ट अनुरोध भी किए गए हैं।

एक अधिक सामान्य कार्यान्वयन से CASEआशावादी को प्रदर्शन में सुधार करने के लिए मनमाने ढंग से सामान्य अभिव्यक्तियों को अमल में लाने पर विचार करना होगा ( एक उपश्रेणी एक और उदाहरण है जहां समस्याएं आज हो सकती हैं)। माइक्रोसॉफ्ट रिसर्च ने 2007 में उस बैक पर एक पेपर (पीडीएफ) प्रकाशित किया , हालांकि यह आज तक लागू नहीं है। कुछ समय के लिए, हम टेबल चर और अस्थायी तालिकाओं जैसी चीजों का उपयोग करके स्पष्ट भौतिकता तक सीमित हैं।

SQLKiwi ने SSIS में योजनाओं का उल्लेख किया है, SQL सर्वर के लिए एक अच्छी योजना बनाने में सहायता करने का एक तरीका या उपयोगी उपकरण है?

यह सिर्फ मेरी ओर से इच्छाधारी सोच थी, और योजना गाइडों को संशोधित करने के विचार से परे थी। यह संभव है, सिद्धांत रूप में, शो प्लान एक्सएमएल को सीधे हेरफेर करने के लिए एक उपकरण लिखने के लिए, लेकिन टूल का उपयोग करने वाले विशिष्ट ऑप्टिमाइज़र इंस्ट्रूमेंटेशन के बिना उपयोगकर्ता के लिए एक निराशाजनक अनुभव होगा (और डेवलपर इसके बारे में सोचते हैं)।

इस प्रश्न के विशेष संदर्भ में, ऐसा उपकरण अभी भी सीटीई सामग्री को इस तरह से उपयोग करने में असमर्थ होगा जो कई उपभोक्ताओं द्वारा उपयोग किया जा सकता है (इस मामले में क्रॉस में शामिल होने के लिए दोनों इनपुटों को खिलाने के लिए)। आशावादी और निष्पादन इंजन बहु-उपभोक्ता स्पूल का समर्थन करते हैं, लेकिन केवल विशिष्ट उद्देश्यों के लिए - जिनमें से कोई भी इस विशेष उदाहरण पर लागू नहीं किया जा सकता है।

हालांकि मैं निश्चित नहीं हूं, मेरे पास एक काफी मजबूत कूबड़ है जिसे RelOps का पालन किया जा सकता है (नेस्टेड लूप, लेज़ी स्पूल) भले ही क्वेरी योजना के समान नहीं है - उदाहरण के लिए यदि आपने CTE में 4 और 5 जोड़ा है , यह अभी भी उसी योजना (प्रतीत होता है - SQL सर्वर 2012 RTM एक्सप्रेस पर परीक्षण) का उपयोग करना जारी रखता है।

यहां उचित मात्रा में लचीलापन है। एक्सएमएल योजना के व्यापक आकार का उपयोग अंतिम योजना की खोज को निर्देशित करने के लिए किया जाता है (हालांकि कई विशेषताओं को पूरी तरह से अनदेखा किया जाता है जैसे एक्सचेंजों पर विभाजन प्रकार) और सामान्य खोज नियमों के साथ-साथ काफी आराम भी किया जाता है। उदाहरण के लिए, लागत के आधार पर विकल्पों के प्रारंभिक छंटाई को अक्षम किया गया है, क्रॉस जॉइन के स्पष्ट परिचय की अनुमति है, और स्केलर संचालन को अनदेखा किया जाता है।

वहाँ गहराई में में जाने के लिए भी कई जानकारी दी जा रही है, लेकिन फिल्टर और कंप्यूट Scalars की नियुक्ति के लिए मजबूर नहीं किया जा सकता है, और फार्म की विधेय column = valueतो एक योजना को शामिल करते सामान्यीकृत कर रहे हैं X = 1या X = @Xयुक्त एक प्रश्न के लिए लागू किया जा सकता है X = 502या X = @Y। यह विशेष लचीलापन एक प्राकृतिक योजना को मजबूर करने में बहुत मदद कर सकता है।

विशिष्ट उदाहरण में, निरंतर संघ सभी को हमेशा एक निरंतर स्कैन के रूप में लागू किया जा सकता है; यूनियन ऑल के इनपुट की संख्या कोई मायने नहीं रखती है।


3

सीटीई के दोनों घटनाओं के लिए एक एकल स्पूल का फिर से उपयोग करने के लिए कोई रास्ता नहीं है (2012 तक एसक्यूएल सर्वर संस्करण)। विवरण SQLKiwi के उत्तर में पाया जा सकता है। आगे सीटीई को दो बार भौतिक करने के दो तरीके हैं, जो क्वेरी की प्रकृति के लिए अपरिहार्य है। दोनों विकल्पों का परिणाम 6 के शुद्ध अलग-अलग गाइड में होता है।

मार्टिन की टिप्पणी से लिंक के बारे में क्वासोई की साइट पर एक ब्लॉग पर सीटीई का मार्गदर्शन करने की योजना इस सवाल के लिए आंशिक प्रेरणा थी। यह एक सहसंबद्ध उपसमिति के उद्देश्य के लिए सीटीई को उत्प्रेरित करने का एक तरीका बताता है, जिसे केवल एक बार संदर्भित किया जाता है, हालांकि सहसंबंध इसका कई बार मूल्यांकन करने का कारण बन सकता है। यह प्रश्न में क्वेरी पर लागू नहीं होता है।

विकल्प 1 - योजना गाइड

SQLKiwi के जवाब से संकेत लेते हुए, मैंने एक नंगे न्यूनतम के लिए गाइड को नीचे कर दिया है जो अभी भी काम करेगा, जैसे ConstantScanनोड्स केवल 2 स्केलर ऑपरेटरों को सूचीबद्ध करते हैं जो किसी भी संख्या में पर्याप्त रूप से विस्तार कर सकते हैं।

;with cte(guid,other) as (
  select newid(),1 union all
  select newid(),2 union all
  select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other
OPTION(USE PLAN
N'<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="11.0.2100.60" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="1600" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.0444433" StatementText="with cte(guid,other) as (&#xD;&#xA;  select newid(),1 union all&#xD;&#xA;  select newid(),2 union all&#xD;&#xA;  select newid(),3&#xD;&#xA;select a.guid, a.other, b.guid guidb, b.other otherb&#xD;&#xA;from cte a&#xD;&#xA;cross join cte b&#xD;&#xA;order by a.other, b.other;&#xD;&#xA;" StatementType="SELECT" QueryHash="0x43D93EF17C8E55DD" QueryPlanHash="0xF8E3B336792D84" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan NonParallelPlanReason="EstimatedDOPIsOne" CachedPlanSize="96" CompileTime="13" CompileCPU="13" CompileMemory="1152">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="157240" EstimatedPagesCached="1420" EstimatedAvailableDegreeOfParallelism="1" />
            <RelOp AvgRowSize="47" EstimateCPU="0.006688" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1600" LogicalOp="Inner Join" NodeId="0" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0444433">
              <OutputList>
                <ColumnReference Column="Union1163" />
              </OutputList>
              <Warnings NoJoinPredicate="true" />
              <NestedLoops Optimized="false">
                <RelOp AvgRowSize="27" EstimateCPU="0.000432115" EstimateIO="0.0112613" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="40" LogicalOp="Sort" NodeId="1" Parallel="false" PhysicalOp="Sort" EstimatedTotalSubtreeCost="0.0117335">
                  <OutputList>
                    <ColumnReference Column="Union1080" />
                    <ColumnReference Column="Union1081" />
                  </OutputList>
                  <MemoryFractions Input="0" Output="0" />
                  <Sort Distinct="false">
                    <OrderBy>
                      <OrderByColumn Ascending="true">
                        <ColumnReference Column="Union1081" />
                      </OrderByColumn>
                    </OrderBy>
                    <RelOp AvgRowSize="27" EstimateCPU="4.0157E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="40" LogicalOp="Constant Scan" NodeId="2" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="4.0157E-05">
                      <OutputList>
                        <ColumnReference Column="Union1080" />
                        <ColumnReference Column="Union1081" />
                      </OutputList>
                      <ConstantScan>
                        <Values>
                          <Row>
                            <ScalarOperator ScalarString="newid()">
                              <Intrinsic FunctionName="newid" />
                            </ScalarOperator>
                            <ScalarOperator ScalarString="(1)">
                              <Const ConstValue="(1)" />
                            </ScalarOperator>
                          </Row>
                          <Row>
                            <ScalarOperator ScalarString="newid()">
                              <Intrinsic FunctionName="newid" />
                            </ScalarOperator>
                            <ScalarOperator ScalarString="(2)">
                              <Const ConstValue="(2)" />
                            </ScalarOperator>
                          </Row>
                        </Values>
                      </ConstantScan>
                    </RelOp>
                  </Sort>
                </RelOp>
                <RelOp AvgRowSize="27" EstimateCPU="0.0001074" EstimateIO="0.01" EstimateRebinds="0" EstimateRewinds="39" EstimatedExecutionMode="Row" EstimateRows="40" LogicalOp="Lazy Spool" NodeId="83" Parallel="false" PhysicalOp="Table Spool" EstimatedTotalSubtreeCost="0.0260217">
                  <OutputList>
                    <ColumnReference Column="Union1162" />
                    <ColumnReference Column="Union1163" />
                  </OutputList>
                  <Spool>
                    <RelOp AvgRowSize="27" EstimateCPU="0.000432115" EstimateIO="0.0112613" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="40" LogicalOp="Sort" NodeId="84" Parallel="false" PhysicalOp="Sort" EstimatedTotalSubtreeCost="0.0117335">
                      <OutputList>
                        <ColumnReference Column="Union1162" />
                        <ColumnReference Column="Union1163" />
                      </OutputList>
                      <MemoryFractions Input="0" Output="0" />
                      <Sort Distinct="false">
                        <OrderBy>
                          <OrderByColumn Ascending="true">
                            <ColumnReference Column="Union1163" />
                          </OrderByColumn>
                        </OrderBy>
                        <RelOp AvgRowSize="27" EstimateCPU="4.0157E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="40" LogicalOp="Constant Scan" NodeId="85" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="4.0157E-05">
                          <OutputList>
                            <ColumnReference Column="Union1162" />
                            <ColumnReference Column="Union1163" />
                          </OutputList>
                          <ConstantScan>
                            <Values>
                              <Row>
                                <ScalarOperator ScalarString="newid()">
                                  <Intrinsic FunctionName="newid" />
                                </ScalarOperator>
                                <ScalarOperator ScalarString="(1)">
                                  <Const ConstValue="(1)" />
                                </ScalarOperator>
                              </Row>
                              <Row>
                                <ScalarOperator ScalarString="newid()">
                                  <Intrinsic FunctionName="newid" />
                                </ScalarOperator>
                                <ScalarOperator ScalarString="(2)">
                                  <Const ConstValue="(2)" />
                                </ScalarOperator>
                              </Row>
                            </Values>
                          </ConstantScan>
                        </RelOp>
                      </Sort>
                    </RelOp>
                  </Spool>
                </RelOp>
              </NestedLoops>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>'
);

विकल्प 2 - रिमोट स्कैन

क्वेरी के खर्च को बढ़ाकर और रिमोट स्कैन शुरू करने से, परिणाम भौतिक हो जाता है।

with cte(guid,other) as (
  select *
  from OPENQUERY([TESTSQL\V2012], '
  select newid(),1 union all
  select newid(),2 union all
  select newid(),3') x)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other;

2

सभी गंभीरता में आप खरोंच से xml निष्पादन की योजना को नहीं काट सकते। SSIS का उपयोग करके इन्हें बनाना विज्ञान कथा है। हां यह सभी एक्सएमएल है, लेकिन वे विभिन्न ब्रह्मांडों से हैं। उस विषय पर पॉल के ब्लॉग को देखते हुए , वह कह रहा है "जिस तरह से एसएसआईएस अनुमति देता है ..." तो संभवतः आपने गलत समझा है? मुझे नहीं लगता कि वह "योजना बनाने के लिए एसएसआईएस का उपयोग करें" कह रहा है, बल्कि " एसएसआईएस जैसे ड्रैग एंड ड्रॉप इंटरफेस का उपयोग करके योजनाएं बनाने में सक्षम होने के लिए महान नहीं होगा "। हो सकता है, बहुत ही सरल क्वेरी के लिए, आप इसे प्रबंधित कर सकते हैं, लेकिन यह एक खिंचाव है, संभवतः समय की बर्बादी भी। व्यस्त काम आप कह सकते हैं।

अगर मैं USE PLAN संकेत या योजना मार्गदर्शिका के लिए एक योजना बना रहा हूं, तो मेरे पास कुछ दृष्टिकोण हैं। उदाहरण के लिए, मैं आंकड़ों को प्रभावित करने के लिए तालिकाओं से रिकॉर्ड हटा सकता हूं (उदाहरण के लिए एक प्रतिलिपि पर) एक अलग निर्णय लेने के लिए अनुकूलक को प्रोत्साहित करने के लिए। मैंने क्वेरी में सभी तालिका के बजाय तालिका चर का उपयोग किया है, इसलिए आशावादी को लगता है कि प्रत्येक तालिका में 1 रिकॉर्ड है। फिर उत्पन्न योजना में, सभी तालिका चर को मूल तालिका नामों से बदलें और इसे योजना के रूप में स्वैप करें। एक अन्य विकल्प सांख्यिकी को खराब करने के लिए अद्यतन सांख्यिकी के STATS_STREAM विकल्प के साथ उपयोग करना होगा, जो कि विधि का उपयोग करते समय प्रयोग किया जाता है, जो केवल डेटाबेस के आंकड़ों की प्रतियों का उपयोग करता है।

UPDATE STATISTICS 
    [dbo].[yourTable]([PK_yourTable]) 
WITH 
    STATS_STREAM = 0x0100etc, 
    ROWCOUNT = 10000, 
    PAGECOUNT = 93

मैंने अतीत में xml निष्पादन योजना के साथ कुछ समय बिताया है और मैंने पाया है कि अंत में, एसक्यूएल सिर्फ "मैं उस का उपयोग नहीं कर रहा हूं" और क्वेरी को चलाता है कि यह वैसे भी कैसे चाहता है।

अपने विशिष्ट उदाहरण के लिए, मुझे यकीन है कि आप जानते हैं कि आप उस परिणाम को प्राप्त करने के लिए प्रश्न में पंक्ति पंक्ति 3 या TOP 3 का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यह आपकी बात नहीं है। सही जवाब वास्तव में होगा: एक अस्थायी तालिका का उपयोग करें। मुझे लगता है कि:) सही उत्तर नहीं होगा "अपने स्वयं के कस्टम XML निष्पादन योजना को काटने में भी दिन बिताएंगे, जहां आप CTE के लिए एक आलसी स्पूल करने के लिए ऑप्टिमाइज़र को ट्रिक करने का प्रयास करते हैं जो कि वैसे भी काम नहीं कर सकता है, चतुर दिखाई देगा। लेकिन बनाए रखना भी असंभव होगा ”।

वहाँ असंवैधानिक होने की कोशिश नहीं, बस मेरी राय - आशा है कि मदद करता है।


गंभीरता से, XML योजनाएं अनजान हैं ?,, मुझे लगा कि यह पूरी बात थी? यदि वे अमान्य हैं तो इसे फेंक देना चाहिए।
क्रुकसेक

मैं योजना गाइड असफल घटना की बात कर रहा था।
वाकोबेक

2

क्या कोई रास्ता है ...

अंत में SQL 2016 CTP 3.0 में एक तरीका है, की तरह:)

ट्रेस ध्वज और विस्तारित घटनाक्रम के रूप में दिमित्री Pilugin द्वारा विस्तृत का उपयोग करते हुए यहाँ , आप (कुछ मनमाने ढंग से) क्वेरी निष्पादन के मध्यवर्ती चरणों से तीन अद्वितीय guids बाहर मछली कर सकते हैं।

एनबी यह कोड उत्पादन या गंभीर उपयोग के लिए अभिप्रेत नहीं है क्योंकि सीटीई योजना के संबंध में, नए ट्रेस ध्वज पर एक हल्के-फुल्के रूप में और चीजों को करने का एक अलग तरीका है:

-- Configure the XEvents session; with ring buffer target so we can collect it
CREATE EVENT SESSION [query_trace_column_values] ON SERVER 
ADD EVENT sqlserver.query_trace_column_values
ADD TARGET package0.ring_buffer( SET max_memory = 2048 )
WITH ( MAX_MEMORY = 4096 KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 30 SECONDS, MAX_EVENT_SIZE = 0 KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF , STARTUP_STATE = OFF )
GO

-- Start the session
ALTER EVENT SESSION [query_trace_column_values] ON SERVER
STATE = START;
GO

-- Run the query, including traceflag
DBCC TRACEON(2486);
SET STATISTICS XML ON;
GO

-- Original query
;with cte(guid,other) as (
  select newid(),1 union all
  select newid(),2 union all
  select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other
option ( recompile )
go

SET STATISTICS XML OFF;
DBCC TRACEOFF(2486);
GO

DECLARE @target_data XML

SELECT @target_data = CAST( target_data AS XML )
FROM sys.dm_xe_sessions AS s 
    INNER JOIN sys.dm_xe_session_targets AS t ON t.event_session_address = s.address
WHERE s.name = 'query_trace_column_values'


--SELECT @target_data td

-- Arbitrarily fish out 3 unique guids from intermediate stage of the query as collected by XEvent session
;WITH cte AS
(
SELECT
    n.c.value('(data[@name = "row_id"]/value/text())[1]', 'int') row_id,
    n.c.value('(data[@name = "column_value"]/value/text())[1]', 'char(36)') [guid]
FROM @target_data.nodes('//event[data[@name="column_id"]/value[. = 1]][data[@name="row_number"]/value[. < 4]][data[@name="node_name"]/value[. = "Nested Loops"]]') n(c)
)
SELECT *
FROM cte a
    CROSS JOIN cte b
GO

-- Stop the session
ALTER EVENT SESSION [query_trace_column_values] ON SERVER
STATE = STOP;
GO

-- Drop the session
IF EXISTS ( select * from sys.server_event_sessions where name = 'query_trace_column_values' )
DROP EVENT SESSION [query_trace_column_values] ON SERVER 
GO

संस्करण पर परीक्षण (CTP3.2) - 13.0.900.73 (x64), केवल मनोरंजन के लिए।


1

मैंने ट्रेसफ्लैग 8649 (बल समानांतर योजना) पाया, जो मेरे 2008, R2 और 2012 के उदाहरणों पर बाएं हाथ के स्तंभ के लिए इस व्यवहार को प्रेरित करता है। मुझे SQL 2005 पर ध्वज का उपयोग करने की आवश्यकता नहीं थी जहाँ CTE ने सही व्यवहार किया था। मैंने उच्च उदाहरणों में SQL 2005 में उत्पन्न योजना का उपयोग करने की कोशिश की, लेकिन यह मान्य नहीं होगा।

with cte(guid,other) as (
  select newid(),1 union all
  select newid(),2 union all
  select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other
option ( querytraceon 8649 )

या तो संकेत का उपयोग करना, संकेत सहित एक योजना गाइड का उपयोग करना या किसी USE PLAN इत्यादि में संकेत के साथ क्वेरी द्वारा उत्पन्न योजना का उपयोग करना। cte newid


फिर से कोशिश करने के लिए धन्यवाद। क्वेरी 2008-2015 पर उस ट्रेस ध्वज के साथ या उसके बिना कोई भिन्न नहीं दिखती है। वास्तव में यह सुनिश्चित नहीं है कि यह मेरा SQL सर्वर इंस्टेंसेस है या आप क्या दिखाने की कोशिश कर रहे हैं। मुझे अभी भी 18 गार्ड दिखाई दे रहे हैं। क्या देखती है?

बायीं ओर 3 अलग गाइड (गाइड कॉलम), प्रत्येक तीन बार दोहराता है। दाहिने हाथ की ओर (गाइड कॉलम) पर 9 अनूठे छापे हैं, इसलिए कम से कम बाएं बिट व्यवहार कर रहे हैं कि आप कैसे चाहते हैं। मैंने उम्मीद है कि थोड़ा स्पष्ट करने के लिए अन्य उत्तर के लिए एक छवि जोड़ी है। छोटे कदम। मुझे एसक्यूएल 2005 में भी ध्यान देना चाहिए, मुझे 6 अद्वितीय गाइड मिले, 3 बाईं ओर, 3 दाईं ओर।
२०

यह भी सिर्फ देखा कि 'सभी' को हटाने से 6 अनूठे मार्गदर्शक भी मिल जाते हैं, प्रत्येक पक्ष के 3।
२०

Traceflag बना सकते हैं काम नहीं सर्वर MAXDOP 1. होने से
wBob
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.