我正在执行以下查询:-
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/