Sql-Server

包含帶有 SUBSTRING 的 WHERE 子句的慢查詢

  • January 29, 2019

我在 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

引用自:https://dba.stackexchange.com/questions/228275