SQL Server链接服务器与Oracle - 问题:选择* x选择列

时间:2013-02-20 19:49:01

标签: sql performance oracle linked-server

我在SQL SERVER 2008 R2上遇到OPENQUERY的性能问题: 我跑的时候:

select 
*
from openquery([LINKEDSERVER],'
            SELECT
            COLUMN1,COLUMN2,COLUMN3...(45 columns at all)
            FROM ORACLE_TABLE
            WHERE X>Y')

超过5分钟的响应时间(是的,5分钟)。但是,如果我在Oracle端使用一个唯一的列运行相同的select

select 
*
from openquery([SERVER],'
            SELECT
            COLUMN1
            FROM ORACLE_TABLE
            WHERE X>Y')

响应时间为17秒(10.000条记录)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

双方的等待事件是什么?什么是查询计划?

进程是否正在等待网络流量?如果是这样的话,据推测,45列数据通过网络传输的数据要多得多。如果我们假设它是数据的45倍,并且在更快的情况下17个经过的秒中的7个花费在网络流量上,那么从一列数据到45列数据将使网络等待事件的数量增加7s * 44列= 308秒。因此,如果没有更多信息,通过将您通过网络发送的数据量增加45倍,从17秒增加到5分钟似乎至少可能是合理的。

当然,如果您告诉我们column1是一张大图片而其他44列是CHAR(1)列,每列消耗一个字节,那么网络流量的增加就不会是对绩效变化的合理解释。

column1被编入索引吗?如果是这样,当您想要获取所有45列时,可能会有一个非常不同的计划。也许第一个查询计划显示Oracle只需扫描一个小覆盖索引,而第二个计划显示它必须进行更昂贵的表扫描。