数据库开发常识(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)什么是触发器的逻辑级联?其是如何引起的?

相关推荐
lusklusklusk3 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
geovindu11 小时前
SQL Data Sampling and Approximation Techniques using postgreSQL 18
大数据·数据库·数据仓库·sql·postgresql·数据库开发·数据库架构
悟道书生11 小时前
Kingbase数据库使用命令来执行init.sql(包含建库建表语句)
数据库·oracle
晴天¥12 小时前
记一次Oracle 归档进程卡死怎么去有效排查
数据库·oracle
梦幻通灵12 小时前
MybatisPlus使用数据库递增ID实现方案【持续更新】
数据库·oracle
海鸥-w1 天前
数据库冗余字段设计笔记
java·数据库·笔记·oracle
Navicat中国1 天前
Navicat 连接 Redis 数据库
数据库·redis·数据库开发·navicat
实泽有之,无泽虚之1 天前
ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务问题原因及解决办法
数据库·oracle
程序员塔塔喵1 天前
【MySQL篇|第十篇】深分页问题
数据库·oracle·深分页问题
qq_452396231 天前
第八篇:《VACUUM、自动清理与膨胀治理》
jvm·数据库·oracle