2013-08-27 8 views
5

2つのテーブルに対して内部結合を実行する一見単純なクエリでは、実際の行数が1になるほぼ200万人。インデックスの欠落に関する問題はありません。インデックスシークとしてクエリのコストの98%が発生しています。クエリが実行されると、I/OまたはCPUの赤いフラグが表示されません。これには約12秒かかります。統計の追加はクエリが単にidsに参加しているため意味がないようで、両方のテーブルでこれらのIDに主キーとしてクラスタ化されたインデックスがあります。単純な内部結合2つのテーブルの結合により、推定行が正しくなく、パフォーマンスが低下する

このクエリは、同じ問題が発生している大規模なクエリの簡略化されたバージョンですが、同じ問題が発生したこの簡略化されたクエリに煮詰めました。私は、推定された行と実際の行との間の不一致が少なくとも最適以下のクエリのパフォーマンスに寄与していると仮定します。興味深いことに、LEFT OUTER JOINをINNER JOINに置き換えると、Estimated Rowsを正しいものに修正しても、ほぼ同じパフォーマンスになります。

問合せ:

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

実際の計画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

統計情報が更新されていないと、関係がある可能性があります。 'exec sp_updatestats'を実行して、プランが変更されているかどうかを確認してください。 – Magnus

+0

マグヌス、これは助けになったようだ!クエリは現在、約4kを報告しています。これは、283が乗算されたものが総行数のおよそです。これで元のクエリが修正されているかどうかを確認してみましょう。 – DavidN

+0

マグヌス、それは素晴らしく働いた。あなたの助けをもう一度おねがいします。 – DavidN

答えて

2

非更新された統計は、それとは何かを持っているかもしれません。 exec sp_updatestatsを実行し、計画が変更されているかどうか確認してください。定期的に統計を更新するSQLサーバー上でメンテナンスジョブを実行していることを確認してください。

関連する問題