SQL Server范围索引思想

时间:2014-09-01 07:39:24

标签: sql sql-server indexing sql-server-2012

我需要帮助了解如何在表格上创建适当的索引以进行快速范围选择。

我有一个包含以下列的表:

--- 类型


frameidx --- int

u --- int

v --- int

x --- float(53)

y --- float(53)

z --- float(53)


这些列都不是唯一的。

此表中大约有3000万条记录。

平均查询看起来像这样:

   Select x, y, z from tablename
   Where
       frameidx = 4 AND
       u between 34 AND 500
       v between 0 AND 200

非常直接,没有联接,没有嵌套的东西。只是好的子集选择。

我应该在MS SQL Server(2012)中为此表做什么类型的索引,以便能够在(理想情况下)小于100毫秒的时间内获取记录(可以是来自此查询的数千个记录),例如?

感谢。

1 个答案:

答案 0 :(得分:2)

如果您没有索引,SQL Server需要扫描整个表以查找所需的数据。对于这样一个耗时的大桌子(30M行)。

如果您的索引适合您的查询,SQL服务器将搜索它们(即将使用索引结构快速查找索引中所需的行)。索引由给定索引顺序的索引列值和索引表中行的指针组成,因此,一旦在索引中找到数据,就会使用该指针恢复索引表中的必要数据。 / p>

所以,如果你想加快速度,你需要为你要用来过滤范围的列创建索引。

添加索引会改善查询响应时间,但也会占用更多空间,并使插入速度变慢。所以你不应该创建很多索引。

实际上,如果您要一直使用所有列进行过滤,那么您应该只创建一个索引。并且,理想情况下,索引应该是更具选择性的,即具有最不同值(重复值的最小数量)的索引。每个查询只能使用一个索引。

如果您要使用不同的范围过滤器集,则应创建更多索引。

使用复合材料可能有好有坏。在组合键中,行按索引中的所有列排序。所以,只要您按A,B,C& D,按A过滤或排序将给出连续的索引行,并且它是一个快速操作。并按A,B,C和C进行过滤D,是这个指数的理想选择。但是,仅对D进行过滤或排序是这个索引的最坏情况,因为它需要恢复遍及索引的数据:记住数据按A排序,然后是B,然后是C,然后是C,然后是D,所以D信息在整个索引上传播。根据几个因素(表统计,索引选择性等),甚至可能根本不使用索引,并扫描表格。

有关聚簇索引的最终说明:聚簇索引定义数据存储在表中的物理顺序。 It doesn't need to be unique。如果您在大多数时间使用其中一列进行过滤,那么最好将表格的聚集索引作为表格,因为在这种情况下,不是寻求索引,而是使用指针查找索引表中的数据,直接查找表,这可以提高性能。

所以没有简单的答案,但我希望知道你有提高查询速度的信息。

修改

更正信息,符合非常有趣的评论。