2010-06-15 4 views
1

J'ai une requête SQL Server 2005 de longue durée que j'espérais optimiser. Lorsque je regarde le plan d'exécution réel, il est dit qu'un index clusterisé coûte 66% du coût.Requête de base de données longue durée

Execuation plan Snippit:

<RelOp AvgRowSize="31" EstimateCPU="0.0113754" EstimateIO="0.0609028" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="10198.5" LogicalOp="Clustered Index Seek" NodeId="16" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0722782"> 
           <OutputList> 
           <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="quoteDate" /> 
           <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="price" /> 
           <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="tenure" /> 
           </OutputList> 
           <RunTimeInformation> 
           <RunTimeCountersPerThread Thread="0" ActualRows="1067" ActualEndOfScans="1" ActualExecutions="1" /> 
           </RunTimeInformation> 
           <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" NoExpandHint="false"> 
           <DefinedValues> 
            <DefinedValue> 
            <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="quoteDate" /> 
            </DefinedValue> 
            <DefinedValue> 
            <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="price" /> 
            </DefinedValue> 
            <DefinedValue> 
            <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="tenure" /> 
            </DefinedValue> 
           </DefinedValues> 
           <Object Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Index="[_dta_index_Indices_14_320720195__K5_K2_K1_3]" Alias="[I]" /> 
           <SeekPredicates> 
            <SeekPredicate> 
            <Prefix ScanType="EQ"> 
             <RangeColumns> 
             <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="HedgeProduct" ComputedColumn="true" /> 
             </RangeColumns> 
             <RangeExpressions> 
             <ScalarOperator ScalarString="(1)"> 
              <Const ConstValue="(1)" /> 
             </ScalarOperator> 
             </RangeExpressions> 
            </Prefix> 
            <StartRange ScanType="GE"> 
             <RangeColumns> 
             <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="tenure" /> 
             </RangeColumns> 
             <RangeExpressions> 
             <ScalarOperator ScalarString="[@StartMonth]"> 
              <Identifier> 
              <ColumnReference Column="@StartMonth" /> 
              </Identifier> 
             </ScalarOperator> 
             </RangeExpressions> 
            </StartRange> 
            <EndRange ScanType="LE"> 
             <RangeColumns> 
             <ColumnReference Database="[wf_1]" Schema="[dbo]" Table="[Indices]" Alias="[I]" Column="tenure" /> 
             </RangeColumns> 
             <RangeExpressions> 
             <ScalarOperator ScalarString="[@EndMonth]"> 
              <Identifier> 
              <ColumnReference Column="@EndMonth" /> 
              </Identifier> 
             </ScalarOperator> 
             </RangeExpressions> 
            </EndRange> 
            </SeekPredicate> 
           </SeekPredicates> 
           </IndexScan> 
          </RelOp> 

De là, que quelqu'un voit un problème évident qui serait la cause de cette prendre si longtemps?

Voici la requête:

(SELECT quotedate, tenure, price, ActualVolume, HedgePortfolioValue, Price AS UnhedgedPrice, ((ActualVolume*Price - HedgePortfolioValue)/ActualVolume) AS HedgedPrice 
     FROM 
      (
      SELECT [quoteDate] 
        ,[price] 
        , tenure 
       ,isnull(wf_1.[Risks].[HedgePortValueAsOfDate2](1,tenureMonth,quotedate,price),0) as HedgePortfolioValue 
      ,[TotalOperatingGasVolume] as ActualVolume 
       FROM [wf_1].[dbo].[Indices] I 
      inner join 
       (
       SELECT DISTINCT tenureMonth 
       FROM [wf_1].[Risks].[KnowRiskTrades] 
       WHERE HedgeProduct = 1 
        AND portfolio <> 'Natural Gas Hedge Transactions' 
       ) B ON I.tenure=B.tenureMonth 
      inner join 
       (
       SELECT [Month],[TotalOperatingGasVolume] 
       FROM [wf_1].[Risks].[ActualGasVolumes] 
       ) C ON C.[Month]=B.tenureMonth 
      WHERE HedgeProduct = 1 
      AND quoteDate>=dateadd(day, -3*365, tenureMonth) 
      AND quoteDate<=dateadd(day,-3,tenureMonth) 
      )A 
    ) 
+0

De plus, dans la table Indices join, le nombre de lignes estimé est ~ 10K, lorsque les lignes retournées sont ~ 1K – JamesMLV

Répondre

1

Ce bit lève un sourcil, avez-vous un indice sur le portefeuille? Pourquoi utilisez-vous DISTINCT?

SELECT DISTINCT tenureMonth 
FROM [wf_1].[Risks].[KnowRiskTrades] 
WHERE HedgeProduct = 1 
AND portfolio <> 'Natural Gas Hedge Transactions' 

Donc, cela:

WHERE HedgeProduct = 1 
AND quoteDate>=dateadd(day, -3*365, tenureMonth) 
AND quoteDate<=dateadd(day,-3,tenureMonth) 

Mais il est difficile d'offrir de bons conseils sans savoir où les indices sont et données contenus dans les tableaux pertinents.

Également: Combien de temps dure la requête? Combien de temps voulez-vous prendre? À quelle fréquence l'exécutez-vous? Quelle est l'activité de votre serveur de base de données?

+0

Je ne sais pas pourquoi DISTINCT est là, j'ai hérité de cette requête de quelqu'un d'autre. Je vais l'enlever. La requête prend environ 1,5 minutes lorsqu'elle est limitée à 1 valeur de tenureMonth, je pense que cela devrait prendre quelques secondes au mieux. Il est exécuté en tant que nécessaire pour l'analyse, donc pas en haute fréquence. Le serveur de base de données se trouve dans un environnement partagé. Cette instance n'est pas utilisée pour les applications à haut volume/fréquence. – JamesMLV

+0

Je voudrais vraiment examiner de près les index que vous avez sur ces tables et m'assurer qu'elles sont réellement utilisées. Essayez la réécriture jointive de @OMG Ponies aussi. – Seth

+0

Les indices sur les indices ont été un peu brouillés, et en les corrigeant, ils ont accéléré un peu – JamesMLV

1

Ressemble vos statistiques sont éteints. Cette requête me tue les yeux et je ne veux pas deviner et choisir la mauvaise table SO, quelle que soit la table que CI cherche à atteindre, mettre à jour les statistiques pour au moins cette table et vérifier à nouveau la requête.

STATISTIQUES DE MISE À JOUR: http://msdn.microsoft.com/en-us/library/ms187348.aspx

Questions connexes