运维小白一枚,最近工作中数据库宕机频发,工作之余,随手整理了个人对oracle性能分析思路,欢迎高手指教。
数据库是否存在性能问题,一般在系统设计就决定了,包含软件设计/数据库设计/硬件设计,其中任何一个环节有不当处理,都有可能导致系统的性能下降,而系统的性能在多数情况下又反映为数据库性能问题。
软件设计导致的性能问题,可简单归纳为架构设计/代码编写;作为随手笔记,今天简单总结下代码编写对数据库性能的影响:
1、SQL代码中加入Hint约束
系统上线运行多天,但某一天突然变慢,根据从用户端发出的SQL,发现在SQL代码中加入了Hint,类似于:select /*+ index(t1 ind_t1) */ col1,col2 from t1 where col1> ... and col1<...>
猜测开发在上线前压测阶段,发现sql选择索引比全表扫描效率高,才在sql中加入了这段Hint;但为什么会突然变慢?
通过比对原始SQL和去掉Hint的SQL执行计划比对,去掉Hint的SQL虽然全表扫描,但扫描的数据块远远小于原始SQL,原因找到了,近期数据在创建索引的列上的列值重复率会远远高于从前,因为ORACLE在选择索引后,读取了更多的索引块和数据块,导致了大量的I/O操作。
2、不必要的外连接操作
外连接执行过程对于性能来说非常昂贵,对于不必要的外连接,比如担心遗漏数据而刻意写的外连接SQL就需要避免使用
3、绑定变量的SQL
很多人觉得SQL的代码优化其中一条是绑定变量,事实上,这完全取决的你的系统,OLAP绑定变量执行性能的影响可以忽略不计,所以根据系统来决定是否绑定变量。
以上个人简单的认识,还请大牛多多交流赐教