Улучшить производительность операторов каскадного обновления? - PullRequest
0 голосов
/ 01 июля 2011

Я пытаюсь заполнить созданную мной таблицу фундаментальными данными, представленными в другой таблице.

У меня есть несколько идентификаторов, к которым можно присоединиться, но по ряду причин ни один идентификатор не будет работать для всех записей. В связи с этим я установил серию каскадных операторов UPDATE: сначала выполняется внутреннее соединение с использованием ID1 для основной таблицы и заполнение таблицы для имеющихся записей; затем внутреннее соединение, используя ID2, к основной таблице для записей, которые ранее не заполнялись, и снова заполнение таблицы для записей с совпадением; и т.д.

Это позволяет мне получить совпадение для почти всех записей, присутствующих в моей исходной таблице (~ 99,5% имеют совпадение после каскадных обновлений, где не более 78% имеют совпадение с любым отдельным идентификатором), что отлично. Проблема в том, что мне нужно сделать это, чтобы заполнить несколько различных полей в моей таблице, и обработка становится вялой, когда я повторяю процедуру для каждого элемента данных.

  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 Ответ

1 голос
/ 01 июля 2011

Единственное, что выскакивает у меня, не видя плана выполнения, это:

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

на вашей 4-й строке.Я предполагаю, что использование substring уносит ваше индексное использование для этой конкретной части.Я полагаю, что это означает, что вы получите снижение производительности при обновлении своих индексов при обновлении записей, но вы не получите прирост производительности при использовании индексов при попытке найти записи (если у вас есть индексы).1006 * Вид "худшего из обоих миров".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...