Sql 如果有人查询此表,插入新记录可能导致超时?
我正在使用Microsoft SQL数据库 我有一个大约有1000000条记录的表。每天我都用新的更新它 所以我有两张桌子 表1所有记录 及 表2显示了新记录。我们的想法是只插入新的。因为表1已经可以包含表2中的一些记录。通常大约60万 这是我用来用新记录更新表的查询Sql 如果有人查询此表,插入新记录可能导致超时?,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用Microsoft SQL数据库 我有一个大约有1000000条记录的表。每天我都用新的更新它 所以我有两张桌子 表1所有记录 及 表2显示了新记录。我们的想法是只插入新的。因为表1已经可以包含表2中的一些记录。通常大约60万 这是我用来用新记录更新表的查询 INSERT INTO Table1 ( Column1, Column2, Column3 ) SELECT Column1, Col
INSERT INTO Table1
(
Column1, Column2, Column3
)
SELECT Column1, Column2, Column3
FROM Table2
LEFT OUTER JOIN Table1
ON Table1.ColumnID = Table2.ColumnID
WHERE Table1.ColumnStockID IS NULL
我在执行此查询期间遇到的问题。对表1的大多数查询选择了1-10条以上的记录,并给出了超时时间。即使在服务器上,我也看不到高CPU
这是我的问题吗?有没有办法使它更有效率?
还是以其他更有效的方式插入新记录
当我试图删除时也会发生同样的情况
DELETE ITEMS
FROM Table1 ITEMS WITH(NOLOCK)
LEFT OUTER JOIN Table2 NEWITEMS
ON ITEMS.ID = NEWITEMS.ID
WHERE NEWITEMS.ID IS NULL AND ITEMS.ID IS NOT NULL
为什么需要加入表1和表2?我认为这不是必需的。加入需要大量的时间,因此需要超时
如果您使用的是MySql,INSERT IGNORE将处理唯一的插入,并且您不需要连接表1和表2。尝试在本地临时表中插入记录,然后从本地临时表select语句中插入记录
SELECT Column1, Column2, Column3
into #temp FROM Table2
LEFT OUTER JOIN Table1
ON Table1.ColumnID = Table2.ColumnID
WHERE Table1.ColumnStockID IS NULL
INSERT INTO Table1
(
Column1, Column2, Column3
)
Select * from #temp
Drop table #temp
首先,你的索引是什么?FK不会自动建立索引 NOT EXISTS通常比left join表单更快地查找一个表中的记录,而不是另一个表中的记录
INSERT INTO Table1 (Column1, Column2, Column3)
SELECT Column1, Column2, Column3
FROM Table2 t2
WHERE NOT EXISTS (SELECT *
FROM Table1 t1
WHERE t1.ColumnId = t2.ColumnId)
表1的连接可能正在锁定行。在这么大的表中,有大量的联接,SqlServer将快速地将行锁升级到页锁,再升级到表锁 尝试在从表1中选择/加入后使用nolock添加。这可以防止锁阻塞其他查询
您需要查看添加nolock是否适合您的情况。在不了解缺点的情况下,不应该应用它。这并不是万灵丹。查询窗口或代码隐藏中即将出现超时。如果是代码隐藏,那么是什么语言?从SQL执行查询JobOP尝试插入唯一记录。这就是JOIN的原因Temp表的原因是使用I/O操作简化查询的执行。这将加快查询速度。因此,超时问题将被删除。请解释我们。顺便说一句,到目前为止,你建议的方式比我建议的更有效。我现在正在测试。当然,你应该测试一下。据我所知,在这种情况下,当有大量记录要插入时,会减慢RAM中的操作,从而导致超时。我接受了您建议的方式。但是当我在同一篇文章中删除这么多查询时,我也遇到了同样的问题。这不是原件。请用新的邮寄。