您好,欢迎访问一九零五行业门户网

数据类型不一致导致的SQL不走索引

前几天,同事发来一条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
其它类似信息

推荐信息