我在 SQL Server 2012 SP3 上有一个带有此表的数据库:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] NVARCHAR (20) NOT NULL,
[AggregationLevelId] TINYINT NOT NULL,
[...],
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)
使用 Sql Server Management Studio Activity Monitor 我看到以下选择的平均持续时间为 32 毫秒。
set @maxCode = (select max(Serial) from Code where AggregationLevelId = @codeLevel);
有什么办法可以改善吗?我问这个是因为我不知道是否可以向具有唯一约束的列添加新索引。
更新:
Code
表也有这个索引:
CREATE NONCLUSTERED INDEX [ix255] ON [dbo].[Code]
(
[AggregationLevelId] ASC
)
INCLUDE ( [Serial],
[CodeId])
WHERE ([CommissioningFlag]=(255))
为了获得最佳的查询性能,该表应该在 上有一个索引
(AggregationLevelId, Serial)
。两列上的一个索引。索引中列的顺序很重要。由于Serial
是唯一的,所以这个两列索引也可以而且应该被声明为唯一的。除了现有索引和约束之外,您还可以创建此类索引。没有限制。与任何其他额外索引一样,它会影响插入和更新的性能。
优化器很可能会在这样的索引中为您的查询使用单个搜索,但偶尔我会遇到这样一种情况,即
MAX
即使有适当的支持索引,查询也不能很好地执行。(我依稀记得它发生在表没有给定行的情况下AggregationLevelId
)。所以,我个人使用查询的等效变体:
优化器应该足够聪明,可以将索引与 一起使用
Serial ASC
,即使查询按 排序Serial DESC
。