Mam procedurę przechowywaną, która robi coś takiego:Czy zastępowanie logiki warunkowej za pomocą instrukcji CASE jest wydajne w języku Transact-SQL?
IF @Param = '1'
SELECT HT.HeaderKey, HT.Description,
(SELECT SUM(E1) -- E1 is actually a complex expression
FROM DetailTable DT INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE DT.HeaderKey = HT.HeaderKey)
FROM HeaderTable HT
ELSE IF @Param = '2'
SELECT HT.HeaderKey, HT.Description,
(SELECT SUM(E2) -- E2 is yet another complex expression
FROM DetailTable DT INNER JOIN ... -- Here, DetailTable is not
INNER JOIN ... -- joined to the same tables
INNER JOIN ... -- as in the first case
WHERE DT.HeaderKey = HT.HeaderKey)
FROM HeaderTable HT
-- Etc. There are five cases.
I chciałby zmniejszyć zapytanie do następujących:
SELECT HT.HeaderKey, HT.Description,
CASE @Param
WHEN '1'
(SELECT SUM(E1)
FROM DetailTable DT INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE DT.HeaderKey = HT.HeaderKey)
WHEN '2'
(SELECT SUM(E2)
FROM DetailTable DT INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE DT.HeaderKey = HT.HeaderKey)
-- Etc.
ELSE 0
END
FROM HeaderTable HT
Jednakże, jeśli SQL Server ocenia wszystkie przypadki Niezależnie od tego, który z nich zostanie faktycznie zwrócony, zmodyfikowane zapytanie byłoby rażąco nieefektywne.
Tak więc, chciałbym wiedzieć, czy SQL Server ocenić wszystkie przypadki w CASE
oświadczenie, czy tylko pierwszy z nich, który spełnia warunku CASE
„s?
+1 na dobre pytanie –
Dzięki, Stephanie. – pyon