1

比較的小さな SQL Server テーブル (< 10,000 行) に対してカウントする必要がある条件が多数あります (事前にわかりません)。各条件は、SQL where 句の形式になっています。現在、「 select count(*) from some_table where " + Where_Clause; の形式で完全な SQL ステートメントを作成しています。そして、SQL Server にカウントを返してもらいました。これをループで実行して、さまざまな条件すべてに必要なすべてのカウントを取得します。

数十または数百のカウントを実行する必要がある場合に、これを高速化する方法を探しています。事前の発表はわかりません。テーブル全体を選択する人もいれば、行を選択しない人もいます。私は次の解決策を試しました:

  1. クエリを並行して発行 - ロックを行わなくても最小限の改善が見られました
  2. それらを case ステートメントの複雑なカウントとして記述して、1 つのステートメントで複数の where 句を実行できるようにします。
  3. 多くのクエリを UNION として一緒に渡し、結果を 1 つの結果セットとして返す

これらのオプションのどれも実行時に素晴らしい改善をもたらしませんでした (実行速度が遅くなる場合もあります)。また、複雑さが増したため、その価値があるとは思えません。

私の質問は、「select *」を 1 つ実行するだけで、テーブル全体を DataTable オブジェクトにすばやく読み込むことができるということです。テーブル全体がメモリにある場合、SQL Server に行ったり来たりせずにそれに対してカウントを実行する方法はありますか? ネットワーク、I/O、ロックなどのオーバーヘッドを削減したいと考えています。

最も複雑な where 句は次のようになります。

a=1 or b in (2,3) or c<4 or d like '%5' or substring(e,2,1)='z'

したがって、それは些細なことではなく、T-SQL を可能な限りサポートすることが理想的ですが、DataTable の .Select() メソッドがこの OR をサポートしているとは思いません。非常に高速です。メモリ内のデータのテーブルが与えられた場合、T-SQL 構文を使用して非常に高速に (または並列に) 行を作成できますか?

4

2 に答える 2

1

LINQ to SQL を使用するか、実行可能なストアド プロシージャとしてクエリを作成することを検討できます。

于 2012-11-01T03:16:58.747 に答える
0

試してみること

a) 適切なインデックスがあることを確認します。最も複雑なクエリのクエリ プランを確認し、そこにテーブル スキャンがないことを確認します。

b) このようなものを使用して、同じリクエストで複数のクエリを実行します。

var cmd = new SqlCommand(@"SELECT TOP 10 * FROM Foo; SELECT TOP 10 * FROM Bar", con))
var ad = new SqlDataAdapter(cmd);
var ds = new DataSet();
ad.Fill(ds);

var foo = ds.Tables[0];
var bar = ds.Tables[1];
于 2012-10-31T15:38:51.700 に答える