如何强制oracle使用索引范围扫描?

2023-12-19

我对包含 14 亿条记录(带索引)的表运行了一系列极其相似的查询,唯一的问题是这些查询中至少有 10% 的执行时间比其他查询多 100 倍以上。

我运行了一个解释计划,并注意到对于快速查询(大约 90%),Oracle 使用索引范围扫描;对于慢速的,它使用完整索引扫描。

有没有办法强制Oracle进行索引范围扫描?


要“强制”Oracle 使用索引范围扫描,只需使用优化器提示INDEX_RS_ASC。例如:

CREATE TABLE mytable (a NUMBER NOT NULL, b NUMBER NOT NULL, c CHAR(10)) NOLOGGING;

INSERT /*+ APPEND */ INTO mytable(a,b,c) 
SELECT level, mod(level,100)+1, 'a'  FROM dual CONNECT BY level <= 1E6;

CREATE INDEX myindex_ba ON mytable(b, a);
EXECUTE dbms_stats.gather_table_stats(NULL,'mytable');

SELECT /*+ FULL(m)         */ b FROM mytable m WHERE b=10; -- full table scan
SELECT /*+ INDEX_RS_ASC(m) */ b FROM mytable m WHERE b=10; -- index range scan
SELECT /*+ INDEX_FFS(m)    */ b FROM mytable m WHERE b=10; -- index fast full scan

这是否会使您的查询实际上运行得更快取决于许多因素,例如索引值的选择性或表中行的物理顺序。例如,如果您将查询更改为WHERE b BETWEEN 10 AND <xxx>,以下成本出现在我的机器上的执行计划中:

b BETWEEN 10 AND    10     20      40     80
FULL               749    750     751    752
INDEX_RS_ASC        29    325     865   1943
INDEX_FFS          597    598     599    601

如果您将查询稍微更改为不仅选择索引列b,还有其他非索引列,成本变化很大:

b BETWEEN 10 AND    10     20      40     80
FULL               749    750     751    754
INDEX_RS_ASC      3352  40540  108215 243563
INDEX_FFS         3352  40540  108215 243563
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制oracle使用索引范围扫描? 的相关文章

  • 将 MS SQL Server 数据库连接到 Oracle 11g 数据库

    我正在努力创建从 Oracle 数据库到一个 SQL Server 的数据库链接 为此 我添加了以下内容 In file tnsnames ora sqlUserConn DESCRIPTION ADDRESS PROTOCOL tcp H
  • Oracle 时间戳数据类型

    不带参数的时间戳数据类型和带参数 0 的时间戳数据类型有什么不同 timestamp VS timestamp 0 括号中的数字指定要存储的小数秒的精度 所以 0 意味着不存储任何一小部分秒 而仅使用整秒 如果未指定 则默认值为小数点分隔符
  • 嵌套循环中的索引

    我是 R 和这个网站的新手 我的目标是创建一个 R 函数 在 ggplot2 中生成特殊类型的箱线图 这肯定是不必要的晦涩难懂的代码 我首先需要通过计算稍后希望绘制的变量来处理其中的潜在输入 我首先生成一些随机数据 称为datos c1 r
  • 为什么PostgresQL查询性能随着时间的推移而下降,但重建索引时又恢复了

    根据这个page http www postgresql org docs current static indexes examine html在手册中 indexes don t need to be maintained 然而 我们运
  • Oracle SQL 查询日期格式

    我总是对 ORACLE SQL 查询中的日期格式感到困惑 并花几分钟时间去谷歌 有人可以向我解释当数据库表中有不同格式的日期时解决问题的最简单方法吗 例如 我有一个日期列为 ES DATE 保存的数据为 27 APR 12 11 52 48
  • oracle嵌套表的最大行数是多少

    CREATE TYPE nums list AS TABLE OF NUMBER Oracle 嵌套表中最大可能的行数是多少 UPDATE CREATE TYPE nums list AS TABLE OF NUMBER CREATE OR
  • 如何查看任意 Oracle 会话正在使用的事务隔离级别

    我试图找出特定会话 不是我自己的会话 在 Oracle 服务器上的隔离级别 有 v 视图可以得到这个吗 您可以在中测试位 28flag列于v transaction 1 http forums oracle com forums threa
  • 如何获取列表的最后一个索引?

    假设我有以下列表 list1 1 2 33 51 indices 0 1 2 3 如何获取该列表的最后一个索引 在本例中为 3 len list1 1绝对是可行的方法 但如果您绝对需要list具有返回最后一个索引的函数 您可以创建一个继承自
  • 如何使用 JSON_TABLE 从 Oracle JSON 列获取键值作为结果集

    我用谷歌搜索了很多 似乎无法找到适合我的简单用例的简单解决方案 我在 Oracle 12C 数据库中有一个 json 列 当然实际上是一个带有 json 约束的 varchar 在该列中我存储了这样的 Map 表示 a 9 0847 b 8
  • 将十六进制转换为字符串

    我想用HEXTORAW 从 ASCII 十六进制代码 30 获取 char 值 ASCII HEX 30 应返回 varchar 0 该怎么做呢 是HEXTORAW 正确的功能 你可以使用utl raw http docs oracle c
  • 为 MongoDB 中的对象数组建立索引

    我有一个巨大的电子邮件转储 我正在尝试在 MongoDB 中存储和查询它 有 160 万封电子邮件 每封电子邮件都存储为节点模块 https github com andris9 mailparser它将原始电子邮件解析为漂亮的 Javas
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • 我可以从匿名 PL/SQL 块向 PHP 返回值吗?

    我正在使用 PHP 和 OCI8 执行匿名 Oracle PL SQL 代码块 有没有什么方法可以让我绑定一个变量并在块完成后获取其输出 就像我以类似的方式调用存储过程时一样 SQL declare something varchar2 I
  • Oracle/PHP - ORA-00911 更新时的无效字符

    我正在运行一个 PHP 脚本 该脚本从 Oracle 数据库实例更新表 首先 我收到一个 JSON 对象 lot KLMHA17N9N00 requestor B10078 id FRESHLOT username B26696 passw
  • UUID最大字符长度

    我们使用 UUID 作为 Oracle DB 的主键 并尝试确定 VARCHAR 的适当最大字符长度 显然这是 36 个字符 但我们注意到生成的 UUID 比这个长 长度最多为 60 个字符 有谁知道 UUID 的合适最大字符长度 RFC4
  • 创建 SYS_REFCURSOR 并将其作为输入参数从 Java 传递给 Oracle 过程

    我必须与具有 SYS REFCURSOR 作为输入参数的外部 Oracle 过程进行通信 过程 merge objects varchar2 中的 p table name p id array 中 varchar2 SYS REFCURS
  • 是否允许在流水线 PL/SQL 表函数中使用 SELECT?

    管道函数的文档指出 在 SQL 语句 通常是SELECT 并且在大多数示例中 管道函数用于数据生成或转换 接受客户作为参数 但不发出任何 DML 语句 现在 从技术上讲 可以使用 SELECT 而不会出现 Oracle 中的任何错误 ORA
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • APEX:从临时表下载 BLOB

    我正在尝试使用 Oracle APEX 4 1 1 构建一个简单的查看应用程序 要显示的信息位于与包含 APEX 应用程序访问的架构的数据库不同的数据库上的表中 使用视图 View 访问此远程表 远程表视图 和数据库链接 视图按预期工作 包

随机推荐

  • EF4 可以为我生成 POCO,还是我必须自己编写它们?

    我最近一直在研究 Entity 4 框架 它非常漂亮 我已经设置了一个名为 Customer cs 的类 其中包含一些属性 例如名称 地址等 我还有一个名为 StoreEntities cs 的类 它通过 DbSet 将这些属性绑定回数据库
  • Python排序——对象列表

    如果可能的话 我想使用 somelist sort 方法来执行此操作 我有一个包含对象的列表 所有对象都有一个成员变量 resultType 它是一个整数 我想使用这个数字对列表进行排序 我该怎么做呢 Thanks somelist sor
  • 使用 MVVM 选择 ListView 中的所有项目

    我正在尝试选择所有Items in a ListView 使用 mvvm 使用代码隐藏 我尝试过全选 and foreach选择它们 但我想像项目的其余部分一样使用 MVVM 有任何想法吗 这是列表视图
  • 解析 request.object.existed() 返回 false

    我的解析有问题 我写了云代码 Parse Cloud afterSave Parse User function request var user request object if user existed all the times u
  • “git推送”和“git流放推送”有什么区别?

    我有一个 git 存储库 并且系统指示我执行以下操作序列 将给定的一组文件从文件夹复制到上述 git 存储库 源文件夹 不是存储库的一部分 Execute git add Execute git exile push folder name
  • 如何在反应日期中添加一年的选择?

    向右滑动几个月直到我到达正确的年份是很痛苦的react dates 是否有可能添加一些年份 月份的选择 是的 从版本开始是可能的 电子邮件受保护 cdn cgi l email protection 相关拉取请求 https github
  • gcc include 顺序损坏?

    我遇到了一个奇怪的问题 linux c 编译器包含本地目录而不是系统目录中的文件 使用 H 选项查看预编译器输出 可以看到系统文件 usr include sched h突然包括time h来自本地目录而不是系统一的标头 我假设如果包含文件
  • powershell 无法向 Excel 图表添加多个图例条目(系列)

    我在通过 powershell 将多个系列添加到 Excel 图表对象中的系列集合时遇到问题 这是我的代码 threading thread CurrentThread CurrentCulture en US excel New Obje
  • 带有 BroadcastReceiver 的清单中的 ACTION_USER_PRESENT

    对于是否可以通过清单捕获 ACTION USER PRESENT 屏幕解锁似乎存在不同意见 该线程暗示不 它不能完成 Android 广播接收器不工作 https stackoverflow com questions 6698716 an
  • 使用 Scala 中的原始类型实现 Java 接口

    我正在尝试使用 Scala 构建 Sonar 的扩展 我需要扩展以下 Java 接口 public interface Decorator extends BatchExtension CheckProject void decorate
  • 使用 NSKeyedUnarchiver 解码时出现问题

    我正在 XCode 3 2 3 上编写一个针对 iOS 4 0 的应用程序 当应用程序关闭时 我使用 NSCoder 协议存储一些数据 保存似乎工作正常 问题是从保存的文件中检索数据 我的保存方法如下所示 void saveMusicalW
  • 如何将 TrueType 字体转换为 PCL5 Soft 字体?

    如何将 TrueType 字体转换为 PCL5 softfont spf 主要思想是将软字体嵌入到 PCL5 打印文件中 然后选择它供打印机使用 因为它是通过 PCL5 命令指定的字体 ID 另外 如果您知道在创建 PCL5 文件时使用 T
  • 在 C++11 中使用没有托管共享指针的shared_from_this()

    假设我有一个类 它是enable shared from this 的子类 这个基类的文档说在调用shared from this之前应该有一个拥有这个类的共享指针 用new分配类并调用shared from this来管理对象是否安全 正
  • 解析不同架构维度输入的所有可能类型

    我正在为我们公司的产品编写一个库 它将采用我们的用户已经熟悉的任何类型的架构维度作为从字符串转换为双精度的函数的输入 这是我们希望有效的输入类型列表 Input 意义 Output 英寸以双精度表示 12 5 12 英尺 6 英寸 150
  • C# WPF - 窗口中的黑线

    我的窗户上有一条小黑线 为什么
  • 为什么单态和多态在 JavaScript 中很重要?

    我一直在阅读一些有关更改检测的文章 它们都说单态函数比多态函数快得多 例如 这里有一个引用 这样做的原因是 它必须以动态方式编写 所以 它可以检查每个组件 无论其模型结构如何 喜欢 虚拟机不喜欢这种动态代码 因为它们不能 优化它 它被认为是
  • 从内存映射文件读取时出现问题

    我试图在我的应用程序 特别是 Windows 服务 中实现内存映射文件 然后使用 C 形式从服务写入的 MMF 中读取 不幸的是 我似乎无法获得从 MMF 读取任何内容的表单 更重要的是 该表单似乎从未找到该服务创建的 MMF 下面是概述我
  • 如何在不安装 Visual Studio 2012 的情况下使用 MsBuild 在生成服务器上生成 Visual Studio 2012 发布配置文件

    我阅读了这里的许多帖子 但从未找到有效的明确答案 因此 在花了时间让它发挥作用后 我认为我应该发布它 问题 发布配置文件将在服务器上构建 但不会发布 解决方案 确保您已安装Microsoft Windows SDK 和 Net Framew
  • Django 强制密码过期

    是否有任何 django 应用程序可以在一定的时间间隔 例如 30 天 后强制使用户的密码过期 我正在使用 djangp 的身份验证 并希望扩展它或使用社区应用程序 到目前为止我已经尝试过 在用户配置文件中添加了一个字段 用于存储上次更新密
  • 如何强制oracle使用索引范围扫描?

    我对包含 14 亿条记录 带索引 的表运行了一系列极其相似的查询 唯一的问题是这些查询中至少有 10 的执行时间比其他查询多 100 倍以上 我运行了一个解释计划 并注意到对于快速查询 大约 90 Oracle 使用索引范围扫描 对于慢速的