Должен ли я создать индекс до или после вставки большого объема данных? - PullRequest
0 голосов
/ 14 февраля 2020

Перед публикацией своего поста я прочитал много таких статей и постов, как:

https://www.sqlservercentral.com/forums/topic/index-creation-after-of-before-populate https://nakulvachhrajani.com/2011/11/07/sql-server-performance-best-practice-create-index-before-or-after-a-data-insert/

Однако мой случай немного отличается, поэтому я и задаю его здесь.

Я использую SQL Server 2008. В моей базе данных есть таблица MyTable со следующей структурой :

MyID (bigint)    MyData1 (bigint)     MyData2 (bigint)

MyID - это уникальный идентификатор для каждой записи. Но я не устанавливаю его как UNIQUE при создании таблицы.

Затем я использую Visual C ++ 2008 / ADO для доступа к таблице, что выражается следующим псевдокодом:

Create MyTable

// Method 1: Create Clustered Index for MyID here

// Part1: Insert data to the table
for (i = 0; i <= 500000; i++)
{
   Read CurrentID, CurrentData1, CurrentData2 from File1
   Select MyID from MyTable Where MyID = CurrentID
   if Found nothing then
     Insert(CurrentID, CurrentData1, CurrentData2) to MyTable      
}

// Method 2: Create Non-Clustered Index for MyID here

// Part2: Lookup data in the table
for (j = 0; j <= 900000; j++)
{
   Read CurrentID2 from File2
   Select MyData1 from MyTable Where MyID = CurrentID2
   if Found Then
     Do something
}

Как вы Как видите, мои коды состоят из двух частей, первая часть - вставка данных, но во время вставки она также ищет таблицу, чтобы предотвратить вставку записей с дубликатом MyID, вторая часть - поиск данных, которая будет искать записи на основе записей. на MyID часто.

Чтобы улучшить производительность поиска, я создаю индекс для MyID. Я пробую следующие методы:

  1. Создать кластеризованный индекс для MyID, перед частью вставки данных.

  2. Создать некластеризованный индекс для MyID, после части вставки данных и до части поиска данных.

К моему удивлению, метод 2 вызовет часть вставки данных намного медленнее, чем метод 1, который, кажется, заключает контракт с рекомендация «вставить сначала, индекс затем».

Мой вопрос:

  1. Должен ли я установить MyID как UNIQUE при создании MyTable? Если я установлю его как UNIQUE, то мне не нужно искать перед вставкой, но вставка записи с дубликатом MyID завершится неудачей.

  2. Я должен создать кластеризованный индекс или некластеризованный индекс?

  3. Должен ли я создать индекс до или после вставки данных?

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

В настоящее время мой тест по методу 2 занимает несколько дней и еще не завершено, но уже заняло намного больше времени, чем метод 1.

Обновление:

Я изменил с «Выбрать *» на «Выбрать только необходимые столбцы» ». Исходя из моего теста, он улучшит скорость примерно на 1,5%.

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