在阅读一些SQL调优相关文档时,我发现了这个:

选择计数(*):

计算行数。 通常不恰当地用于验证记录的存在。

SELECT COUNT(*)真的那么糟糕吗?

验证记录存在的正确方法是什么?


当前回答

其他选项:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [MyTable] AS [MyRecord])
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END

其他回答

我宁愿不使用Count函数:

IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
     <do smth>

例如,如果你想在将user插入数据库之前检查它是否存在,查询可以是这样的:

IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
    INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END

其他答案都很好,但是添加LIMIT 1(或等价的,以防止检查不必要的行)也会很有用。

你可以使用:

SELECT 1 FROM MyTable WHERE... LIMIT 1

使用select 1防止检查不必要的字段。

使用LIMIT 1防止检查不必要的行。

其他选项:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [MyTable] AS [MyRecord])
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END

你可以使用:

SELECT COUNT(1) FROM MyTable WHERE ... 

or

WHERE [NOT] EXISTS 
( SELECT 1 FROM MyTable WHERE ... )

这将比SELECT *更有效,因为您只是为每一行选择值1,而不是所有字段。

COUNT(*)和COUNT(列名)之间也有细微的区别:

COUNT(*)将计数所有行,包括空值 COUNT(列名)将只计算列名出现的非空值