Лучше как?
Я думаю, что последнее более читаемо, другие могут не согласиться. У вас может быть стиль дома, который одобряет первое, и в этом случае нет никаких сомнений.
Что касается производительности, я очень сомневаюсь, что вы вызываете проблему с производительностью, поэтому вам не следует оптимизировать, преждевременная оптимизация - это корень всего зла.
Вот хороший вопрос задавать When is optimisation premature? и here является определение термина.
В этом случае повышает производительность примерно в таком порядке:
SELECT Count(*) FROM BigTable WHERE (ISNULL(SmallNumber,0) > 0) --140 ms
SELECT Count(*) FROM BigTable WHERE (SmallNumber IS NOT NULL) AND (SmallNumber > 0) --41 ms
SELECT Count(*) FROM BigTable WHERE SmallNumber > 0 --30 ms
Но поменять Count(*)
с *
и любой крошечный прирост производительности теряется в море для извлечения строк.
Вы можете протестировать его самостоятельно, используя этот уродливый кусок кода, чтобы создать большую таблицу.
CREATE TABLE [dbo].[BigTable]([ID] [int] IDENTITY(1,1) NOT NULL, [BigNumber] [bigint] NULL, [SmallNumber] [int] NULL,
CONSTRAINT [PK_BigTable] PRIMARY KEY CLUSTERED ([ID] ASC));
CREATE NONCLUSTERED INDEX [IX_BigTable] ON [dbo].[BigTable] ([SmallNumber] ASC);
With Digits as (SELECT 0 AS d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9),
OneToAMillion as (SELECT (100000 * D6.d) + (10000 * D5.d) + (1000 * D4.d) + (100 * D3.d) + (10 * D2.d) + (1 * D1.d) AS Number
FROM Digits D6, Digits D5, Digits D4, Digits D3, Digits D2, Digits D1)
INSERT INTO dbo.BigTable (BigNumber, SmallNumber) SELECT CAST(CHECKSUM(NEWID()) as BigInt) * CHECKSUM(NEWID()), CHECKSUM(NEWID()) FROM OneToAMillion;
UPDATE BigTable SET SmallNumber = Null WHERE BigNumber < 0;
Почему бы вам не воспользоваться SQL Query Analyzer? – Gnat
Вы должны понимать, что значение NULL по сравнению с 0 никогда не вернет True, поэтому вам не нужно его проверять. Вы также должны знать, что, если Оптимизатор достаточно умен, чтобы исправить это для вас, ISNULL (columnName, 0)> 0 не сможет воспользоваться индексом в вашем столбце. Таким образом, это будет преимуществом второй формы, если вам нужно сравнение с NULL (чего у вас нет). – GilM
Я считаю, что @GilM имеет лучший ответ. Удостовериться, что ваши запросы используют индексы (sargeable), могут быть довольно важными. – Fionnuala