เหตุใดแบบสอบถาม DELETE จึงทำงานในรูปแบบหนึ่งนานกว่าอีกรูปแบบหนึ่ง


11

ฉันมีรหัสการล้างข้อมูลเฉพาะที่พยายามลบรายการที่ซ้ำบางรายการ

สิ่งนี้ทำงานได้อย่างสมบูรณ์บนเว็บไซต์ของลูกค้าจำนวนมาก บันทึกบอกฉันว่าแบบสอบถามนี้ใช้อย่างน้อย 1 วินาทีสูงสุด 45 วินาที:

DELETE FROM [tbl]
WHERE [Id] NOT IN
(
    SELECT MIN([Id])
    FROM [tbl]
    GROUP BY [IdProject], [IdRepresentative], [TimeStart]
) 

แต่ฉันมีลูกค้าที่แบบสอบถามนี้ทำงานนานกว่า 4 ชั่วโมง (ถึงตอนนี้และไม่สิ้นสุด)! ฉันตรวจสอบ DB ( DBCC CHECKDB) ฉันอัปเดตสถิติ ( sp_updatestats) แล้วและยังUPDATE STATISTICS [tbl] WITH FULLSCANไม่แสดงการเปลี่ยนแปลงอีกด้วย

ฉันมีการสำรองข้อมูลดั้งเดิมของฐานข้อมูลจากลูกค้า ฉันเรียกใช้บน SQL Server 14.0.2002.14 ฉันมี Standard Edition ลูกค้าใช้ Express Edition

ฉันสามารถเห็นในการตรวจสอบกิจกรรมที่ไม่มีใครใช้ DB ไม่ต้องรอและใช้ CPU 25% (เท่ากับ 1 ใน 4 CPU ของฉัน) นอกจากนี้ในกรณีทดสอบของฉันไม่มีใครใช้ DB

ฉันปฏิรูปแบบสอบถามและตรวจสอบคำสั่งนี้:

DELETE FROM [tbl]
FROM [tbl] AS t
LEFT OUTER JOIN 
    (
        SELECT MIN([Id]) AS [IdMin]
        FROM [tbl]
        GROUP BY [IdProject], [IdRepresentative], [TimeStart]
    ) AS d ON d.[IdMin]=t.[Id]
WHERE d.[IdMin] IS NULL

คำสั่งนี้ดำเนินการใน 1-4 วินาทีในฐานข้อมูลเดียวกัน

ฉันจะทำอย่างไรกับตารางหรือ SQL DB เพื่อเร่งความเร็ว

สำหรับฉันดูเหมือนว่าจะมีปัญหาเฉพาะกับสถานการณ์ DB / เวอร์ชันเซิร์ฟเวอร์ SQL เราไม่เคยเห็นพฤติกรรมนี้ในเว็บไซต์อื่นเกือบ 100 แห่ง

คำถามคือไม่ได้เกี่ยวกับการพูดคุยที่สองDELETEที่มีJOINรูปแบบที่ดีขึ้น ฉันรู้ว่านี้. แต่ตอนนี้เรามีรหัสอื่นในการผลิตและฉันไม่สามารถเปลี่ยนได้ทันที แต่ฉันต้องการทำให้ลูกค้ามีความสุข

Idไม่เป็นโมฆะ เป็น ID ของคลัสเตอร์หลัก การสร้างดัชนีไม่ใช่ตัวเลือก เพราะฉันไม่สามารถมีอิทธิพลต่อระบบการทำงานปัจจุบัน บางสิ่งต้องแตกต่างกันไป

ไม่มีล็อคแน่นอน! ฉันเพิ่งใช้เครื่องสแตนด์อะโลนกับการสำรองข้อมูลของฐานข้อมูล และฉันเพิ่งดำเนินการคำสั่งเดียวนี้ภายในสตูดิโอการจัดการ

แผนแบบสอบถาม

แผนแบบสอบถาม

เอาต์พุต sp_whoisactive

00 00:03:46.523;54;<?query -- DELETE FROM [tblSchedTimeline] WHERE [Id] NOT IN  (       SELECT MIN([Id])        FROM [tblSchedTimeline]         GROUP BY [IdProject], [IdRepresentative], [TimeStart]   )  --?>;DESKTOP-QV3K54L\Test;NULL;"            224,653";"                  0";"                  0";NULL;"          2,393,069";"                  0";"              1,225";"<ShowPlanXML xmlns=""http://schemas.microsoft.com/sqlserver/2004/07/showplan"" Version=""1.6"" Build=""14.0.2002.14""><BatchSequence><Batch><Statements><StmtSimple StatementText=""DELETE FROM [tblSchedTimeline]&#xD;&#xA;WHERE [Id] NOT IN&#xD;&#xA;&#x9;(&#xD;&#xA;&#x9;&#x9;SELECT MIN([Id])&#xD;&#xA;&#x9;&#x9;FROM [tblSchedTimeline]&#xD;&#xA;&#x9;&#x9;GROUP BY [IdProject], [IdRepresentative], [TimeStart]&#xD;&#xA;&#x9;)"" StatementId=""1"" StatementCompId=""1"" StatementType=""DELETE"" RetrievedFromCache=""true"" StatementSubTreeCost=""91.3449"" StatementEstRows=""257246"" SecurityPolicyApplied=""false"" StatementOptmLevel=""FULL"" QueryHash=""0x527453AF47051791"" QueryPlanHash=""0x1988C324845A2D73"" CardinalityEstimationModelVersion=""120""><StatementSetOptions QUOTED_IDENTIFIER=""true"" ARITHABORT=""true"" CONCAT_NULL_YIELDS_NULL=""true"" ANSI_NULLS=""true"" ANSI_PADDING=""true"" ANSI_WARNINGS=""true"" NUMERIC_ROUNDABORT=""false"" /><QueryPlan CachedPlanSize=""64"" CompileTime=""458"" CompileCPU=""16"" CompileMemory=""584""><MemoryGrantInfo SerialRequiredMemory=""512"" SerialDesiredMemory=""21608"" /><OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant=""104844"" EstimatedPagesCached=""26211"" EstimatedAvailableDegreeOfParallelism=""2"" MaxCompileMemory=""1414704"" /><OptimizerStatsUsage><StatisticsInfo LastUpdate=""2019-01-23T09:09:49.14"" ModificationCount=""37344"" SamplingPercent=""28.5972"" Statistics=""[PK__tblSched__3214EC076837DC08]"" Table=""[tblSchedTimeline]"" Schema=""[dbo]"" Database=""[AGVIP-KCC]"" /></OptimizerStatsUsage><RelOp NodeId=""0"" PhysicalOp=""Index Delete"" LogicalOp=""Delete"" EstimateRows=""257246"" EstimateIO=""7.9627"" EstimateCPU=""0.257246"" AvgRowSize=""9"" EstimatedTotalSubtreeCost=""91.3449"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList /><Update WithOrderedPrefetch=""1"" DMLRequestSort=""1""><Object Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Index=""[IDX_SchedTimeline_Ids]"" IndexKind=""NonClustered"" Storage=""RowStore"" /><RelOp NodeId=""2"" PhysicalOp=""Sort"" LogicalOp=""Sort"" EstimateRows=""257246"" EstimateIO=""0.0112613"" EstimateCPU=""21.2216"" AvgRowSize=""27"" EstimatedTotalSubtreeCost=""83.125"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></OutputList><MemoryFractions Input=""1"" Output=""1"" /><Sort Distinct=""0""><OrderBy><OrderByColumn Ascending=""1""><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /></OrderByColumn><OrderByColumn Ascending=""1""><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /></OrderByColumn><OrderByColumn Ascending=""1""><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></OrderByColumn><OrderByColumn Ascending=""1""><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OrderByColumn></OrderBy><RelOp NodeId=""3"" PhysicalOp=""Clustered Index Delete"" LogicalOp=""Delete"" EstimateRows=""257246"" EstimateIO=""30.7735"" EstimateCPU=""0.257246"" AvgRowSize=""27"" EstimatedTotalSubtreeCost=""61.8921"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></OutputList><Update WithOrderedPrefetch=""1"" DMLRequestSort=""1""><Object Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Index=""[PK__tblSched__3214EC076837DC08]"" IndexKind=""Clustered"" Storage=""RowStore"" /><RelOp NodeId=""5"" PhysicalOp=""Table Spool"" LogicalOp=""Eager Spool"" EstimateRows=""257246"" EstimateIO=""0.013125"" EstimateCPU=""0.0927087"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""30.8613"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OutputList><Spool><RelOp NodeId=""6"" PhysicalOp=""Nested Loops"" LogicalOp=""Left Anti Semi Join"" EstimateRows=""257246"" EstimateIO=""0"" EstimateCPU=""4.18e-006"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""30.7555"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OutputList><NestedLoops Optimized=""0""><OuterReferences><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OuterReferences><RelOp NodeId=""7"" PhysicalOp=""Sort"" LogicalOp=""Sort"" EstimateRows=""1"" EstimateIO=""0.0112613"" EstimateCPU=""0.000100011"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""29.3753"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OutputList><MemoryFractions Input=""1"" Output=""1"" /><Sort Distinct=""0""><OrderBy><OrderByColumn Ascending=""1""><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OrderByColumn></OrderBy><RelOp NodeId=""8"" PhysicalOp=""Nested Loops"" LogicalOp=""Left Anti Semi Join"" EstimateRows=""1"" EstimateIO=""0"" EstimateCPU=""1.07529"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""29.3639"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OutputList><NestedLoops Optimized=""0""><RelOp NodeId=""9"" PhysicalOp=""Index Scan"" LogicalOp=""Index Scan"" EstimateRows=""257246"" EstimatedRowsRead=""257246"" EstimateIO=""0.874977"" EstimateCPU=""0.283128"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""1.1581"" TableCardinality=""257246"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></OutputList><IndexScan Ordered=""1"" ScanDirection=""FORWARD"" ForcedIndex=""0"" ForceSeek=""0"" ForceScan=""0"" NoExpandHint=""0"" Storage=""RowStore""><DefinedValues><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></DefinedValue></DefinedValues><Object Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Index=""[IDX_SchedTimeline_Ids]"" TableReferenceId=""1"" IndexKind=""NonClustered"" Storage=""RowStore"" /></IndexScan></RelOp><RelOp NodeId=""10"" PhysicalOp=""Row Count Spool"" LogicalOp=""Lazy Spool"" EstimateRows=""1"" EstimateIO=""0"" EstimateCPU=""0.0001001"" AvgRowSize=""9"" EstimatedTotalSubtreeCost=""27.1305"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""257245"" EstimatedExecutionMode=""Row""><OutputList /><RowCountSpool><RelOp NodeId=""11"" PhysicalOp=""Filter"" LogicalOp=""Filter"" EstimateRows=""1"" EstimateIO=""0"" EstimateCPU=""0.0331891"" AvgRowSize=""9"" EstimatedTotalSubtreeCost=""1.38021"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList /><Filter StartupExpression=""0""><RelOp NodeId=""12"" PhysicalOp=""Stream Aggregate"" LogicalOp=""Aggregate"" EstimateRows=""69144"" EstimateIO=""0"" EstimateCPU=""0.18892"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""1.34702"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Column=""Expr1004"" /></OutputList><StreamAggregate><DefinedValues><DefinedValue><ColumnReference Column=""Expr1004"" /><ScalarOperator ScalarString=""MIN([AGVIP-KCC].[dbo].[tblSchedTimeline].[Id])""><Aggregate Distinct=""0"" AggType=""MIN""><ScalarOperator><Identifier><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></Identifier></ScalarOperator></Aggregate></ScalarOperator></DefinedValue></DefinedValues><GroupBy><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></GroupBy><RelOp NodeId=""13"" PhysicalOp=""Index Scan"" LogicalOp=""Index Scan"" EstimateRows=""257246"" EstimatedRowsRead=""257246"" EstimateIO=""0.874977"" EstimateCPU=""0.283128"" AvgRowSize=""27"" EstimatedTotalSubtreeCost=""1.1581"" TableCardinality=""257246"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></OutputList><IndexScan Ordered=""1"" ScanDirection=""FORWARD"" ForcedIndex=""0"" ForceSeek=""0"" ForceScan=""0"" NoExpandHint=""0"" Storage=""RowStore""><DefinedValues><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></DefinedValue></DefinedValues><Object Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Index=""[IDX_SchedTimeline_Ids]"" TableReferenceId=""2"" IndexKind=""NonClustered"" Storage=""RowStore"" /></IndexScan></RelOp></StreamAggregate></RelOp><Predicate><ScalarOperator ScalarString=""[Expr1004] IS NULL""><Compare CompareOp=""IS""><ScalarOperator><Identifier><ColumnReference Column=""Expr1004"" /></Identifier></ScalarOperator><ScalarOperator><Const ConstValue=""NULL"" /></ScalarOperator></Compare></ScalarOperator></Predicate></Filter></RelOp></RowCountSpool></RelOp></NestedLoops></RelOp></Sort></RelOp><RelOp NodeId=""14"" PhysicalOp=""Filter"" LogicalOp=""Filter"" EstimateRows=""1"" EstimateIO=""0"" EstimateCPU=""0.0331891"" AvgRowSize=""9"" EstimatedTotalSubtreeCost=""1.38021"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList /><Filter StartupExpression=""0""><RelOp NodeId=""15"" PhysicalOp=""Stream Aggregate"" LogicalOp=""Aggregate"" EstimateRows=""69144"" EstimateIO=""0"" EstimateCPU=""0.18892"" AvgRowSize=""11"" EstimatedTotalSubtreeCost=""1.34702"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Column=""Expr1004"" /></OutputList><StreamAggregate><DefinedValues><DefinedValue><ColumnReference Column=""Expr1004"" /><ScalarOperator ScalarString=""MIN([AGVIP-KCC].[dbo].[tblSchedTimeline].[Id])""><Aggregate Distinct=""0"" AggType=""MIN""><ScalarOperator><Identifier><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></Identifier></ScalarOperator></Aggregate></ScalarOperator></DefinedValue></DefinedValues><GroupBy><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></GroupBy><RelOp NodeId=""16"" PhysicalOp=""Index Scan"" LogicalOp=""Index Scan"" EstimateRows=""257246"" EstimatedRowsRead=""257246"" EstimateIO=""0.874977"" EstimateCPU=""0.283128"" AvgRowSize=""27"" EstimatedTotalSubtreeCost=""1.1581"" TableCardinality=""257246"" Parallel=""0"" EstimateRebinds=""0"" EstimateRewinds=""0"" EstimatedExecutionMode=""Row""><OutputList><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></OutputList><IndexScan Ordered=""1"" ScanDirection=""FORWARD"" ForcedIndex=""0"" ForceSeek=""0"" ForceScan=""0"" NoExpandHint=""0"" Storage=""RowStore""><DefinedValues><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdProject"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""IdRepresentative"" /></DefinedValue><DefinedValue><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""TimeStart"" /></DefinedValue></DefinedValues><Object Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Index=""[IDX_SchedTimeline_Ids]"" TableReferenceId=""2"" IndexKind=""NonClustered"" Storage=""RowStore"" /></IndexScan></RelOp></StreamAggregate></RelOp><Predicate><ScalarOperator ScalarString=""[AGVIP-KCC].[dbo].[tblSchedTimeline].[Id]=[Expr1004]""><Compare CompareOp=""EQ""><ScalarOperator><Identifier><ColumnReference Database=""[AGVIP-KCC]"" Schema=""[dbo]"" Table=""[tblSchedTimeline]"" Column=""Id"" /></Identifier></ScalarOperator><ScalarOperator><Identifier><ColumnReference Column=""Expr1004"" /></Identifier></ScalarOperator></Compare></ScalarOperator></Predicate></Filter></RelOp></NestedLoops></RelOp></Spool></RelOp></Update></RelOp></Sort></RelOp></Update></RelOp></QueryPlan></StmtSimple></Statements></Batch></BatchSequence></ShowPlanXML>";"              2,705";runnable;"                  2";NULL;DESKTOP-QV3K54L;AGVIP-KCC;Microsoft SQL Server Management Studio - Abfrage;2019-02-05 15:35:50.680;2019-02-05 15:35:50.677;0;2019-02-05 15:39:37.297

ผลลัพธ์ของ sp_spaceused

name    rows    reserved    data    index_size  unused
tblSchedTimeline    257246                  50280 KB    36432 KB    9720 KB 4128 KB

แผนปฏิบัติการนี้สำหรับแบบสอบถามที่ใช้เวลาหลายชั่วโมงหรือไม่ แถวที่ประมาณนั้นนับว่าแสดงอย่างถูกต้องโดยประมาณหรือไม่? แผนช้าหกลงใน tempdb หรือทำให้ tempdb เติบโตอย่างดุเดือด? การขนานสามารถช่วยได้ คุณMAXDOPปิดไปแล้วหรือขีด จำกัด ค่าใช้จ่ายสำหรับความเท่าเทียมปรากฏขึ้นหรือไม่
Jon of All Trades

คำตอบ:


24

ส่วนนี้ของแผนเป็นปัญหา

ป้อนคำอธิบายรูปภาพที่นี่

ปัญหา

พฤติกรรมที่ถูกต้องถ้าแบบสอบถามย่อยนำกลับใด ๆNULLคือการกลับแถวจาก0NOT IN

แม้ว่าIDจะไม่เป็นโมฆะ (และMIN(ID)อาจไม่สามารถNULLใช้เมื่อรวมเป็นเวกเตอร์) ประเภทข้อมูลของMIN(ID)จะถือเป็นโมฆะ (มันยังสามารถกลับมาNULLเมื่อใช้เป็นสเกลาร์รวมกับตารางว่างตัวอย่างเช่น)

ดังนั้นคุณมีสปูลจำนวนแถวพิเศษนี้ถูกเพิ่มเข้าไปในแผนที่มีหน้าที่ตรวจสอบให้แน่ใจ (ร่วมกับการต่อต้านกึ่งเข้าร่วม) ว่าไม่มีแถวใดถูกปล่อยออกมาถ้า a NULLถูกส่งกลับโดยเคียวรี่ย่อย

แต่น่าเสียดายที่แม้แถวกำจัดโดยกึ่งต่อต้านเข้าร่วมในการเก็บพักนี้มีแนวโน้มที่จะ0และทุก257,246แถวที่จะไหลไปยังผู้ประกอบการต่อไปประมาณการ cardinality 1ลดจำนวนโดยประมาณของแถวไปที่ผ่านมาขั้นตอนที่

เป็นผลให้มันมีการสแกนของตารางด้านในของลูปซ้อนกันมีประมาณ 1 การดำเนินการในขณะที่ในความเป็นจริงมันจะสแกนและรวมทั้งตาราง257,246เวลา

การประมาณหนึ่งแถวที่ออกมาจากการเข้าร่วมกึ่งต่อต้านเป็นข้อบกพร่องที่รู้จักที่ได้รับการแก้ไขภายใต้การติดตามสถานะ 4199 เมื่อครู่ที่แล้ว ดูคำถามที่พบบ่อยเกี่ยวกับการแก้ไขข้อบกพร่อง Anti-Semi Join ที่เกี่ยวข้องสำหรับพื้นหลังและลิงก์เพิ่มเติม

สารละลาย

ข้อผิดพลาดที่ปรากฏบน SQL Server 2017 สำหรับคุณเท่านั้นเนื่องจากคุณได้เลือกระดับความเข้ากันได้ 120

คุณควรพบว่าคุณได้รับการประเมินที่ดีขึ้นมากสำหรับการเข้าร่วมกึ่งต่อต้านด้วยการติดตามสถานะ 4199 ที่ใช้งานOPTION (QUERYTRACEON 4199)คำOPTION (USE HINT ('ENABLE_QUERY_OPTIMIZER_HOTFIXES'))ใบ้คำใบ้ (โดยตรงหรือผ่านคำแนะนำแผน) หรือสำหรับฐานข้อมูล:

ALTER DATABASE SCOPED CONFIGURATION
SET QUERY_OPTIMIZER_HOTFIXES = ON;

คำแนะนำการใช้งานQUERY_OPTIMIZER_COMPATIBILITY_LEVEL_140เป็นอีกตัวเลือกหนึ่งของ SQL Server 2017 CU10

ตัวเลือกใดที่คุณเลือกนั้นขึ้นอยู่กับว่าคุณต้องการให้มีการใช้โปรแกรมแก้ไขด่วนของเครื่องมือเพิ่มประสิทธิภาพเว็บไซต์มากแค่ไหน ระดับความเข้ากันได้นั้นมีวัตถุประสงค์เพื่อเป็นสิ่งในระยะสั้นดังนั้นคุณควรวางแผนที่จะย้ายไปสู่การตั้งค่าที่เป็นปัจจุบันมากขึ้น

Repro

สคริปต์ต่อไปนี้สร้างปัญหาขึ้นมาใหม่และแก้ไข:

ALTER DATABASE CURRENT 
SET COMPATIBILITY_LEVEL = 120;
GO
ALTER DATABASE SCOPED CONFIGURATION
SET QUERY_OPTIMIZER_HOTFIXES = OFF;
GO
DROP TABLE IF EXISTS dbo.tbl;
GO
CREATE TABLE dbo.tbl
(
    Id integer PRIMARY KEY, 
    IdProject integer NOT NULL, 
    IdRepresentative integer NOT NULL, 
    TimeStart datetime NOT NULL,

    INDEX i NONCLUSTERED
    (
        TimeStart, 
        IdRepresentative, 
        IdProject
    )
);
GO
UPDATE STATISTICS dbo.tbl 
WITH 
    ROWCOUNT = 257246, 
    PAGECOUNT = 25725;
DELETE FROM [tbl]
WHERE [Id] NOT IN
(
    SELECT MIN([Id])
    FROM [tbl]
    GROUP BY [IdProject], [IdRepresentative], [TimeStart]
) 
OPTION 
(
    MAXDOP 1
);

แมลง

DELETE FROM [tbl]
WHERE [Id] NOT IN
(
    SELECT MIN([Id])
    FROM [tbl]
    GROUP BY [IdProject], [IdRepresentative], [TimeStart]
) 
OPTION 
(
    MAXDOP 1,
    USE HINT ('ENABLE_QUERY_OPTIMIZER_HOTFIXES')
);

ด้วยการแก้ไข

ไวยากรณ์ทางเลือก

NOT INเป็นการดีที่คุณควรเขียนแบบสอบถามที่จะไม่ใช้ปัญหา ทางเลือกที่เป็นไปได้ซึ่งน่าจะมีประสิทธิภาพมากกว่าแม้ว่าจะมีการแก้ไขด้านบนก็ตาม

DELETE T
FROM   (SELECT ROW_NUMBER() OVER (PARTITION BY IdProject, IdRepresentative, TimeStart ORDER BY Id) AS RN
        FROM   tbl) T
WHERE  RN > 1 

-2

รหัสในการผลิตในปัจจุบันและฉันไม่สามารถเปลี่ยนได้ทันที

การสร้างดัชนีไม่ใช่ตัวเลือก เพราะและไม่สามารถมีอิทธิพลต่อระบบการทำงานปัจจุบัน

หากคุณไม่สามารถแก้ไขคิวรีหรือสคีมาและแน่นอนว่าคุณไม่สามารถควบคุมข้อมูลได้ดังนั้นตัวเลือกอื่น ๆ คือการโยนฮาร์ดแวร์ที่มีปัญหาและฉันคิดว่ามันเป็นคำถามที่ไม่ดีเช่นกัน!

CPU ใช้ 25% (ตรงกับ 1 ใน 4 CPU ของฉันทุกประการ)

ความเป็นไปได้ที่นี่: tblแผนแบบสอบถามมีการปั่นเซิร์ฟเวอร์ที่ใช้ย่อยแบบสอบถามสำหรับทุกแถวใน นอกเหนือจากการเปลี่ยนคำสั่งในลักษณะที่คล้ายกับที่พบในคำถามของคุณหรือการเปลี่ยนแปลง / การตรวจสอบดัชนี (คุณต้องการบางสิ่งบางอย่างในอย่างน้อย[IdProject]บางทีดัชนีที่กว้างขึ้นเกี่ยวกับ[IdProject], [IdRepresentative], [TimeStart]คุณอาจติดอยู่ในเรื่องนั้น

บางทีอาจจะตรวจสอบเพื่อให้แน่ใจว่าทุกดัชนีที่คุณคาดหวังที่มีอยู่และเปิดใช้งาน อาจอัปเดตสถิติของพวกเขาในกรณีที่ข้อมูลค้างมีสาเหตุที่ผู้วางแผนทำสิ่งผิดปกติ

การพิจารณาก็คือว่ามันอาจจะไม่ได้คลิกที่สละเวลาและใช้ CPU: อาจจะมีการทำธุรกรรมอีกยาวทำงานที่มีการถือครองล็อคว่ากองกำลังไปยังคิว ตรวจสอบกับที่ไม่มีเอกสารsp_who2ซึ่งรวมถึงข้อมูลเกี่ยวกับสิ่งที่ถูกบล็อกโดยคนอื่นถ้าพวกเขา หากการสืบค้นของคุณมีการบันทึกเวลา CPU & IO น้อยหรือไม่มีเลยและค่าในBlkByคอลัมน์นี่คือสิ่งที่เกิดขึ้น หรือยังดีกว่าถ้าคุณได้รับอนุญาตให้เพิ่มลงในDB(หรือในพื้นที่master) ให้ใช้sp_whoisactiveซึ่งให้รายละเอียดเพิ่มเติมและตัวเลือกการวิเคราะห์ ถ้าคุณไม่สามารถใช้sp_whoisactive เนื่องจากการติดตั้งจะเป็นการเปลี่ยนแปลงสกีมาที่คุณไม่ได้รับอนุญาตให้ดูที่โค้ดเพื่อดูว่ามุมมองระบบ / tables / ether ใดที่ใช้อยู่และเขียนแบบสอบถามเพื่อทำสิ่งเดียวกันด้วยตนเองโดยไม่จำเป็นต้องติดตั้งโพรซีเดอร์

หากไม่มีข้อมูลเพิ่มเติมเราไม่สามารถให้คำแนะนำโดยละเอียดได้มากกว่านี้ และแม้ว่าคุณจะไม่สามารถสัมผัสคำสั่งหรือโครงสร้างของตัวเลือกของคุณจะถูก จำกัด เพิ่มไปยังแผนแบบสอบถามคำถามตามที่แนะนำไปแล้วเช่นกันคำจำกัดความของตาราง / ดัชนีและขนาดโดยประมาณของตาราง: EXEC sp_spaceused 'tbl'จะให้ทั้งจำนวนแถวและจำนวนหน้าที่เกี่ยวกับหน้าเว็บที่บริโภค (ซึ่งอาจได้รับการจัดคิวด้วยถ้าลองSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; EXEC sp_spaceused 'tbl')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.