【发布时间】:2020-10-14 15:09:00
【问题描述】:
此问题与 Microsoft SQL Server 中的一个表有关,该表通常使用ORDER BY Id DESC 进行查询。
将主键设置为PRIMARY KEY CLUSTERED (Id DESC) 会带来性能优势吗?还是需要索引?还是没有它的情况下它的速度一样快?
表:
CREATE TABLE [dbo].[Items] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Category] INT NOT NULL,
[Name] NVARCHAR(255) NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)
)
查询:
SELECT TOP 1 * FROM [dbo].[Items]
WHERE Catgory = 123
ORDER BY [Id] DESC
【问题讨论】:
-
一个主键就足够了。使主键降序 - 对于增加的主键 - 将对插入造成严重破坏。嗯,不完全是,但每次插入都需要大量数据移动。
-
按 ID DESC 添加第二个索引不是更好吗?您可以尝试一些查询并检查执行计划。
-
为什么在生产查询中有
ORDER BY?使用ORDER BY的理由并不像您想象的那么多! (并且索引或 PK 的排序对ORDER BY的影响很小,因为在数据已经读入服务器的数据缓冲区之后评估ORDER BY:排序通常发生在内存中)。 -
“或者说它没有它的情况下也一样快?” - 我们需要查看您的完整查询和
CREATE TABLE定义(包括所有相关索引)和实际执行计划。其他一切都是猜测和推测。 -
@Dai 不过有一个很好的理由:可预测的排序。此外,如果查询分析器发现排序列在索引中,它可以简单地使用索引作为基础来选择行并完全放弃排序。
标签: sql sql-server sqlperformance sql-optimization