一尘不染

在查询计划中避免“排序依据”

sql

我有一个这样的表:

create table A (
    fieldA numeric,
    fieldB varchar(255),
    fieldC varchar(255),
... fields ... constraints ... 
);

我在上具有唯一的B树索引fieldB。所以,当我执行这样的查询时:

select /*+ index(a)*/ * from A a where fieldB > 'LOW' and fieldB < 'HIGH' order by fieldB

由于存在现有索引,我希望看到具有索引范围扫描并且没有子句排序顺序(或任何其他类型的排序)的查询计划。其实我有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 Aselect * from A order by fieldB应提供与i相同的查询计划想法)

我该如何避免sort order by

Oracle版本:12.2


阅读 106

收藏
2021-05-23

共1个答案

一尘不染

这个问题在NLS_LANGUAGENLS_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'

具有相同的查询计划

2021-05-23