Jeden z moich programistów twierdzi, że COALESCE(column, default value) = default value
jest teraz do sargable. Czy to prawda?
Przeprowadziłem następujący test i myślę, że to sugeruje, że COALESCE
nie można go sprzedawać.
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
źródło
źródło
CASE
wyrażeniu - nie dlatego, że wynik wyrażenia nie może być następnie użyty do wyszukiwania w czymś innym.COALESCE
kolumny d.Odpowiedzi:
Nie,
COALESCE
nie można wysiadać.Twój własny test pokazuje to dobrze.
Wyjątkiem może być utworzenie kolumny obliczeniowej z
COALESCE
wyrażeniem i zaindeksowanie tego.Możesz skończyć z poszukiwaniem tego
ISNULL
jest marginalnie bardziej podatny na sprzedaż, ponieważ jeśli jest całkowicie zbędny, można go zoptymalizować i nie uniemożliwić wyszukiwania.tzn. jeśli kolumna
Mod6
jest zdefiniowana jako,NOT NULL
to następujące może wygenerować wyszukiwanie.Ale to oczywiście nie zapewnia żadnych korzyści w porównaniu do zwykłego działania
źródło