Медленная вставка / удаление

#database #vb.net #indexing #ssms

#База данных #vb.net #индексирование #ssms

Вопрос:

Итак, у меня есть база данных SQL Server, которую я подключил к приложению vb и использую SSMS. Приложение считывает данные, а затем в основном анализирует и извлекает данные из файлов .txt, затем вставляет в 2 таблицы в моей базе данных.

Способ, которым я загружаю эти данные, в основном заключается в чтении из файла .txt, затем переносе информации в datatable, sqlbulkcopy затем эти данные в промежуточную таблицу (без индексов) в моей базе данных и, наконец, select into из промежуточной таблицы в оперативную версию таблиц. У действующих таблиц есть индексы (по 2 некластеризованных и по 1 кластеризованному каждый.).

Кажется, у меня возникают проблемы, поскольку моя база данных растет со временем загрузки. Раньше это было очень быстро (40 секунд на файл размером 750 мб .txt), но из того, что я могу сказать, что переход всей промежуточной таблицы к вставке живой таблицы занимает ОЧЕНЬ много времени, более 6 минут (возможно, больше на файл), мне пришлось отменить, так как это занимало слишком много времени. Я знаю, что это может быть связано с ростом моей базы данных (70 миллионов строк на момент написания.), но я бы не подумал, что вставка займет так много времени.

Я отключил все некластеризованные индексы в таблице lives, и никаких существенных улучшений замечено не было. Есть еще идеи, как улучшить вставку данных?

ТАКЖЕ я знаю, что люди предложат также удалить и воссоздать кластеризованный индекс, но это приводит к моему другому вопросу, я пытался удалить свой кластеризованный индекс, но, похоже, это занимает необычно много времени. Я ждал более часа, и снова он все еще работал. Я проверил, блокирует ли это какой-либо процесс, но, похоже, этого не было? Опять же, любая информация или помощь были бы высоко оценены.

Комментарии:

1. «У меня есть база данных SSMS» . На самом деле такой вещи не существует. SQL Server Management Studio — это приложение, созданное для управления базами данных SQL Server. Вот что у вас есть.

2. «Очень долгое время» — 6 минут, в зависимости от размера компьютера, может быть очень долгим или очень коротким временем для 70 миллионов строк. Исключить все остальное (vb.net и т.д.) и просто сделайте select into в ssms для начала и посмотрите, есть ли на это время. Если это так, то vb.net не имеет значения, и вы можете просто посмотреть, что вы могли бы сделать с индексами. Создание кластеризованного индекса приведет к реорганизации данных, поэтому, если вам нужно, чтобы они были кластеризованы, сначала создайте таблицу и выполните обычную вставку, а не select into .

3. @TomC Извините за мою ошибку, я уже использую insert вместо select into! Моя машина i7@2.8 ГГЦ, 8 ГБ оперативной памяти, так что это не так уж плохо. Я чувствую, что вставить около 650 000 строк в мою базу данных, занимающую более 6 минут, довольно долго, не так ли?

4. А — у меня возникла идея, что вы вставляете 70 миллионов строк, что было бы довольно неплохо. Я бы провел некоторое тестирование — возможно, кластеризованный индекс значительно замедляет работу, и вам было бы намного лучше с некластеризованным индексом. В некоторых случаях лучше всего удалять индексы перед вставками и создавать заново после, но это может сказать только тестирование. Помните, что кластеризованный индекс влияет на порядок хранения строк, поэтому, если ваш кластеризованный индекс не находится в столбцах, которые всегда будут видеть его записанным в «конец», то это может привести к принудительной реорганизации данных.