0

OPENQUERY在 SQL SERVER 2008 R2 上遇到性能问题:当我运行时:

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

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

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

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

有任何想法吗?

4

1 回答 1

1

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

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

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

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

于 2013-02-20T19:59:07.117 回答