我正在使用Microsoft SQL数据库
我有一张包含 1000000 记录的表格。我每天都用新的更新它。
所以我有两张桌子
表1所有记录
和
表2新记录。想法是只插入新的。因为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
答案 0 :(得分:0)
尝试在本地临时表中插入记录,然后从本地临时表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
答案 1 :(得分:0)
首先你的索引是什么? 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)
答案 2 :(得分:0)
表1的连接可能是锁定行。在一个表大,具有大量连接的表中,SqlServer会快速将行锁升级为页锁到表锁。
尝试在table1中选择/加入后添加“with(nolock)。这可能会阻止锁定阻止其他查询。
您需要查看添加(nolock)是否适合您的情况。如果不了解缺点,就不应该应用它。这并不能解决所有问题。
答案 3 :(得分:-1)
为什么需要加入Table1和Table2?我认为这不是必需的。加入需要花费大量时间,因此需要超时。
如果您使用的是MySql,INSERT IGNORE会处理独特的插入,您无需加入Table1和Table2。