我在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条记录)。
有什么想法吗?
答案 0 :(得分:1)
双方的等待事件是什么?什么是查询计划?
进程是否正在等待网络流量?如果是这样的话,据推测,45列数据通过网络传输的数据要多得多。如果我们假设它是数据的45倍,并且在更快的情况下17个经过的秒中的7个花费在网络流量上,那么从一列数据到45列数据将使网络等待事件的数量增加7s * 44列= 308秒。因此,如果没有更多信息,通过将您通过网络发送的数据量增加45倍,从17秒增加到5分钟似乎至少可能是合理的。
当然,如果您告诉我们column1
是一张大图片而其他44列是CHAR(1)
列,每列消耗一个字节,那么网络流量的增加就不会是对绩效变化的合理解释。
column1
被编入索引吗?如果是这样,当您想要获取所有45列时,可能会有一个非常不同的计划。也许第一个查询计划显示Oracle只需扫描一个小覆盖索引,而第二个计划显示它必须进行更昂贵的表扫描。