4

SQL データベース サーバーと、その下に同じ構造とデータを持つ 2 つのデータベースがあります。2 つのデータベースで同じ SQL クエリを実行すると、一方は時間がかかり、もう一方は 50% 未満の時間で完了します。どちらも異なる実行計画を持っています。

ビューのクエリは次のとおりです。

SELECT DISTINCT  i.SmtIssuer, i.SecID, ra.AssetNameCurrency AS AssetIdCurrency, i.IssuerCurrency, seg.ProxyCurrency, shifts.ScenarioDate, ten.TenorID, ten.Tenor, 
                      shifts.Shift, shifts.BusinessDate, shifts.ScenarioNum
FROM         dbo.tblRrmIssuer AS i INNER JOIN
                      dbo.tblRrmSegment AS seg ON i.Identifier = seg.Identifier AND i.SegmentID = seg.SegmentID INNER JOIN
                      dbo.tblRrmAsset AS ra ON seg.AssetID = ra.AssetID INNER JOIN
                      dbo.tblRrmHistSimShift AS shifts ON seg.Identifier = shifts.Identifier AND i.SegmentID = shifts.SegmentID INNER JOIN
                      dbo.tblRrmTenor AS ten ON shifts.TenorID = ten.TenorID INNER JOIN
                      dbo.tblAsset AS a ON i.SmtIssuer = a.SmtIssuer INNER JOIN
                      dbo.tblRrmSource AS sc ON seg.SourceID = sc.SourceID
WHERE     (a.AssetTypeID = 0) AND (sc.SourceName = 'CsVaR') AND (shifts.SourceID =
                          (SELECT     SourceID
                            FROM          dbo.tblRrmSource
                            WHERE      (SourceName = 'CsVaR')))

私がすでに試したことは、テーブルのインデックスの再構築と再編成 (tblRRMHistSimShifts - このテーブルには 200 万件以上のレコードがあります)、ロックやその他のバックグラウンド プロセス、サーバー上のエラーのチェック、サーバーの最大並列度は 0 です。

この問題を解決するために他に提案できることはありますか?

4

2 に答える 2

1

同じサーバー上に同じデータセットを持つ2つのデータベースがあるという事実(あなたが言ったように)は、同じ実行計画を保証しません。

クエリ プランが異なる理由のいくつかを次に示します。

  • mdf ファイルと ldf ファイル (データベースごと) は異なるドライブにあります。1 台のドライブが高速であれば、そのデータベースも高速にクエリを実行します。
  • 行き詰まった統計。あるデータベースの統計が他のデータベースよりも新しい場合、SQL は適切な (そして
    より高速な) 実行計画を選択する可能性が高くなります。
  • インデックス: 両方とも同一だとおっしゃっていましたが、両方に同じタイプのインデックスがあるかどうかを確認します。

比較するのではなく、クエリの実行速度が遅い理由や実際の実行計画を確認することに重点を置いてください。遅いクエリの実際の実行計画を確認すると、実行速度が遅い理由のヒントが得られます。

また、問題を解決するために NO LOCK ステートメントを追加しません。私の経験では、トランザクションによっては、変更された結果セットまたは古い結果セットを取得する可能性のある NO LOCK ヒントを追加する代わりに、コードまたはインデックスを介してほとんどの低速クエリを調整できます。

于 2013-03-18T18:32:47.387 に答える
0

最善の方法は、リクエストを再構築して再編成することです

SELECT DISTINCT  i.SmtIssuer, i.SecID, ra.AssetNameCurrency AS AssetIdCurrency, i.IssuerCurrency, seg.ProxyCurrency, shifts.ScenarioDate, ten.TenorID, ten.Tenor, 
                 shifts.Shift, shifts.BusinessDate, shifts.ScenarioNum
FROM dbo.tblRrmIssuer AS i INNER JOIN dbo.tblRrmSegment AS seg ON i.Identifier = seg.Identifier AND i.SegmentID = seg.SegmentID 
                           INNER JOIN dbo.tblRrmSource AS sc ON seg.SourceID = sc.SourceID
                           INNER JOIN dbo.tblRrmAsset AS ra ON seg.AssetID = ra.AssetID 
                           INNER JOIN dbo.tblRrmHistSimShift AS shifts ON seg.Identifier = shifts.Identifier AND i.SegmentID = shifts.SegmentID AND shifts.SourceID = sc.SourceID
                           INNER JOIN dbo.tblRrmTenor AS ten ON shifts.TenorID = ten.TenorID 
                           INNER JOIN dbo.tblAsset AS a ON i.SmtIssuer = a.SmtIssuer 
WHERE (a.AssetTypeID = 0) AND (sc.SourceName = 'CsVaR')
于 2013-03-18T16:42:12.377 に答える