sql - 优化 select 查询以返回前 100 条记录(添加 ORDER BY 会减慢查询速度)

标签 sql sql-server

我正在执行以下查询:-

 select top 32 * from TweetEntity order by FavoriteCount desc, LastModifiedDateTime desc

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

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

  select top 32 * from TweetEntity 

执行时间不到一秒。我对如何在不到一秒的时间内执行我的第一个查询一无所知。我应该检查什么。有人能给我指出正确的方向吗?

最佳答案

当您引入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);

如果你的查询是表上最重要/最常见的查询,你也可以考虑将其更改为聚集索引。

编辑,重新我可以在表上创建任意数量的非聚集索引吗?

您最多可以任意创建 999 non clustered indexes per table

但是,有一个问题 - 添加的每个索引:

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

欢迎来到black art of indexing - 没有简单的公式 - 每次您考虑添加新索引时,您都需要仔细评估每个新索引相对于现有索引的好处。在许多情况下,您将能够调整现有索引,而不是每次都添加新索引。

关于sql - 优化 select 查询以返回前 100 条记录(添加 ORDER BY 会减慢查询速度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30295641/

相关文章:

sql-server - 将对象导入 Visual Studio 2010 服务器项目

sql-server - 如何使用Perl获取存储过程结果?

sql-server - Delphi 6、ADO、MS 数据库 "Date"字段与 ftWideString 相同

mysql - SQL查询以查找在连接表中没有特定组ID的用户

MySQL查询一个类(class)的书籍成本

sql-server - 如何在 SQL Server 中使用 alter 设置列的默认值?

mysql - sql 两个 order by 给出不同的结果

sql - 获取多对多关系的有效方法

.net - 如何设计公共(public)交通时刻表数据库?

c# - 回发后如何保持 DropDownList1 的选定值?