我正在使用 SQL Server Management Studio 活动监视器优化我的 SQL Server 数据库。
比较昂贵的两条sql语句是:
set @codesToPrintCount =
(select count(CodeId)
from Code
where CommissioningFlag = 255
and AggregationLevelId = @codeLevel);
SET @code = (SELECT TOP 1 Serial
FROM Code
WHERE CommissioningFlag = 255
and AggregationLevelId = @codeLevel);
这是Code
表sql脚本:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] NVARCHAR (20) NOT NULL,
[AggregationLevelId] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[ ... ]
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
CONSTRAINT [FK_Code_AggregationLevelConfiguration]
FOREIGN KEY ([AggregationLevelId])
REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)
我不知道如何加快这些句子的速度。
该Code
表中 column 上具有相同值的AggregationLevelId
行多于 上 值为 255 的列CommissioningFlag
。换句话说,Code
表中有 1.050.000 行AggregationLevelId
等于@codeLevel
和 32 行或更少列中的值为 255 CommissioningFlag
。
在此表上添加两个索引是个好主意吗?一个用于CommissioningFlag
,另一个用于AggregationLevelId
。
此时Code
表上有 1.100.000 行,它们分别得到 23ms 和 78ms 的执行时间。
顺便说一句,这两句话是在存储过程中的。
如果您对非 255 行不感兴趣,您可以使用过滤索引:
这意味着它只会按 AggregationLevelId 顺序索引具有 255 的索引,包括 Serial 和 CodeId 的值,因为您需要计算/返回它们。
如果您不能(或不想)使用过滤索引,请尝试以下操作(如评论中最初建议的那样):