繁体   English   中英

SQL Server 范围索引的想法

[英]SQL Server range indexing ideas

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

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

---类型


frameidx --- int

你 --- 整数

v --- 整数

x --- 浮点数(53)

y --- 浮点数(53)

z --- 浮点数(53)


这些列都不是唯一的。

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

平均查询看起来像这样:

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

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

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

谢谢。

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

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

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

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

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

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

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

关于聚集索引的最后说明:聚集索引定义了数据在表中存储的物理顺序。 它不需要是唯一的 如果您在大多数情况下使用其中一列进行过滤,最好将表的聚集索引设为该表,因为在这种情况下,不是使用指针查找索引并在索引表中查找数据,直接查找表,这可以提高性能。

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

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM