1

私はこのコードを使用します:

    Dim connection As SqlConnection
Dim connetionString As String
Dim sqlq As String = "select c.* from(..."
    connetionString = "Data Source=...;Initial Catalog=...;User ID=...;Password=..."
    connection = New SqlConnection(connetionString)
                track3.Text = "Connection... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
        Using connection
            connection.Open()
                track4.Text = "SqlCommand... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            Dim command As SqlCommand = New SqlCommand(sqlq, connection)
                track5.Text = "SqlDataReader... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            Dim reader As SqlDataReader = command.ExecuteReader()
                track6.Text = "Filling RTB... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            If reader.HasRows Then
                ........
                Do While reader.Read()
                    .......
            reader.Close()
        End Using
                track7.Text = "Done " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")

そして、コマンド 'command.ExecuteReader()' が最も多くの時間を消費していることに気付きました。この時間範囲は 1 ~ 19 秒の場合があり、私には長すぎます。私がしていることを行うためのより良い方法はありますか? データベースからいくつかのデータを読み取り、リッチ テキスト ボックスに表示する必要があります (DB から受信したものすべてではありません)。

4

2 に答える 2

4

にはさまざまなパフォーマンス パーツがありますExecuteReader

  • クエリ自体のパフォーマンス (これは特にレイテンシ、つまりデータの取得を開始するExecuteReaderのにかかる時間に影響します)
  • 返されるデータの量 (これは、帯域幅、行数、およびWhileループの反復回数に影響します)
  • 行処理コード (Whileループ内のコード)のパフォーマンス

あなたの説明から、最初が問題のようです。これはADO.NET とはまったく関係がなく、すべてクエリと関係があります。したがって、より良いクエリを作成するか、適切なインデックスを追加してください。

これに影響を与える可能性のあるその他の事柄:

  • 高サーバー負荷/ネットワーク負荷
  • 他の接続からのロック
  • 異なるSET構成 (ADO.NETSETには SSMS ウィンドウの既定値が異なるため、場合によってはパフォーマンスが大幅に異なる可能性があります)
  • パラメータ盗聴; ある時点で非定型クエリ (非常に偏ったデータ) を実行している場合、不適切なクエリ プランがキャッシュされる可能性があります。この場合、パラメーター スニッフィングが問題であることを確認していればOPTIMIZE FOR、クエリ ヒントが役立ちます。
于 2013-01-02T09:18:58.053 に答える
2

パフォーマンスのボトルネックである場合ExecuteReader()は、より適切な SQL クエリを記述し、データベース内のデータをより適切に整理し (インデックスを設定するなど)、データベース全体を最適化する必要があります。

ExecuteReader()基本的にクエリをデータベースに送信し、結果が到着するのを待つだけなので、クライアント側では多くのことを行うことはできません。

于 2013-01-02T09:17:51.020 に答える