我正在使用 Microsoft SQL 数据库
我有一个包含大约 1000000 条记录的表。我每天都会更新新的。
所以我有两张桌子
表1包含所有记录
和
Table2 新增记录。这个想法是只插入新的。因为Table1 已经可以包含Table2 中的一些记录。一般是600K左右
这是我用来用新记录更新表的查询。
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
尝试将记录插入到本地临时表中,然后从本地临时表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 通常是比左连接形式更快的形式,可以在一个表中查找记录,但不能在另一个表中查找记录。
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 的连接可能会锁定行。这么大的表,有大量的join,SqlServer会很快将行锁升级为页锁,再升级为表锁。
尝试在 table1 的 select/join 之后添加“with (nolock)”。这可能会阻止锁阻塞其他查询。
您需要查看添加(nolock)是否适合您的情况。在不了解其缺点的情况下不应应用它。这并不是包治百病的方法。
看起来陷入僵局
Tbl 1 被一项操作锁定,而另一个操作也正在访问它
考虑使用不同的事务隔离级别 如果可能,请尝试对查询使用较低的隔离级别(例如,READ UNCOMMITTED)。这可以减少锁定问题。
为什么需要连接Table1和Table2?我认为这没有必要。加入需要花费大量时间,因此会超时。
如果您使用 MySql,INSERT IGNORE 将处理唯一插入,您无需连接 Table1 和 Table2。