2013-08-27 65 views
5

Tôi đang gặp khó khăn khi hiểu tại sao truy vấn dường như đơn giản thực hiện kết nối bên trong trên 2 bảng là kết quả là số hàng ước tính là 1, khi thực tế là gần 2 triệu. Tôi không thấy bất kỳ vấn đề nào với chỉ mục bị thiếu và 98% chi phí truy vấn đang xảy ra khi chỉ mục tìm kiếm. Tôi không thấy bất kỳ cờ đỏ I/O hoặc CPU nào khi truy vấn chạy, mất khoảng 12 giây. Việc thêm số liệu thống kê dường như không có ý nghĩa ở đây vì truy vấn chỉ đơn giản là tham gia vào các id và cả hai bảng đều có chỉ mục nhóm trên các id đó làm khóa chính.Nội suy đơn giản Tham gia trên 2 bảng dẫn đến hàng sai ước tính và hiệu suất chậm

Truy vấn này là phiên bản được đơn giản hóa của truy vấn lớn hơn gặp phải các vấn đề tương tự, nhưng tôi đã luộc truy vấn xuống truy vấn đơn giản này gặp vấn đề tương tự. Tôi cho rằng sự khác biệt giữa các hàng ước tính và thực tế ít nhất là góp phần vào hiệu suất truy vấn phụ tối ưu. Thật thú vị, thay thế một LEFT OUTER JOIN cho INNER JOIN dẫn đến hiệu suất xấp xỉ giống nhau, mặc dù nó sửa chữa các Hàng Ước tính là chính xác.

Query:

SELECT StationId, Readings.Power, Readings.TimeCovered 
FROM Readings 
INNER JOIN Stations ON Readings.StationId = Stations.Id 

thực tế Kế hoạch XML:

<?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.1" Build="10.50.1600.1" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.388499" StatementText="SELECT StationId,&#xD;&#xA;[Readings].[Power], [Readings].[TimeCovered]&#xD;&#xA;FROM [dbo].[Readings]&#xD;&#xA;INNER JOIN [dbo].[Stations] ON [Readings].[StationId] = [Stations].[Id]" StatementType="SELECT" QueryHash="0x540DF2384788314E" QueryPlanHash="0x7546B31B38AC8153"> 
      <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 
      <QueryPlan DegreeOfParallelism="1" CachedPlanSize="24" CompileTime="3" CompileCPU="3" CompileMemory="224"> 
      <RelOp AvgRowSize="17" EstimateCPU="0.00118294" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Inner Join" NodeId="0" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.388499"> 
       <OutputList> 
       <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="StationId" /> 
       <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="Power" /> 
       <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="TimeCovered" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="1898419" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <NestedLoops Optimized="false"> 
       <OuterReferences> 
        <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Stations]" Column="Id" /> 
       </OuterReferences> 
       <RelOp AvgRowSize="11" EstimateCPU="0.0004683" EstimateIO="0.00608796" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="283" LogicalOp="Clustered Index Scan" NodeId="1" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.00655626" TableCardinality="283"> 
        <OutputList> 
        <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Stations]" Column="Id" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="0" ActualRows="283" ActualEndOfScans="1" ActualExecutions="1" /> 
        </RunTimeInformation> 
        <IndexScan Ordered="false" ForcedIndex="false" NoExpandHint="false"> 
        <DefinedValues> 
         <DefinedValue> 
         <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Stations]" Column="Id" /> 
         </DefinedValue> 
        </DefinedValues> 
        <Object Database="[MyDB]" Schema="[dbo]" Table="[Stations]" Index="[PK_Stations]" IndexKind="Clustered" /> 
        </IndexScan> 
       </RelOp> 
       <RelOp AvgRowSize="17" EstimateCPU="0.0012571" EstimateIO="0.025" EstimateRebinds="0" EstimateRewinds="282" EstimateRows="1" LogicalOp="Index Seek" NodeId="2" Parallel="false" Partitioned="true" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.380759" TableCardinality="4246720"> 
        <OutputList> 
        <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="StationId" /> 
        <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="Power" /> 
        <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="TimeCovered" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="0" ActualRows="1898419" ActualEndOfScans="283" ActualExecutions="283" /> 
        </RunTimeInformation> 
        <RunTimePartitionSummary> 
        <PartitionsAccessed PartitionCount="8"> 
         <PartitionRange Start="1" End="8" /> 
        </PartitionsAccessed> 
        </RunTimePartitionSummary> 
        <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" NoExpandHint="false"> 
        <DefinedValues> 
         <DefinedValue> 
         <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="StationId" /> 
         </DefinedValue> 
         <DefinedValue> 
         <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="Power" /> 
         </DefinedValue> 
         <DefinedValue> 
         <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="TimeCovered" /> 
         </DefinedValue> 
        </DefinedValues> 
        <Object Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Index="[IX_Readings_StationId_SecondsSinceEpoch]" IndexKind="NonClustered" /> 
        <SeekPredicates> 
         <SeekPredicateNew> 
         <SeekKeys> 
          <StartRange ScanType="GE"> 
          <RangeColumns> 
           <ColumnReference Column="PtnId1000" /> 
          </RangeColumns> 
          <RangeExpressions> 
           <ScalarOperator ScalarString="(1)"> 
           <Const ConstValue="(1)" /> 
           </ScalarOperator> 
          </RangeExpressions> 
          </StartRange> 
          <EndRange ScanType="LE"> 
          <RangeColumns> 
           <ColumnReference Column="PtnId1000" /> 
          </RangeColumns> 
          <RangeExpressions> 
           <ScalarOperator ScalarString="(8)"> 
           <Const ConstValue="(8)" /> 
           </ScalarOperator> 
          </RangeExpressions> 
          </EndRange> 
         </SeekKeys> 
         <SeekKeys> 
          <Prefix ScanType="EQ"> 
          <RangeColumns> 
           <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Readings]" Column="StationId" /> 
          </RangeColumns> 
          <RangeExpressions> 
           <ScalarOperator ScalarString="[MyDB].[dbo].[Stations].[Id]"> 
           <Identifier> 
            <ColumnReference Database="[MyDB]" Schema="[dbo]" Table="[Stations]" Column="Id" /> 
           </Identifier> 
           </ScalarOperator> 
          </RangeExpressions> 
          </Prefix> 
         </SeekKeys> 
         </SeekPredicateNew> 
        </SeekPredicates> 
        </IndexScan> 
       </RelOp> 
       </NestedLoops> 
      </RelOp> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
+1

Thống kê không cập nhật có thể có liên quan đến nó. Hãy thử chạy 'exec sp_updatestats' và xem liệu kế hoạch có thay đổi hay không. – Magnus

+0

Magnus, điều này dường như đã giúp! Truy vấn hiện đang báo cáo khoảng 4k, nhân với 283 là tổng số hàng. Hãy để tôi kiểm tra xem truy vấn ban đầu đã được khắc phục chưa. – DavidN

+0

Magnus, nó hoạt động tuyệt vời. Một lần nữa cám ơn vì sự giúp đỡ của bạn. – DavidN

Trả lời

2

Non thống kê cập nhật có thể có cái gì để làm với nó. Hãy thử chạy một số exec sp_updatestats và xem liệu kế hoạch có thay đổi hay không. Ngoài ra hãy chắc chắn rằng bạn có một công việc bảo trì chạy trên máy chủ SQL cập nhật các số liệu thống kê định kỳ.