WHERE (ISNULL (columnName, 0)> 0) и WHERE (columnName НЕ НУЛЬ) и AND (columnName> 0) - PullRequest
2 голосов
/ 16 декабря 2011
SELECT * FROM tableName WHERE (ISNULL(columnName,0) > 0)

ИЛИ

SELECT * FROM tableName WHERE (columnName IS NOT NULL) AND (columnName > 0)

какой из них лучше?

columnName имеет int тип данных

Ответы [ 3 ]

7 голосов
/ 16 декабря 2011

Вам не нужно проверять нулевые значения в вашем запросе, поэтому я думаю, это будет лучше.

SELECT * FROM tableName WHERE columnName > 0
3 голосов
/ 16 декабря 2011

А почему не просто WHERE columnName > 0? Остальная часть условия представляется излишней: нули не возвращаются.

0 голосов
/ 16 декабря 2011

Лучше как?

Я думаю, что последнее более читабельно, другие могут не согласиться.У вас может быть домашний стиль, который предпочтительнее первого, и в этом случае нет никаких сомнений.

Что касается производительности, я очень сомневаюсь, что либо это вызывает проблемы с производительностью, поэтому вам не следует оптимизировать , преждевременная оптимизация - корень всего зла.


Хороший вопрос: Когда оптимизация преждевременна? и здесь - это определениеterm.

В этом случае производительность примерно улучшается в следующем порядке:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...