我有一个这样的表:
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 * fromA
,select * from A order by fieldB
应提供与i相同的查询计划想法)
我该如何避免sort order by
?
Oracle版本:12.2
这个问题在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'
具有相同的查询计划
你好,我有一个简单的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索引,我从简单的谓词开始 然后我