• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Oracle约束Constraint对于CBO优化器的作用

mysql 搞代码 4年前 (2022-01-09) 29次浏览 已收录 0个评论

进入CBO优化器时代之后,成本计算值决定执行计划的选取已经成为主流。一条性能良好的执行计划建立在尽可能ldquo;贴切rdquo;的统

进入CBO优化器时代之后,成本计算值决定执行计划的选取已经成为主流。一条性能良好的执行计划建立在尽可能“贴切”的统计量基础上。CBO内部又经历了两个时代——IO Cost和CPU Cost,两者的区别就在于系统统计量(System Statistical)的应用。

RBO时代,执行计划其实也是有评估的。RBO的执行计划评定级别不会像CBO成本粒度那么细,而是15个路径等级评定。等级编号低的执行计划比等级编号高的执行计划更会被选择到。

在这个过程中,我们其实还是忽略了影响执行计划的因素,就是约束(Constraint)。Constraint对于数据库对象很重要,所谓约束,就是建立在数据表、数据列上的规则限制。Constraint的存在目的就是将业务规则融入到数据表设计中。

Constraint确定描述了数据表的一些固有特性,比如非空、外键,就从一个程度上给出了数据表特性的描述。经常性的将Constraint作为一种数据完整性约束的实现,但是对于CBO而言,约束也是搜寻“捷径”执行计划的重要信息来源。从经验上看,约束能够给CBO带来的高效执行计划作用,是不可忽视的。

本篇介绍几个常见的业务场景,说明在合理规划约束的情况下,CBO能够生成更好地执行计划。

————————————–分割线 ————————————–

相关阅读:

Oracle完整性约束

Oracle的约束和索引

从Oracle的约束到索引

Oracle常用数据类型和完整性约束

ORA-02291: 违反完整约束条件 …… – 未找到父项关键字

————————————–分割线 ————————————–

1、执行环境介绍

我们同时要使用CBO和RBO进行测试过程,选择Oracle 11g进行测试。

SQL> select * from v$version;

BANNER

———————————

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – Production

PL/SQL Release 11本文来源gao@dai!ma.com搞$代^码!网7.2.0.3.0 – Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 – Production

NLSRTL Version 11.2.0.3.0 – Production

当前默认使用CBO优化器组件。

SQL> show parameter optimizer

NAME TYPE VALUE

———————————— ———– ——————————

optimizer_mode string ALL_ROWS

optimizer_use_sql_plan_baselines boolean TRUE

(篇幅原因,有省略……)

2、“null还是not null”大不一样

我们在实际设计数据库中,经常会忽略字段非空设置。不少朋友和开发团队对于这个细节不以为然,认为这个设置就是会影响到插入过程。一些朋友认为:在应用层面验证一下就可以了。但是实际上,,null与not null,大不一样!有很多方面的差异和问题,纯应用层面验证是不能解决问题的。

笔者从性能优化器角度,介绍一下忽视not null效果的问题。我们首先创建实验数据表T。

–数据表T

SQL> create table t as select * from dba_objects;

Table created

–其他用途索引

SQL> create index idx_t_id on t(object_id);

Index created

–统计量收集

SQL> exec dbms_stats.gather_table_stats(user,’T’,cascade => true);

PL/SQL procedure successfully completed

还是我们经常设置的场景,就是没有where条件的count动作。

SQL> explain plan for select count(*) from t;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

—————————————————–

Plan hash value: 2966233522

————————————————-

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

————————————————-

| 0 | SELECT STATEMENT | | 1 | 294 (1)| 00:00:04 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | TABLE ACCESS FULL| T | 75609 | 294 (1)| 00:00:04 |

———————————————-

9 rows selected

很正常的执行计划,因为需要检索所有的数据行记录,检索数据表所有的记录是比较直观的想法。这个FTS执行计划成本值294。我们修改一下索引列object_id的属性,将其从原先的null设置为not null。

SQL> alter table t modify object_id not null;

Table altered

SQL> explain plan for select count(*) from t;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

——————————————————————————–

Plan hash value: 3570898368

————————————————————————–

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

————————————————————————–

| 0 | SELECT STATEMENT | | 1 | 48 (3)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | | |

| 2 | INDEX FAST FULL SCAN| IDX_T_ID | 75609 | 48 (3)| 00:00:01 |

————————————————————————–

9 rows selected


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Oracle约束Constraint对于CBO优化器的作用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址