Einer meiner Entwickler argumentiert, dass COALESCE(column, default value) = default value
das jetzt sargable ist. Ist das richtig?
Ich habe den folgenden Test durchgeführt und denke, dies impliziert, dass dies COALESCE
nicht sargable ist.
USE tempdb;
SELECT @@VERSION;
-- Microsoft SQL Server 2016 (RTM-CU3-GDR) (KB3194717) - 13.0.2186.6 (X64) Oct 31 2016 18:27:32 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 6.3 <X64> (Build 14393: ) (Hypervisor)
CREATE TABLE Test
(
ID int primary key clustered,
Mod6 int null,
INDEX IX_Mod6 NONCLUSTERED (Mod6)
);
INSERT INTO Test (ID, Mod6)
SELECT object_id as ID, case when name like '%k%' then null else object_id % 6 end as Mod6
FROM sys.objects;
SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
where Mod6 is null or Mod6 = 0;
-- Plan shows expected seek
SELECT Mod6
FROM Test WITH (INDEX = IX_Mod6, FORCESEEK)
WHERE COALESCE(Mod6, 0) = 0;
-- Error:
-- Msg 8622, Level 16, State 1, Line 20
-- Query processor could not produce a query plan because of the hints
-- defined in this query. Resubmit the query without specifying any hints
-- and without using SET FORCEPLAN.
sql-server
index
sql-server-2016
Mitch
quelle
quelle
CASE
Ausdruck verwendeten Spalten verhindert wird - nicht, dass das Ergebnis des Ausdrucks dann nicht dazu verwendet werden kann, nach etwas anderem zu suchen.COALESCE
Spalte d durchführte.Antworten:
Nein
COALESCE
ist nicht sargable.Ihr eigener Test zeigt dies gut.
Eine Ausnahme wäre, wenn Sie eine berechnete Spalte mit dem
COALESCE
Ausdruck erstellt und diesen indiziert hätten.Sie könnten am Ende eine Suche danach haben
ISNULL
ist insofern etwas sarkastischer, als es, wenn es völlig redundant ist, optimiert werden kann und eine Suche nicht verhindert.Wenn die Spalte
Mod6
als definiert ist,NOT NULL
kann Folgendes eine Suche erzeugen.Aber das bringt natürlich keinen Vorteil gegenüber dem bloßen Tun
quelle