包含非聚集索引的列

时间:2011-06-01 07:57:45

标签: sql sql-server tsql indexing

您好
我有一张有很多记录的表(1100万)。记录有外国ID,日期和其他一些字段 我有一个查询,我经常在我的应用程序中运行。查询类似于:


if( SELECT * FROM myTable WHERE Date=@Date AND ForeignID=@ForeignID != 0 )    
     UPDATE myTable SET ....... WHERE Date=@Date AND ForeignID=@ForeignID
else
     INSERT INTO myTable(......) VALUES(.....)

我想将“Date”添加为非聚集索引。然后,如果我将“ForeignID”列添加为该索引的包含列,它是否有助于查询执行得更快? 感谢。

4 个答案:

答案 0 :(得分:3)

我同意@gbn你需要Date和ForeignID的索引而不是“Include Column”。

您可以按如下方式创建它:

CREATE NONCLUSTERED INDEX [IDX1] ON [myTable] ([Date], [ForeignID])

然而,“选择*”并不是检查记录是否存在的好方法。您可以使用“EXISTS”条款

答案 1 :(得分:1)

添加ForeignID会有所帮助,因为索引将覆盖子查询,并且不需要从表中抓取ForeignID

但是,最好为DateForeignID添加唯一约束或索引。

像这样:

create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID)

此外,您可能希望对此类查询使用MERGE语句。取决于您使用的SQL版本。

答案 2 :(得分:1)

您需要Date和ForeignID的索引,首先是Date。它是一个过滤器(在WHERE子句中)所以它应该在键列而不是INCLUDE列

此外,您的test..update..else..insert模式不可扩展。有关其他方法,请参阅thisSelect / Insert version of an Upsert: is there a design pattern for high concurrency?

答案 3 :(得分:0)

是的,我希望它能显着加快这个查询的速度(你需要选择*?)

但它会减慢插入到表中的速度,因为它有另一个要写入的索引 - 它显然也会增加数据库的大小。

如果这种经常运行的过程非常慢,那么可能值得添加。