T-SQL存储过程:选择计数(*)与选择计数([uniqueId])

时间:2015-12-18 12:50:44

标签: sql sql-server performance stored-procedures

所以,我在这里查看一个存储过程,它有多个行,如下面的伪代码:

if(select count(*) > 0)
...

在具有唯一ID(或标识符,用于使其更通用)的表上。

现在,就性能而言,更改此条款是否更有效 到

if(select count([uniqueId]) > 0)
    ...

其中uniqueId是,例如,Idx包含双值?

一个例子:

考虑像Idx(double)|这样的表名称(字符串)|地址(字符串)

现在' Idx'是我想要在存储过程中加入的外键。

所以,就性能而言:这里有什么更好的?

if(select count(*) > 0)
    ...

if(select count(Idx) > 0)
    ...

?或者SQL引擎是否在内部将select count(*)更改为select count(Idx),因此我们不必为此烦恼?因为乍一看,我说select count(Idx)会更高效。

2 个答案:

答案 0 :(得分:2)

评论太长了。

两者略有不同。 count(*)计算行数。 count([uniqueid])计算uniqueid的非NULL值的数量。由于唯一约束允许NULL值,因此SQL Server实际上需要读取列。这可能会增加查询的微秒时间,特别是如果具有id的页面尚未在内存中。这也为SQL Server提供了更多优化count(*)的机会。

@ lad2025在评论中写道,性能解决方案是使用if (exists . . .

答案 1 :(得分:-1)

SELECT t1.* 
FROM Table1 t1
JOIN Table2 t2 ON t2.idx = t1.idx

只会为您提供t1中与Table2中的idx值匹配的行。我不确定是否有充分理由做if(选择计数......)。

如果你真的对这样的表现感兴趣,只需创建一个包含一百万行的临时表并给它一个去:

CREATE TABLE #TempTable (id int identity, txt varchar(50))
GO

INSERT #TempTable (txt) VALUES (@@IDENTITY)
GO 1000000