首页 文章

从SQL Server 2008R2到Oracle 11g的OpenQuery很慢,但在Oracle服务器上运行的查询速度很快

提问于
浏览
0

码:

WITH GTransNums
AS (
SELECT /*+ INDEX (GTRANS_DEFS_24) */ gtrans_num
FROM pro.gtrans_defs
INNER JOIN pro.loc_defs ON (
        loc_defs.loc_num = gtrans_defs.gdest_num
        AND loc_defs.loc_type = '' JLP ''
        )
WHERE gdest_num != 99999
)
SELECT /*+ INDEX (GTRANS_ITEMS_1) */ Gtrans_items.season
,Gtrans_items.sty_num
,Gtrans_items.sty_qual
,Gtrans_items.bf_mat_char_val
FROM pro.gtrans_items
WHERE gtrans_num IN (
    SELECT gtrans_num
    FROM GTransNums
    )
GROUP BY Gtrans_items.season
,Gtrans_items.sty_num
,Gtrans_items.sty_qual
,Gtrans_items.bf_mat_char_val

上面粘贴的代码在直接在Oracle服务器上运行时运行得非常快,但是当我们将它包装到Microsoft SQL Server上的Openquery时,它就会挂起 . 它可以拉回大约40000行 .

我们已经评估了Openquery在访问Oracle框时的格式,并且所有内容看起来都与直接运行时完全相同 .

Openquery在Microsoft SQL Server和Oracle机箱上运行时拥有相当多的上帝权限 .

提供者:OLE DB的Oracle提供者

我们已经从Oracle框中的代码创建了一个视图,并通过Microsoft SQL Server中的Openquery查询了该视图,并且速度非常快 .

可能的想法:

  • 在将查询传递给Oracle时,Openquery不访问索引,统计信息或键 .

  • 驱动程序/连接管理器导致问题 . 我们尝试了ODBC驱动程序但没有成功 .

  • 一些奇怪的网络正在围绕房屋发送查询 . 无法对此进行测试,因为网络上禁止使用数据包嗅探器 . 两个盒子都放在同一个地方 .

我已经找到了类似的线程,但它们似乎都没有结论 . 这令人沮丧,因为我无法解释为什么完全相同的查询以不同的速度显着运行 .

任何有关这方面的帮助将不胜感激,如果您需要更多信息,那么请问 .

1 回答

  • 0

    我曾经在SQLServer 2008和Oracle 8上做过类似的事情 . 我从未获得过良好的性能 .

    查询在Oracle上运行正常 - 毕竟,Oracle正在运行它们,而不是驱动程序 . 会发生什么事情是网络往返杀了它 . 查询和数据采用的路径是:

    • 客户端向SQLServer发送查询

    • SQLServer将查询发送到Oracle Server

    • Oracle Server执行查询 .

    • Oracle Server将查询发送到SQLServer

    • SQLServer将查询发送到客户端

    我认为步骤5实际上并没有开始,直到从步骤4收到所有数据 - 当你认为它可能被用于与SQLServer表的连接时,这是有意义的 .

    无论如何,您有三次网络旅行而不是一次,加上最后一次旅行没有完成,直到第二次完成 .

    此外,如果完整的结果集保存在SQL Server上,那么它将使用比查询通常更多的内存 . SQL Server将在可用时立即开始向客户端发送数据 . 如果运行的查询超过几秒钟,您可以在SSMS中看到这一点:结果显示在右下方状态栏中的查询计时器仍在运行时 . 因此,SQL Server可能不得不分配额外的内存,从而导致可能的分页等 .

    这是一个相当有用的功能,但我从未见过它很快 .

相关问题