T-Sql - оптимизировать хранимую процедуру, которая обновляет соединение для больших таблиц - PullRequest
0 голосов
/ 29 марта 2011

Фактическое обновление выглядит следующим образом:

UPDATE TableA 
    SET TableA.Col1 =TableB.Col2 
    FROM TableA (nolock)
        INNER JOIN TableB (nolock) 
            ON TableA.Col1 = -TableB.Col2  

TableA Col1 инвертируется, если он найден в TableB Col1 Не все строки в Таблице A имеют обновленный Col1, допустим, от 20 до 40%

Размер таблицы: 1 миллион строк, размер таблицы - 8 миллионов. Оба столбца Col1 и Col2 проиндексированы. БД - это Sql Server 2000, который не помогает ситуации.

Спасибо

MAA

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Я думаю, что будет намного быстрее, если вы уроните индекс для tableA.Col1, запустите обновление, а затем заново создадите индекс для col1.

Обновляет индекс для каждой записи. Отбрасывание и воссоздание давайте сделаем это как массовую операцию, которая должна быть намного быстрее.

Также убедитесь, что Col1 не входит в кластеризованный индекс. Если это так, вы можете изменить это.

GJ

0 голосов
/ 29 марта 2011

Это один из случаев, когда вы хотите выполнить цикл, но обрабатывать в пакетах записей не по одной за раз. Вам необходимо выяснить, какой размер бактов лучше всего работает в вашей системе, но начните с 5000, а если быстро, перейдите к большему числу.

    DECLARE @Min_id INT, @Max_id INT

    SELECT @Min_id= MIN(ID) 
    FROM TableA


    SET @Max_id =@Min_id + 5000

    WHILE @Min_id IS NOT NULL
        BEGIN

            UPDATE TableA 
            SET TableA.Col1 =TableB.Col2 
            FROM TableA (nolock) 
            INNER JOIN TableB (nolock) 
                ON TableA.Col1 = -TableB.Col2 

            SELECT @Min_id= MIN(ID) 
            FROM TableA
            WHERE ID > @Max_id

            SET @Max_id = @Min_id + 5000
        END
...