0

SQL サーバー テーブルからデータを取得するプログラムがあります。コードは次のとおりです。

SqlConnection conn=new SqlConnection(...);//correct
conn.Open();
DataTable dt=new DataTable();
SqlCommand selectCMD = new SqlCommand("SELECT * FROM TABLE WHERE Condition", conn);
SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
custDA.Fill(dt);
Datagridview1.DataSource=dt;
Datagridview1.DataBind();

しかし問題は、SQL サーバー管理スタジオで同じクエリを実行すると、実行に 1 秒もかからないことです。一方、プログラムを使用すると、結果を得るのに 30 分かかります。デバッガーを使用すると、プログラムが多くの時間を「考える」メイン行は、データアダプターが DataTable を埋めているときであることがわかります。時間を短縮する方法はありますか?私のコードで何が問題になっていますか?

4

4 に答える 4

3

管理スタジオは、テキスト結果を表示するだけです。 SqlDataAdapter各結果列の値を列の値にマップする必要がありDataGridViewます。一方は他方よりもはるかに時間がかかります。Management Studio を使用すると、結果も仮想化されます。一度にすべての結果が表示されるわけではありません。大きな結果セットを下にスクロールすると、より多くのデータが取得されます。

于 2012-09-04T14:27:23.870 に答える
1

インデックスを作成し、クエリの実行を高速化するオプションを設定できます。そして、このアプローチを使用してデータをロードすることができますSqlDataAdapter.Fill-非同期アプローチ

create index condition_idx on table (condition)

new SqlCommand("set nocount on;SELECT * FROM TABLE WHERE Condition", conn);
于 2012-09-04T14:28:34.177 に答える
1

必要な列に適切なインデックスを付ける必要があるかもしれないことを確認してください。SQLからクエリを実行しているときは、.Fillメソッドが実行しているときと比較してより最適化された実行プランを使用している可能性があります。

SSMSを使用してプロシージャキャッシュとメモリバッファをクリーンアップしてみてください。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

クエリをテストする前にこれを行うと、キャッシュされた実行プランと以前の結果キャッシュが使用されなくなります。

于 2012-09-04T14:28:43.417 に答える
0

助けてくれてありがとう。SqlCommandオブジェクトでパラメーターを使用しました。残念ながら、私はそれについて言及していないので、あなたは私を助けることができませんでした. しかし、JamesSqlCommandがリンクを投稿したように、 がパラメータで使用されると、ストアド プロシージャを使用して実行されることがわかりましたsp_execute。サーバーはそれをコンパイルする必要があるため、時間がかかります。パラメータが削除された後、すべてが正常に機能しています。もう 1 つの方法は、ストアド プロシージャが実行されるたびに自動再コンパイルをオフにすることです。みんなありがとう。全員に+1。

于 2012-09-04T15:05:52.163 に答える