Sql 优化select查询以返回前100条记录(通过查询添加订单)

Sql 优化select查询以返回前100条记录(通过查询添加订单),sql,sql-server,Sql,Sql Server,我正在执行以下查询:- select top 32 * from TweetEntity order by FavoriteCount desc, LastModifiedDateTime desc 执行此操作至少需要30秒。该表包含至少300000条记录 但当我执行以下查询时: select top 32 * from TweetEntity 执行不到一秒钟。我不知道如何在不到一秒钟的时间内执行我的第一个查询。我应该检查什么。有人能给我指出正确的方向吗。当您按引入顺序时,Sql需要

我正在执行以下查询:-

 select top 32 * from TweetEntity order by FavoriteCount desc, LastModifiedDateTime desc
执行此操作至少需要30秒。该表包含至少300000条记录

但当我执行以下查询时:

  select top 32 * from TweetEntity 

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

当您按引入
顺序时,Sql需要根据该顺序计算最高的32行,而不是表中的任何32行。很明显,Sql没有合适的索引来评估查询

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

CREATE NONCLUSTERED INDEX IX_TweetEntity_Favourite 
ON dbo.TweetEntity(FavoriteCount desc, LastModifiedDateTime desc);

如果您的查询是表上最重要的公共查询,您也可以考虑将此更改为聚集索引。

Edit,re我可以在一个表上创建任意数量的非聚集索引吗?

您可以任意创建多达个

但是,每个索引都添加了一个陷阱:

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

欢迎使用-没有简单的公式-每次考虑添加新索引时,都需要仔细评估每个新索引相对于现有索引的好处。在许多情况下,您可以调整现有索引,而不是每次添加新索引。

您需要为字段FavoriteCount和LastModifiedDateTime创建索引,以优化特定查询。您可能会发现以下页面很有用:


这就解决了问题。我可以在一个表上创建尽可能多的非聚集索引吗?