连接和链接服务器查询导致延迟

时间:2017-05-02 15:53:42

标签: sql-server

嘿伙计们,下面的代码需要很长时间。我已经看了很久了。有什么东西可以说是导致延迟的明显原因吗?

[SQLSRV-3-JB]是一个链接服务器BTW

Select count(cast (Unique_ID as bigint)) as [Count],
       T.[Region_Code],
       T.[Region_Name],
       U.[Region_Code],
       Y.[Examination_Year], 
       case when [Subject] = 'MUSIC THEORY' THEN 'Theory' 
            else 'Practical' 
       end  
from   [SQLSRV-3-JB].[X].[dbo].[Exam_and_Candidate_Details] Y
  left join [SQLSRV-3-JB].[X].[dbo].[UK_Exam_Centre_Info] T 
    on Y.Centre_Code = T.Centre_Code
  left join [SQLSRV-3-JB].[X].[dbo].[UK_Exam_Centres] U 
    on Y.Centre_Code = U.Centre_Code
where  Y.[Examination_Year] between 2010 and 2016 
group by Y.[Examination_Year],
         T.[Region_Code],
         T.[Region_Name],
         U.[Region_Code],
         case when [Subject] = 'MUSIC THEORY' THEN 'Theory' 
              else 'Practical' 
         end

1 个答案:

答案 0 :(得分:0)

是的,有一个非常明显的问题 - 远程服务器。当您使用这样的链接服务器时,SQL Server有一个令人不安的习惯,即在执行JOIN或过滤之前将远程表中的所有数据拉到本地服务器

处理此问题的正确方法是使此查询成为远程服务器上的视图,并使用您的WHERE子句查询该视图。所以,你的远程代码看起来像这样:

-- Remote Server
USE X
GO
CREATE VIEW dbo.ExamCenterInfo 
AS
    Select count(cast (Unique_ID as bigint)) as [Count],
           T.[Region_Code],
           T.[Region_Name],
           U.[Region_Code],
           Y.[Examination_Year], 
           case when [Subject] = 'MUSIC THEORY' THEN 'Theory' 
                else 'Practical' 
           end  
    from dbo.[Exam_and_Candidate_Details] Y
    left join dbo.[UK_Exam_Centre_Info] T 
        on Y.Centre_Code = T.Centre_Code
    left join dbo.[UK_Exam_Centres] U 
        on Y.Centre_Code = U.Centre_Code
    group by Y.[Examination_Year],
             T.[Region_Code],
             T.[Region_Name],
             U.[Region_Code],
             case when [Subject] = 'MUSIC THEORY' THEN 'Theory' 
                  else 'Practical' 
             end

然后是您的本地代码:

-- Local Server

SELECT *
FROM   [SQLSRV-3-JB].[X].[dbo].ExamCenterInfo ECI
    where ECI.[Examination_Year] between 2010 and 2016 

注意:有可能在按年度过滤之前将所有视图输出拉出来。如果这仍然是一个问题,您将不得不创建一个更复杂的机制来在远程服务器上通过过滤执行视图。