当前位置: 首页 > 面试题库 >

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

邰胤
2023-03-14
问题内容

我有一个这样的表:

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

如果我从orderby查询中删除,我将无法按所需顺序获取数据(这对我来说很奇怪,因为默认情况下,B树索引会按升序构建行树,并且在这种情况下select * fromAselect * from A order by fieldB应提供与i相同的查询计划想法)

我该如何避免sort order by

Oracle版本:12.2


问题答案:

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

具有相同的查询计划



 类似资料:
  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 我需要从一个非常大的表中选择一个“页”的数据。由于WHERE子句和需要分页到相当大的偏移量,我使用一个子查询来获取ID。只有在末尾放置时,此策略才有效。这导致(我认为)到数据库的额外往返。有什么方法可以避免额外的? 附言。我这样做的原因是由于orderBy/offset/limit用于大偏移量(我选择的列之一由于是blob类型,不适合添加到索引中,所以我不能创建覆盖索引)。

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 问题链接1链接2链接3 从上面的链接,我希望我遵循的答案是被接受的。但我还是有例外。我正在使用Java 6。 代码: 堆栈跟踪:

  • 数学成绩从高到低排序 const { field = '' } = ctx.query const fields = ctx.helper.filterFields(field) // 数学成绩从高到低排序 const ret = await Student.findAll({ attributes: fields, order: [ ['math', 'DESC

  • 问题内容: 我刚刚开始研究通过索引优化查询,因为SQL数据正在快速增长。我查看了优化器如何通过SSMS中的执行计划处理查询,并注意到正在使用Sort运算符。我听说排序运算符表示查询中的设计不正确,因为可以通过索引过早地进行排序。因此,这是一个示例表和数据,类似于我正在做的事情: 这是一个示例查询: 我创建了一个非聚集索引来帮助加快查询速度: 为了建立IX_Store索引,我从简单的谓词开始 然后我