您好
我有一张有很多记录的表(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”列添加为该索引的包含列,它是否有助于查询执行得更快? 感谢。
答案 0 :(得分:3)
我同意@gbn你需要Date和ForeignID的索引而不是“Include Column”。
您可以按如下方式创建它:
CREATE NONCLUSTERED INDEX [IDX1] ON [myTable] ([Date], [ForeignID])
然而,“选择*”并不是检查记录是否存在的好方法。您可以使用“EXISTS”条款
答案 1 :(得分:1)
添加ForeignID
会有所帮助,因为索引将覆盖子查询,并且不需要从表中抓取ForeignID
。
但是,最好为Date
和ForeignID
添加唯一约束或索引。
像这样:
create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID)
此外,您可能希望对此类查询使用MERGE
语句。取决于您使用的SQL版本。
答案 2 :(得分:1)
您需要Date和ForeignID的索引,首先是Date。它是一个过滤器(在WHERE子句中)所以它应该在键列而不是INCLUDE列
此外,您的test..update..else..insert模式不可扩展。有关其他方法,请参阅this:Select / Insert version of an Upsert: is there a design pattern for high concurrency?
答案 3 :(得分:0)
是的,我希望它能显着加快这个查询的速度(你需要选择*?)
但它会减慢插入到表中的速度,因为它有另一个要写入的索引 - 它显然也会增加数据库的大小。
如果这种经常运行的过程非常慢,那么可能值得添加。