2017-09-15 82 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