我想使用SDO_JOIN-Operator来自我加入一张桌子。
该表具有以下结构:
ID VARCHAR2(20)
SHAPE SDO_GEOMETRY()
该表有25778行。
以下SDO_JOIN-Statement需要90秒:
SELECT w.id as id1, w2.id as id2
FROM TABLE(SDO_JOIN('nodesWays', 'SHAPE', 'nodesWays', 'SHAPE', 'mask=ANYINTERACT')) c,
nodesWays w, nodesWays w2
WHERE c.rowid1 = w.rowid AND c.rowid2 = w2.rowid;
90秒是正常时间还是太高。我不知道什么是执行的好时机。
再见,安德烈答案 0 :(得分:0)
SDO_JOIN旨在将许多空间对象与许多其他对象进行匹配:它是一种“批处理”操作,因此需要时间,并且需要的对象越多,它显然需要的时间越长。它需要多长时间显然取决于您运行它的硬件类型。 CPU容量是关键。
关于您的查询,首先删除SDO_GEOM.RELATE调用。这是不必要的,因为它已经由主SDO_JOIN查询完成。我也认为没有理由使用这些提示。所以试试这个:
SELECT w.id as id1, w2.id as id2
FROM TABLE(SDO_JOIN('nodesWays', 'SHAPE', 'nodesWays', 'SHAPE', 'mask=ANYINTERACT')) c,
nodesWays w, nodesWays w2
WHERE c.rowid1 = w.rowid
AND c.rowid2 = w2.rowid
and c.rowid1 < c.rowid2;
这需要多长时间?
90秒是个好时光吗? 50秒是个好时光吗?一根绳子有多长?
真正的问题是:90或50秒是您的应用程序工作流程的好时机吗?它符合您的业务要求吗?如果是这样,你就完全了。如果您希望更快地获得结果,请尝试在具有更多CPU功率的系统上运行它,即更快的处理器。
请注意,SDO_JOIN当前不利用多核/多CPU服务器提供的并行性。您仍然可以使用并行性,但这需要重写查询并使语法更复杂。然后再问自己一个问题:是否值得努力让响应更快?
答案 1 :(得分:0)
鉴于您发布的解释计划,我怀疑您可能很难让它更快地运行,除非您使用更快的CPU运行更好的硬件。请注意,sdo_join在12c中速度要快得多,因为SPATIAL_VECTOR_ACCELERATION = TRUE,所以如果可能的话,尝试在该版本上运行...即使只是为了测试它的速度。