SQL Server范围索引的想法

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

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

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

--- 类型


frameidx --- 整数

u --- 整数

v --- 整数

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 毫秒的时间内获取记录(此查询中可能有数千条记录) ?

谢谢。

最佳答案

如果没有索引,SQL Server 需要扫描整个表来查找所需的数据。对于这么大的表(30M 行),这非常耗时。

如果您有适合您的查询的索引,SQL Server 将查找它们(即,它将使用索引结构快速找到索引中所需的行)。索引由给定索引顺序的索引列值和指向索引表中行的指针组成,因此一旦在索引中找到数据,就可以使用这些指针从索引表中恢复必要的数据。

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

添加索引会提高查询响应时间,但也会占用更多空间,并使插入速度变慢。因此您不应该创建大量索引。

如果您要始终使用所有列进行过滤,则应该只创建一个索引。而且,理想情况下,该索引应该更具选择性,即具有最多不同值(重复值最少)的索引。每个查询只能使用一个索引。

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

使用复合 Material 可能是好是坏。在复合键中,行按索引中的所有列排序。因此,如果您按 A、B、C 和 D 建立索引,按 A 进行过滤或排序将给出索引的连续行,并且这是一个快速操作。按 A、B、C 和 D 进行过滤非常适合该索引。然而,仅按 D 进行过滤或排序对于该索引来说是最坏的情况,因为它将需要恢复分布在整个索引上的数据:请记住,数据是按 A、B、C、D 排序的,因此D 信息遍布整个索引。根据多种因素(表统计信息、索引选择性等),甚至有可能根本不使用任何索引,而是扫描表。

关于聚集索引的最后一点:聚集索引定义了数据在表中存储的物理顺序。 It doesn't need to be unique 。如果您大多数时候都使用其中一列进行过滤,那么最好将其设为表的聚集索引,因为在这种情况下,不需要查找索引并使用指针查找索引表中的数据,直接查找表,可以提高性能。

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

编辑

根据一条非常有趣的评论,更正了信息。

关于SQL Server范围索引的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25600962/

相关文章:

mysql - 计算特定年份的sql中的日期差异

sql - 插入时锁定表

sql - 如何取得三连胜

python - Pandas 列多索引到行多索引

indexing - Elasticsearch:将映射字段类型ID从长整数更新为字符串

Mysql innodb : Choosing index type for 'greater than >=' select

sql - 主键选择的性能

mysql - 如何在触发器中更新多个表和字段?

asp.net - 标识列增量跳转

sql-server - 如何在cmd中查找sql​​实例使用的cpu核心