gpt4 book ai didi

SQL Server 索引排序

转载 作者:行者123 更新时间:2023-12-04 21:23:56 24 4
gpt4 key购买 nike

我有一个表格如下

CREATE TABLE [dbo].[VideoRecipient](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[IssueId] [bigint] NOT NULL,
[CreatedDateTime] [datetime2](7) NOT NULL,
[NotifiedDateTime] [datetime2](7) NULL,
[ReceivedDateTime] [datetime2](7) NULL,
[ReadDateTime] [datetime2](7) NULL,
[AcknowledgedDateTime] [datetime2](7) NULL,
[IsDeleted] [bit] NOT NULL,
[DeletedDateTime] [datetime2](7) NULL,
CONSTRAINT [PK_VideoRecipient] PRIMARY KEY CLUSTERED
(
[Id] ASC
))

然后我创建一个索引如下

CREATE NONCLUSTERED INDEX UX_VideoRecipient_UserId_IssueId_CreatedDateTime ON [dbo].VideoRecipient ([UserId], [IssueId], [CreatedDateTime]) INCLUDE ([ReadDateTime], [ReceivedDateTime], [AcknowledgedDateTime], [NotifiedDateTime])

当我通过 UserId 进行查询以获取记录时,它使用索引并使用索引查找,这正是我想要的。如果我随后进行查询以通过 IssueId 获取记录,它会执行较慢的索引扫描。除了创建另一个索引并将 IssueId 指定为索引的第一列之外,是否有办法使索引成为搜索而不是扫描?

指定索引的第一列似乎比我原先想象的更重要!

最佳答案

索引实质上创建了另一个版本的表,它只包含您提到的列。然后按照您指定的确切顺序对其进行排序(在您的示例中,它的顺序为 UserId->IssueId->CreatedDateTime)。由于索引中的 IssueId 列排在第二位,这意味着如果这是您要搜索的主要值,则这些值将不会按顺序排列。因此,SQL 必须对索引中的所有行执行“扫描”以找到您正在搜索的项目。

如果您打算仅搜索 IssueId,则需要调整索引。如果您计划有多个查询来搜索不同的值,那么您将需要不同的索引。

但是请记住,向表中添加索引会稍微减慢插入和更新的速度,因为在提交更改之前需要同时更新索引。因此,您需要确保创建索引是因为您需要它,而不是“以防万一”。

关于SQL Server 索引排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878298/

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