优化选择查询以返回前100条记录(添加ORDER BY减慢查询)

Ven*_*kat 5 sql sql-server

我正在执行以下查询: -

 select top 32 * from TweetEntity order by FavoriteCount desc, LastModifiedDateTime desc
Run Code Online (Sandbox Code Playgroud)

这至少需要30秒才能执行.该表包含至少300,000条记录.

但是当我执行以下查询时:

  select top 32 * from TweetEntity 
Run Code Online (Sandbox Code Playgroud)

执行时间不到一秒.我无能为力 - 如何在不到一秒的时间内执行我的第一个查询.我应该检查什么 有人可以指出我正确的方向.

Stu*_*tLC 8

当您介绍时ORDER BY,Sql需要根据该顺序评估32个最高行,而不是表中的任何32行.值得注意的是,Sql没有合适的索引用于评估查询.

因此,TL;DR您需要添加索引TweetEntity(FavoriteCount desc, LastModifiedDateTime desc)以提高性能,例如:

CREATE NONCLUSTERED INDEX IX_TweetEntity_Favourite 
ON dbo.TweetEntity(FavoriteCount desc, LastModifiedDateTime desc);
Run Code Online (Sandbox Code Playgroud)

如果您的查询是表上最重要/最常见的查询,您还可以考虑将其更改为聚簇索引.

编辑,重新可以在桌面上创建尽可能多的非聚集索引吗?

任意地,每个表最多可以创建999个非聚簇索引.

但是,有一个问题 - 每个指数都增加了:

  • 消耗更多的磁盘空间
  • 并且在对表的写操作期间使其变慢(即插入新的/更新/删除现有的行),因为还必须维护索引
  • 如果您有许多类似的索引,Sql还需要在创建查询计划时在索引之间进行选择.

欢迎使用索引黑色艺术 - 没有简单的公式 - 每次考虑添加新索引时,您都需要仔细评估每个新索引对现有索引的好处.在许多情况下,您将能够调整现有索引,而不是每次都添加新索引.