0

我在两台不同的 Oracle 服务器上有相同的数据库,一台是 11.2.0.1.0,另一台是 11.2.0.4.0。我在两个数据库中都有相同的 2 个几何表,并在两个服务器上运行以下查询。在 11.2.0.1.0 版本的 Oracle 上运行时,查询会运行几分钟并得到结果,在 11.2.0.4.0 上运行时相同的查询会运行大约 3 秒并且没有返回任何结果。

BLPUs 表包含 3600 万个点,PD_B2 表包含一个多边形。我试图找到落在多边形中的所有点。其他空间查询确实返回行,但需要数小时和数小时,而 Oracle Spatial 文档中建议的表连接需要 15 分钟才能返回所有点。

SELECT /*+ ordered */ a.uprn 
FROM TABLE(SDO_JOIN('BLPUS', 'GEOLOC', 'PD_B2', 'GEOLOC','mask=ANYINTERACT')) c, blpus a, PD_B2 b 
WHERE c.rowid1 = a.rowid 
AND c.rowid2 = b.rowid; 

下面的空间查询在 11.2.0.4 服务器上运行时返回 SDO_ROWIDSET()

select SDO_JOIN('BLPUS', 'GEOLOC', 'PD_B2', 'GEOLOC','mask=ANYINTERACT')
from dual;

select SDO_JOIN('BLPUS', 'GEOLOC', 'PD_B2', 'GEOLOC')
from dual;

在 11.2.0.1 服务器上,它们返回结果。

我发现一个小得多的点表将在 11.2.0.4 上工作,因此在使用 SDO_JOIN 时似乎对 11.2.0.4 有大小限制,而 11.2.0.1 似乎可以处理大表。

有谁知道这是为什么,或者在使用 SDO_JOIN 时表大小是否存在实际限制?

4

1 回答 1

0

这很奇怪。我看不出为什么 SDO_JOIN 在 11.2.0.4 中不会以同样的方式工作。至少我以前没有见过这种行为。对我来说这似乎是一个错误,我建议您向 Oracle 支持提交服务请求,以便我们查看。您可能需要提供表的转储 - 或至少提供足够小的子集来证明问题。

也就是说,有几件事需要检查:您是否在同一个数据库上应用了 11.2.0.4 补丁?即在表结构或内容、授权等方面没有任何改变?

当您说查询不返回任何行时,它会立即返回吗?还是它在完成之前执行一些处理而不返回任何东西?

PD_B2 表有多大?

当你这样做时会发生什么:

select SDO_JOIN('BLPUS', 'GEOLOC', 'PD_B2', 'GEOLOC','mask=ANYINTERACT')
from dual;

这也没有回报吗?

如果你这样做会发生什么

select SDO_JOIN('BLPUS', 'GEOLOC', 'PD_B2', 'GEOLOC')
from dual;

两者都应该返回如下所示的内容:

SDO_ROWIDSET(SDO_ROWIDPAIR('AAAW3LAAGAAAADmAAu', 'AAAW3TAAGAAAAg7AAC'), SDO_ROWIDPAIR('AAAW3LAAGAAAADmABE', 'AAAW3TAAGAAAAgrAAA'),...)

如果您在 sqlplus 中运行查询,您将看到这一点。[如果您使用 GUI(如 TOAD 或 SQLDeveloper),那么您可能看不到这一点。所有这些 GUI 在处理对象或数组时都有问题。]

但是你的 11.2.0.4 测试很快完成的事实可能意味着你得到一个空的结果,可能是这样的:

SDO_ROWIDSET()

这证实了某些事情没有奏效。

现在,从你所说的 PD_B2 只包含一行?如果是这样,那么没有任何理由通过 SDO_JOIN。直接的空间查询更容易编写。SDO_JOIN 仅在连接的两个表都包含多行时才有意义。再说一次,如果其中一个表非常小(如您的情况下的 PD_B2 表),那么它无论如何都会退回到一个简单的查询。

一个简单的查询如下所示:

SELECT a.uprn 
FROM blpus a, PD_B2 b 
WHERE sdo_anyinteract (a.geoloc, b.geoloc) = 'TRUE';

这会返回您对 11.2.0.4 的期望吗?

您可能还想检查查询的成本和使用的查询计划。在 sqlplus 中,执行以下操作:

set timing on
set autotrace traceonly

然后运行上面的查询。效果是 sqlplus 不会显示任何结果 - 但它仍会获取并格式化输出:它不会打印它们。最后,您将获得所用查询计划的打印输出以及一些执行统计信息和经过的时间。请将这些结果添加到您的问题中。

从您的应用程序中运行查询应该具有类似的配置文件:类似的响应时间和数据库端成本 - 假设您确实获取了所有 130 万行。

顺便说一句,您如何处理这些结果?你把它们作为报告展示出来吗?您是否将它们保存到表中以供以后分析?您肯定不想将它们全部显示在地图上吗?

澄清一下: SDO_JOIN仅用于匹配多对多的几何图形。为了匹配一对多,您需要简单的 SDO_ANYINTERACT() 事实上,当其中一组比另一组小得多时,SDO_JOIN 将自动回退到简单的 SDO_ANYINTERACT。我看不出 SDO_JOIN 在您的情况下如何更快(即在搜索与一个对象匹配的所有对象时),因为它将执行与 SDO_ANYINTERACT 相同的操作,并且需要对两个表进行额外的连接。

回到最初的问题- 11.2.0.1 和 11.2.0.4 之间的 SDO_JOIN 行为差异,IMO 绝对是您需要向 Oracle 支持报告的错误。

于 2015-02-25T22:37:03.247 回答