如果有人查询这个表,插入新记录会导致超时?

问题描述 投票:0回答:5

我正在使用 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
sql sql-server-2008
5个回答
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  

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) 

0
投票

与表 1 的连接可能会锁定行。这么大的表,有大量的join,SqlServer会很快将行锁升级为页锁,再升级为表锁。

尝试在 table1 的 select/join 之后添加“with (nolock)”。这可能会阻止锁阻塞其他查询。

您需要查看添加(nolock)是否适合您的情况。在不了解其缺点的情况下不应应用它。这并不是包治百病的方法。


0
投票

看起来陷入僵局

Tbl 1 被一项操作锁定,而另一个操作也正在访问它

考虑使用不同的事务隔离级别 如果可能,请尝试对查询使用较低的隔离级别(例如,READ UNCOMMITTED)。这可以减少锁定问题。


-1
投票

为什么需要连接Table1和Table2?我认为这没有必要。加入需要花费大量时间,因此会超时。

如果您使用 MySql,INSERT IGNORE 将处理唯一插入,您无需连接 Table1 和 Table2。

© www.soinside.com 2019 - 2024. All rights reserved.