这个问题涉及到microsoftsqlserver中的一个表,通常用 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
5条答案
按热度按时间weylhg0b1#
将主键设置为主键集群(id desc)会对性能有好处吗?
正如你所展示的:这要看情况。
过滤器位于category=123上。要查找123类的所有条目,因为没有定义索引,服务器必须进行表扫描。除非您有一个非常大的结果集,和/或一些非常滑稽的错误配置tempdb和非常低的内存(因为只有在tempdb内存耗尽时才使用disc),否则结果的排序将与表扫描无关。
你真的走错了方向。通过向cateology添加一个非唯一索引,您更有可能加快查询速度,以便查询可以根据您的查询条件快速预过滤数据。
如果您要分析这个查询的查询计划(您应该——从技术上讲,我们甚至不应该在您没有表现出一些努力的情况下回答这个问题,并且查看查询计划就像您做的第一件事一样),您很可能会看到时间花在查询上,而不是结果排序上。
v64noz0r2#
当只有一列时,按asc或desc顺序创建索引并不会对“order by”产生很大的影响,但是当需要按两个不同的方向对数据进行排序时(一列按升序排列,另一列按降序排列),创建索引的方式会产生很大的影响。
看看这篇文章有很多例子:
https://www.mssqltips.com/sqlservertip/1337/building-sql-server-indexes-in-ascending-vs-descending-order/
在您的场景中,我建议您在category列上创建一个不包含“id”的索引,因为聚集索引总是包含在非聚集索引中。
ojsjcaue3#
从以下几点来看没有区别
inb24sb24#
我建议在(category,id desc)上定义一个索引。它将为您的查询提供最佳性能。
w1jd8yoj5#
正如其他人所指出的,分类索引(假设你没有)是这里可能的最大性能提升。
至于你真正的问题。一个单身汉
order by
像您所拥有的查询一样,就性能而言,查询/索引是按desc还是asc排序并不重要。sql server可以轻松地交换这些数据(从数据结构的开头或结尾开始)绩效成为绩效问题的原因是:
拥有超过
order by
柱索引有多个列
你的
order by
与索引上的顺序相反。因此,假设您的主键有id asc和category asc,然后您按id asc和category desc进行查询,那么sql server就不能使用索引上的顺序进行搜索。
这里有一些警告和陷阱。经过一番搜索,这个答案似乎列出了他们:
sql server索引-升序或降序,有什么区别?