ক্যাশে (অলস স্পুল) সিটিই ফলাফলের জন্য একটি পরিকল্পনা গাইড তৈরি করুন


19

আমি প্রথমে সঠিক পরিকল্পনা ব্যবহার করে এমন একটি ক্যোয়ারী তৈরি করে এবং এটির অনুরূপ ক্যোয়ারীতে অনুলিপি করে প্ল্যান গাইডগুলি তৈরি করি। যাইহোক, এটি কখনও কখনও জটিল হয়, বিশেষত যদি ক্যোয়ারীটি ঠিক একইরকম না হয়। স্ক্র্যাচ থেকে পরিকল্পনা গাইড তৈরির সঠিক উপায় কী?

এসকিউএলকিভি এসএসআইএস-এ পরিকল্পনাগুলি আঁকার কথা উল্লেখ করেছেন, এসকিউএল সার্ভারের জন্য একটি ভাল পরিকল্পনা তৈরিতে সহায়তা করার কোনও উপায় বা দরকারী সরঞ্জাম আছে কি?

সুনির্দিষ্ট উদাহরণটি হ'ল এই সিটিই: এসকিউএলফিডাল

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? আমি কিছু এসকিউএল সার্ভার সিটিই কিরককে কাটিয়ে উঠতে একাধিকবার রেফারেন্সযুক্ত সিটিই-টাইপ প্রশ্নের সাথে পরিকল্পনাগুলি অন্তর্ভুক্ত করে ভবিষ্যতে আরও ভাল প্রশ্নের উত্তর দিতে সক্ষম হবেন বলে আশা করছি।


উত্তর:


14

ঠিক তিনটি স্বতন্ত্র গাইড এবং আরও কিছু দিয়ে ফলাফলটি প্রকাশের কোনও উপায় আছে কি? আমি প্রত্যাশা করছি যে কিছু এসকিউএল সার্ভার সিটিই কিরককে কাটিয়ে উঠতে একাধিকবার রেফারেন্সযুক্ত সিটিই-টাইপ ক্যোয়ারির সাথে প্ল্যান গাইড সহ ভবিষ্যতে আরও ভাল প্রশ্নের উত্তর দিতে সক্ষম হব।

আজ না. অপরিবর্তনীয় সাধারণ টেবিল এক্সপ্রেশনস (সিটিই) অনুকূলকরণের পূর্বে ইন-লাইন ভিউ সংজ্ঞা হিসাবে বিবেচনা করা হয় এবং লজিক্যাল ক্যোয়ারী ট্রিটিতে তাদের যথাযথভাবে উল্লেখ করা হয় (ঠিক নিয়মিত দেখার সংজ্ঞা যেমন হয়) like আপনার প্রশ্নের জন্য যৌক্তিক গাছটি হ'ল:

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 সালে একটি কাগজ (পিডিএফ) প্রকাশ করেছিল , যদিও তা আজ অবধি কার্যকর নয়। আপাতত, আমরা টেবিল ভেরিয়েবল এবং অস্থায়ী টেবিলের মতো জিনিসগুলি ব্যবহার করে সুস্পষ্ট উপাদানাদির মধ্যে সীমাবদ্ধ।

এসকিউএলকিভি এসএসআইএস-এ পরিকল্পনাগুলি আঁকার কথা উল্লেখ করেছেন, এসকিউএল সার্ভারের জন্য একটি ভাল পরিকল্পনা তৈরিতে সহায়তা করার কোনও উপায় বা দরকারী সরঞ্জাম আছে কি?

এটি আমার পক্ষ থেকে কেবল ইচ্ছাকৃত চিন্তাভাবনা ছিল , এবং পরিকল্পনার নির্দেশিকাগুলি সংশোধন করার ধারণা ছাড়িয়ে যায়। নীতিগতভাবে, শো প্ল্যান এক্সএমএলকে সরাসরি পরিচালনা করার জন্য কোনও সরঞ্জাম লিখন সম্ভব, তবে নির্দিষ্ট অপ্টিমাইজার যন্ত্রটি ব্যবহার না করে ব্যবহারকারীর পক্ষে হতাশার অভিজ্ঞতা হতে পারে (এবং বিকাশকারী এটি ভাবতে পারেন)।

এই প্রশ্নের বিশেষ প্রসঙ্গে, এই জাতীয় সরঞ্জামটি এখনও একাধিক গ্রাহকরা (এক্ষেত্রে উভয় ইনপুটকে ক্রস জোনে খাওয়ানোর জন্য) একাধিক ভোক্তাদের দ্বারা ব্যবহার করা যেতে পারে এমনভাবে সিটিই বিষয়বস্তু বাস্তবায়িত করতে অক্ষম হবে। অপ্টিমাইজার এবং এক্সিকিউশন ইঞ্জিন মাল্টি-কনজিউমার স্পুলগুলিকে সমর্থন করে তবে কেবল নির্দিষ্ট উদ্দেশ্যে - যার কোনওটিই এই বিশেষ উদাহরণটিতে প্রয়োগ করতে পারেনি।

যদিও আমি নিশ্চিত নই, আমার কাছে মোটামুটি শক্তিশালী হান্চ রয়েছে যে ক্যালোয়ারটি পরিকল্পনার ঠিক মতো না হলেও - রিলওপস অনুসরণ করতে পারে (নেস্টেড লুপ, অলস স্পুল) - উদাহরণস্বরূপ যদি আপনি সিটিইতে 4 এবং 5 যোগ করেন , এটি এখনও একই পরিকল্পনা ব্যবহার করা অব্যাহত রেখেছে (আপাতদৃষ্টিতে - এসকিউএল সার্ভার 2012 আরটিএম এক্সপ্রেসে পরীক্ষিত)।

এখানে যুক্তিসঙ্গত পরিমাণে নমনীয়তা রয়েছে। এক্সএমএল পরিকল্পনার বিস্তৃত আকারটি একটি চূড়ান্ত পরিকল্পনার অনুসন্ধানের জন্য গাইড করতে ব্যবহৃত হয় (যদিও অনেকগুলি বৈশিষ্ট্য পুরোপুরি উপেক্ষা করা হয় যেমন এক্সচেঞ্জগুলিতে পার্টিশন টাইপ) এবং সাধারণ অনুসন্ধানের নিয়মগুলিও যথেষ্ট স্বাচ্ছন্দ্যযুক্ত। উদাহরণস্বরূপ, ব্যয় বিবেচনার ভিত্তিতে বিকল্পগুলির প্রাথমিক ছাঁটাই নিষ্ক্রিয় করা হয়েছে, ক্রস যোগদানের সুস্পষ্ট পরিচয় অনুমোদিত এবং স্কেলার অপারেশনগুলি উপেক্ষা করা হবে।

সেখানে গভীরতা ঢোকা অনেকগুলি বিবরণ আছে, কিন্তু ফিল্টার এবং কম্পিউট Scalars বসানো বাধ্য করা যাবে না, এবং ফর্মটির predicates column = valueতাই একটি পরিকল্পনা ধারণকারী সাধারণ করছে X = 1বা X = @Xধারণকারী একটি ক্যোয়ারী প্রয়োগ করা যেতে পারে X = 502বা X = @Y। এই নির্দিষ্ট নমনীয়তা জোর করার জন্য একটি প্রাকৃতিক পরিকল্পনা সন্ধানে ব্যাপক সাহায্য করতে পারে।

নির্দিষ্ট উদাহরণে, ধ্রুব ইউনিয়ন সবসময় একটি কনস্ট্যান্ট স্ক্যান হিসাবে প্রয়োগ করা যেতে পারে; ইউনিয়ন ইনপুট সংখ্যা সব কিছু যায় আসে না।


3

সিটিইর উভয় উপস্থিতির জন্য একটি একক স্পুল পুনরায় ব্যবহার করার কোনও উপায় নেই (এসকিউএল সার্ভার সংস্করণ ২০১২ অবধি)। এসকিউএলকিউয়ের উত্তরে বিশদ পাওয়া যাবে। আরও নীচে দুবার সিটিই বাস্তবায়নের দুটি উপায় রয়েছে যা কোয়েরির প্রকৃতির জন্য অপরিহার্য। উভয় বিকল্পের ফলে 6 এর নিখরচায় পৃথক গাইড গণনা ঘটে।

সিটিইকে পরিচালনা করার পরিকল্পনা সম্পর্কে ব্লগে মার্টিনের মন্তব্য থেকে কাসনোইয়ের সাইটের লিঙ্কটি এই প্রশ্নের আংশিক অনুপ্রেরণা ছিল। এটি একটি পারস্পরিক সম্পর্কযুক্ত সাবকোরির উদ্দেশ্যে সিটিই বাস্তবায়নের একটি উপায় বর্ণনা করে, যা কেবল একবার উল্লেখ করা হলেও পারস্পরিক সম্পর্ক এটি একাধিকবার মূল্যায়ন করতে পারে। এটি প্রশ্নের ক্যোয়ারিতে প্রযোজ্য নয়।

বিকল্প 1 - পরিকল্পনা গাইড

এসকিউএলকিউয়ের উত্তর থেকে ইঙ্গিত গ্রহণ করে, আমি একটি ন্যূনতম নূন্যতম নির্দেশিকাটি রেখেছি যা এখনও কাজ করবে, উদাহরণস্বরূপ 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 এক্সিকিউশন পরিকল্পনাটি স্ক্র্যাচ থেকে কাটাতে পারবেন না। এসএসআইএস ব্যবহার করে এগুলি তৈরি করা বিজ্ঞান কল্পকাহিনী। হ্যাঁ এটি সমস্ত এক্সএমএল, তবে তারা বিভিন্ন মহাবিশ্বের। সেই বিষয়ে পলের ব্লগটি দেখে তিনি বলছেন যে "এসএসআইএস যেভাবে অনুমতি দেয় ..." তাই সম্ভবত আপনি ভুল বুঝেছেন? আমি মনে করি না যে তিনি "পরিকল্পনা তৈরিতে এসএসআইএস ব্যবহার করুন" বলছেন তবে "এসএসআইএসের মতো একটি ড্রাগ এবং ড্রপ ইন্টারফেস ব্যবহার করে পরিকল্পনা তৈরি করতে সক্ষম হবেনা এটি দুর্দান্ত হবে না "। খুব সাধারণ জিজ্ঞাসার জন্য, আপনি এটি পরিচালনা করতে পারতেন, তবে এটি একটি প্রসারিত, সম্ভবত এমনকি সময় নষ্টও। ব্যস্ত কাজ আপনি বলতে পারেন।

যদি আমি কোনও ব্যবহারের পরিকল্পনার ইঙ্গিত বা পরিকল্পনার গাইডের জন্য কোনও পরিকল্পনা তৈরি করি, তবে আমার কাছে বেশ কয়েকটি পদ্ধতি রয়েছে। উদাহরণস্বরূপ, আমি পরিসংখ্যানগুলিকে প্রভাবিত করতে এবং অপ্টিমাইজারকে আলাদা সিদ্ধান্ত নিতে উত্সাহিত করতে আমি টেবিলগুলি থেকে রেকর্ডগুলি সরিয়ে ফেলতে পারি (উদাহরণস্বরূপ db এর অনুলিপিটিতে)। আমি কোয়েরিতে থাকা সমস্ত টেবিলের পরিবর্তে টেবিল ভেরিয়েবলগুলিও ব্যবহার করেছি তাই অপ্টিমাইজারটি মনে করে যে প্রতিটি টেবিলটিতে 1 টি রেকর্ড রয়েছে। তারপরে উত্পন্ন পরিকল্পনায় সমস্ত টেবিলের ভেরিয়েবলগুলি মূল টেবিলের নামগুলির সাথে প্রতিস্থাপন করুন এবং এটিকে পরিকল্পনা হিসাবে স্যুপ ইন করুন। অন্য বিকল্পটি হ'ল পরিসংখ্যানগুলিকে ফাঁকি দেওয়ার জন্য আপডেটের পরিসংখ্যানের সাথে স্ট্যাটাসপ্রেম বিকল্পটি ব্যবহার করা হবে যা কেবলমাত্র ডাটাবেসের অনুলিপি-অনুলিপি ক্লোনিং করার সময় ব্যবহৃত হয় এমন পদ্ধতি used

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

আমি অতীতে এক্সএমএল এক্সিকিউশন পরিকল্পনাগুলির সাথে কিছুটা সময় কাটিয়েছি এবং আমি পেয়েছি যে এসকিউএল কেবল "আমি এটি ব্যবহার করছি না" এবং কীভাবে এটি যেভাবে চায় সে অনুসন্ধান চালায়।

আপনার সুনির্দিষ্ট উদাহরণের জন্য, আমি নিশ্চিত যে আপনি এই ফলাফলটি পেতে ক্যোরিয়ায় নির্ধারিত সারি রোঙ্কসઉન્ટ 3 বা শীর্ষ 3 ব্যবহার করতে পারেন তবে আমি অনুমান করি যে এটি আপনার বক্তব্য নয়। সঠিক উত্তর সত্যিই হবে: একটি টেম্প টেবিল ব্যবহার করুন। আমি এটিকে উপস্থাপন করব:) সঠিক উত্তরটি হ'ল "আপনার নিজস্ব কাস্টম এক্সএমএল এক্সিকিউশন পরিকল্পনাটি কাটাতে কয়েক ঘন্টা সময় ব্যয় করা হবে যেখানে আপনি সিটিইয়ের পক্ষে অলস স্পুলটি করার চেষ্টা করে যা অপ্টিমাইজারকে চালিত করার চেষ্টা করে যা এমনকি কোনওভাবেই কাজ করে না, চালাক দেখাবে would তবে এটি বজায় রাখাও অসম্ভব "।

সেখানে সংবিধানমূলক হওয়ার চেষ্টা করছেন না, কেবল আমার মতামত - আশা করি এটি সাহায্য করে।


সিরিয়াসলি, এক্সএমএল প্ল্যানগুলি কি অজ্ঞ??, আমি ভেবেছিলাম পুরো বিষয়টি কি ছিল? যদি তারা অবৈধ হয় তবে এটি নিক্ষেপ করা উচিত।
ক্রোকুসেক

আমি প্ল্যান গাইড অসফল ইভেন্টের কথা উল্লেখ করছিলাম।
ডাব্লু

2

আছে কি কোন উপায় ...

শেষ পর্যন্ত এসকিউএল ২০১ C সিটিপি 3.0 এ একটি উপায় রয়েছে, ধরণের:)

দিমিত্রি পিলুগিন বিশদ অনুসারে ট্রেস পতাকা এবং বর্ধিত ইভেন্টগুলি ব্যবহার করে এখানে , আপনি (কিছুটা ইচ্ছামত) ক্যোয়ারী মৃত্যুদণ্ড অন্তর্বর্তী পর্যায়ে তিন অনন্য 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

সংস্করণে পরীক্ষিত (সিটিপি 3.2) - 13.0.900.73 (x64), কেবল মজাদার জন্য।


1

আমি ট্রেসফ্লেগ 8649 পেয়েছি (সমান্তরাল পরিকল্পনা জোর করে) আমার 2008, আর 2 এবং 2012 এর উদাহরণগুলিতে বাম-দিক নির্দেশিকা কলামের জন্য এই আচরণকে প্ররোচিত করেছি। আমার এসকিউএল 2005 তে পতাকা ব্যবহার করার দরকার নেই যেখানে সিটিই সঠিকভাবে আচরণ করেছিল। আমি এসকিউএল 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 )

হয় ইঙ্গিতটি ব্যবহার করে, ইঙ্গিত সহ কোনও পরিকল্পনার গাইড ব্যবহার করা বা কোনও ব্যবহারের পরিকল্পনায় ইঙ্গিত সহ ক্যোয়ারী দ্বারা উত্পন্ন প্ল্যান ব্যবহার করা ইত্যাদি সমস্ত কাজ করে। cte newid


আবার চেষ্টা করার জন্য ধন্যবাদ। ক্যোয়ারীটি ২০০৮/২০১২-তে সেই ট্রেস পতাকা সহ বা ছাড়া কোনও আলাদা দেখাচ্ছে না। এটি আমার এসকিউএল সার্ভারের উদাহরণ বা আপনি কী দেখানোর চেষ্টা করছেন তা সত্যই নিশ্চিত নয়। আমি এখনও 18 গাইড দেখতে পাচ্ছি। তুমি কি দেখতে পাও?
孔夫子

বাম দিকে 3 টি পৃথক গাইড (গাইড কলাম), প্রতিটি তিনবার পুনরাবৃত্তি করছে। ডান-হাতের দিকনির্দেশে 9 টি অনন্য গাইড (গাইড কলাম), সুতরাং কমপক্ষে বাম বিট আপনি কীভাবে লোল চান তা আচরণ করছে। আশা করি কিছুটা স্পষ্ট করার জন্য আমি অন্য উত্তরে একটি চিত্র যুক্ত করেছি। ছোট পদক্ষেপ। আমার এসকিউএল 2005-এও নোট করা উচিত, আমি 6 টি অনন্য গাইড, বাম দিকে 3, ডানদিকে 3 পাই।
ডব্লিউবি

এছাড়াও কেবল লক্ষ্য করেছেন যে 'সমস্ত' অপসারণ করলে 6 টি স্বতন্ত্র নির্দেশিকাও প্রতিটি পাশেই 3 পায়।
ডব্লিউবি

সার্ভার ম্যাক্সডোপ ১ পেয়ে ট্রেসফ্ল্যাগটি কাজ না করতে পারে
ডাব্লুবিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.