【发布时间】:2013-06-06 15:44:06
【问题描述】:
设置: SQL Server 2008 R2
背景故事: 我们有一个同时在多个线程中调用的 proc。这些线程化的 proc 调用有时会将重叠(重复)数据写入它们写入的表中。在插入语句中,我有一个“NOT EXISTS”子句来确保不插入重复项,但我们仍然得到重复项。
问题: “NOT EXISTS”子句做了一个简单的选择,因为线程调用的插入仅相隔几毫秒,一些索引(特别是“NOT EXISTS”子句使用的索引)是否可能尚未更新?因此在插入之前看不到现有记录?
想法: 这可能是我不理解 SQL 是如何做它的事情的。如果我有一个带有“WHERE NOT EXISTS”的插入,它是否会在插入之前检查以确保不存在任何记录?还是在插入每一行时以逐行方式检查?如果是前者(在进行任何插入之前检查所有内容),那么我认为其他调用之一可能尚未完成它的插入。
我被难住了。
这是我正在做的一个例子:
插入 [SomeTable] (Col1,Col2)
选择
A列,
B栏
从
#TempTable
在哪里
不存在 (
选择 1
来自 [SomeTable]
其中 Col1 = #TempTable.ColumnA
AND Col2 = #TempTable.ColumnB
)
【问题讨论】:
-
你能给我们看看代码吗?猜测时间太长了。见Writing The Perfect Question。
-
您是否在代码中使用事务?
-
无事务,proc 有 10,000 行长。 :) 这是一个直接的插入,它将临时表中的记录插入到用户表中,其中该条目不存在。如果您为员工运行 proc,然后直接再次运行,它不会插入任何内容,因为它看到记录已经存在。
test -
添加了代码示例。是的,在生产代码中就是这么简单。
标签: sql-server-2008 tsql indexing sql-insert