在插入大量数据之前还是之后应该创建索引?

时间:2020-02-14 02:19:23

标签: sql-server indexing insert clustered-index non-clustered-index

在发布我的帖子之前,我已经阅读了很多此类文章和帖子,例如:

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 Server2008。在我的数据库中,有一个表MyTable,其结构如下:

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

MyID是每个记录的唯一ID。但是在创建表时,我不会将其设置为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. 创建MyTable时是否应将MyID设置为UNIQUE?如果将其设置为UNIQUE,则在插入之前无需查找,但是插入具有重复MyID的记录将失败。

  2. 我应该创建聚集索引还是非聚集索引?

  3. 我应该在数据插入部分之前还是之后创建索引?

很抱歉有这么多个问题。但是,它们是相关的。另外,由于这些选择有很多组合,因此我想获得有关应该尝试哪个方向的提示,因为每次测试都会消耗大量时间。

目前,我对方法2的测试花了几天时间,但仍未完成,但是已经比方法1花费了更多时间。

更新

我已从“选择*”更改为“仅选择所需的列”。根据我的测试,它将提高约1.5%的速度。

0 个答案:

没有答案