当前位置: 首页 > 面试题库 >

SQL Server 2008:按日期时间排序太慢

郭曾笑
2023-03-14
问题内容

我的表(SQL Server
2008)拥有100万以上的记录,当我尝试按日期时间排序记录时,它需要1秒钟,但是当我按ID(int)排序时,它仅需要约0.1秒钟。

有什么办法可以提高效率吗?(我已经将datetime列添加到索引中了)


问题答案:

通过排序id可能使用聚簇索引扫描,而通过datetime排序或索引查找来排序。

这两种方法都比聚簇索引扫描慢。

如果您的表格是由集群的id,则基本上意味着它已经被排序了。记录包含在中B+Tree,该记录具有一个按id顺序链接页面的链接列表。引擎应仅遍历链接列表以获取由排序的记录id

如果id按顺序插入,则表示行的物理顺序将与逻辑顺序匹配,并且聚集索引扫描将更快。

如果您希望按来对记录进行排序datetime,则有两种选择:

  • 从表中获取所有记录并对它们进行排序。速度很明显。
  • 在上使用索引datetime。索引存储在磁盘的单独空间中,这意味着引擎需要在嵌套循环中的索引页和表页之间穿梭。它也更慢。

为了改善顺序,您可以在上创建一个单独的覆盖索引datetime

CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, 鈥�)

,并将您在查询中使用的所有列都包含在该索引中。

该索引就像表的卷影副本,但是数据以不同的顺序排序。

这将使您摆脱键查找(因为索引包含所有数据),这将使排序datetime速度与on一样快id

更新:

有关此问题的新博客文章:

  • SQL Server:聚集索引和排序


 类似资料:
  • 问题内容: 我要显示的最后5个输入的特定ID数据。我的SQL查询是 是DATETIME 它显示按日期而非时间排序的最后5个条目。然后在同一日期按字母顺序排序。 假设我在同一日期有3个条目,并带有差异时间 比方说 查询以上查询后 我得到的是 按日期排序,然后按字母顺序 我想要的是这个.. 还按日期和时间排序… 问题答案: 如果要最后5行(以升序排列),则需要一个子查询: 第10次阅读问题后,这可能是

  • 问题内容: 我想按日期订购。 例如 我已经尝试过: 伯,这是行不通的。 我得到这个代替: 你能帮我吗? 问题答案: 如果要按日期排序, 请将其存储为日期而不是字符串。 除非您的日期字符串的格式为,否则它不会按您希望的顺序排序。 数据库可以按原样进行足够的工作,而无需人们加倍努力,因此,您应该尽可能地避免我喜欢的 SQL体操。 将其存储为日期,然后(如果需要)使用日期函数以形式获取它。 这样会比您尝

  • 问题内容: 我知道这一定是相对简单的,但是我有一个JSON数据集,我想按日期排序。到目前为止,我无处不在遇到问题。现在,我将日期存储为。如果有帮助,我可以访问jquery,但是我意识到.sort()是本机JS。提前致谢。 问题答案: 假设您有一个javascript对象数组,只需使用自定义排序功能即可: Array 方法使用回调函数对数组进行排序,该回调函数传递给数组中的元素对。 如果返回值为负,

  • 问题内容: 我正在尝试按日期顺序显示文件数组(最后修改)。 我已经完成了遍历数组并将其排序到另一个数组中的购买循环,但是有没有更简单(更有效)的方法来做到这一点? 问题答案: *从PHP 7.2.0开始, *警告 已被弃用。强烈建议不要使用此功能。 为了后代的目的,如果在接受的答案中链接的论坛帖子丢失或不清楚,则所需的相关代码为: 在我的系统上对此进行了测试,并验证了它确实可以根据需要按文件mti

  • 我有一个JTable,它有两列,文件名和日期都被修改了。我为第一列添加了name String,并为第二个dateTime列添加了。 我将dateTime列呈现为字符串。 我还启用了 编辑2 我已经测试并弄明白了。如果使用DefaultTableModel而不重写它的getColumnClass()方法,那么在使用Date或Number列时会遇到麻烦。

  • 问题内容: 我有一个表,该表包含大约100.000个博客文章,并通过1:n关系链接到具有50个供稿的表。当我用select语句查询两个表时(按发布表的datetime字段排序),MySQL始终使用文件排序,导致查询时间非常慢(> 1秒)。这是表的架构(简化): 这是桌子: 这是执行时间超过1秒的查询。请注意,该字段具有索引,但MySQL并未使用它对发布表进行排序: 该查询命令的结果表明MySQL正