Oracle 数据库优化实战心得总结
程序员文章站
2023-01-08 13:14:00
1.优化应用程序和业务逻辑,这个是最重要的。 2.数据库设计阶段范式和反范式的灵活应用。一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化;对于频繁修改...
1.优化应用程序和业务逻辑,这个是最重要的。
2.数据库设计阶段范式和反范式的灵活应用。一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化;对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。
3.充分利用内存,优化sga、pga等(11g已经实现了sga+pga自动化,但有的时候仍然需要手动进行调整),适当的将小表keep到cache中。
4.优化sql语句
1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
2)尽量使用相同的或非常类似的sql语句进行查询,这样不仅充分利用sql共享池中的已经分析的语法树,要查询的数据在sga中命中的可能性也会大大增加。
3)限制动态sql的使用,虽然动态sql很好用,但是即使在sql共享池中有一个完全相同的查询值,动态sql也会重新进行语法分析。
4)避免不带任何条件的sql语句的执行。没有任何条件的sql语句在执行时,通常要进行fts,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将 是一个漫长的过程。
5)如果对有些表中的数据有约束,最好在建表的sql语句用描述完整性来实现,而不是用sql程序中实现。
6)可以通过取消自动提交模式,将sql语句汇集一组执行后集中提交,程序还可以通过显式地用commit和rollbacl进行提交和回滚该事务。
7)检索大量数据时费时很长,设置行预取数则能改善系统的工作表现,设置一个最大值,当sql语句返回行超过该值,数值库暂时停止执行,除非用户发出新的指令,开始组织并显示数据,而不是让用户继续等待。
5.优化io,将不同的数据文件、控制文件、日志文件放在不同的磁盘,表和索引放在不同的表空间,设置合适的block大小,设置异步io等。
6.适当建立只读表空间,减少数据块头的更新和数据库故障的发生。
7.表设计优化
1)分区
2)压缩
3)建立合适的索引
4)设置合适的pctfree,减少行连接和行迁移
5)设置合适的storage,控制表碎片
6)其他等
8.充分利用系统cpu资源,使用parallel query option(pqo,并行查询选择)方式进行数据查询,使用pqo方式不仅可以在多个cpu间分配sql语句的请求处理,当所查询的数据处于不同的磁盘时,一个个独立的进程可以同时进行数据读取。
9.优化数据库连接
1)使用直接的ole db数据库连接方式。
通过ado可以使用两种方式连接数据库,一种是传统的odbc方式,一种是ole db方式。ado是建立在ole db技术上的,为了支持odbc,必须建立相应的ole db到odbc的调用转换,而使用直接的ole db方式则不需转换,从而提高处理速度。
2)使用connection pool机制
在数据库处理中,资源花销最大的是建立数据库连接,而且用户还会有一个较长的连接等待时间。解决的办法就是复用现有的connection,也就是使用connection pool对象机制。
connection pool的原理是:iis+asp体系中维持了一个连接缓冲池,这样,当下一个用户访问时,直接在连接缓冲池中取得一个数据库连接,而不需重新连接数据库,因此可以大大地提高系统的响应速度。
10.充分利用数据的后台处理方案减少网络流量
1)合理创建临时表或视图
所谓创建临时表或视图,就是根据需要在数据库基础上创建新表或视图,对于多表关联后再查询信息的可建新表,对于单表查询的可创建视图,这样可充分利用数据库的容量大、可扩充性强等特点,所有条件的判断、数值计算统计均可在数据库服务器后台统一处理后追加到临时表中,形成数据结果的过程可用数据库的过程或函数来实现。
2)数据库打包技术的充分利用
利用数据库描述语言编写数据库的过程或函数,然后把过程或函数打成包在数据库后台统一运行包即可。
3)数据复制、快照、视图,远程过程调用技术的运用
数据复制,即将数据一次复制到本地,这样以后的查询就使用本地数据,但是只适合那些变化不大的数据。使用快照也可以在分布式数据库之间动态复制数据,定义快照的自动刷新时间或手工刷新,以保证数据的引用参照完整性。调用远程过程也会大大减少因频繁的sql语句调用而带来的网络拥挤。
11.实施系统资源管理分配计划
oracle提供了database resource manager(drm,数据库资源管理器)来控制用户的资源分配,dba可以用它分配用户类和作业类的系统资源百分比。在一个oldp系统中,可给联机用户分配75%的cpu资源,剩下的25%留给批用户。另外,还可以进行cpu的多级分配。除了进行cpu资源分配外,drm还可以对资源用户组执行并行操作的限制。
2.数据库设计阶段范式和反范式的灵活应用。一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化;对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。
3.充分利用内存,优化sga、pga等(11g已经实现了sga+pga自动化,但有的时候仍然需要手动进行调整),适当的将小表keep到cache中。
4.优化sql语句
1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
2)尽量使用相同的或非常类似的sql语句进行查询,这样不仅充分利用sql共享池中的已经分析的语法树,要查询的数据在sga中命中的可能性也会大大增加。
3)限制动态sql的使用,虽然动态sql很好用,但是即使在sql共享池中有一个完全相同的查询值,动态sql也会重新进行语法分析。
4)避免不带任何条件的sql语句的执行。没有任何条件的sql语句在执行时,通常要进行fts,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将 是一个漫长的过程。
5)如果对有些表中的数据有约束,最好在建表的sql语句用描述完整性来实现,而不是用sql程序中实现。
6)可以通过取消自动提交模式,将sql语句汇集一组执行后集中提交,程序还可以通过显式地用commit和rollbacl进行提交和回滚该事务。
7)检索大量数据时费时很长,设置行预取数则能改善系统的工作表现,设置一个最大值,当sql语句返回行超过该值,数值库暂时停止执行,除非用户发出新的指令,开始组织并显示数据,而不是让用户继续等待。
5.优化io,将不同的数据文件、控制文件、日志文件放在不同的磁盘,表和索引放在不同的表空间,设置合适的block大小,设置异步io等。
6.适当建立只读表空间,减少数据块头的更新和数据库故障的发生。
7.表设计优化
1)分区
2)压缩
3)建立合适的索引
4)设置合适的pctfree,减少行连接和行迁移
5)设置合适的storage,控制表碎片
6)其他等
8.充分利用系统cpu资源,使用parallel query option(pqo,并行查询选择)方式进行数据查询,使用pqo方式不仅可以在多个cpu间分配sql语句的请求处理,当所查询的数据处于不同的磁盘时,一个个独立的进程可以同时进行数据读取。
9.优化数据库连接
1)使用直接的ole db数据库连接方式。
通过ado可以使用两种方式连接数据库,一种是传统的odbc方式,一种是ole db方式。ado是建立在ole db技术上的,为了支持odbc,必须建立相应的ole db到odbc的调用转换,而使用直接的ole db方式则不需转换,从而提高处理速度。
2)使用connection pool机制
在数据库处理中,资源花销最大的是建立数据库连接,而且用户还会有一个较长的连接等待时间。解决的办法就是复用现有的connection,也就是使用connection pool对象机制。
connection pool的原理是:iis+asp体系中维持了一个连接缓冲池,这样,当下一个用户访问时,直接在连接缓冲池中取得一个数据库连接,而不需重新连接数据库,因此可以大大地提高系统的响应速度。
10.充分利用数据的后台处理方案减少网络流量
1)合理创建临时表或视图
所谓创建临时表或视图,就是根据需要在数据库基础上创建新表或视图,对于多表关联后再查询信息的可建新表,对于单表查询的可创建视图,这样可充分利用数据库的容量大、可扩充性强等特点,所有条件的判断、数值计算统计均可在数据库服务器后台统一处理后追加到临时表中,形成数据结果的过程可用数据库的过程或函数来实现。
2)数据库打包技术的充分利用
利用数据库描述语言编写数据库的过程或函数,然后把过程或函数打成包在数据库后台统一运行包即可。
3)数据复制、快照、视图,远程过程调用技术的运用
数据复制,即将数据一次复制到本地,这样以后的查询就使用本地数据,但是只适合那些变化不大的数据。使用快照也可以在分布式数据库之间动态复制数据,定义快照的自动刷新时间或手工刷新,以保证数据的引用参照完整性。调用远程过程也会大大减少因频繁的sql语句调用而带来的网络拥挤。
11.实施系统资源管理分配计划
oracle提供了database resource manager(drm,数据库资源管理器)来控制用户的资源分配,dba可以用它分配用户类和作业类的系统资源百分比。在一个oldp系统中,可给联机用户分配75%的cpu资源,剩下的25%留给批用户。另外,还可以进行cpu的多级分配。除了进行cpu资源分配外,drm还可以对资源用户组执行并行操作的限制。
下一篇: 在命令行下进行Oracle用户解锁的语句