Как разбивать коммиты на SQL Server - PullRequest
2 голосов
/ 21 августа 2011

Что было бы хорошим решением для разбиения на страницы коммитов, когда у меня есть запрос типа

BEGIN TRANSACTION
INSERT INTO
    table1
FROM
    table2

INSERT INTO
    table3
FROM
    table4
COMMIT 

Я имею дело с большими объемами данных, и у меня возникают некоторые проблемы с фиксацией всего этого сразу, поэтому я хотел бы зафиксировать что-то вроде 5000 строк на каждый коммит.

Мысль о чем-то вроде

  • maxNumber = получить максимальное количество строк среди числа строк из таблиц 2 и 3
  • maxNumber / 5000 = numberOfCommits
  • создать цикл от 1 до numberOfCommits и обработать данные по номеру строки (используя ROW_NUMBER ()) (n-1) * 5000 до n *5000* 1013 *

Было бы здорово узнать, как это сделать лучше!

Заранее спасибо!

1 Ответ

4 голосов
/ 21 августа 2011

Обработка всей таблицы пакетами на основе ROW_NUMBER () на самом деле является потенциально плохой идеей. Чтобы вернуть ROW_NUMBER 5001, движок должен сначала сосчитать 5000 строк. Чтобы прочитать строку 10001, нужно снова сосчитать первые 5000, затем следующие 5000. И так далее, и так далее, шаблон очень интенсивно читается. Если таблицы маленькие, это не имеет значения, но если они не ...

Если ваши таблицы имеют хотя бы один уникальный индекс (предпочтительно кластерный), тогда вы можете использовать комбинацию TOP 5000 и WHERE uniquecolumn > @lastbatchmaxvalue. Если у вас нет такого уникального индекса, вы можете сделать это только с помощью курсора.

Но, возможно, лучшее решение - это выйти из ограничений T-SQL. SSIS идеально подходит для выполнения подобных задач, поддерживает пакеты и работает с эффективным интерфейсом массовой вставки, когда это возможно.

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