繁体   English   中英

如何优化游标使用的查询?

[英]How can I optimize this query used by a cursor?

我有一个利用以下游标的存储过程:

DECLARE Delai_latence CURSOR LOCAL FOR 
SELECT [ID]
      ,[ID_LIVRAISON]
      ,[DH_ETAPE_DEB]
      ,[DH_ETAPE_FIN]
      ,[ORDRE_ETAPE]
FROM [ODS_PFNUM_DELAI]
WHERE ID_GRP = 1
  AND STATUT_ETAPE is not Null
  AND DH_ETAPE_FIN is not Null
ORDER BY [ID_LIVRAISON], [ORDRE_ETAPE]

为了优化它,我创建了非聚集索引:

CREATE NONCLUSTERED INDEX [IX_LATENCE_PFNUM_DELAI] ON [ODS_PFNUM_DELAI] 
(
    [ID_GRP] ASC,
    [STATUT_ETAPE] ASC,
    [DH_ETAPE_FIN] ASC
)
INCLUDE ( [ID],
[ID_LIVRAISON],
[DH_ETAPE_DEB],
[ORDRE_ETAPE]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

但是,执行仍然花费太多时间(您会发现附有执行计划)。

谢谢。

ExecutionPlan.jpg

真正的问题可能是:您真的需要一个游标,特别是考虑到查询计划中显示的“胖”行。

无论如何,出于好奇,查询是否将从此(过滤后的)索引中受益?

CREATE INDEX idx_test ON [ODS_PFNUM_DELAI] 
       ([ID_GRP], [ID_LIVRAISON], [ORDRE_ETAPE]) 
INCLUDE ([ID], [DH_ETAPE_DEB], [DH_ETAPE_FIN])
WHERE [STATUT_ETAPE] IS NOT NULL AND [DH_ETAPE_FIN] IS NOT NULL 

另外,对存储过程的其余部分一无所知:如果您碰巧正在更​​新游标循环内的[ODS_PFNUM_DELAI]表,并且所做的更改不会影响实际的循环,则定义一个好主意光标为STATIC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM