为什么 Oracle 会忽略“完美”索引?

2023-12-27

我有这张表:

create table demo (
    key number(10) not null,
    type varchar2(3) not null,
    state varchar2(16) not null,
    ... lots more columns ...
)

和这个索引:

create index demo_x04 on demo(key, type, state);

当我运行这个查询时

select * from demo where key = 1 and type = '003' and state = 'NEW'

EXPLAIN PLAN显示它进行了全表扫描。所以我删除了索引并重新创建了它。EXPLAIN PLAN还是说全表扫描。怎么可能?

一些背景:这是历史数据,所以发生的情况是我查找带有状态的行CLEARED并插入一个带有状态的新行NEW(另外,我从旧行复制了一些值)。然后旧行更新为USED。所以桌子总是在增长。我注意到索引的基数是 0(尽管我有数千个不同的值)。重新创建后,基数增加了,但 CBO 不再喜欢该索引。

第二天早上,Oracle 突然喜欢上了这个索引(可能是睡过头了)并开始使用它,但时间不长。一段时间后,处理速度从 50 行/秒下降到 3 行/秒,我再次看到“全表扫描”。到底是怎么回事?

就我而言,我需要处理大约一百万行。我批量提交更改。 50. 在提交更新/重组索引或类似的命令后,我是否应该运行一些命令?

我使用的是 Oracle 10g。

[编辑] 我在这个表中有 969'491 个不同的键,3 种类型和 3 种状态。


如果指定索引提示会发生什么?尝试这个:

SELECT /*+ INDEX (demo demo_x04) */ * 
  FROM demo 
 WHERE key = 1 
   AND type = '003' 
   AND state = 'NEW';

听起来好像一夜之间发生的事情就是对表格进行了分析。然后,当您对表运行处理时,足够的索引被更新,导致 Oracle 表的统计信息再次过时,优化器停止使用索引。

添加提示并查看 EXPLAIN PLAN 是否为您提供不同的计划并且查询性能更好。

哦,托尼关于分析表的回答是一个普遍的好习惯,尽管 10g 的数据库在这方面进行自我维护非常好。如果您的进程正在进行大量更新,索引可能很快就会过时。如果当你的进程开始陷入困境时运行分析可以暂时改善情况,那么你就会知道这就是问题所在。

要更新表的统计信息,请使用dbms_stats.gather_table_stats http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461包裹。

例如:

exec dbms_stats.gather_table_stats('所有者','DEMO');

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Oracle 会忽略“完美”索引? 的相关文章

  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 是否可以将 pd.Series 分配给无序 pd.DataFrame 中的列而不映射到索引(即不重新排序值)?

    在 Pandas 中创建或分配新列时 我发现了一些意外的行为 当我对 pd DataFrame 进行过滤或排序 从而混合索引 然后从 pd Series 创建新列时 Pandas 会重新排序该系列以映射到 DataFrame 索引 例如 d
  • 将十六进制转换为字符串

    我想用HEXTORAW 从 ASCII 十六进制代码 30 获取 char 值 ASCII HEX 30 应返回 varchar 0 该怎么做呢 是HEXTORAW 正确的功能 你可以使用utl raw http docs oracle c
  • PostgreSQL 如何对字段上的 b 树索引执行 ORDER BY?

    我有一张桌子bsort CREATE TABLE bsort a int data text Here data可能不完整 换句话说 某些元组可能没有data value 然后我在表上建立一个 B 树索引 CREATE INDEX ON b
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • Power BI 中的区分大小写

    我想知道是否可以在 Power BI 中配置区分大小写 我在 Oracle 数据库中有数据 其中主键EXample不同于exampLE 但如果我想将其导入到Power BI中 就不行了 任何想法 目前 我认为最好的选择是在查询编辑器阶段为主
  • 获取 pandas 数据框中每列的前 k 个元素的索引的快速方法

    我有一个非常大的 pandas 数据框 大约有 500 000 列 每列大约有 500 个元素长 对于每一列 我需要检索该列中前 k 个元素的 索引 列 位置 所以 如果 k 等于 2 这是我的数据框 A B C D w 4 8 10 2
  • CREATE TABLE 和 CREATE ANY TABLE 权限之间的区别

    我不明白这两种特权之间的区别 我找到了这两个解释 但这对我没有帮助 CREATE TABLE gt Enables a user to create a table owned by that user CREATE ANY TABLE g
  • 什么是 Oracle 数据集成器?

    什么是ODI ODI的实际用途是什么 oracle data integrator工具如何帮助编程 sql Developer 工具和 ODI 工具实际上有什么区别 真的厌倦了在某些网站上找到的定义 如果有人能提出 gud 解释 那就太好了
  • 获取列表中倒数第二个元素[重复]

    这个问题在这里已经有答案了 我可以通过以下方式获取列表的倒数第二个元素 gt gt gt lst a b c d e f gt gt gt print lst len lst 2 e 有没有比使用更好的方法print lst len lst
  • APEX:从临时表下载 BLOB

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

    Select sg gameno Max sg Year sg end sg hostcity country olympic name from Summergames s Country co where s country isoco
  • MySQL:为什么 IN 子句中的第 5 个 ID 会极大地改变查询计划?

    给出以下两个查询 Query 1 SELECT log id FROM log WHERE user id IN 188858 188886 189854 203623 204072 and type in 14 15 17 ORDER B
  • 何时对 MongoDB 集合调用 EnsureIndex?

    我什么时候应该打电话ensureIndex 插入单条记录之前 插入单条记录之后 或者调用之前find 看来我的评论有点被误解了 所以我会澄清一下 当你调用它时并不重要只要在第一次调用 find 之前的某个时刻调用它即可 换句话说 什么时候创
  • SQL Server 为什么索引不与 OR 一起使用

    我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能 但我错过了一些东西 我有下表 Person Id Name Email Phone 1 John E1 P1 2 Max E2 P2 我正在尝试找到对列进行索引的最佳方法
  • JDBC元数据检索约束信息

    我需要来自约束名称的有关表和列名称的信息 是否存在类似于connection getMetadata getX的人来检索约束信息 我的测试用例在Oracle数据库中 但我最好的解决方案只是想用jdbc来解决 如果您正在谈论外键和主键约束 这
  • SELECT * FROM 员工 WHERE NULL IS NULL; SELECT * FROM 员工 WHERE NULL = NULL;

    最近开始学习oracle和sql 在学习的过程中 我遇到了我的朋友在面试时被问到的几个问题 SELECT FROM Employees WHERE NULL IS NULL 此查询生成Employees 表中的所有行 至于我所理解的Orac
  • 我可以在 WebGL 的 GLSL 中使用什么作为数组索引?

    是否只允许使用常量 或者我可以将其用于循环索引或任何其他动态值 In WebGL GLES2 是的 只允许使用常量 但是 如果您的代码可以展开 无论是由您自己还是由编译器 那么它就被视为一个常量 并且您有一个解决方法 例如 问题 unifo
  • 关于pl/sql异常的问题

    以下文字摘录自oracle文档Oracle Database PL SQL 语言参考 11g 第 1 版 11 1 未处理的异常也会影响 子程序 如果退出子程序 成功后 PL SQL 将值分配给 输出参数 但是 如果您退出 带有未处理的异常
  • 如何在oracle日志中打印http请求

    我们正在使用以下方式调用外部 URLUTL HTTP方法并设置 HTTP 标头 例如basic authentication keep alive content soap action所以我需要打印我设置为标题的内容 DBMS OUTPU

随机推荐

  • 如何使用带有基本身份验证的 JQuery 进行 JSONP 调用?

    使用 JQuery 我如何调用需要基本身份验证的 JSONP API 我可以通过编程方式处理这个问题 还是用户必须进行交互并在登录对话框中输入用户名和密码 JSONP 请求不使用 XMLHttpRequest 对象 系统 因此没有办法直接做
  • 当只有一个单元格时,单元格位于集合视图的中心

    我想从左到右布局单元格 所以我使用UICollectionViewFlowLayout UICollectionViewFlowLayout layout UICollectionViewFlowLayout alloc init use
  • Elasticsearch - preIndex

    我正在执行提到的维护任务 该任务将拦截 ES 索引操作 并在某些情况下更改字段的内容 我的问题是 我如何操作这些文档 有一个index docs 方法 例如 我获取第一个 也是唯一一个 文档 添加一个字段 然后希望它被持久化 但不幸的是 该
  • 如何使用相当于 C# .NET 中的 #region / #endregion (outlined) 来组织 xml 数据

    我想使用预处理器命令将 XML 数据组织为可折叠和可扩展的 例如 region endregion http msdn microsoft com en us library 9a1ybwek 28VS 71 29 aspxC NET 中的
  • 使用 PHP 通过 email() 发送的电子邮件中的文本方向和对齐方式

    我正在通过 php 自动发送电子邮件 该电子邮件包含希伯来语 方向为从右到左 这是我用于组成消息正文部分的代码 emailMessage table table
  • 在 WHERE 子句中重用计算列

    在 SELECT 语句中 我想在 WHERE 子句中重用计算列 在SQLserver中有什么办法可以做到这一点吗 简化示例 工作 但经过重复计算 SELECT field1 concat field2 field3 AS calc fiel
  • 使用 maven Fabric8 插件将多个 docker 镜像保存到一个 tar.gz 文件中

    我们正在使用io fabric8 docker maven plugin 0 27 2构建 docker 镜像 我的 Maven 项目由 3 个模块组成 module1 module2 and module3 每个模块都会根据每个模块中存在
  • SpriteKit - 制作精灵抵抗重力(如气球)

    有谁知道我怎样才能让我的SKSpriteNode反抗重力 我想过反转默认重力 但意识到我也需要东西掉落 看起来应该很简单 但通读文档后我不知道该怎么做 Thanks Update 在 iOS 8 OS X Yosemite 10 10 中
  • 按下按钮时颤动更改文本

    伙计们 我会尝试在单击时更改按钮上的文本 我的代码 bool pressGeoON false bool cmbscritta false RaisedButton shape new RoundedRectangleBorder bord
  • 通过命令行的 Eclipse 和 Maven

    我可以通过跳过包含文件夹的原型选择 在 Eclipse IDE 版本 3 71 中创建一个简单的 Maven 应用程序 Edit 2以及其他文件夹 src main resources src test resources 如果我使用命令行
  • 是否可以在 Postgres 的 CTE 语句中多次二次使用返回值?

    我想在一个 CTE 中插入主表后 将外键插入到多个表中 我找不到解决方案 所以这很可能是不可能的 看这个例子 CREATE TABLE test main main id serial NOT NULL main name characte
  • C++11 中的通用函数指针

    我目前正在用 C x0 编写一个方法执行队列 我已经实现并验证了基本的队列机制 但想用一个选项来修改它push 自动删除所有先前对特定方法的调用 queue push this Obj foo 1 queue push this Obj f
  • 在 CSS 中使用颜色名称代替颜色代码有什么缺点吗?

    例如写作red比更有效 cc0000 它的字符较少 占用空间较小 并且更容易记住 使用有什么缺点吗颜色名称 http www somacon com p142 php超过十六进制代码或 RGB 值 这包括在多开发人员环境中进行编程 不同的浏
  • 将 CLRegion 转换为 MKMapRect 或类似的

    我想将 CLRegion 中心和半径 转换为两点 左上 右下 坐标集 我看过这个答案 但不合适 将 MKCoordinateRegion 转换为 MKMapRect https stackoverflow com questions 927
  • 连接点和计算区域

    这是我的第一篇文章 所以请友善 我有一个具有 3 10 个坐标的矩阵 我想连接这些点成为最大尺寸的多边形 我尝试 fill 1 生成一个图 但如何计算该图的面积 有没有办法将绘图转换回矩阵 你会推荐我什么 先感谢您 1 x1 0 0 0 5
  • Android Studio 4.2 布局渲染错误

    布局预览最近停止工作 我无法修复它 当问题出现时我最近改变的事情是 从 4 1 更新到 4 2 根据此处的说明更改了一些目录位置 https developer android com studio intro studio config
  • 在 Visual Studio 2012 .SDF 文件中,未替换(提交)我对原始文件的更改

    我在插入 SQL CE 数据库时遇到问题 我写了一些代码 然后当我需要数据库时 我右键单击投影 添加新项目 本地数据库 之后它让我选择一个数据模型 我选择了 数据集 这已在我左侧的服务器资源管理器下为我创建了一个数据库 并且在我右侧的解决方
  • 删除对象数组中的重复项 Javascript

    我有一个对象数组 list x 1 y 2 x 3 y 4 x 5 y 6 x 1 y 2 我正在寻找一种有效的方法 如果可能的话 O log n 删除重复项并最终得到 list x 1 y 2 x 3 y 4 x 5 y 6 我试过了 u
  • 在java中填充数字直到字符串长度为8个字符?

    我正在阅读 但找不到完整的片段 我正在寻找一个函数 它接受一个字符串并在左侧填充零 0 直到整个字符串的长度为 8 位 我找到的所有其他片段只让整数控制要填充的数量 而不是让整数控制填充的数量 直到整个字符串的长度为 x 位 在Java中
  • 为什么 Oracle 会忽略“完美”索引?

    我有这张表 create table demo key number 10 not null type varchar2 3 not null state varchar2 16 not null lots more columns 和这个