如何解决包含非聚集索引的列
| 你好 我有一张桌子,上面有很多记录(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 \”列添加为该索引的包含列,它将帮助查询更快地执行吗?
谢谢。
解决方法
我同意@gbn的观点,即您需要同时在Date和ForeignID上建立索引,而不是\“ Include Column \”。
您可以如下创建它:
CREATE NONCLUSTERED INDEX [IDX1] ON [myTable] ([Date],[ForeignID])
但是,“选择* \”不是检查记录是否存在的好方法。您可以使用\“ EXISTS \”子句
, 您需要同时在Date和ForeignID上建立索引,并以Date为首。它是一个过滤器(在WHERE子句中),因此它应该在键列而不是INCLUDE列中
另外,您的test..update..else..insert模式不可扩展。请参见其他方法:选择/插入Upsert版本:是否存在高并发设计模式?
, 添加ForeignID
会有所帮助,因为索引将覆盖子查询,并且无需从表中获取grab2ѭ。
但是,最好为Date
和ForeignID
添加唯一约束或索引。
像这样:
create unique index IX_MyTable_Date_ForeignID on MyTable(Date,ForeignID)
另外,您可能想对此类查询使用“ 7”语句。取决于您使用的SQL版本。
, 是的,我希望它可以大大加快此查询的速度(您是否需要选择*?)
但这会减慢插入表的速度,因为它还有另一个要写的索引-显然也会增加数据库的大小。
如果此经常运行的proc确实很慢,则可能值得添加。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。