SQL索引上包含INCLUDE的字段数

时间:2014-09-17 21:22:56

标签: sql sql-server

我有下表有数百万行

+----+----------+-----------+--------+-------+-------------+------------------+
| ID | ClientID | ProjectID | Status | Note  | AccountOwner| + 7 more fields  |
+----+----------+-----------+--------+-------+-------------+------------------+

索引ID(clusted)和ClientID(非群集)

我正在尝试使用ClientID索引上的INCLUDE列减少执行时间。我对此表有几个查询,但有两个常见问题:

SELECT ID, ClientID, ProjectID, Status WHERE ClientID = 4987 

SELECT ID, ClientID, AccountOwner, + 5 more fields WHERE ClientID = 4987

为了使用INCLUDE功能来覆盖两个查询,我需要在ClientID索引中包含8或9个字段。

在测试中,它将查询时间从20秒减少到2,因此该功能似乎是我需要的。

我遇到的问题是,感觉这可能是太多的领域,但似乎有必要涵盖两个常见用例,我不知道它是如何内部工作知道这是否是一个好主意。这个领域太多了吗?是否有其他功能可用或测试并查看在INCLUDE上有这么多字段的影响?

编辑:我不是要求在两个字段上创建索引,我问的是使用索引的“包含列”功能(http://msdn.microsoft.com/en-us/library/ms190806.aspx

3 个答案:

答案 0 :(得分:1)

索引会更大,搜索时间会更长(因为索引不能存储在1页上),占用更多存储空间,搜索时占用更多内存,有人更新时需要更多更新记录。

如果您有2个非常常见的搜索,那么替代方法是为每个用例分配2个索引1。这可能会占用更多的存储空间,但会减少搜索时间(可能无法估量,具体取决于表的大小)。每个索引在磁盘和内存中占用的空间更少,但组合可能会占用更多空间。在表中插入记录或更新ClientID列需要更长的时间,因为两个索引都可能需要更新。

个人而言,我会选择涵盖两个查询的1个索引。

答案 1 :(得分:0)

据我所知,他正在讨论索引的de Include功能,而此功能适用于select中的字段。我了解你的情况。我过去也遇到过同样的问题。您必须自己进行测试才能看到最符合您需求的场景。您可以通过ClientID创建索引,包括其余字段,并使您的查询更快。但索引将是巨大的并占用大量磁盘空间。在这种情况下,我强烈建议在不同的文件组中拆分您的索引和数据,如果有不同的fisical磁盘。我是我的方案使用包括索引使我的查询更快,但另一方面,数据库使用的70%的空间在索引上。是你的选择。

答案 2 :(得分:-1)

在您的情况下,两个查询在where子句中使用相同的列ClientID。一个索引INLCUDE只有ClientId应该足够两者。基于where子句中的列的索引不选择caluse。