为什么REPLACE查询在SQL Server 2008中占用了太多时间

时间:2015-04-01 06:59:30

标签: sql-server sql-server-2008 replace

我有一个SQL查询,它将日期时间转换为 106格式,然后我将空格替换为-,这在执行时花费了大约4分钟的时间。示例如下

REPLACE(CONVERT(VARCHAR,GETDATE(),106),' ','-') DDate
  

输出19-Feb-2015

没有替换我的查询是0秒

有没有其他方法可以获得上面提到的自定义格式日期? 我知道REPLACE会比较结果项的集合。 但它不应该花费4分钟来替换100到200个数据。

有什么想法吗?

查询为

SELECT  TOP(ISNULL(100,'10000'))
         FD.Flight 'Select'
        ,FD.Filename    
        ,ISNULL(FD.RefNo, 'FLT-' + CONVERT(VARCHAR, FD.FLID)) 'FlightID'                     
        ,FD.Registration
        ,ISNULL(FD.FlightNumber, '') FlightNumber
        **,REPLACE(CONVERT(VARCHAR,FD.TKD,106),' ','-') TODate**
        ,FD.TOGMT   
        **,REPLACE(CONVERT(VARCHAR,FD.LKD,106),' ','-') LDDate**
        ,FD.LDGMT
        ,FD.Origin
        ,FD.Destination
        ,FD.Pilot
        ,FD.CoPilot             
        **,REPLACE(CONVERT(VARCHAR,FD.DumpDate,106),' ','-') DDate**
        ,FD.UserName
        ,FD.FlightCount     
        ,FD.AcVariation     
    FROM 
        dbo.vw_FlightDetails FD
        LEFT JOIN [dbo].FlightRemark RM ON RM.FlightID = FD.FLID
    WHERE 
        1=1 
    ORDER BY 
         FD.TKD DESC
        ,FD.TOGMT DESC      

大胆的区域是我面临的问题

1 个答案:

答案 0 :(得分:0)

很难说出这里发生了什么,但你可以试试这个:

select  <all your _other_ columns>,
        ISNULL(x.RefNo, 'FLT-' + CONVERT(VARCHAR, x.FLID)) FlightID,
        REPLACE(CONVERT(VARCHAR, x.TKD, 106),' ','-') TODate,
        REPLACE(CONVERT(VARCHAR, x.LKD, 106),' ','-') LDDate,
        REPLACE(CONVERT(VARCHAR, x.DumpDate, 106),' ','-') DDate,
  from (
      SELECT TOP (ISNULL(100,'10000'))
             FD.Flight 'Select'
            ,FD.Filename    
            ,FD.RefNo, 
            ,FD.FLID
            ,FD.Registration
            ,ISNULL(FD.FlightNumber, '') FlightNumber
            ,FD.TKD                
            ,FD.TOGMT   
            ,FD.LKD
            ,FD.LDGMT
            ,FD.Origin
            ,FD.Destination
            ,FD.Pilot
            ,FD.CoPilot             
            ,FD.DumpDate
            ,FD.UserName
            ,FD.FlightCount     
            ,FD.AcVariation     
        FROM 
            dbo.vw_FlightDetails FD
            LEFT JOIN [dbo].FlightRemark RM ON RM.FlightID = FD.FLID
        WHERE 
            1=1 
        ORDER BY 
             FD.TKD DESC
            ,FD.TOGMT DESC    
    ) x

基本上,将查询埋入子查询中,然后仅在结果行上格式化日期。我怀疑这是因为top()语句而发生的......它可能使用REPLACE处理的行多于它需要的行。