包含非聚集索引的列

问题描述:

你好
我有一张有很多记录(1100万)的表格。记录有一个外部ID,日期和一些其他字段。
我有一个查询,我经常在我的应用程序中运行。查询是这样的:
包含非聚集索引的列


if(SELECT * FROM myTable WHERE [email protected] AND [email protected] != 0)  
    UPDATE myTable SET ....... WHERE [email protected] AND [email protected] 
else 
    INSERT INTO myTable(......) VALUES(.....) 

我想“日期”添加为一个非聚集索引。那么如果我将“ForeignID”列添加为该索引的包含列,是否会帮助查询更快地执行?
谢谢。

我同意@gbn指出您需要Date和ForeignID索引而不是“包含列”。

如下,您可以创建它:

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

但是“SELECT *”是不是来检查记录是否存在一个很好的方式。你可以使用“EXISTS”子句

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

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

像这样:

create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID) 

此外,您可能需要使用MERGE语句这种查询。取决于你使用的SQL版本。

+0

我同时使用Sql Server 2005/2008。我会寻找MERGE谢谢。您认为分别为Date和ForeignID添加非聚簇索引更好? – Fer 2011-06-01 08:43:44

+0

@Fer - 不分开,两个字段的索引。更新了答案。 – 2011-06-01 08:50:30

是的,我希望它显著加快此查询(你需要做一个选择*?)

但它会插入放慢到表中,因为它有另一个指标来写 - 这将明显增加数据库的大小。

这可能值得添加,如果这经常运行PROC非常慢。

+0

我想我也必须添加。但我正在寻找添加索引的最佳方式。顺便说一句,我需要选择测试现有的记录,但我可以使用任何其他方法来做到这一点。 – Fer 2011-06-01 08:47:34

在Date和ForeignID上都需要一个索引,Date为first。它是一个过滤器(在WHERE子句中),所以它应该在关键列而不是INCLUDE列

此外,您的模式test..update..else..insert不可伸缩。请参阅this以了解其他方式:Select/Insert version of an Upsert: is there a design pattern for high concurrency?

+0

我应该添加Date和ForeignID seperatly作为索引?我将搜索更好的模式来检查更新插入。 Thnks。 – Fer 2011-06-01 08:46:27

+0

@Fer:no,两列的复合索引。 (更新:按照Hasan的回答) – gbn 2011-06-01 08:59:32