2017-09-15 85 views
1


我正在尝试使用Oracle的sdo_contains空间运算符,但它似乎并没有真正起作用,当您在联合表上使用它时。 下面的代码在2分钟运行,但你必须复制的空间算为每个源表:
Oracle的SDO_CONTAINS在联合表上不使用空间索引?

SELECT -- works 
    x.code, 
    count(x.my_id) cnt 
FROM (select 
     c.code, 
     t.my_id 
     from my_poi_table_1 t,my_shape c 
     WHERE SDO_contains(c.shape, 
        sdo_geometry(2001,null,SDO_POINT_type(t.latitude, t.longitude,null),null,null) 
        ) = 'TRUE' 
     union all 
     select 
     c.code, 
     t.my_id 
     from my_poi_table_2 t,my_shape c 
     where SDO_contains(c.shape, 
        sdo_geometry(2001,null,SDO_POINT_type(t.lat, t.lng,null),null,null) 
        ) = 'TRUE' 
    ) x 
group by x.code 

我想让它简单,所以我想先创建点,然后只有一次使用就可以了SDO_CONTAINS,但它的运行更多的则25分钟,因为它不使用空间索引:

SELECT -- does not work 
    c.code, 
    count(x.my_id) cnt 
FROM my_shape c, 
    (select 
     my_id, 
     sdo_geometry(2001,null,SDO_POINT_type(latitude, longitude,null),null,null) point 
     from my_poi_table_1 t 
     union all 
     select 
     my_id2, 
     sdo_geometry(2001,null,SDO_POINT_type(lat, lng,null),null,null) point 
     from my_poi_table_2 t 
    ) x 
WHERE SDO_contains(c.shape, 
        x.point 
        ) = 'TRUE' 
group by c.code 

有一种使用多个表的结果SDO_CONTAINS不必包括它的方式在选择几次?
甲骨文:12.1.0.2

回答

1

看来,这SDO_CONTAINS没有(有效)从一个子查询可以读出:如果我把POI表的一进一出的子查询,那么甲骨文将不会使用空间索引的那部分:

SELECT -- does not work 
    x.code, 
    count(x.my_id) cnt 
FROM (select --+ ordered index(c,INDEX_NAME) 
     c.code, 
     t.my_id 
     from my_shape c,(select t.*,rownum rn from my_poi_table_1 t) t 
     WHERE SDO_contains(c.shape, 
        sdo_geometry(2001,null,SDO_POINT_type(t.latitude, t.longitude,null),null,null) 
        ) = 'TRUE' 
     union all 
     select 
     c.code, 
     t.my_id 
     from my_poi_table_2 t,my_shape c 
     where SDO_contains(c.shape, 
        sdo_geometry(2001,null,SDO_POINT_type(t.lat, t.lng,null),null,null) 
        ) = 'TRUE' 
    ) x 
group by x.code