我正在尝试使用不同表中的基本数据填充我创建的表。
我有许多要加入的ID,但由于多种原因,没有一个ID可用于所有记录。因此,我设置了一系列级联UPDATE语句:内部连接首先使用ID1到基本表,并为当前记录填充表;内部连接接下来使用ID2到基本表,用于以前未填充的记录,再次为具有匹配的记录填充表;等。
这允许我得到一个非常接近我的初始表中存在的所有记录的匹配(~99.5%在级联更新后匹配,其中最多78%与任何单个ID匹配),是很棒的。问题是我需要这样做来填充表格中的许多不同字段,并且当我重复每个数据项的过程时处理变得缓慢。
有没有比使用级联更新更好的方法来实现我的目标?也许类似于我根本不知道的COALESCE功能(COALESCE不起作用,但本质上是迭代的)?
如果没有,在下面的查询中,是否有任何明显的方法可以加快速度?
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
答案 0 :(得分:1)
在没有看到执行计划的情况下,唯一突然出现的是:
JOIN qai.dbo.secmstr s ON s.cusip = substring(b.cusip,1,8)
在你的第4行。我猜想substring
的使用正在吹嘘这个特定部分的索引用法。我相信这意味着当您更新记录时,您将不得不更新索引,但在尝试查找记录时(假设您有索引),您将无法获得索引使用的性能提升。
有点“两全其美”的情况。