SELECT * FROM tableName WHERE (ISNULL(columnName,0) > 0)或
SELECT * FROM tableName WHERE (columnName IS NOT NULL) AND (columnName > 0)哪一个更好?
columnName具有int数据类型
发布于 2011-12-16 21:50:00
您不需要在查询中检查null值,所以我想这样会更好。
SELECT * FROM tableName WHERE columnName > 0发布于 2011-12-16 21:50:25
为什么不只是WHERE columnName > 0呢?条件的其余部分似乎是多余的:不会返回空值。
发布于 2011-12-16 21:50:03
如何做得更好?
我认为后者更具可读性,其他人可能不同意。你可能有一种倾向于前者的房子风格,在这种情况下,这是毫无疑问的。
至于性能,我非常怀疑是不是导致了性能问题,所以你不应该优化,过早优化是万恶之源。
这是一个很好的问题,询问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;https://stackoverflow.com/questions/8535032
复制相似问题