You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL数据库分页查询偶发慢查询的原因排查与优化咨询

问题背景

我在Azure SQL数据库中有两张表:

Action表结构

CREATE TABLE [dbo].[Action]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Action] [varchar](7) NOT NULL,
    [Resource] [varchar](16) NOT NULL,
    [Timestamp] [datetime] NOT NULL
)

ALTER TABLE [dbo].[Action] 
    ADD CONSTRAINT [PK_Action] 
        PRIMARY KEY CLUSTERED ([ID] ASC)

ResourceScope表结构

CREATE TABLE [dbo].[ResourceScope]
(
    [Resource] [varchar](16) NOT NULL,
    [Scope] [varchar](100) NOT NULL
)

ALTER TABLE [dbo].[ResourceScope] 
    ADD CONSTRAINT [PK_ResourceScope] 
        PRIMARY KEY CLUSTERED ([Scope] ASC, [Resource] ASC)

Action表包含约1500万条操作记录,涉及约150万个唯一Resource;ResourceScope表包含约1万行数据,记录唯一Resource与其所属Scope的对应关系。

分页查询场景

某API通过以下分页查询遍历Action表,其中<id>和<scope>为变量,每页大小固定:

SELECT TOP 101
    [Action].[ID], 
    [Action].[Action], 
    [Action].[Resource], 
    [Action].[Timestamp]
FROM 
    [Action] 
JOIN 
    [ResourceScope] ON [ResourceScope].[Resource] = [Action].[Resource] 
WHERE 
    [Action].[ID] <= <id>
    AND [ResourceScope].[Scope] = <scope>
ORDER BY 
    [Action].[ID] DESC

慢查询现象

针对某一Scope进行分页时,约95%的查询耗时约15ms,但剩余5%的特定id/scope组合查询耗时在500ms至4000ms之间。慢查询与快查询的执行计划完全一致,但慢查询会对ResourceScope的主键执行大量聚集索引seek操作,而快查询仅执行约100次该操作。

索引视图临时解决方案

当为特定Scope创建如下索引视图并基于该视图分页时,慢查询现象消失:

CREATE VIEW [dbo].[DemoSetAction]
WITH SCHEMABINDING
AS  
    SELECT
        [dbo].[Action].[ID], 
        [dbo].[Action].[Action], 
        [dbo].[Action].[Resource], 
        [dbo].[Action].[Timestamp]
    FROM 
        [dbo].[Action] 
    JOIN 
        [dbo].[ResourceScope] ON [dbo].[ResourceScope].[Resource] = dbo.[Action].[Resource] 
    WHERE 
        [dbo].[ResourceScope].[Scope] = 'demo-set'

CREATE UNIQUE CLUSTERED INDEX IDX_DemoSet ON [dbo].[DemoSetAction] (ID);

视图分页查询语句:

SELECT TOP 101
    [DemoSetAction].[ID], 
    [DemoSetAction].[Action], 
    [DemoSetAction].[Resource], 
    [DemoSetAction].[Timestamp]
FROM 
    [DemoSetAction] 
WHERE 
    [Action].[ID] <= <id>   
ORDER BY 
    [Action].[ID] DESC

由于Scope可动态添加(预计不超过25个),我希望不为每个Scope创建索引视图,现咨询两个问题:

  1. 慢查询的触发原因是什么?
  2. 有无无需创建索引视图即可实现同等性能的索引或其他优化方案?

内容的提问来源于stack exchange,提问作者standardModel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:53:10