为什么 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 会忽略“完美”索引? 的相关文章

  • 如何通过ODBC检索Oracle数据库函数的结果?

    我在通过 ODBC 调用 Oracle 存储函数 而不是过程 时遇到问题 我的函数非常简单 它只是连接两个字符串 我可以通过以下方式调用它 rs c execute SELECT add str yogi bubu FROM dual fo
  • 从 all_tab_columns 中选择,其中表有 > 0 行

    我需要在大型数据库中搜索与列名匹配的表 但该表必须有超过 0 行 顺便说一句 这是查询 SELECT FROM all tab columns WHERE column name LIKE ID SUPPORT 您可以使用单个查询来过滤名称
  • 如何查看授予其他用户的架构哪些权限

    考虑这种情况 在数据库中 我有两个用户 A 和 B 及其相应的架构 我想知道 如何获取信息 架构 B 中的用户 A 有哪些权限 考虑这种情况 我们有两个用户及其关联的场景 我们有用户A和用户B 在A中 假设我们有TB1 TB2 在B中 假设
  • WHERE IN 条件不接受字符串值

    我正在动态构造一个带有名称的字符串用户数据在 PL Sql 过程中通过附加用户名 单引号 和逗号 的形式 abc123 xyz456 pqr789 但是当我将此字符串传递给 SELECT 语句的 WHERE IN 条件时 SELECT FR
  • 使用 createNativeQuery 调用 Oracle 存储过程

    我需要使用 JPA 调用存储过程并找到这篇文章 http www oracle com technology pub articles vasiliev jpql html http www oracle com technology pu
  • 在 jdbc 程序中使用时,通过 SQL 客户端插入表中的记录未显示

    我使用 SQL 客户端和 JDBC 程序将几行插入到我的表 EMP 中 使用 SQL 客户端插入的记录不会显示在 Java 的输出控制台中 我正在使用 Java 8 和 oracle 11g 数据库来插入和读取数据库 除了通过 SQL 客户
  • 如何查找elasticsearch 6.2.1中存在的索引?

    我试图检查elasticsearch 6 2 1的RestHighLevelClient中是否存在索引 目前我正在使用以下代码 try OpenIndexRequest openIndexRequest new OpenIndexReque
  • 递归 SQL 给出 ORA-01790

    使用 Oracle 11g 第 2 版 以下查询给出 ORA 01790 表达式必须与相应表达式具有相同的数据类型 with intervals time interval AS select trunc systimestamp from
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • Oracle - 使用 DBMS_MVIEW.REFRESH 刷新“REFRESH FORCE ON DEMAND”视图时会发生什么

    我有以下物化视图 CREATE MATERIALIZED VIEW TESTRESULT ON PREBUILT TABLE WITH REDUCED PRECISION REFRESH FORCE ON DEMAND WITH PRIMA
  • Pivotal Cloud Foundry - 连接到外部 Oracle 数据库

    我正在创建一个 Spring boot 应用程序 该应用程序连接到一个不由 PCF 管理 或驻留在外部 的 Oracle 数据库 在我的本地开发环境中 我在 application properties 文件中配置了数据库连接详细信息 有人
  • 对 PLSQL 中的每个表执行

    我想要所有表中匹配特定名称条件的记录数 这是我构建的 SQL Declare SQLStatement VARCHAR 8000 BEGIN SELECT SELECT COUNT FROM Table Name INTO SQLState
  • SQL 国家字符 (NCHAR) 数据类型的真正用途是什么?

    也CHAR CHARACTER and VARCHAR CHARACTER VARYING SQL 提供了NCHAR NATIONAL CHARACTER and NVARCHAR NATIONAL CHARACTER VARYING 类型
  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 如何获取 Oracle 上 SYSDATE 的 UTC 值

    可能是一个经典 您知道在 Oracle 上检索 SYSDATE 的 UTC 值的简单技巧吗 最好也能在第 8 版上工作 现在我有自定义函数 Cheers Stefan 您可以使用 SELECT SYS EXTRACT UTC TIMESTA
  • Windows 上良好的 Oracle 数据库开发和管理工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找像 sql server management studio 这样的 Oracle 数据库管理工具 我在互联网上搜索并在以下链接
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我

随机推荐

  • 如何使用带有基本身份验证的 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 和这个