代码之家  ›  专栏  ›  技术社区  ›  b126

在两种不同的Oracle模式上执行相同查询的速度差异很大

  •  0
  • b126  · 技术社区  · 1 年前

    我在同一台Oracle服务器(v12c)上安装了两个不同的模式。

    在这两个模式中的每一个模式上,我都有相同的DBLINK,它指向一个远程数据库,允许我读取一个表(大小 ±12000行 几个基本列 (没有斑点))。

    当我在TOAD中执行/编译时 SELECT * from TABLE@DBLINK 第一种模式:140ms

    当我在TOAD中执行/编译时 SELECT*fromTABLE@DBLINK 第二种模式:900ms

    我快速比较了这两种模式,发现它们看起来完全相同(相同的表空间、相同的授权等)。

    什么能解释这种缓慢?

    如果有意义的话,我应该用工具深入比较这些模式之间的差异吗?

    执行计划方案1

    enter image description here

    执行计划方案2

    enter image description here

    1 回复  |  直到 1 年前
        1
  •  2
  •   Paul W    1 年前

    显然,您的“表”不是表,而是连接远程数据库上多个表的视图。而且,您不是简单地查询表本身,而是将其连接到本地表( COUNTRY ). 这些差异很重要。

    在一个案例中,Oracle正在合并视图,并使用本地数据库作为驱动站点,要求它在本地将所有部分拉到一起,并在那里执行联接。在另一种情况下 合并视图并完全在远程执行。

    尝试添加以下提示(将别名与要添加的表别名相匹配):

    SELECT /*+ driving_site(x) no_merge(x) */ * from VIEW@DBLINK x
    

    至于为什么它在一种模式中与另一种模式不同:有许多潜在因素可能会改变它 国家 在一个模式中的大小可能与另一个不同,或者具有不同的统计信息,或者在一个方案中缺少统计信息。即使链接名称相同,您的链接也可能指向两个不同的数据库;他们可能正在使用两个不同的连接帐户,这两个帐户可能正在解析到远程上的不同对象。等等。只要知道最小的差异可能会导致截然不同的计划就足够了;这种计划的可变性是很常见的。