我有下表。我的存储过程始终使用IitemId和Created日期范围。 其中ItemId = ...并已创建> ...并已创建<.... 什么是性能最佳的设计。
我在 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并创建吗? 是非集群还是集群?
答案 0 :(得分:0)
如果您唯一的性能问题是存储过程,那么可以,您应该在ItemId
和Created
上创建聚集索引。
答案 1 :(得分:0)
我同意Tab的回答(是的,将其聚类),但是要补充一点,以使您的设计更严格,您可能看起来更深一些,并考虑将其设为主键,或者如果不能,则为什么不这样做。在this Stack Overflow Post
上有一个很好的逻辑说明答案 2 :(得分:0)
对于您要考虑的查询,您需要(itemId, created)
上的复合索引。
之所以可行,是因为itemId
上的条件是相等的,因此不等式将使用索引中的第二个键。
聚集索引可能会有所帮助,具体取决于数据的性质。如果一项仅在表中存储一,两次或三次,则聚集索引可能没有多大用处。如果一项存储多次,则该项的行将散布在表中,而聚集索引将有所帮助。
甚至有一些警告。如果该表经常使用并且已完全加载到数据页中,则聚集索引会有所帮助,但不会像表太大而无法容纳可用内存时那样有益。