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 毫秒。
顺便说一下,这两个语句是在一个存储过程中。
如果您对不是 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)
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |