gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:48:33 32 4
gpt4 key购买 nike

我正在执行以下查询:-

 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com