菜刀:
- sql一刀剁了
- 整个模块丢弃了
- 调用次数少多了
- 排序不在需要了
- 大表砍成小表了
- 排重操作消失了
- 插入障碍小多了
- 迁移事情不做了
手术刀:
- 大表等于小表了
- 大表切成小表了
- 索引变身小表了
- 删除动作不做了
- 清表角度表换了
- 提交次数缩减了
- 迁移越来越快了
- sql语句精简了
思路:
- 诊断
- 过程细化
- 找出细化项的主要矛盾
- 改进优化
- 理解需求
- 表明需求
- 隐藏需求
- 真正需求
- 设计
- 尽量不做事,甚至少做事。
- 选择相关工具,掌握相关技能
- 合理利用资源
- 理解需求
规范:
- 数据库规范
- 学习规范
- 了解自己的职责
- 根据职责学习
- 提问必须有智慧
- 必须有动手试验的习惯
- 解决完问题必须总结
- 总结后学会分享
- 求助提问规范
- 描述不全不问:
- 什么点出故障
- 影响面多大
- 发生故障的时间点
- 产生的故障是否有规律
- 故障环境的访问方式
- 求助人的联系方式
- 用词准确:
- 现在运行多长,希望运行多长。
- 能搜不问
- 问过不问
- sql提问要需求最小化
- 提供建表语句
- 插入部分数据
- 告诉我想要展现的结果
- 描述不全不问:
- 作业操作规范
- 数据库补丁投放
- DML语句和DDL语句不能放在一起
- 一次只允许开一个数据库登录界面
- PLSQL开发不允许保存密码自动登录
- 涉及需更新记录的表必须先备份
- 涉及对投放补丁完成时间有预计
- 数据库迁移备份
- 必须先明确备份迁移方式:
- expdp/impdp
- exp/imp
- rman
- others
- 明确导入导出表空间及磁盘空间大小
- 明确操作的库具体有多大
- 明确最大的对象有哪些
- 明确需要导出的有多大
- 明确需要完成的操作的规定时长
- 必须先明确备份迁移方式:
- 数据库误删除
- 确定被删除的类型
- 表被drop
- 记录被删除
- 表被truncate
- 明确误操作的时间点
- 当场发现
- 事后发现
- 对应策略
- 表被drop
- 用备份恢复
- 从回收站恢复
- 被多次drop从回收站中根据时间点恢复
- 记录被删除
- 用备份回鹘
- 闪回恢复
- 时间长无法闪回,且无备份,考虑手工插入恢复
- 表被truncate
- 用备份恢复
- 如果数据库有闪回,考虑闪回数据库
- 都不行的情况下,考虑手工插入记录恢复
- 表被drop
- 确定被删除的类型
- 数据库补丁投放
- 诊断流程规范
- 完善的数据库问题分析步骤
- 动态
- 整体
- 主机动态情况检查
- 性能视图备份
- 获取基线
- 观察临时表空间和回滚段表空间情况
- 局部
- 通过主机进程pid查sql
- 观察当前数据库的版本和等待情况,sql基本情况
- 检查是否有过分提交的语句
- 检查系统的绑定变量
- 整体
- 静态
- 整体
- 主机的静态情况检查
- 记录oracle所有的参数设置情况,并且检查是否归档
- 检查数据库表和索引是否存在并行度设置
- 检查是否有实效的索引
- 检查是否有显著未释放的高水平位的表
- 检查统计信息
- 自动统计信息收集情况
- 全局临时表的情况
- awr/addm/ash/awrddrpt/awrsqrpt等方式观察数据库
- 获取数据库警告和监听日志
- 检查日志大小设置情况
- 检查最大的对象是哪些,表空间使用情况和回收站情况
- 局部
- 检查有哪些函数索引和位图索引
- 检查CACHE小于20的序列
- 分析需要跟踪的表和索引
- 查看表的大小情况
- 记录的大小
- 物理的大小
- 检查表结构的情况
- 查看表的信息
- 看分区表相关信息
- 查看索引情况
- 每张表对应多少索引
- 结构情况
- 查看索引列的信息
- 以下查出的都是分区索引
- 查看表的大小情况
- 整体
- 动态
- 完善的数据库问题分析步骤
- 高效开发规范
- SQL编写规范
- 单条sql不要超过100行
- sql子查询嵌套不要超过3层
- sql表关联需要考虑连接条件和限制条件的索引
- 尽量避免hint在代码中出现
- 同一个sql模块避免出现大量相似之处
- 用到并行需谨慎
- 尽量避免对列的运算
- PLSQL编写规范
- 注释不少于代码的1/10
- 代码必须提供最小化测试案例与注释中
- 绑定变量
- 尽量使用批量提交
- 同一过程包中出现重复逻辑块需封装,统一调用
- 生产环境尽量使用包来封装过程和函数
- 动态SQL编写需记录真实SQL记录表中
- SQL编写规范
- 合理设计规范
- 表规范
- 范式
- 绝大部分要求第三范式
- 适当考虑反范式
- 不同类表的差异
- 小表
- 一般要有主键
- 一般要有约束
- 尽量规划在同一个表空间
- 大表
- 尺寸超过10g需要考虑建分区
- 分区表中分区超过100要注意
- 大表尽量要有明确的数据保留策略
- 体现在设计文档
- 实现步骤体现在维护脚本中
- 体现在表注释中
- 大表坚决不允许有触发器
- 日志大表一般不设主键
- 中间表
- 内存表
- 全局临时表
- 小表
- 表结构
- 注释
- 表必须要有注释
- 列尽量要有注释
- 列类型
- 避免使用LOGN字段
- 避免用CHA字段
- 列类型和值尽量匹配
- 时间取值放入date列
- 数据取值放入number列
- 字符串放入varchar2列
- 注释
- 范式
- 索引规范
- 用不上分区条件的局部索引不宜建
- 函数索引大多用于列运算,一般需要避免
- 位图索引遇到更新是噩梦,需要避免
- 外键未建索引将引发死锁,及影响表连接的性能
- 建联合索引需谨慎
- 要结合单列查询决定前缀
- 超过四个字段的联合索引要引起注意
- 范围查询影响组合索引
- 需要考虑回表因素
- 单表索引个数需要控制
- 索引超过5个以上
- 建后2个月内没有使用的
- 单表无任何索引需要重视
- 需要注意索引的实效情况
- 导致索引失效的因素
- 表移动表空间
- 分区表系列动作未加update global indexes
- 当前哪些索引实效
- 如何让索引生效
- 导致索引失效的因素
- 环境参数规范
- 数据库参数
- SGA和PGA参数
- OLTP应用是主机内存的80%分配数据库,其中SGA80%,PGA20%
- OLAP应用是主机内存的80%分配数据库,其中SGA50%,PGA50%
- Process和Session
- Open_cursor
- 日志参数
- 日志文件个数
- 日志文件大小
- 是否归档
- SGA和PGA参数
- 表空间规划
- 回滚表空间
- 自动管理
- 避免自动扩展
- 尽可能规划大
- 临时表空间
- 避免自动扩展
- 尽可能大
- 尽可能使用临时表空间组
- 业务表空间
- 控制个数,不超过6个为宜
- 尽量避免自动扩展,超阀值由监控来检查
- 根据自己的业务,固定表空间名
- 表空间需良好分类
- 参数配置表
- 业务数据表
- 历史记录表
- 表空间需合理命名
- 回滚表空间
- RAC系统
- 考虑通过TNS设置,将不同的业务代码部署在不同节点
- 不同节点用不同的回滚段和临时段
- 数据库参数
- 命名规范
- 表t_
- 视图v_
- 同义词s_
- 簇表c_
- 序列seq_
- 存储过程p_
- 函数f_
- 包pkg_
- 类typ_
- 外键fk_
- 主键pk_
- 唯一索引ux_
- 普通索引idx_
- 位图索引bx_
- 函数索引fx_
- 表规范
- 学习规范