2012-03-12 12 views
0

エンタープライズアプリケーションでパフォーマンスの問題を攻撃しています。私のSQL Procの1つは、2 MB以上のデータ(XMLの平文)を返します。そのSPを実行するためには、DBサーバーでのみ約600ミリ秒かかる。しかし、それは私のUIで応答を得るために約30秒かかります。SQL Serverと.NETクライアント - サーバーから大量のデータを返すベストプラクティス - パフォーマンスの向上

SQLサーバー2008/.NET 4.0

注(IISは、Windowsアプリケーションをホストされている):前のパフォーマンスの繰り返しで - あまりにも多くのDB呼び出しが一緒にこん棒、したがって、多くのDBコールをaviodedを。しかし、現在、データを返すのは巨大で、この問題に直面しています

ここでは、パフォーマンスを向上させるための標準または制限事項のベストプラクティスを特定します。

ここにこれを追加するという考えの下に寄せられたコメントに基づいて: -

  1. しかし、私はこの中には、私は現場でのサーバの接続性を持つ私の地元の場合SQLserverクエリアナライザから同じSpのコールを実行しています発見しました。 2.イントラネットではなく、インターネットを通じた米国/インド間のコミュニケーション。 3.私はdottraceツールとソースを使ってthouroughly分析しました。 4.このデータを結合するボトルネックはありません。以前は約15 Dbコールがループ内にありました(毎回のコールではKbsが小さくなりました)が、今度はクラブ付きのシングルコールになりましたが、大きなデータはMBで運ばれます。

よろしく、 Karthikeyan.G

+0

ローカルで600msかかる場合、これは帯域幅の問題であることを示しています。しかし2MBは、些細なことではありませんが、ここではサーバーとクライアントの間の接続は何ですか? –

+0

2mbも最近では些細なことですが、避けてはいけないと言っているわけではありませんが、LAN、無線またはDSLで20mの場合は30秒も現実的ではありません。 – TomTom

+0

時が流れている場所を確認してください。私は真剣にあなたが間違った項目を見ていると思う。 UIバインディングのないCHeckを使用して、UIバインディングの時間を確認します。私はUIでその時間を簡単に使うと思います。 – TomTom

答えて

0

は確かにUIが結合のように見えます。インターネット経由の2Mbでは30秒かかることはほとんどありませんが、接続速度によって異なる場合があります。

SPを実行するのに600msかかることを考慮すると、それは少し長いのでキャッシュするのが望ましいでしょう。とにかく2MBのキャッシュはそれほど多くありません(ユーザーあたりではない限り)。

2MBのデータを取得し、キャッシュして分割します。最初の100レコードを取得し、それらの行をUIコントロールにバインドしてページングを実装するなど。

ただし、コードがないと、どのタイプのコントロールにバインドするデータのタイプと深さがわかりません。

0

あなたは非同期プログラミングを使用することができます。この中

Dim connectionString As String = "server=.\SQLEXPRESS; database=master; Integrated Security=true; Asynchronous Processing=true" 

    Private Sub btnDisplayCustomersCallback_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayCustomersCallBack.Click 
     Dim sqlConnection As New SqlConnection(connectionString) 
     Dim sqlCommand As SqlCommand = sqlConnection.CreateCommand() 
     Dim asyncResult As IAsyncResult 
     'Example of Asynchronous Callback Model 

     sqlCommand.CommandText = "SELECT * FROM [customer]" 
     sqlCommand.CommandType = CommandType.Text 
     sqlConnection.Open() 
     btnDisplayCustomersCallBack.Enabled = False 


     Dim callback As AsyncCallback = New AsyncCallback(AddressOf DisplayCustomers) 
     asyncResult = sqlCommand.BeginExecuteReader(callback, sqlCommand, CommandBehavior.CloseConnection) 
    End Sub 

    Private Sub DisplayCustomers(ByVal result As IAsyncResult) 
     Dim dr As SqlDataReader 
     Dim command As SqlCommand 
     Dim del As DelFillGrid 
     Try 
      command = CType(result.AsyncState, SqlCommand) 
      dr = command.EndExecuteReader(result) 
      del = New DelFillGrid(AddressOf FillGrid) 
      Threading.Thread.Sleep(5000) 
      Me.Invoke(del, dr) 

     Finally 
      If (Not dr.IsClosed) Then 
       dr.Close() 
      End If 
     End Try 
    End Sub 

Private Sub FillGrid(ByVal dr As SqlDataReader) 
     Try 
      Dim dt As New DataTable() 
      dt.Load(dr) 
      Me.DataGridView1.DataSource = dt 
     Catch ex As Exception 
      ' Because you're guaranteed this procedure 
      ' is running from within the form's thread, 
      ' it can directly interact with members of the form. 
     Finally 
      btnDisplayCustomersCallBack.Enabled = True 

      If dr IsNot Nothing Then 
       dr.Close() 
      End If 

     End Try 
    End Sub 

を、アプリケーションがasynchrnous方法でExecuteReaderの要求を生成し、結果を得ているとき、グリッドが満たされています。その時までアプリケーションはさらに処理を行います。

関連する問題