gpt4 book ai didi

SQL 主键排序顺序

转载 作者:行者123 更新时间:2023-12-01 12:40:34 25 4
gpt4 key购买 nike

我正在使用 MS SQL Server 2005

我有一个包含 3 列的表,我在其中存储用户消息映射,例如:

msg_for msg_from msg_id 
bob bob 1
bob john 1
bob steve 1
bob bob 2
bob john 2
bob bob 3
bob john 3
bob steve 3

PK 在 3 列上,msg_id 是存储消息的消息表的 FK

以上是我根据3列PK看到的物理存储

现在我的查询必须返回给定用户的消息,在顶部有最新消息(按 msg_id DESC 排序)

bob john  3
bob steve 3
bob john 2
bob steve 2
bob john 1
bob steve 1

这个映射表有数百万行。我看到 95% 的成本是对结果进行排序。

是否可以让 PK 或其他一些方式像这样在物理上存储数据(避免 SORT)?

msg_for msg_from msg_id
bob bob 3
bob john 3
bob steve 3
bob bob 2
bob john 2
bob bob 1
bob john 1
bob steve 1

谢谢

最佳答案

是的。

当您设置主键(或任何索引)时,您可以定义它

ALTER TABLE dbo.[Messages] ADD CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED 
(
msg_for ASC, msg_from ASC, msg_id DESC
)

SQL Server 可以在任一方向进行扫描,因此只有当您想要控制多列的排序顺序组合时才有意义。

编辑:您在评论中说问题查询是

select top 10 msg_id 
from message_user
where msg_for = @user_name
and msg_from <> @user_name
order by msg_id DESC

这里的问题不是升序、降序之一。

打个比方。电话簿按姓氏、名字的顺序列出,但如果您需要知道目录中按字典顺序排列的最后 10 个名字,则需要扫描整本书。无论每个部分中的名字是按升序还是降序排列,这都是不可避免的。

类似地,复合索引键需要是 msg_for, msg_id, msg_from 才能最佳地满足此查询,而不是 msg_for, msg_from, msg_id 对于后一种顺序,它仍然需要扫描满足 msg_for = @user_name 条件的索引的整个部分,因为它不知道是否会有以后的 msg_id 仍然属于以后的 msg_from 此外,无论 msg_id 在其各个子部分中按哪个方向排序,索引的 msg_for = @user_name 部分的顺序扫描仍然需要排序因为它们根据 msg_from 分成小节。

关于SQL 主键排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639085/

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