繁体   English   中英

在我的表上使用哪个sql索引以获得最佳查询性能

[英]Which sql index to use on my table for best query performance

我有下表。 我的存储过程始终使用IitemId和Created日期范围。 其中ItemId = ...以及Created> ...和Created <...。什么是性能最佳的设计。

我在ItemId上有非聚集索引

CREATE TABLE [dbo].[LV] (
[Id]       UNIQUEIDENTIFIER NOT NULL,
[ItemId]   UNIQUEIDENTIFIER NOT NULL,
[C1]  NVARCHAR (7)     NOT NULL,
[C2] NVARCHAR (7)     NOT NULL,
[C3]  NVARCHAR (2)     NOT NULL,
[Created]  DATETIME2 (7)    NOT NULL,
CONSTRAINT [PK_LV] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_LV_Items_ItemId] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[Items] ([Id]) ON DELETE CASCADE
);


GO
CREATE NONCLUSTERED INDEX [IX_LV_ItemId]
ON [dbo].[LV]([ItemId] ASC); 

我应该将索引添加到ItemId和Created吗? 非集群还是集群?

如果您唯一的性能问题是存储过程,那么可以,您应该在ItemIdCreatedCreated聚集索引。

我同意Tab的回答(是的,将它聚类),但是要补充一点,以使您的设计更严格,您可能看起来更深一些,并考虑将其作为主键,或者,如果不能,为什么不这样做。 此Stack Overflow Post上有一个很好的逻辑背后的文章

对于您要考虑的查询,您需要在(itemId, created)上的复合索引。

这是itemId的,因为itemId上的条件是相等的,因此不相等将使用索引中的第二个键。

聚集索引可能会有所帮助,具体取决于数据的性质。 如果一项仅在表中存储一,两次或三次,则聚集索引可能没有多大用处。 如果一项存储多次,则该项的行将散布在表中,而聚集索引将有所帮助。

甚至有一些警告。 如果该表经常使用并且已完全加载到数据页中,则聚集索引将有所帮助,但没有该表太大而无法容纳可用内存的好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM