Sql-Server
包含帶有 SUBSTRING 的 WHERE 子句的慢查詢
我在 SQL Server 2016 中有以下查詢,因為“在此處輸入程式碼”列沒有程式碼,我不得不使用
SUBSTRING
. 但正如預期的那樣,它很慢,查詢以00:03:37
.with cte as ( -- De Incidente para Requisição select cdchamado AS [Chamado] ,'De Incidente para Requisição' AS [Tipo de Alteração] ,dtacompanhamento AS [Alterado Em] from [dbo].[hd_acompanhamento] where SUBSTRING(dsacompanhamento,45,36) = 'incidente para requisição de serviço' union -- De Requisição para Incidente select cdchamado AS [Chamado] ,'De Requisição para Incidente' AS [Tipo de Alteração] ,dtacompanhamento AS [Alterado Em] from [dbo].[hd_acompanhamento] where SUBSTRING(dsacompanhamento,45,36) = 'requisição de serviço para incidente' ) select * from cte
我考慮過製作一個臨時表並僅插入我需要的數據,因此該表將通過 SQL Server 代理中的作業進行自我更新。但我不知道這是否是最好的解決方案。
IMO,它不是計算列的主要候選者,而是重要的是要知道如何通過 UI 或任何 Job 填充表。可能更好的解決方案在這裡。
還有一點是為什麼謂詞是硬編碼的,它會經常變化嗎?
另一點是@Erik 指出,
UNION
, 消除UNION
會增加您的查詢。with cte as ( -- De Incidente para Requisição select cdchamado AS [Chamado] ,'De Incidente para Requisição' AS [Tipo de Alteração] ,dtacompanhamento AS [Alterado Em] from [dbo].[hd_acompanhamento] where SUBSTRING(dsacompanhamento,45,36) = 'incidente para requisição de serviço' ) -- De Requisição para Incidente select cdchamado AS [Chamado] ,'De Requisição para Incidente' AS [Tipo de Alteração] ,dtacompanhamento AS [Alterado Em] from [dbo].[hd_acompanhamento] where SUBSTRING(dsacompanhamento,45,36) = 'requisição de serviço para incidente' and not exists(select 1 from CTE 1 where hd_acompanhamento].somekeyCol = c.somekeyCol) union all select * from cte