Oracle10g 如何强制Oracle Spatial选择“可执行”执行计划
Oracle 10g中的空间查询仅根据参数值获取不同的执行计划。不幸的是,甲骨文公司根本无法执行其中一项计划,因此出现了一个错误。将低于282的值更改为284或运算符=更改为在任何情况下,都应添加wgs84的索引 如果您不知道这一切意味着什么,请询问DBAOracle10g 如何强制Oracle Spatial选择“可执行”执行计划,oracle10g,sql-execution-plan,oracle-spatial,Oracle10g,Sql Execution Plan,Oracle Spatial,Oracle 10g中的空间查询仅根据参数值获取不同的执行计划。不幸的是,甲骨文公司根本无法执行其中一项计划,因此出现了一个错误。将低于282的值更改为284或运算符=更改为在任何情况下,都应添加wgs84的索引 如果您不知道这一切意味着什么,请询问DBA 请参阅以获取一些信息。您只需以正确的方式编写提示: select nn.poi_id as id from poi p, (select /*+ index (pl POI_LOC_SP_IDX) */ pl.poi_
请参阅以获取一些信息。您只需以正确的方式编写提示:
select nn.poi_id as id
from
poi p,
(select /*+ index (pl POI_LOC_SP_IDX) */ pl.poi_id
from
poi_loc pl,
poi_loc pl2
where
pl2.poi_id = 769
and
pl.poi_id<>769
and
sdo_nn(pl.wgs84, pl2.wgs84)='TRUE'
) nn
where
cat_id = 282
and
p.id = nn.poi_id
and rownum<7;
错误的原因是优化器选择不使用空间索引,因为它认为其他非空间索引谓词更具选择性。澄清一下:您必须有一个空间索引才能进行空间查询,但优化器可能会选择不使用它。这适用于SDO_RELATE和SDO_ANYINTERACT运算符,但不适用于SDO_NN。索引已经存在。我怎样才能强迫oracle每次都使用它。如果你已经有了索引,你的计划可能已经过时了。如果这是在pl/sql中,请重新编译它。否则,请使用dbms_stats pack更新统计信息。如果您已经做了所有这些事情,它仍然不起作用,请使用优化器提示:选择/*+INDEXYOU_INDEX_NAME*/nn.poi_id作为id blar blar blar blar blar不要认为计划已经过时。它是纯sql。请参阅,oracle有时会根据值选择使用POI_LOC_SP_IDX的计划,查询工作正常。你给出的提示在这种情况下也没有帮助。
ORA-13249: SDO_NN cannot be evaluated without using index
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 17
ORA-06512: at "MDSYS.PRVT_IDX", line 22
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 315 | 6 (0)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID | POI_LOC | 1 | 153 | 2 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 315 | 6 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 1 | 162 | 4 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID| POI | 1 | 9 | 2 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | POI_CAT_ID_IDX | 1 | | 1 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID| POI_LOC | 1 | 153 | 2 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | POI_LOC_POI_ID_IDX | 1 | | 1 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | POI_LOC_POI_ID_IDX | 1 | | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------
1 - filter(ROWNUM<7)
2 - filter("MDSYS"."SDO_NN"("PL"."WGS84","PL2"."WGS84")='TRUE')
5 - filter("P"."ID"<>769)
6 - access("CAT_ID"=282)
8 - access("P"."ID"="PL"."POI_ID")
filter("PL"."POI_ID"<>769)
9 - access("PL2"."POI_ID"=769)
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 1890 | 106 (1)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
|* 2 | HASH JOIN | | 6 | 1890 | 106 (1)| 00:00:02 |
|* 3 | TABLE ACCESS BY INDEX ROWID | POI | 573 | 5157 | 41 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | POI_CAT_ID_IDX | 573 | | 2 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 301 | 92106 | 65 (2)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| POI_LOC | 1 | 153 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | POI_LOC_POI_ID_IDX | 1 | | 1 (0)| 00:00:01 |
|* 8 | TABLE ACCESS BY INDEX ROWID| POI_LOC | 302 | 46206 | 65 (2)| 00:00:01 |
|* 9 | DOMAIN INDEX | POI_LOC_SP_IDX | | | | |
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<7)
2 - access("P"."ID"="PL"."POI_ID")
3 - filter("P"."ID"<>769)
4 - access("CAT_ID"=284)
7 - access("PL2"."POI_ID"=769)
8 - filter("PL"."POI_ID"<>769)
9 - access("MDSYS"."SDO_NN"("PL"."WGS84","PL2"."WGS84")='TRUE')
select nn.poi_id as id
from
poi p,
(select /*+ index (pl POI_LOC_SP_IDX) */ pl.poi_id
from
poi_loc pl,
poi_loc pl2
where
pl2.poi_id = 769
and
pl.poi_id<>769
and
sdo_nn(pl.wgs84, pl2.wgs84)='TRUE'
) nn
where
cat_id = 282
and
p.id = nn.poi_id
and rownum<7;