学习
实践
活动
专区
工具
TVP
写文章
专栏首页bisal的个人杂货铺续《表扫描与索引扫描返回的行数不一致》

续《表扫描与索引扫描返回的行数不一致》

续《表扫描与索引扫描返回的行数不一致

上篇文章主要介绍了如何从分析表得到的报错,以及trace中的信息,判断表返回的记录与索引返回记录不一致时的处理方式。下面这篇文章则介绍了针对ORA-1499进行问题排查的一些基本方法。

OERR: ORA-1499 table/Index Cross Reference Failure - see trace file (文档 ID 1499.1)

Error: ORA 1499 Text: table/Index Cross Reference Failure - see trace file ------------------------------------------------------------------------------- Cause:  An error occurred when validating an index or a table using the         ANALYZE command.         One or more entries does not point to the appropriate cross-reference. Action: Check the trace file for more descriptive messages about the problem.         Correct these errors.

ORA-1499的错误是通过“"ANALIZE TABLE|CLUSTER <name> VALIDATE STRUCTURE CASCADE”分析得出的,它的含义是表或聚类和索引之间存在不一致性,具体来讲是索引键值未出现在索引中,或者相反。

trace文件中包含:

<description>: tsn: <tablespace number> rdba: <relative dba>

description有以下值:

"row not found in index"  "Table/Index row count mismatch" "row mismatch in index dba" "Table row count/Bitmap index bit count mismatch" "kdavls: kdcchk returns %d when checking cluster dba 0x%08lx objn %d\n"

tsn:    Tablespace Number表示的是索引存储的表空间编号。

rdba: 是索引段头相对于数据块的存储地址。

SQL> analyze table DEPT validate structure cascade; analyze table case7 validate structure cascade * ERROR at line 1: ORA-01499: table/index cross reference failure - see trace file

trace文件的实例:

row not found in index tsn: 5 rdba: 0x02c00061

哪些索引受影响?

包含ORA-1499的trace文件提供了与索引相关的段头rdba。查询dba_segments来明确索引:

SELECT owner, segment_name, segment_type, partition_name

FROM   DBA_SEGMENTS WHERE  header_file = (SELECT file#                                           FROM   v$datafile                                           WHERE  rfile# = dbms_utility.data_block_address_file(to_number('&rdba','XXXXXXXX'))                                           AND  ts#= &tsn)                  AND header_block = dbms_utility.data_block_address_block(to_number('&rdba','XXXXXXXX'));

&rdba值应该是删除’0x‘的十六进制的rdba,tsn是表空间编号。

例如:

SELECT owner, segment_name, segment_type, partition_name FROM DBA_SEGMENTS WHERE header_file = (SELECT file#                                          FROM   v$datafile                                      WHERE  rfile# = dbms_utility.data_block_address_file(to_number('02c00061','XXXXXXXX'))                                         AND  ts#= 5)                 AND header_block = dbms_utility.data_block_address_block(to_number('02c00061','XXXXXXXX'));

明确受影响的键值

如果需要明确所有受影响的键,需要运行一次全表扫描和索引扫描:

在表中但未在索引的行:

SELECT /*+ FULL(t1) */ rowid, <indexed column list> FROM   <Table name> t1 MINUS SELECT /*+ index(t <Index name>) */ rowid, <indexed column list> FROM   <Table name> t;

在索引中但未在表中的行:

SELECT /*+ index(t <Index name>) */ rowid, <indexed column list>

FROM   <Table name> t MINUS SELECT /*+ FULL(t1) */ rowid, <indexed column list> FROM  <Table name> t1;

实例:

表名 = DEPT,索引名 = I_DEPT1,在索引I_DEPT1中的索引列:DEPTNO,DNAME. SELECT /*+ FULL(t1) */ rowid, deptno, dname FROM   dept t1 MINUS SELECT /*+ index(t I_DEPT1) */ rowid, deptno, dname FROM   dept t;

确保查询语句的执行计划使用受影响的索引,例如I_DEPT1会展示在执行计划中。查询未使用索引的原因之一是因为索引列定义为允许NULL值。如果是这样,可以添加一个where子句,例如:where deptno is not null。 导致这种问题的根本原因就是表和索引之间的不一致,可能是由于Oracle的defect产生,或者Oracle外部问题,例如IO丢失。硬件或OS子系统问题可能导致IO丢失写入。如果出现IO丢失,包含表或索引的块修改操作就可能不会写入Oracle的数据文件中,引起键缺失。解决方法可以参考上一篇文章《表扫描与索引扫描返回的行数不一致》。当出现表和索引之间不一致的情况,即表中的行不在索引中,删除并重建索引是常用的一种合适方法。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://blog.csdn.net/bisal复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 表扫描与索引扫描返回的行数不一致

    某个应用最近总出现死锁,其中一些是因为报了索引和数据行存在不匹配的问题,MOS中有如下文档可以参考。 ORA-1499. Table/Index ro...

    bisal
  • 多对多业务,数据库水平切分架构一次搞定

    本文将以“好友中心”为例,介绍“多对多”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践。 一、什么是多对多关系 所谓的“多对多”...

    架构师之路
  • MySQL查询优化-基于EXPLAIN

    含有子查询的时候,表明各语句执行的先后顺序,如果数字相同,则按照先后顺序执行,如果为 null,则代表是结果集,不需要查询。

    用户2987604
  • 为什么我使用了索引,查询还是慢?

    经常有朋友问到:我的一个SQL语句使用了索引,为什么还是会进入到慢查询之中呢?今天我们就从这个问题开始来聊一聊索引和慢查询。

    java进阶架构师
  • 百亿关系链,架构如何设计?

    粉丝与关注,社交好友,都是典型的“多对多关系”的业务,这类业务的核心服务是好友中心,当关系链达到百亿之后,好友中心架构设计要考虑哪些因素,是本文将要分享的内容。

    架构师之路
  • 举一反三-分区裁剪作用的“新”发现

    作者介绍 ? 赵勇 云和恩墨北区技术工程师 专注于SQL审核和优化相关工作。曾经服务的客户涉及金融保险、电信运营商、政府、生产制造等行业。 分区裁剪的定义 分区...

    数据和云
  • 什么是MySQL的执行计划(Explain关键字)?

    本文作者王良辰,京东中台架构师,擅长分布式系统及高可用、高并发系统架构与设计。曾经为企业开发过多个通用脚手架,推崇以技术手段提升开发效率、约束开发行为。

    小灰
  • SQL 优化必懂知识点

    单个列唯一键(distict_keys)的数量叫做基数。比如性别列,该列只有男女之分,抛开中性,所以这一列基数就是主键列的基数等于表的总行数。基数的高低影响列的...

    田维常
  • mysql查询性能优化

    WindWant
  • 高效sql性能优化极简教程

    一,sql性能优化基础方法论 对于功能,我们可能知道必须改进什么;但对于性能问题,有时我们可能无从下手。其实,任何计算机应用系统最终队可以归结为: cpu消耗 ...

    架构师小秘圈
  • PostgreSQL统计信息的几个重要视图

    比如tup_returned值明显大于tup_fetched,历史SQL语句很多是全表扫描,存在没有使用索引的SQL,可结合pg_stat_statments查...

    yzsDBA
  • 面试官:count(*) 怎么优化?

    哈喽,我是狗哥。小伙伴都知道我最近换工作了,薪资、工作内容什么的都是我比较满意的。五月底也面试了有 6、7 家公司,应该拿了有 5 个 offer。这段时间也被...

    JavaFish
  • MySQL优化看这篇就对了

    我们在面试的时候经常被问到你如何对数据库优化?动不动就分库分表,但是实际上有几个有分库分表的经验呢?下面我们将介绍优化数据库的各个阶段。

    丁D
  • 索引与慢sql剖析

    `user_id` int(9) NOT NULL AUTO_INCREMENT,

    虞大大
  • 工作中遇到的99%SQL优化,这里都能给你解决方案(三)

    表示从表employees 中取出从10000行开始的5行记录。看似只查询5条记录,实际这条SQL是先读取10005条记录,然后抛弃前10000条记录,然后读...

    程序员小强
  • Oracle执行计划详解

    简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 ...

    java达人
  • Oracle执行计划详解

    简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 ...

    java达人
  • MySQL史上最全性能优化方式

    MySQL有哪些性能优化方式?这个问题可以涉及到 MySQL 的很多核心知识,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看...

    数据和云
  • MySQL 慢查询、 索引、 事务隔离级别

    MySQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,阈值指的是运行时间超过 long_query_t...

    chenchenchen

扫码关注腾讯云开发者

领取腾讯云代金券