0

DB の最適化 / メモリ管理については、ほとんど何も知りません。

次のようなクエリがあります。

SELECT Value
FROM ValueTable
WHERE SomeConstraint > 4

このクエリの結果と、このクエリの結果に WHERE 句を 1 つ追加する必要があります。これら2つのアプローチのどちらが優れていますか?

1) そのクエリの結果を変数に選択します。次に、2 つの追加クエリを用意します。

SELECT COUNT(DISTINCT(VALUES))
FROM @SavedQuery

SELECT COUNT(DISTINCT(VALUES))
FROM @SavedQuery
WHERE otherConstraintColumn < 30

2)

    SELECT COUNT(DISTINCT(Value))
    FROM ValueTable
    WHERE SomeConstraint > 4

    SELECT COUNT(DISTINCT(Value))
    FROM ValueTable
    WHERE SomeConstraint > 4
    AND otherConstraintColumn < 30

これは LINQ で記述される可能性があるため、クエリの結果を保存する方法である可能性があります。

4

2 に答える 2

2

最も効率的な方法は、1 つのクエリを使用して両方のカウントを取得することです。次に例を示します。

SELECT COUNT(DISTINCT(t.Value)) AS count1
     , COUNT(DISTINCT(CASE WHEN t.otherConstraintColumn<30 THEN t.Value END))) AS count2
  FROM ValueTable t
 WHERE t.SomeConstraint > 4 

このアプローチは、他の 2 つのアプローチ (データベースから潜在的に大きな値のセットをプルするか、同じデータにアクセスする 2 つの別個のクエリを実行する) のいずれよりも、データベース サーバーでのリソース集約が少なくなります。

あなたの質問に答えるという点では、2 つのアプローチの間で、(クライアント側で) 再度処理する必要がある潜在的に多数の行を転送するのではなく、データベースからカウントだけを取得する 2 番目のアプローチを選択します。 、または結果セットの(不要な)一時ストアを(サーバー側で)実体化し、それに対して追加のクエリを実行します。

表示する最初のクエリには、後続のクエリを満たすのに十分なデータがありませんotherConstraintColumn<30。結果を満たすために使用するために、条件のインジケーターもプルする必要があります。サーバー上のクライアントに転送する (または一時テーブルとしてマテリアライズする) 必要がある行の数をさらに減らすには、次のようにします。

この結果セットを取得する方が効率的です。

SELECT t.Value
     , MAX(CASE WHEN t.otherConstraintColumn < 30 THEN 1 ELSE 0 END) AS occlt30
  FROM ValueTable t
 WHERE t.SomeConstraint > 4
 GROUP BY t.Value

しかし、そのアプローチは、単一のクエリで必要な実際の結果セットを取得するよりもはるかに効率的ではありません.

于 2013-09-17T19:45:50.540 に答える
2

あなたの特定の例では、アプローチ#1はよりスケーラブルです(最初の結果をフィルタリングせずに取得し、LINQを使用してクライアント側で再フィルタリングします)が、効率は低くなります。通常、データベースサーバーは、データのクエリとフィルタリングにおいて、はるかに優れている/高速/効率的であることに注意してください。

ルール 1 は常に: DB を乱用しないことです。だから、私が言う他の何よりもそのアドバイスを優先してください.

あなたの例を見ると、データベースに対して 2 回しかクエリを実行していないようです。それは虐待ではありません。したがって、アプローチ #2 (2 つの個別のクエリ) を使用します。ただし、このアドバイスも修飾させてください。このブロックをループで実行している場合、またはこのコードを 1 日に何百回も実行している場合は、アドバイスを変更します。2回の再クエリは非常に軽くて取るに足らないものですが、ひどい状況になる可能性はたくさんあります.


一般的に言えば、最適化に関して言えば、ASP.NET を使用している場合、ASP.NET には非常に優れたキャッシュ メカニズムが組み込まれています。クエリ結果をセッションまたはビューステートに保存するよりも優れています。http://msdn.microsoft.com/en-us/library/6hbbsfk6(v=vs.90).aspx

winforms などを使用している場合は、メモリが不足していない限り、結果をメモリに保存する価値があります。

これは、他のいくつかの一般的なアプローチについて説明している SO の記事です。データをキャッシュする最良の方法

于 2013-09-17T15:38:29.873 に答える