3

アプリケーションからの SQL クエリは、通常SET ARITHBAORT OFF、SSMS (デフォルト) が使用する where を使用することを十分に認識していますSET ARITHBAORT ONSET ARITHBAORT OFFまた、これは従来の互換性のためにのみ存在すると考えており、実際にはクエリは で実行する必要がありますSET ARITHBAORT ON

C# コンソール アプリ バッチ ファイルの一部として実行されるクエリがあります。コンテキストは (デフォルトで) と で準備されSET ARITHBAORT OFFます SET ANSI_WARNINGS ON。最初の 92 回の呼び出しは正常に実行され、93 回目は常にロックされます (各呼び出しは異なるパラメーターを使用します)。SET ARITHBAORT OFF93回目の呼び出しからのパラメーターを使用してストアドプロシージャを呼び出す前に使用すると、SSMSでこれを再現できました。

それでは、私の質問に進みます (これまでの背景情報で申し訳ありません) 。Erland Sommarskog の記事には次のように記載されています。

次に、ARITHABORT に関して言えば、SQL 2005 以降のバージョンでは、ANSI_WARNINGS が ON である限り、この設定による影響はまったくないことを知っておく必要があります。したがって、問題のためにそれをオンにする理由はありません。

ただし、SQL Server 2014 を使用していますが、次のことがわかりました。

SET ARITHBAORT ON
SET ANSI_WARNINGS ON
EXEC mySP   -- Runs efficiently

正常に動作しますが、

SET ARITHBAORT OFF
SET ANSI_WARNINGS ON
EXEC mySP   -- Runs indefinitely

無期限に実行されます。したがってSET ANSI_WARNINGS ONARITHBAORTオプションを無関係にする場合、クエリがロックされるのはなぜですか? ありがとう。

http://www.sommarskog.se/query-plan-mysteries.html

4

2 に答える 2

2

わかった。したがって、Sommarskog の記事から引用した引用文は、データベース レベルが 80 以上であるという条件の下にあります。

のMSDNリファレンスでARITHABORTこの段落を見つけました:

データベース互換性レベルが 90 以上に設定されている場合、ANSI_WARNINGS を ON に設定すると、ARITHABORT が暗黙的に ON に設定されます。データベース互換性レベルが 80 以前に設定されている場合は、ARITHABORT オプションを明示的に ON に設定する必要があります

これは次のように説明します。

  1. に設定されARITHABORTているのに、変更すると違いが得られたのはなぜですか。(データベース レベルは 80 でした)ANSI_WARNINGSON
  2. データベース レベルを変更すると問題が解決したように見える理由 (120 に変更したため)
于 2015-07-09T14:22:07.197 に答える
0

あなたが投稿した記事は誤解を招くものです。ansi_warnings が ON で arithabort がオフの場合、人間はクエリに違いがないことを知っています。SQL Server エンジンは、これが違いを生むかどうかを認識せず、キャッシュされたプランを使用せずに新しい実行プランを自動的に取得します。これは、パラメータ スニッフィングの問題があり、悪い計画を持っている場合、その悪い計画を決して取得せず、arithabort をオンにして使用することを意味します。これが、その設定がパラメーターのスニッフィングを見つけるための優れたテストになる理由です。データベースの互換性レベルを変更すると、他のことに影響する可能性があるため、パラメーターのスニッフィングには不明なヒントの最適化を使用してください。

于 2016-01-08T19:15:41.680 に答える