我在sql Server中有一个SP,每分钟运行数百次,需要检查数据库的传入流量.目前它执行以下操作
INSERT INTO table SELECT @value1,@value2 WHERE NOT EXISTS (SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2);
不过,我也可以一起去
IF NOT EXISTS(SELECT * FROM table WHERE value1 = @value1 AND value2 = @value2) INSERT INTO table (value1,value2) VALUES (@value1,@value2);
哪个会更快?我觉得它们之间并没有太大区别,但我在历史上并不擅长Tsql …… = /
更新:哎呀…意味着说EXISTS使用多于1个值来查找是否存在记录,因此唯一约束将不起作用.编辑样本以反映……
解决方法
在对这个问题及其答案添加了大量评论之后,我将继续自己回答这个问题.
我不希望在原始问题中提出的两个提议之间在性能上有任何重大差异.一方面,正如Ray所指出的,第二种方法可能会使您无法为插入做一些准备工作,但另一方面,RDBMS通常在批处理语句中表现最佳,如第一种解决方案.
KM和DVK建议添加UNIQUE约束,这将使隐含唯一性测试,但需要在INSERT语句周围添加某种错误处理.我很难发现为什么这应该添加任何额外的性能,假设你已经有一个覆盖这两列的索引.如果您没有这样的索引,请添加它,并重新考虑您对提高性能的需求.
无论是显性还是隐式执行唯一性检查都不应该与AFAIK无关.如果通过在DBMS的“内部”进行检查获得了任何结果,那么当重复存在时,该增益可能会被与引发和处理错误相关的开销所吞噬.
底线:假设索引已经到位,如果您仍然发现自己渴望性能,我建议您对三个建议的解决方案进行实证测试.制作一个模拟预期输入数据的小程序,然后用几十亿行吹掉三个解决方案中的每一个,包括一些可能的重复数据.这样做,一定要发布你的结果:-)