1

我对数据库性能还是很陌生,并且了解管理工作室在幕后为我们所做的所有错综复杂的事情,因此感谢任何帮助或对学习材料的参考。

我的问题是我正在编写一个查询以从链接服务器获取数据并将其加入我的本地数据库表以插入特定信息。我正在使用 2 个 cte 并在 cte 中为链接服务器数据加入 2 个表。然后我使用子查询将列添加到我的结果集中,这样我就可以逐行过滤。我这样做是因为我不擅长使用 PIVOT。

    with ap AS (
    SELECT DISTINCT col1
    ,col2 ,col3 ,col4
    from [linkedServer].[db].[dbo].[table] st
    JOIN [linkedServer].[db].[dbo].[table2] vs ON vs.col1 = st.col1 AND vs.col2 = st.col2
    WHERE vs.col3 = '' and ...

    ,pre as (
    SELECT *
    ,COALESCE(
    (SELECT 1 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 2 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 3 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 4 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ) Monday 

    ,COALESCE(
    (SELECT 1 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 2 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 3 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 4 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ) Tuesday 

    ,COALESCE(
    (SELECT 1 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 2 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 3 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 4 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ) Wednesday

   ,COALESCE(
    (SELECT 1 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 2 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 3 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ,(SELECT 4 from ap where sss.col1 = ap.col1 and ap.col3 = '')  
    ) Thursday 

    FROM local_Table sss
    )
UPDATE tar 
SET tar.monday = pre.Monday
    ,tar.Tuesday = pre.Tuesday
    ,tar.Wednesday = pre.Wednesday
    ,tar.Thursday = pre.Thursday
FROM local_table tar
JOIN pre on tar.column = pre.column

这大约需要 5 分钟才能运行。

从我到目前为止所学到的知识来看,我的选择是使用临时表或在链接服务器上创建一个视图,这样我就不会在我的查询中进行任何连接。

非常感谢您对优化此问题的任何帮助!

4

1 回答 1

0

当您将此语法与链接服务器一起使用时:

select field1, field2
from servername.databasename.ownername.tablename
where field3 = something

发生的情况是 sql server 将首先带入该表的全部内容,然后应用 where 子句。缓慢的执行时间是由所有正在传输的数据引起的。

解决方法是使用 openquery。如果你用谷歌搜索“sql server openquery”,你会发现很多例子。

于 2013-10-28T22:45:32.493 回答