Um dos meus desenvolvedores está argumentando que COALESCE(column, default value) = default value
agora é sargável. Isso está certo?
Eu executei o seguinte teste e acho que isso implica que COALESCE
não é sargável.
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.
Não
COALESCE
não é sargável.Seu próprio teste demonstra isso bem.
Uma exceção seria se você criasse uma coluna computada com a
COALESCE
expressão e a indexasse.Você pode acabar com uma busca sobre isso
ISNULL
é marginalmente mais sargável, pois, se for totalmente redundante, pode ser otimizado e não impedir uma busca.ou seja, se a coluna
Mod6
for definida comoNOT NULL
, então o seguinte pode produzir uma busca.Mas é claro que isso não oferece nenhum benefício em apenas fazer