当前位置: 首页 > article >正文

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


http://www.kler.cn/a/536438.html

相关文章:

  • 力扣.623. 在二叉树中增加一行(链式结构的插入操作)
  • 简单说一下CAP理论和Base理论
  • PHP JSON操作指南
  • 为什么使用nohup 和 启动的python脚本,日志没有在nohup.out中
  • 2025职业发展规划
  • 一文解释nn、nn.Module与nn.functional的用法与区别
  • C++ labmbd表达式
  • 在 Flownex 中创建自定义工作液
  • 寻找2020
  • 【算法】动态规划专题⑥ —— 完全背包问题 python
  • Maven 依赖管理全面解析
  • 【有啥问啥】什么是CTC(Connectionist Temporal Classification)算法
  • leetcode_双指针 541. 反转字符串 II
  • KAFKA-UI升级教程,因旧版本不支持(KAFKA-3.8.0 开启SASL认证)
  • Python基于Django的课堂投票系统的设计与实现【附源码】
  • Linux系统用户分类、UID与GID的区别、用户管理的基础命令
  • 【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
  • 深度学习|表示学习|训练优化方法|Nesterov动量一定比基础的Momentum更好吗?|22
  • 基于LMStudio本地部署DeepSeek R1
  • elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)
  • Deepseek-v3 / Dify api接入飞书机器人go程序
  • 你是否想过,让AI像人类一样协作竞争?——展望智能体协作新范式
  • 数据结构-基础
  • 华为昇腾报:aclrtMemMallocPolicy:ACL_MEM_MALLOC_HUGE_FIRST
  • 三极管的截止、放大、饱和区
  • python2048游戏