架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数据库性能能优化

Posted on 2009-03-02 14:45  chen eric  阅读(220)  评论(0编辑  收藏  举报

优化哪些内容
数据库吞吐量
 单位时间内存取的数据量
数据库用户响应时间
 系统服务时间
  提高数据库的吞吐量
 用户等待时间
  减少用户访问同一数据库资源的冲突率
性能优化过程
1. 调整数据结构的设计
 哪些表经常访问:建立索引
 哪些表经常联接:建立冗余字段
2. 调整应用程序结构设计
 CS/BS:人少与人多的问题
 OLTP/OLAP:数据更新多/查询多的问题
3. 调整数据库SQL语句
 SQL语句是应用系统最关键的性能
4. 调整服务器内存分配
 保存更多共享资源
5. 调整硬盘I/O
6. 调整操作系统参数
SGA(全局共享内存) 共享池
共享池是PL/SQL程序进行语法分析、编译、执行的内存区域,共享池的大小直接影响数据库的性能。保存了对SQL分析结果,减少了分析相同SQL的时间,提高SQL执行效率。
SELECT子句中避免使用 ‘ * ‘
、*‘是一个方便的方法但也是一个非常低效的 方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有 的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.不必每次取出所有的数据规则:
not exists,not in,表连接。
规则:not exists代替not in
规则:用表连接替换EXISTS
1、查询一个表有,而另一个表没有的记录,用not exists最快。
2、查询多个表都有的记录,用表的对待联接最快
  --查询没有人的部门
 --分析 员工表中没有此部门编号
select * from dept where dept.deptno not in
(select emp.deptno from emp);  -- not in
优化方式
select * from dept where not exists -- not exists 性能比not in好
(select 'a' from emp where emp.deptno = dept.deptno)
表连接
select * from emp where emp.deptno in (select dept.deptno from dept)
select * from emp where exists (select 'd' from dept where dept.deptno = emp.deptno);
优化方式
select * from emp join dept on emp.deptno = dept.deptno;

索引使用注意事项
索引的本质就是通过创建一个内部的索引表来达到快速搜索的目的。
索引可以提高在该表上执行SELECT语句的速度,但是会降低数据增删改语句执行的速度。
应该使用索引的地方
 被索引的列经常在where条件中被查询
 查询时返回数据比较少(少于1/3)
不应该使用索引的地方
 小表不需要建索引
 表的索引列经常修改时
 返回的数据很多时
尽快使用COMMIT,但是要注意事务完整性。
财务1部为张三加500块,财务2部为张三减500块。
张三给李四转帐500块。
对经常修改的字段使用char类型
 如果一个VARCHAR列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR会更好一些。
 因为CHAR的效率比VARCHAR的效率稍高。在数据库查询数据时,对于变长类型字段,必须要先获取数据的长度,而定长类型字段而没有这一步,所以查询效率要高于变长类型字段。
 在实际开发中建议使用char(1)来代替BIT类型,以提高系统的兼容性。