【发布时间】:2018-03-12 14:38:53
【问题描述】:
我有一个已经按“日期时间”列排序的表。因为当它被插入时,我存储了 UTC 日期,所以它是有序的。这是一张人满为患的桌子。因此,如果可能的话,我正在尝试提高查询性能。
当我使用 WHERE columnDateTime > dateToSearch 时,返回行需要很长时间。由于我的表已经由columnDateTime 订购,我可以做些什么来提高这个查询性能。例如,当一个表按cod 排序并且您尝试搜索cod > 40 时,T-SQL 优化将在找到 cod = 41 时停止搜索并返回表的其余部分,因为它知道表按该索引排序。这是一种可以告诉 T-SQL 我的表已经被 columnDateTime 排序的方法吗?
【问题讨论】:
-
(1) 您使用的是
mysql还是SQL Server?T-SQL是 Microsoft 的 SQL 版本。 (2) 在关系数据库中,“表按……排序”的概念是不准确的。这些表不是而且根本不能订购。但是,它们确实有索引。在考虑性能时,了解所有索引的确切详细信息也很重要。 (3) 您的问题太模糊无法回答:“太长”有多长?说“人口众多”意味着什么都没有! (4) 确切的查询很重要! 阅读:How to Ask -
@RafaelAndrade 数据 IS NOT 在关系数据库中“排序”。它仅由查询中的 ORDER BY 子句排序。
-
如果是SQL Server,可以通过聚簇键/聚簇索引有一个逻辑(非物理)顺序,尽管与所有性能转向一样——查询+模式+查询计划需要提供指导.如果没有聚集索引,则表是一个堆,虽然您可能认为存在基于插入的顺序,但 SQL Server 没有可以依赖的顺序。
-
如果您以严格的时间顺序插入行,并且该列永远不会更新,并且大多数查询都会对其进行过滤,那么它是一个很好的候选者(非唯一) 聚集索引。当然,您也可以在其上创建一个常规索引。如果没有索引,SQL Server 只会生成有关列中值分布的统计信息——这些是一些帮助,但不如正确的索引那么多。它不能利用你认为存在的任何顺序,因为它不能保证存在一个。
-
@AnthonyHancock 也许您应该确保自己理解正确地了解聚集索引的概念,然后再声称我在告诉人们“信息不正确” ?聚集索引仍然有分散在磁盘各个页面中UNORDERED的数据,可以使用聚集索引以特定顺序检索数据。优化器根据查询、索引和表统计信息来决定是否以那种方式使用聚集索引。
标签: sql performance tsql