Ограничить количество строк - TSQL - Слияние - SQL Server 2008 - PullRequest
1 голос
/ 23 августа 2011

Привет всем, у меня есть следующий сценарий слияния sql, который отлично работает для сравнительно небольшого числа строк (до 20 000 я нашел).Однако иногда данные, которые у меня есть в таблице B, могут содержать до 100 000 строк, и я пытаюсь объединить их с таблицей A (которая в настоящее время составляет 60 миллионов строк).Это занимает много времени для обработки, и это понятно, поскольку необходимо объединить 100 000 с 60 миллионами существующих записей!

Мне просто было интересно, есть ли лучший способ сделать это.Или возможно иметь какой-то счет, поэтому объедините 20 000 строк из таблицы B в таблицу A. Затем удалите эти объединенные строки из таблицы B. Затем выполните следующие 20 000 строк и так далее, пока в таблице B не останется строк?

Сценарий:

MERGE
    Table A AS [target]
USING
    Table B AS [source]
ON
    ([target].recordID = [source].recordID)
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
        VALUES([source].[recordID],[source].[Field 1],[source].[Field 2],[source].[Field 3],[source].[Field 4],[source].[Field 5]
    );

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

MERGE излишне для этого, так как все, что вам нужно, это INSERT пропущенных значений.

Попытка:

INSERT INTO Table_A
([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
SELECT  B.[recordID],
        B.[Field 1],B.[Field 2],B.[Field 3],B.[Field 4],B.[Field 5]
FROM Table_B as B
WHERE NOT EXISTS (SELECT 1 FROM Table_A A
                  WHERE A.RecordID = B.RecordID)

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

2 голосов
/ 23 августа 2011

Вы можете определенно сделать (SELECT TOP 20000 * FROM B ORDER BY [some_column]) as [source] в USING и затем удалить эти записи после MERGE. Таким образом, ваш псевдокод будет выглядеть так:

1. Merge top 20000
2. Delete 20000 records from source table
3. Check @@ROWCOUNT. If it's 0, exit; otherwise goto step 1

Я не уверен, что он работает быстрее, чем объединение всех записей одновременно. Также ты уверен, что тебе нужно MERGE? Из того, что я вижу в вашем коде INSERT INTO ... SELECT также должно работать для вас.

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