选择与点相交的多边形

问题描述 投票:0回答:0

我有两个 Oracle 18c 表:

  • ply
    — 多边形:4970 行。
  • pnt
    — 点数:3280 + 220 = 3500 行。
  • 形状存储在 SDO_GEOMETRY 列中。

数据可以在这里查看:db<>fiddle.



我有一个查询选择至少与一个点相交的多边形。

  SELECT objectid 
    FROM (SELECT ply.objectid,
                 row_number() over(partition by ply.objectid order by null desc) rn
            FROM ply
      CROSS JOIN pnt
           WHERE sdo_anyinteract(ply.shape, pnt.shape) = 'TRUE'
         )
   WHERE rn = 1

   OBJECTID
   ----------
            1
            2
            3
            4
            5
          ...

   1443 rows selected.
--------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |           |  1457 | 37882 |       | 12851   (1)| 00:00:01 |
|*  1 |  VIEW                              |           |  1457 | 37882 |       | 12851   (1)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK          |           |  1457 |    10M|    11M| 12851   (1)| 00:00:01 |
|   3 |    NESTED LOOPS                    |           |  1457 |    10M|       | 10522   (1)| 00:00:01 |
|   4 |     TABLE ACCESS FULL              | PNT       |  3500 |    12M|       |    11   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID    | PLY       |     1 |  3848 |       | 10522   (1)| 00:00:01 |
|*  6 |      DOMAIN INDEX (SEL: 0.010000 %)| PLY_SHAPE |       |       |       |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("RN"=1)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "PLY"."OBJECTID" ORDER BY  NULL )<=1)
   6 - access("MDSYS"."SDO_ANYINTERACT"("PLY"."SHAPE","PNT"."SHAPE")='TRUE')
Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

查询设计为每个多边形只选择一行。原因:我想要一个唯一的多边形列表,这些多边形至少与一个点相交。


查询的执行速度相对较慢。

  • 在我的本地 Oracle 18c 数据库中运行需要 5 秒。
  • 在 db<>fiddle 中运行至少需要同样长的时间,如果不是更长的话。
  • 我相信统计数据是最新的,因为这些表是新创建的 在我的本地数据库和 db<>fiddle 中。

相比之下,像 ArcGIS Pro 这样的桌面制图软件可以在 0.5 秒内在 RAM 中执行相同的操作。 Screenshot.


问题:

查询性能能否提升?

作为一个新手,我平庸的办公电脑在这种情况下表现优于我们的企业 Oracle 数据库,这似乎令人惊讶。通常,Oracle 数据库性能非常好;立即执行非空间查询。

sql oracle query-optimization spatial-query oracle-spatial
© www.soinside.com 2019 - 2024. All rights reserved.