11

MSSMSで約2秒実行するクエリを実行しました(25Kの行を返します)

.NET (sqlReader) で使用される同じクエリを数分実行します。

また、リーダーのみを実行しようとしました

( while ループ内のすべてのコードにコメントして、 Reader.Read() を残すだけです) - それでも同じです!

どうしたの?


私は DBA ではなく、Profiler を使用する特権もありません。DBA に尋ねて、すべてを知らせます。

その間、SPに「 WITH RECOMPILE」パラメータを追加した後、本質的なパフォーマンスの向上に気づきました。

だから、私の観点からは、それは実行計画の場合のように思えます...どう思いますか?

[編集] また、私がチェックしたのは、QA および .NET から以下のクエリを実行していたことです。

select @@options

私の理解では、両方の環境で同じ値を返す必要があります。(そうでない場合は ex.plans が使用されます) 私は正しいですか?

[EDIT2] ( http://www.sqldev.net/misc/fn_setopts.htmから) QA でARITHABOIRT =ON を読みました (.NET ではオフです)

.NET 接続ごとに ARITHABOIRT=ON を強制する方法を知っている人はいますか?

4

5 に答える 5

4

私はその問題を抱えていました。DBサーバーの接続設定で「算術アボート」設定にチェックマークを付けます。

于 2010-08-10T12:54:07.797 に答える
1

また、クエリ アナライザーは、ラージ テキスト フィールドまたはラージ バイナリ フィールドの完全なコンテンツをダウンロードしません。SqlDataReader は完全なコンテンツをダウンロードするため、時間がかかる場合があります。

于 2009-03-19T17:46:57.160 に答える
0

実際の取得にかかる時間を確認します。

例えば:

  Private Sub timeCheck()
    'NOTE: Assuming you have a sqlconnection object named conn

    'Create stopwatch
    Dim sw As New System.Diagnostics.Stopwatch

    'Setup query
    Dim com As New SqlClient.SqlCommand("QUERY GOES HERE", conn)

    sw.Start()

    'Run query
    Dim dr As SqlClient.SqlDataReader = com.ExecuteReader()

    sw.Stop()

    'Check the time
    Dim sql_query_time As String = CStr((sw.ElapsedMilliseconds / 1000)) & " seconds"
  End Sub

これにより、ホールドアップが検索中なのか、リーダーの実行中なのかを確認できます。

于 2009-03-19T17:12:17.413 に答える
0

リーダーを何度も実行するループで実行する場合は、CommandBehavior.CloseConnection を使用していることを確認してください。

    SqlCommand cmd = new SqlCommand();
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

そうしないと、ループがラインを処理するたびに、ループが終了し、rdr と接続オブジェクトがスコープ外にドロップされたときに、接続オブジェクトは明示的に閉じられないため、閉じられてプールに解放されるだけです。ガベージコレクターが最終的にそれを完成させるとき...

次に、ループが十分に高速である場合 (可能性は非常に高い)、接続が不足します。(プールには生成できる上限があります)

これにより、コードが余分な不要な接続を (最大まで) 作成し続け、GC がそれらを使用しているループに「追いつく」のを待つため、余分なレイテンシと遅延が発生します...

于 2009-03-19T17:13:40.080 に答える