Перед публикацией своего поста я прочитал много таких статей и постов, как:
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. Я пробую следующие методы:
Создать кластеризованный индекс для MyID, перед частью вставки данных.
Создать некластеризованный индекс для MyID, после части вставки данных и до части поиска данных.
К моему удивлению, метод 2 вызовет часть вставки данных намного медленнее, чем метод 1, который, кажется, заключает контракт с рекомендация «вставить сначала, индекс затем».
Мой вопрос:
Должен ли я установить MyID как UNIQUE при создании MyTable? Если я установлю его как UNIQUE, то мне не нужно искать перед вставкой, но вставка записи с дубликатом MyID завершится неудачей.
Я должен создать кластеризованный индекс или некластеризованный индекс?
Должен ли я создать индекс до или после вставки данных?
Извините за столь много вопросов. Однако они связаны между собой. Кроме того, поскольку существует множество комбинаций этих вариантов, я хочу получить несколько советов о том, в каком направлении мне следует попробовать, поскольку каждый тест будет занимать много времени.
В настоящее время мой тест по методу 2 занимает несколько дней и еще не завершено, но уже заняло намного больше времени, чем метод 1.
Обновление:
Я изменил с «Выбрать *» на «Выбрать только необходимые столбцы» ». Исходя из моего теста, он улучшит скорость примерно на 1,5%.