提高级联更新语句的性能?

时间:2011-07-01 16:36:43

标签: sql sql-server tsql

我正在尝试使用不同表中的基本数据填充我创建的表。

我有许多要加入的ID,但由于多种原因,没有一个ID可用于所有记录。因此,我设置了一系列级联UPDATE语句:内部连接首先使用ID1到基本表,并为当前记录填充表;内部连接接下来使用ID2到基本表,用于以前未填充的记录,再次为具有匹配的记录填充表;等。

这允许我得到一个非常接近我的初始表中存在的所有记录的匹配(~99.5%在级联更新后匹配,其中最多78%与任何单个ID匹配),是很棒的。问题是我需要这样做来填充表格中的许多不同字段,并且当我重复每个数据项的过程时处理变得缓慢。

  1. 有没有比使用级联更新更好的方法来实现我的目标?也许类似于我根本不知道的COALESCE功能(COALESCE不起作用,但本质上是迭代的)?

  2. 如果没有,在下面的查询中,是否有任何明显的方法可以加快速度?

    UPDATE #temp
       SET Avg_DivYld_5yr = d.value_ / AvgPrice
          FROM #temp b
          JOIN qai.dbo.secmstr s ON s.cusip = substring(b.cusip,1,8)
           --on s.sedol = substring(b.sedolcode,1,6)
                                AND b.Avg_DivYld_5yr IS NULL
          JOIN qai.dbo.secmap m ON m.seccode = s.seccode 
                               AND m.ventype = 7
                               AND ((m.exchange = 0 AND m.rank = 1) OR m.exchange = 2)
          JOIN qai.dbo.wsndata d ON d.code = m.vencode
                                AND d.item = 5140
                              --and d.freq = 'A'
                                AND d.year_ = @year_
          JOIN (SELECT code, SUM(value_) AS AvgPrice
                  FROM qai.dbo.wsndata d2
                 WHERE year_ BETWEEN @year_-4 and @year_
                   AND item = 5001
                   AND freq = 'A'
              GROUP BY code) d2 ON d2.code = m.vencode
    

1 个答案:

答案 0 :(得分:1)

在没有看到执行计划的情况下,唯一突然出现的是:

JOIN qai.dbo.secmstr s ON s.cusip = substring(b.cusip,1,8)

在你的第4行。我猜想substring的使用正在吹嘘这个特定部分的索引用法。我相信这意味着当您更新记录时,您将不得不更新索引,但在尝试查找记录时(假设您有索引),您将无法获得索引使用的性能提升。

有点“两全其美”的情况。