3

ページ上のいくつかのドロップダウンのデータソースとしてデータテーブルを使用していますが、ポストバック中にページが非常に遅いことに気づきました。

私はここまでそれを追跡しました:

DataTable dt = new DataTable();
dt.Load(sqlCmd.ExecuteReader()); // this takes ages

sqlコマンドはパラメーター化されたクエリであり、ストアドプロシージャではありません(戻り値とwhereは非常に「動的」であるため、これは実用的ではありません)が、それでも単純なselectユニオンクエリです。通常、他のドロップダウンで選択されている内容に応じて、ドロップダウンごとに5〜20のオプションが返されます。Management Studioでクエリを実行すると、1秒以内に実行されます。ここでは、ドロップダウンごとに最大7秒かかる場合があり、ページに6つのドロップダウンがすぐに追加されます。私もSqlDataAdapterで試しました:

SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt); // this takes ages

しかし、これは同じくらい遅かった。私はこれを2つの異なるシステムで使用していますが、どちらも同じパフォーマンスの問題があります。

誰かがより良い(より速い)方法を知っているか、なぜこれがとても遅いのかを知っているなら、それは素晴らしいことです。

4

2 に答える 2

2

この問題について私が見た中で最高のスレッドではありませんが、内部に良いリンクがあり、私の投稿履歴にあります:

SSMS で正常に実行される SQL クエリは、ASP.NET では非常に遅く実行されます。

SQL オプティマイザーは何が最善かを判断するのが好きな場合があり、データ実行計画のトレースとログ記録を通じてクエリを分割する必要があります。不適切なインデックスのように埋もれている可能性が非常に高いか、クエリ コードを最適化する必要がある可能性があります。クエリコードがないので、それがあると役立つ場合とそうでない場合があります。上記の投稿にリンクされているガイドに従って、質問を閉じることをお勧めします。

于 2013-02-25T19:49:02.627 に答える
0

Columnsこれは、DataTableをロードする方法の例です。戻りたいことを具体的に示す方法にすぐに気付くことができます。

private DataTable GetTableData()
{
  string sql = "SELECT Id, FisrtName, LastName, Desc FROM MySqlTable";
  using (SqlConnection myConnection = new SqlConnection(connectionString))
  {
    using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
    {
      myConnection.Open();
      using (SqlDataReader myReader = myCommand.ExecuteReader())
      {
        DataTable myTable = new DataTable();
        myTable.Load(myReader);
        myConnection.Close();
        return myTable;
      }
    }
  }
}

DataAdapterここに使用したい場合Fill the DataTableは簡単な例です

private void FillAdapter()
{
    using (SqlConnection conn = new SqlConnection(Your ConnectionString))
    {
      conn.Open();
          using (SqlDataAdapter dataAdapt = new SqlDataAdapter("SELECT * FROM EmployeeIDs", conn))
      {
         DataTable dt = new DataTable();
         dataAdapt.Fill(dt);
        // dataGridView1.DataSource = dt;//if you want to display data in DataGridView 
      }
    }
}
于 2013-02-25T20:01:39.447 に答える