在日常工作中,我们经常会遇到SQL性能问题,这些问题可能会影响系统的响应速度,甚至导致系统崩溃。为了应对这些问题,我们通常会采用以下几种常见的处理方法:
image.png
以下是进行SQL优化时以下需要遵循的安全操作规范:
image.png
索引:提升数据检索速度的关键
索引是数据库中用于加快数据检索速度的一种数据结构。在创建和管理索引时,我们需要注意以下几点:
1、索引创建的基本要点
命名规范:为了便于管理和维护,索引的命名应遵循一定的规范。普通索引可以命名为“表名称_字段名_IND”,函数索引可以命名为“表名称_字段名_FIND”。
风险评估:在创建索引时,可能会面临一些风险,如登录到错误的schema下、没有指定索引表空间、并行创建索引后未将并行度改回1等。这些风险可能会导致索引创建失败、空间不足或性能问题。
操作过程:在项目SQL审核阶段,应与设计人员一起明确新索引的设计方案。在准备发布脚本时,要检查表空间定义和剩余空间,为新建的索引选择合适的表空间。在已有表上新建索引操作可能会对数据库造成一定的风险,因此应尽量安排在业务低峰期进行,并在ITIL中提交相应的变更申请。
2、索引创建失败导致数据库崩溃案例
某客户对一张上亿数据的表进行加索引操作,由于业务没有停,晚上操作时命令执行了几个小时,索引还没加上。担心影响第二天的业务,操作人员尝试取消操作,但没有返回,于是直接关闭了窗口。之后,查询dba_objects试图发现索引记录存在,但尝试用drop index删除时,返回找不到索引。最终,操作人员执行了delete from obj$ where object_id=’xxxx’命令,导致数据库crash,无法启动。
这个案例告诉我们,在进行索引操作时,必须谨慎对待,避免盲目取消操作或直接删除对象,以免造成不可挽回的后果。
image.png
统计信息:优化器生成执行计划的重要依据
1、统计信息的基本要点
统计信息是数据库优化器生成执行计划的重要依据。在收集和更新统计信息时,我们需要注意以下几点:
影响范围评估:统计信息的改变会影响表上所有SQL的执行计划,因此在操作时需要确认影响的范围,避免因优化一个SQL而导致更多的SQL执行计划出错。
no_invalidate参数设置:no_invalidate参数决定了表上依赖的SQL是否会在统计信息更新后立即失效。通常情况下,我们建议将该参数设置为false,让表上依赖的游标立刻失效,以便在下一次解析时能够使用新的统计信息。但在某些情况下,如果表上依赖的SQL很多,设置为false可能会导致硬解析风暴,影响系统性能。
RAC集群操作注意事项:在RAC集群中进行统计信息收集时,需要特别注意节点之间的争用情况,避免在高负载节点进行操作,以免影响整个集群的性能。
image.png
2、更新导致RAC集群争用案例
在RAC集群中,某个节点CPU告警,发现某个SQL执行计划异常,判断是某个表统计信息没有更新造成的。DBA决定在第二个节点负载低的节点收集统计信息,结果造成了大量的GC等待,两个节点同时CPU很高,业务无法受理。这个案例说明,在RAC集群中进行统计信息更新时,需要特别注意节点之间的争用情况,避免在高负载节点进行操作,以免影响整个集群的性能。
image.png