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

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

我正在使用Microsoft SQL数据库

我有一个大约有1000000条记录的表。每天我都用新的更新它

所以我有两张桌子

表1所有记录

表2显示了新记录。我们的想法是只插入新的。因为表1已经可以包含表2中的一些记录。通常大约60万

这是我用来用新记录更新表的查询

    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中的操作,从而导致超时。我接受了您建议的方式。但是当我在同一篇文章中删除这么多查询时,我也遇到了同样的问题。这不是原件。请用新的邮寄。