所以,我在这里查看一个存储过程,它有多个行,如下面的伪代码:
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)
会更高效。
答案 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