码:
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 回答
我曾经在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可能不得不分配额外的内存,从而导致可能的分页等 .
这是一个相当有用的功能,但我从未见过它很快 .