【问题标题】:Sql query is executing endlesslySql 查询无休止地执行
【发布时间】:2017-03-29 03:52:41
【问题描述】:

我在 Sql Server 上运行了一个简单的 sql 查询,但它并没有停止执行。

更新 表_A 放 Table_A.[Miktar] = Table_B.[Miktar] 从 [零售].[dbo].[tb_DepoSevkDetay] AS Table_A 内部联接 ( 从 [零售].[dbo].[tb_SatisDetay] 中选择 [Miktar]、[UrunID] GROUP BY [UrunID], [Miktar] ) AS Table_B ON Table_A.[UrunID] = Table_B.[UrunID]

可以有循环吗?请帮忙 这是第一个表的一小部分

Depo SatisID SatisSira UrunID Satici KdvKod KDVYuzde Miktar AZ01 20001 1 3788898 999 AZ 18.00 1 AZ01 20002 1 3788898 999 AZ 18.00 1 AZ01 20003 1 3876390 999 AZ 18.00 1 AZ01 20003 2 3793202 999 AZ 18.00 1 AZ01 20003 3 4046508 999 AZ 18.00 1 AZ01 20003 4 3843387 999 AZ 18.00 1 AZ01 20003 5 3850608 999 AZ 18.00 1 第二个
BaslikID Sira UrunID Miktar Fiyat Depo
20001 1 3792703 1 1 AZ01
20002 1 4067131 1 1 AZ01
20003 1 3251881 1 1 AZ01
20003 2 3251883 1 1 AZ01
20003 3 3788887 1 1 AZ01
20003 4 3788890 1 1 AZ01
20004 1 3761260 2 1 AZ01

【问题讨论】:

  • 当子查询返回两条 UrunID 值相同但 Miktar 值不同的记录时,您认为会发生什么。 Table_A 中的记录会得到这两者中的哪一个?
  • 更新中确实没有循环之类的东西,但是你可能有阻塞,或者如果你的表很大,这已经不是一个简单的查询了。
  • 没有循环;您必须更新大量行,并且您的 SQL Server 功能不够强大,无法执行该事务,或者被其他事务阻塞。
  • 执行 sp_who2 并检查是否有其他会话阻止您的会话
  • 你的表上是否有任何索引(我正在查看 UrunID 列)

标签: sql sql-server


【解决方案1】:

对于更新Table_A 的值可能存在冲突:如果子查询为相同的UrunID 返回多个记录,那么应该使用哪个Miktar 值将是不明确的更新Table_A 记录。

因此,请确保子查询每个 UrunID 只返回一条记录:

UPDATE
    Table_A
SET
    Table_A.[Miktar] = Table_B.[Miktar]
FROM
    [Retail].[dbo].[tb_DepoSevkDetay] AS Table_A
    INNER JOIN (
                SELECT   [UrunID], Min([Miktar]) as Miktar 
                    FROM [Retail].[dbo].[tb_SatisDetay]
                GROUP BY [UrunID]
               ) AS Table_B
            ON Table_A.[UrunID] = Table_B.[UrunID]

【讨论】:

  • 这不一定会加快速度 - 实际上可能恰恰相反。
  • 嗯,实际上每个 UrunID 确实包含多条记录,真正的任务是为每个 UrunID 取 Miktar 的总和,并为每个 UrunID 分布在第二张表中。我尝试了 SUM(A.Miktar)/COUNT(B.Miktar),但它无休止地执行。
  • 你有UrunID 的索引吗?你的意思是Table_A第二张桌子
  • 是的,从表 A (satisDetay) 中获取并更新 DepoSevkDetay。关于索引,我在第二张表上找到了这个
    Depo dbo.dt_Depo(char(6)) 6 No No SatisID int 4 No No SatisSira int 4 No No UrunID int 4 No No 
  • 请将此信息放在您的问题中,这样会更易读;-)
【解决方案2】:

在大多数情况下,UPDATE 使用 JOIN 比关联查询慢。在这里,我假设 Miktar 每个 UrunID 都是唯一的

 UPDATE Table_A as A
 SET [Miktar] = 
(SELECT [Miktar] FROM [Retail].[dbo].[tb_SatisDetay] as B where B.[UrunID] = A.[UrunID])

如果UrunIDMiktar 之间存在一对多关系,我认为它会失败

【讨论】:

    【解决方案3】:

    考虑到您为JOIN 条件中涉及的列设置了适当的索引。在子查询中根本不需要group by。您可以将查询更改为如下所示。仅仅发布查询是不够的。考虑发布查询执行计划。

      UPDATE
        Table_A
    SET
        Table_A.[Miktar] = Table_B.[Miktar]
    FROM
        [Retail].[dbo].[tb_DepoSevkDetay] AS Table_A
        INNER JOIN [Retail].[dbo].[tb_SatisDetay] AS Table_B
            ON Table_A.[UrunID] = Table_B.[UrunID];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多