优化两条sql语句添加索引

Van*_*nel 4 performance sql-server query-performance

我正在使用 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);
Run Code Online (Sandbox Code Playgroud)

这是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])
)
Run Code Online (Sandbox Code Playgroud)

我不知道如何加快这些句子的速度。

还有更多的行Code该表有相同的值AggregationLevelId比对价值255列列CommissioningFlag。换句话说,在Code表中有 1.050.000 行AggregationLevelId等于@codeLevel和 32 行或更少的值为 255CommissioningFlag列中。

在这个表上添加两个索引是个好主意吗?一个为CommissioningFlag,另一个为AggregationLevelId

此时Code表上有 1.100.000 行,它们的执行时间分别为 23毫秒和 78 毫秒。

顺便说一下,这两个语句是在一个存储过程中。

Rob*_*ley 5

如果您对不是 255 的行不感兴趣,则可以使用过滤索引:

CREATE INDEX ix255 ON Code (AggregationLevelId)
INCLUDE (Serial, CodeId) 
WHERE CommissioningFlag = 255;
Run Code Online (Sandbox Code Playgroud)

这意味着它只会以 AggregationLevelId 顺序索引具有 255 的那些,包括 Serial 和 CodeId 的值,因为您需要对它们进行计数/返回。

如果您不能(或不想)使用过滤索引,请尝试以下操作(如评论中最初建议的那样):

CREATE INDEX pick_a_name_for_the_index
ON Code (CommissioningFlag, AggregationLevelId) 
INCLUDE (Serial, CodeId);
Run Code Online (Sandbox Code Playgroud)