如果有人查询此表,插入新记录可能会导致超时?

时间:2011-06-07 13:59:39

标签: sql sql-server-2008

我正在使用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

4 个答案:

答案 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。