What is more efficient - handling with case statements in sql or handling the same data using if statements in code. I'm asking because my colleague has a huge query that has many case statements. I advised her to take stress off of the DB by coding the case statements. I've found that it is more efficient...but why?
5 に答える
ここでは問われていない、より基本的な質問があります。これらのCASE
ステートメントは実際に何をしているのか?
パフォーマンスを少し忘れてください。がクエリの最終出力を変換するためだけに使用されており、同じ機能を ASP 内のorCASE
に置き換えることが実際に可能である場合、おそらく、データベース クエリ/プロシージャが、UI が責任を負うべきことを実行しようとしていることを意味します。フォーマットなどに。関心の分離の問題は、考えられるパフォーマンスの問題よりも深刻です。if
select case
次のようなクエリがある場合:
SELECT InvoiceID, InvoiceDate,
CASE WHEN PaidStatus = 0 THEN 'Unpaid' ELSE 'Paid' END
FROM ...
UI、またはデータからドメインへのマッピングを行うレイヤーは、データベース内のステータスを対応する説明に変換する方法を知っている必要があるため、これはばかげています。このロジックをクエリ自体に含めても意味がありません。
一方、CASE
コンストラクトがクエリの重要な部分である場合は、次のようになります。
SELECT
SUM(CASE WHEN PaidStatus = 0 THEN Amount ELSE 0 END) AS TotalUnpaid,
SUM(CASE WHEN PaidStatus = 1 THEN Amount ELSE 0 END) AS TotalPaid
FROM ...
データベースの方がはるかに優れているため、この種のロジックを UI に移動しようとさえしないでください。意味的にはクエリの一部であり (「 xCASE
の支払済みおよび未払いの合計金額を計算する」)、UI 機能を引き継いでいるわけではありません。
最初に、ロジックが何を達成しようとしているかに基づいて、ロジックが実際にどこに属しているかを考えてください。重大なパフォーマンス上の問題に実際に気付いている場合にのみ、パフォーマンスの問題について議論する必要があります。
CASE
次の理由により、ステートメントが推奨されます。
- SQL: ANSI 標準であり、変更する必要なく他のデータベースに移植できます。
- 彼らは「短絡」をサポートしています
私の経験では、データベース サーバーはアプリケーション サーバーよりもはるかに大きく、通常は 30% 未満のアイドル状態になっています。データベースにデータを管理させてから、クライアントに結果セットを反復処理させます。データベースが必要なデータのみを返すようにすることをお勧めします (これを前もって判断できる場合)。
データベース内のデータをクエリ (フィルター処理および並べ替え) し、プレゼンテーション層にプレゼンテーションを任せる必要があります。これには、次の 2 つの主な理由があります。
- データベースは、データをフィルタリングおよびソートするために作られています
- 必要に応じて、DB からワイヤー経由で最小限のデータをプルしたい
私が読んだように、ここでの基本的な質問は、CASE が SQL の IF よりも優れているかどうかです。答えは、条件の深さにも依存します。ここで良い記事を見つけました。誰かに役立つかもしれません。 http://www.4guysfromrolla.com/webtech/102704-1.shtml