0

私はこのクエリを持っています:

SELECT
    COUNT(*) AS 'RedactedCount'
    ,s.Redacted1
    ,s.[Redacted2]
    ,s.[Redacted3] AS 'Redacted3'
FROM RedactedTable1 s
    LEFT OUTER JOIN RedactedTable2 g ON s.Redacted5= g.Redacted5
WHERE g.Redacted6= 31013 AND s.DateTime >= '2013-03-02 00:00:00'
GROUP BY s.Redacted1,s.Redacted2, s.Redacted3

これは非常に奇妙な動作をします。このクエリは、完了するまでに 1 分 30 秒かかります。日付を 2013-04-02 00:00:00 (この記事を書いている今日) に変更する必要がありますが、これは予想される動作であり、ほぼ瞬時です。

しかし、日付を 2013-02-02 (1 ではなく 2 か月の期間) に変更すると、クエリは 20 秒しかかかりません。

この問題に遭遇した人はいますか? 私はその結果に完全に唖然としています。これは、私が取り組んでいる Web アプリケーションの重要な SQL 要求でもあります。

  • Microsoft SQL Server Management Studio 11.0.3128.0
  • Microsoft データ アクセス コンポーネント (MDAC) 6.1.7601.17514
  • マイクロソフト MSXML 3.0 6.0
  • Microsoft Internet Explorer 9.0.8112.16421
  • マイクロソフト .NET フレームワーク4.0.30319.296
  • 悪用システム6.1.7601

注: データベースの設計が不十分で、インデックスがまったく含まれていません。はい、これは悪いです。残念ながら、これは商用ソフトウェアであり、データベース モデルを変更する権利はありません。しかし、私が抱えている問題はこれが原因だとは思いません。

PS: 厳密な NDA を締結しているため、クエリが大幅に編集されている場合は申し訳ありません。なるべく読みやすいように心がけました。

ありがとう !

4

3 に答える 3

1

まず、外部結合の外側の表に述語条件を付けても意味がありません。これを行うとすぐに、そのテーブルで一致しない最終結果セットのすべての行が削除され、実質的にクエリ全体が内部結合であるかのように動作します。

テーブル RedactedTable2 に一致する行がない行を結合に含める場合は、RedactedTable2.Redacted6 の条件を結合条件の一部にする必要があります。

 SELECT COUNT(*) AS 'RedactedCount',
     s.Redacted1, s.[Redacted2],
     s.[Redacted3] AS 'Redacted3'
 FROM RedactedTable1 s
      LEFT JOIN RedactedTable2 g 
          ON g.Redacted5= s.Redacted5
             And g.Redacted6= 31013 
 WHERE s.DateTime >= '2013-03-02 00:00:00'
 GROUP BY s.Redacted1,s.Redacted2, s.Redacted3

パフォーマンスの違いの理由については、テーブル内のデータの何かが原因で問題が発生し、クエリ プロセッサが別のケースとは異なる実行プランを使用することが原因であると思われます。これは簡単に起こります。テーブル内のデータ値の分布に関するデータベース統計に基づいて、1 つのクエリ実行プランを使用して一定の割合を超えるデータ行を調べる必要があるとオプティマイザーが「推測」した場合、オプティマイザーは別のプランに切り替えます。ShowPlan オプションをオンにして両方のクエリを実行し、違いを確認します。

于 2013-04-02T14:41:32.223 に答える
0

Aaron Bertrand はコメントで答えを得ました。

この問題は、MSSQL によって行われたパラメーター スニッフィングが原因でした。

ダミー変数を宣言して使用すると、MSSQL が過去の最適化を使用してクエリを誤って最適化するのを防ぎます。

次のリンクは、パラメーターのスニッフィングについて学ぶのに役立ちましたhttp://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

于 2013-04-03T13:27:25.730 に答える