Как я могу эффективно манипулировать 500 тыс. Записей в SQL Server 2005? - PullRequest
0 голосов
/ 24 марта 2010

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

Вот процесс, которому я следую в моем приложении VB, которое обрабатывает данные (в целом):

  1. Удалить все записи из временной таблицы (чтобы удалить данные за последний месяц) (например, DELETE * FROM tempTable)
  2. Копировать текстовый файл во временную таблицу
  3. Введите дополнительную информацию во временную таблицу, такую ​​как их organization_id, их user_id, group_code и т. Д.
  4. Обновление данных в реальных таблицах на основе данных, вычисленных во временной таблице

Проблема в том, что я часто запускаю такие команды, как UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id), и эти команды часто останавливаются. Я пытался увеличить таймауты до 10 минут, но они все равно не работают. Теперь я понимаю, что 500 тыс. Строк - это не малое количество строк, которыми нужно манипулировать, но я думаю, что база данных, предназначенная для обработки миллионов и миллионов строк, должна легко справляться с 500 тыс. Строк. Что-то не так с обработкой этих данных?

Пожалуйста, помогите. Любые предложения приветствуются.

Ответы [ 6 ]

5 голосов
/ 24 марта 2010

подзапросов, подобных тому, который вы задаете нам в вопросе:

UPDATE tempTable SET user_id = (SELECT user_id FROM myUsers WHERE external_id = tempTable.external_id) 

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

UPDATE t
    SET user_id = u.user_id
    FROM tempTable          t
        inner join myUsers  u ON t.external_id=u.external_id

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

1 голос
/ 24 марта 2010

Посмотрите на ответ КМ и не забудьте об индексах и первичных ключах.

1 голос
/ 24 марта 2010

Убедитесь, что в ваших таблицах есть индексы, из которых вы делаете выбор. В вашем примере команды UPDATE вы выбираете user_id из таблицы myUsers. У вас есть индекс со столбцом user_id в таблице myUsers? Недостатком индексов является то, что они увеличивают время для вставок / обновлений. Убедитесь, что у вас нет индексов в таблицах, которые вы пытаетесь обновить. Если таблицы, которые вы пытаетесь обновить, имеют индексы, рассмотрите возможность их удаления, а затем перестройте их после импорта.

Наконец, запустите ваши запросы в SQL Server Management Studio и посмотрите на план выполнения, чтобы увидеть, как выполняется запрос. Ищите такие вещи, как сканирование таблицы, чтобы увидеть, где вы можете оптимизировать.

1 голос
/ 24 марта 2010

Индексируете ли вы временную таблицу после импорта данных?

temp_table.external_id определенно должен иметь индекс, поскольку он содержится в предложении where.

1 голос
/ 24 марта 2010

Требуется больше информации. Я регулярно манипулирую 3-4 миллионами строк в таблице 150 миллионов строк, и я НЕ думаю, что это много данных. У меня есть таблица «продукты», которая содержит около 8 миллионов записей, включая полнотекстовый поиск. Проблем тоже нет.

Можете ли вы просто использовать свое оборудование? Я предполагаю, что «обычный настольный ПК» или «сервер нижнего уровня», как с абсолютно неоптимальным расположением дисков, так и с кучей проблем с вводом-выводом - при обновлениях.

0 голосов
/ 24 марта 2010

Существуют более эффективные способы импорта больших блоков данных. Посмотрите в SQL Books Online под BCP (протокол массового копирования.)

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