【问题标题】:What resources are used on a local Oracle database when a query is executed against a linked database?对链接数据库执行查询时,在本地 Oracle 数据库上使用了哪些资源?
【发布时间】:2021-10-06 05:45:53
【问题描述】:

我正在用 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# 中的示例会很棒)

【问题讨论】:

  • Oracle 数据库管理员指南在Chapter 32.4 Tuning Distributed Queries 中谈到了这一点
  • 感谢@kfinity,但是文档的范围是“本地 Oracle 数据库服务器将分布式查询分解为相应数量的远程查询,然后将其发送到远程节点执行。远程节点执行查询并将结果发送回本地节点。本地节点然后执行任何必要的后处理并将结果返回给用户或应用程序。 Oracle 如何确定将分布式查询分解为远程查询的位置?是否足够聪明地确定可以完全传递针对所有远程对象的查询?

标签: oracle performance hyperlink resources


【解决方案1】:

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

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

Note
-----
   - fully remote statement

作为语句的一部分,一旦需要在本地服务器上执行某些操作(例如插入或加入本地表(包括本地对偶表)),则查询变为分布式,只有一台服务器可以被认为是驾驶站点,它通常是本地的(我无法提供一个选择远程站点的演示,即使它更便宜,所以它可能不是基于成本的)。通常,这最终会导致您在某处遇到一些问题 - 可能是针对在本地计算的远程表的嵌套循环连接。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    根据查询的复杂程度、向查询中添加提示的难度以及在环境中让优化器运行的难度有多大,在远程数据库中创建视图可能是另一种强制查询的方式在远程数据库上运行。如果您在db_link 上创建一个视图,将两个表连接在一起并通过数据库链接查询该视图,那么(根据我的经验)这将始终强制执行在定义视图的远程数据库上发生。考虑到您没有混合本地和远程对象,我不希望需要此选项,但为了完整性我将其包括在内。

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2011-04-13
      • 2015-03-27
      • 2020-09-14
      相关资源
      最近更新 更多