我有一个这样的表:
create table A ( fieldA numeric, fieldB varchar(255), fieldC varchar(255), ... fields ... constraints ... );
我在上具有唯一的B树索引fieldB。所以,当我执行这样的查询时:
fieldB
select /*+ index(a)*/ * from A a where fieldB > 'LOW' and fieldB < 'HIGH' order by fieldB
由于存在现有索引,我希望看到具有索引范围扫描并且没有子句排序顺序(或任何其他类型的排序)的查询计划。其实我有sort order by查询计划
sort order by
explain plan for select /*+ index(a)*/ * from A a where fieldB > 'LOW' and fieldB < 'HIGH' order by fieldB
结果:
SELECT STATEMENT SORT ORDER BY TABLE ACCESS BY INDEX ROWID BATCHED INDEX RANGE SCAN
如果我从order by查询中删除,我将无法按所需顺序获取数据(这对我来说很奇怪,因为默认情况下,B树索引会按升序构建行树,并且在这种情况下select * from A,select * from A order by fieldB应提供与i相同的查询计划想法)
order by
select * from A
select * from A order by fieldB
我该如何避免sort order by?
Oracle版本:12.2
这个问题在NLS_LANGUAGE和NLS_TERRITORY会话的参数。默认情况下,我的会话有
NLS_LANGUAGE
NLS_TERRITORY
NLS_LANGUAGE= 'RUSSIAN'
NLS_TERRITORY= 'RUSSIA'
当我尝试使用varchar索引值和查询中的顺序以特定顺序获取数据时,我会sort order by在查询计划中获得更多信息。
在更改了这些参数之后:
NLS_LANGUAGE= 'AMERICAN'
NLS_TERRITORY= 'AMERICA'
sort order by我的查询计划中没有其他内容。
现在,查询:
EXPLAIN PLAN FOR select * from SIEBEL_CT.A a where fieldB > 'LOW' and fieldB < 'HIGH' order by fieldB
EXPLAIN PLAN FOR select * from SIEBEL_CT.A a where fieldB > 'LOW' and fieldB < 'HIGH'
具有相同的查询计划