Re: grösserer von zwei Werten in Where-Klausel

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Hallo Frank,

Frank Kalis schrieb:
"Hannes Brunner" schrieb:

da unterschätzt du aber den Abfrageoptimierer des SQL Servers. Guck dir
doch mal die Ausführungspläne an und du wirst sehen dass in beiden
Fällen die gleiche Strategie, nämlich ein Custered Index Scan, gewählt wird.


Wirklich?

ja, bei mir schon.

SET SHOWPLAN_TEXT ON

DECLARE @a INT, @b INT
SELECT @a = 11008, @b = 11019
SELECT *
FROM Orders
WHERE OrderID = CASE WHEN @a>@b THEN @a ELSE @b END

DECLARE @final INT
SET @final = CASE WHEN @a>@b THEN @a ELSE @b END

SELECT *
FROM Orders
WHERE OrderID = @final


StmtText

-----------------------------------------------------------------------------------
DECLARE @a INT, @b INT
SELECT @a = 11008, @b = 11019

SELECT *
FROM Orders
WHERE OrderID = CASE WHEN @a>@b THEN @a ELSE @b END

(2 row(s) affected)

StmtText

--------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:([Northwind].[dbo].[Orders].[ShippedDate]),
WHERE:([Orders].[OrderID]=If ([@a]>[@b]) then [@a] else [@b]))

Was ist denn hier passiert? Der Clustered Index in deiner Orders-Tabelle
liegt auf ShippedDate und nicht auf OrderID? Da hast du mich ja sauber
ausgetrickst ;)

(1 row(s) affected)

StmtText
-------------------------------------------------------------------------

DECLARE @final INT
SET @final = CASE WHEN @a>@b THEN @a ELSE @b END

SELECT *
FROM Orders
WHERE OrderID = @final

(2 row(s) affected)

StmtText

--------------------------------------------------------------------------------------------------------------------------
|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([Northwind].[dbo].[Orders]))
|--Index Seek(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]),
SEEK:([Orders].[OrderID]=[@final]) ORDERED FORWARD)

Ok, ich sehe ein, wenn man im WHERE nicht in der Clustered Index Spalte
sucht ist deine Version besser. Allerdings musst du wohl eingestehen
dass dein Beispiel unglücklich gewählt ist :-p

Gruß
Hannes
.



Relevant Pages