前几天,同事发来一条SQL,说是更新操作的时候执行的很慢,我看了下,数据量也不是很大。再查看执行计划,发现是执行路径错误导致

前几天,,同事发来一条SQL,说是更新操作的时候执行的很慢,我看了下,数据量也不是很大。再查看执行计划,发现是执行路径错误导致的,可是为什么会走错误的执行路径呢?统计信息并没有太大的问题。在这里模拟下:

数据准备:

--1.数据准备,表一:

DROP TABLE t_test_1;

create table T_TEST_1

(

owner VARCHAR2(30),

object_name VARCHAR2(128),

subobject_name VARCHAR2(30),

object_id NUMBER,

data_object_id NUMBER,

object_type VARCHAR2(19),

created DATE,

last_ddl_time DATE,

timestamp VARCHAR2(19),

status VARCHAR2(7),

temporary VARCHAR2(1),

generated VARCHAR2(1),

secondary VARCHAR2(1)

);

INSERT INTO T_TEST_1

SELECT * FROM dba_objects;

COMMIT;

UPDATE t_test_1 a SET a.object_type = 'TABLE';

COMMIT;

--2.数据准备,表二:

DROP TABLE t_test_2;

create table T_TEST_2

(

owner VARCHAR2(30),

object_name VARCHAR2(128),

subobject_name VARCHAR2(30),

--这里数据类型和T_TEST_1中object_id的数据类型不一致

object_id VARCHAR2(100),

data_object_id NUMBER,

object_type VARCHAR2(19),

created DATE,

last_ddl_time DATE,

timestamp VARCHAR2(19),

status VARCHAR2(7),

temporary VARCHAR2(1),

generated VARCHAR2(1),

secondary VARCHAR2(1),

--这里数据类型和T_TEST_1中object_id的数据类型一致

object_id2 NUMBER

);

INSERT INTO T_TEST_2

SELECT a.*, a.object_id object_id2 FROM dba_objects a;

COMMIT;

SELECT * FROM t_test_1;

CREATE INDEX ind_t_test_2_id1 ON t_test_2(object_id) TABLESPACE TBS_LUBINSU_DATA;

CREATE INDEX ind_t_test_2_id2 ON t_test_2(object_id2) TABLESPACE TBS_LUBINSU_DATA;

T_TEST_2表中的object_id和object_id2两个字段都创建了索引

在这里需要更新表1的对象类型字段object_type:

--更新数据

UPDATE t_test_1 a

SET a.object_type =

(SELECT i.object_type FROM t_test_2 i WHERE i.object_id = a.object_id);

UPDATE t_test_1 a

SET a.object_type =

(SELECT i.object_type FROM t_test_2 i WHERE i.object_id2 = a.object_id);

第一条SQL中T_TEST_2的object_id和T_TEST_1中的object_id数据类型是不一致的,而第二条中两个字段数据类型是一致的。

我们来看下执行计划:

SQL> EXPLAIN PLAN FOR

2 UPDATE t_test_1 a

3 SET a.object_type =

4 (SELECT i.object_type FROM t_test_2 i WHERE i.object_id = a.object_id);

Explained

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 2933162137

-------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

-------------------------------------------------------------------------------

| 0 | UPDATE STATEMENT | | 64296 | 1506K| 137 (3)| 00:00:02 |

| 1 | UPDATE | T_TEST_1 | | | | |

| 2 | TABLE ACCESS FULL| T_TEST_1 | 64296 | 1506K| 137 (3)| 00:00:02 |

|* 3 | TABLE ACCESS FULL| T_TEST_2 | 603 | 37989 | 150 (3)| 00:00:02 |

-------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

3 - filter(TO_NUMBER("I"."OBJECT_ID")=:B1)

Note

-----

- dynamic sampling used for this statement

19 rows selected

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

MySQL数据类型不一致_数据类型不一致导致的SQL不走索引相关推荐

  1. jira mysql 启动 失败_重启机器导致mysql启动失败

    一.问题 二.常见解决方案 网上的解决方法大致为 ①空间不足(df -h 查看) ②权限不足(/var/lib文件夹)chown -R mysql:mysql /vdb1/lib/ ③修改my.cnf ...

  2. mysql 2006测试_狂神说MySQL06:事务和索引

    狂神说MySQL系列连载课程,通俗易懂,基于MySQL5.7.19版本,欢迎各位狂粉转发关注学习.禁止随意转载,转载记住贴出B站视频链接及公众号链接! 上课视频同步文档 事务和索引 事务 什么是事务 ...

  3. iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

    IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(Logical EXPression, Numeric Expression1, Numeric Expression2) 如 ...

  4. 如何用js语句给mysql添加内容_在js里写SQL的方法

    在日新月异的前端领域中,前端工程师能做的事情越来越多,自从nodejs出现后,前端越来越有革了传统后端命的趋势,本文就再补一刀,详细解读如何在js代码中执行标准的SQL语句 为什么要在js里写SQL? ...

  5. linux下导入mysql表乱码_在linux下导入.sql文件,数据库中文乱码

    现象描述 我是在aix下面导入如下SQL语句时,数据库中显示乱码. insert into CONFERENCE(CONFERENCEID,SUBCONFERENCEID,ACCESSNUMBER,A ...

  6. 删除mysql 执行计划_如何清除某条SQL的执行计划

    如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(除非alter system flush shared_pool) ...

  7. mysql query语句_使用mysql_query()函数执行SQL语句

    mysql_query()函数 PHP MySQL 函数库中,mysql_query() 函数用于向 MySQL 发送并执行 SQL 语句. 对于没有数据返回结果集的 SQL ,如 UPDATE.DE ...

  8. sql文件导入mysql数据库出错_如何解决navicat导入sql文件出错的问题

    如何解决navicat导入sql文件出错的问题 发布时间:2020-11-11 17:05:39 来源:亿速云 阅读:120 作者:小新 这篇文章主要介绍了如何解决navicat导入sql文件出错的问 ...

  9. 对于LIMITE,Mysql优化器导致的有时候不走索引而是走全表查询

    使用Mysql官方数据库sakila作示例 首先查看actor表内索引 有一个主键索引(聚簇索引)和一个last_name字段的二级索引          这里我是想走聚簇索引找出第一条id,当然这里 ...

最新文章

  1. ubuntu-14.04 系统安装mysql-5.6.21
  2. 面试 -- 多线程( 一) -- 基础
  3. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构...
  4. 每天一个linux命令(56):netstat命令
  5. 交互设计精髓_设计空间的精髓
  6. mustache 模板使用
  7. bootstrap学习笔记(5)
  8. redis怎么不让存byte_Redis 删除数据后不能自动释放内存么?
  9. Applet类的方法
  10. 统计学习方法读书笔记14-逻辑斯蒂回归代码实现与最大熵代码实现
  11. 如何使用camtasia制作网页视频调查问卷
  12. 计算机毕业设计之java+javaweb的房屋出租系统
  13. PN结的形成及其单向导电性
  14. linux上进行base64编码解码
  15. Cypress 增加自定义header访问
  16. Picgo 水印制作教程
  17. python爬取豆瓣电影排行榜函数_摆脱剧荒:教你用Python爬取豆瓣电影最新榜单
  18. 中文分词词库汇总(一)
  19. JavaScript动画案例——筋斗云,手风琴,固定导航栏
  20. 华擎主板bios设置图解_华擎主板bios设置_华擎主板bios设置图解_asrock主板bios设置...

热门文章

  1. CSDN博客添加微信公众号图片
  2. PowerBI最全可视化视图打包和DEMO汇总
  3. c oracle 多条语句,Oracle 实践:如何编写一条 sql 语句获取数据表的全部索引信息(兼容 Oracle 19c、Oracle 11g)...
  4. python使用scrapy_Python实现从脚本里运行scrapy的方法
  5. 北京市通信管理局对3·15晚会曝光的北京企业作出行政处罚
  6. 长远锂科:拟发行可转债募资不超32.5亿元
  7. 苹果ios15.4RC版发布:新增口罩面容解锁功能
  8. realme GT Neo3重磅细节曝光:首发150W快充 5分钟充50%
  9. 押中三位奥运冠军 元气森林“赢麻了”
  10. 万达辟谣王健林去世:已报警!造谣账号已封禁