当对链接数据库执行查询时,在本地Oracle数据库上使用了哪些资源?



我正在用c#编写一个应用程序,该应用程序将对本地和链接数据库(所有Oracle 10g和更新)执行查询,我想确保我了解了当链接数据库被查询时谁在做什么。

例如,对于一个简单的查询,如

SELECT * FROM FOO@DB_LINK

本地数据库服务器负责什么?我假设这将使用承载DB_LINK的数据库服务器上的CPU、磁盘和内存,但是这个查询对本地数据库服务器资源有什么影响呢?

如果查询稍微复杂一点,比如

SELECT * FROM FOO@DB_LINK F INNER JOIN BAR@DB_LINK B ON F.FOOBAR = B.FOOBAR

整个查询是在承载DB_LINK的服务器上执行,还是在本地服务器上执行INNER JOIN?如果INNER JOIN是由本地数据库执行的,它是否能够利用链接表上的索引(我不这么认为)?是否有一种方法告诉Oracle在链接的数据库上执行整个查询?

在我的应用程序中,我的查询将始终完全针对本地数据库或选定的链接数据库。换句话说,我永远不会有一个查询,我同时从本地和链接数据库获取数据,如

SELECT * FROM FOO F INNER JOIN BAR@DB_LINK B ON F.FOOBAR = B.FOOBAR

总结,

  1. 我只处理Oracle 10g或更新的数据库。
  2. 当查询(无论多么复杂)严格针对链接表时,本地数据库服务器负责什么?
  3. 有什么方法(如果有的话)可以优化或给Oracle一些关于如何最好地执行这些查询的提示?(c#的例子会很好)

就像大多数与优化器相关的事情一样,这取决于。

如果您为特定查询生成查询计划,该查询计划将告诉您本地数据库正在执行什么操作(如果有的话)以及远程数据库正在执行哪些操作。最有可能的情况是,如果对象的统计信息相当准确,并且查询只引用单个远程数据库中的对象,那么优化器将足够聪明地将整个查询推送到远程服务器执行。

唉,优化器并不总是聪明到能做正确的事情。如果发生这种情况,您很可能通过在查询中添加适当的driving_site提示来解决它。

SELECT /*+ driving_site(F) */ * 
FROM FOO@DB_LINK F 
INNER JOIN BAR@DB_LINK B 
ON F.FOOBAR = B.FOOBAR

根据查询的复杂程度,在查询中添加提示的困难程度,以及在您的环境中使优化器正常工作的困难程度,在远程数据库中创建视图可以是强制查询在远程数据库上运行的另一种方法。如果在db_link上创建一个将两个表连接在一起的视图,并通过数据库链接查询该视图,那么(以我的经验)总是会强制在定义该视图的远程数据库上执行。考虑到您没有混合本地对象和远程对象,我不希望需要这个选项,但为了完整性,我包含了它。

100%的远程查询将由远程实例优化。本地实例仍然需要分配一些内存和使用CPU,以便从远程服务器获取结果,但主要工作(如哈希连接和循环)都将由远程实例完成。

当发生这种情况时,您将在本地执行计划中得到一个注释

Note
-----
- fully remote statement

一旦需要在本地服务器上完成某些事情(例如插入或连接到本地表(包括本地双表))作为语句的一部分,那么查询就变成分布式的,只有一个服务器可以被认为是驱动站点,它通常是本地的(我无法提出一个选择远程站点的演示,即使它更便宜,所以可能不是基于成本的)。通常,这将导致您在某个地方遇到一些问题—可能是在本地计算的远程表的嵌套循环连接。

使用分布式查询要记住的一件事-优化实例不会查看来自另一个实例的直方图信息。

最新更新