[英]Best way to use Where Clause in SQL SERVER Query (for best performance)?
[英]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吗? 非集群还是集群?
如果您唯一的性能问题是存储过程,那么可以,您应该在ItemId
和Created
上Created
聚集索引。
我同意Tab的回答(是的,将它聚类),但是要补充一点,以使您的设计更严格,您可能看起来更深一些,并考虑将其作为主键,或者,如果不能,为什么不这样做。 在此Stack Overflow Post上有一个很好的逻辑背后的文章
对于您要考虑的查询,您需要在(itemId, created)
上的复合索引。
这是itemId
的,因为itemId
上的条件是相等的,因此不相等将使用索引中的第二个键。
聚集索引可能会有所帮助,具体取决于数据的性质。 如果一项仅在表中存储一,两次或三次,则聚集索引可能没有多大用处。 如果一项存储多次,则该项的行将散布在表中,而聚集索引将有所帮助。
甚至有一些警告。 如果该表经常使用并且已完全加载到数据页中,则聚集索引将有所帮助,但没有该表太大而无法容纳可用内存的好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.