Улучшение производительности оператора обновления - PullRequest
0 голосов
/ 17 мая 2018

Я создаю запрос на обновление SQL. В этом запросе должны отображаться данные о самых популярных платных поставщиках и сведения о платежах по каждому поставщику за месяц, а также общая сумма платежей для поставщика

VendorTable
Vendor varchar(100)
Month   Date
MonthlyAmt   int
TotalAmt int

-

Vendor   Month   MonthlyAmt   TotalAmt
Vendor1  Jan-15  $100         NULL
Vendor2  Mar-16  $250         NULL
Vendor3  Sep-16  $300         NULL
Vendor1  Dec-16  $140         NULL
Vendor2  Feb-17  $210         NULL
Vendor1  Apr-17  $400         NULL
Vendor3  Aug-17  $420         NULL
Vendor2  Nov-17  $330         NULL
Vendor2  Mar-18  $110         NULL
Vendor1  May-18  $230         NULL

Пример конечного результата

Vendor   Month   MonthlyAmt   TotalAmt
Vendor1  Jan-15  $100         $870
Vendor2  Mar-16  $250         $900
Vendor3  Sep-16  $300         $720
Vendor1  Dec-16  $140         $870
Vendor2  Feb-17  $210         $900
Vendor1  Apr-17  $400         $870
Vendor3  Aug-17  $420         $900
Vendor2  Nov-17  $330         $900
Vendor2  Mar-18  $110         $900
Vendor1  May-18  $230         $870

Мое обновление выглядит так, но его обработка занимает очень много времени. Интересно, есть ли гораздо более быстрый способ сделать это?

UPDATE VendorTable 
SET TotalAmt = (SELECT SUM(MonthlyAmt) FROM VendorTable B WHERE B.Vendor = A.Vendor)
from VendorTable A

1 Ответ

0 голосов
/ 17 мая 2018

Попробуйте что-то вроде ...

WITH X AS (
    SELECT Vendor , SUM(MonthlyAmt) AS TotalAmtCalculated
    FROM VendorTable
    GROUP BY Vendor
)
UPDATE t 
 SET t.TotalAmt = x.TotalAmtCalculated
FROM VendorTable t 
INNER JOIN x ON t.Vendor = x.Vendor

Ваш запрос медленный, потому что ваш внутренний выбор выполняется для каждой строки, возвращаемой внешним запросом обновления.

Также проверьте, есть ли в таблице какие-либо индексы со столбцом TotalAmt, эти индексы также замедляют ваши обновления.

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