包含非聚集索引的列
你好
我有一张有很多记录(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
。
但是,最好为Date
和ForeignID
添加唯一约束或索引。
像这样:
create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID)
此外,您可能需要使用MERGE
语句这种查询。取决于你使用的SQL版本。
是的,我希望它显著加快此查询(你需要做一个选择*?)
但它会插入放慢到表中,因为它有另一个指标来写 - 这将明显增加数据库的大小。
这可能值得添加,如果这经常运行PROC非常慢。
我想我也必须添加。但我正在寻找添加索引的最佳方式。顺便说一句,我需要选择测试现有的记录,但我可以使用任何其他方法来做到这一点。 – 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?
我同时使用Sql Server 2005/2008。我会寻找MERGE谢谢。您认为分别为Date和ForeignID添加非聚簇索引更好? – Fer 2011-06-01 08:43:44
@Fer - 不分开,两个字段的索引。更新了答案。 – 2011-06-01 08:50:30