数据库开发常识(10.6)——考量使用多视图连接、循环删除、绑定变量、连接表数及触发器(2)

10.6. 数据库开发常识

10.6.3. 慎用多视图连接

涉及多个对象连接的SQL语句,尽量不要用视图,严禁视图嵌套视图,尤其是有大数据量表参与其中的场景,具体场景如下所示。

create view v1 as select ...where;

create view v2 as select ... from tab2,tab3,v1 where ...;

select ... from tab1,v1,v2 where ...;

--注:

1)为什么要"慎用多视图连接"?为什么"严禁视图嵌套视图"?又为什么"尤其是有大数据量表参与其中的场景"?

10.6.4. 慎用循环Delete

Delete语句,尽量不要出现在loop内,除非相关表数据量巨大(大于500w,当然这不是绝对的)。否则,最好通过一次delete完成,不要在loop结构内循环多次完成。对于数据量巨大表的delete操作,也可以考虑将表分区,再通过对分区的drop或truncate完成相关数据的清除。2014年,本人就曾在给某行业机构的系统做性能分析和诊断时发现了类似的模块,当时该模块消耗了大量的系统资源,并且,该模块已导致相关系统出现了严重的性能问题。具体场景如下所示。

while ... loop

delete from tab1

where col1=...

...

and rownum<=500;

end loop;

--注:

1)大家思考下,在什么场景下,这种循环delete方式最容易导致严重的性能问题?而又在什么场景下,其不会导致严重的性能问题?

10.6.5. 考量绑定变量的应用

Oracle 10g及以下的版本,绑定变量的使用要注意,尤其是在数据分布倾斜严重的列上使用绑定变量时,需要谨慎的权衡绑定变量带来的利益和可能发生的诸多问题。绑定变量的SQL语句具体如下所示。

select * from tab_sales

where pro_no=:v_bind;

--注:

1)大家思考下,"在数据分布倾斜严重的列上使用绑定变量时",为什么Oracle 10g及以下版本上会出现性能问题?Oracle 11g不会出现问题吗?

10.6.6. 减少参与连接的表数

尽量减少参与连接的表数目。因为默认情况下,参与连接的表越多,执行计划跑偏的几率就越大,这在有大数据量表参与时,可能会导致严重的性能问题。较多表参与连接的SQL语句具体如下所示。

select ...from tab_1,tab_2,tab_3,...,tab10

where ...;

--注:

1)为什么参与连接的表越多,执行计划跑偏的几率越大?

10.6.7. 慎用触发器

涉及大数据量相关业务时,尤其是在频繁操作的大数据量表上,表上的触发器可能会导致系统局部或整体的性能问题,继而引发其他更严重的系统性故障。因此,这种大数据量业务场景,尽量不要用触发器。

此外,非大数据量业务场景中,因为触发器的逻辑级联等因素,也可能会引发一系列连锁问题和故障的发生,同时,这种问题分析、排查和解决起来又比较隐蔽和麻烦,因此,出于数据库性能、稳定性、可用性、管理和维护的考虑,也要慎用触发器。

2013年,本人就曾帮助某行业机构成功排查和解决了触发器引发的一起严重的数据库性能故障。故障排查前,数据库服务器IBM某型小机CPU资源使用率持续冲顶,导致数据库性能问题和应用系统异常;触发器相关故障排除后,数据库服务器CPU资源使用率在10%上下徘徊,系统性能和应用系统恢复正常。

--注:

1)我们回忆下什么是触发器及触发器的种类。另外,思考下,触发器能给我们带来什么好处和问题?

2)为什么在大数据量业务里及操作频繁的表上,尽量不要用触发器?

3)什么是触发器的逻辑级联?其是如何引起的?

相关推荐
凯子坚持 c19 小时前
从 API 到应用:用 Rust 和 SQLx 为 Axum 服务添加持久化数据库
数据库·oracle·rust
百***68041 天前
MySQL四种备份表的方式
mysql·adb·oracle
百***62851 天前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
百***87441 天前
MySQL 查看有哪些表
数据库·mysql·oracle
曹牧1 天前
Oracle:查询当前正在等待执行的SQL语句
linux·数据库·oracle
_Kafka_1 天前
在 Oracle Data Guard 环境中,手工将备库(Standby)切换为主库(Primary)
数据库·oracle
百***24131 天前
oracle使用PLSQL导出表数据
数据库·oracle
cqsztech1 天前
ORACLE 11g 在线修改数据文件路径
数据库·oracle
为什么要做囚徒1 天前
Oracle跨用户表授权+同义词创建的标准脚本模板
数据库·oracle
爱吃猫的鱼星1 天前
SQL 分类
数据库·oracle