在发布我的帖子之前,我已经阅读了很多此类文章和帖子,例如:
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创建了索引。我尝试以下方法:
在数据插入部分之前为MyID创建聚簇索引。
在数据插入部分之后和数据查找部分之前为MyID创建非聚集索引。
令我惊讶的是,方法2会使数据插入部分比方法1慢得多,这似乎与“先插入,后索引”的建议相抵触。
我的问题是:
创建MyTable时是否应将MyID设置为UNIQUE?如果将其设置为UNIQUE,则在插入之前无需查找,但是插入具有重复MyID的记录将失败。
我应该创建聚集索引还是非聚集索引?
我应该在数据插入部分之前还是之后创建索引?
很抱歉有这么多个问题。但是,它们是相关的。另外,由于这些选择有很多组合,因此我想获得有关应该尝试哪个方向的提示,因为每次测试都会消耗大量时间。
目前,我对方法2的测试花了几天时间,但仍未完成,但是已经比方法1花费了更多时间。
更新:
我已从“选择*”更改为“仅选择所需的列”。根据我的测试,它将提高约1.5%的速度。