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

时间:2019-01-22 14:24:58

标签: sql sql-server indexing

我有下表。我的存储过程始终使用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并创建吗? 是非集群还是集群?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我同意Tab的回答(是的,将其聚类),但是要补充一点,以使您的设计更严格,您可能看起来更深一些,并考虑将其设为主键,或者如果不能,则为什么不这样做。在this Stack Overflow Post

上有一个很好的逻辑说明

答案 2 :(得分:0)

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

之所以可行,是因为itemId上的条件是相等的,因此不等式将使用索引中的第二个键。

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

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