分类: 数据库开发技术
2011-07-19 22:52:28
2011-07-17我去参加CU数据库沙龙,由于周六,周日忙着用perl重写我们项目的收集数据程序,结果到时,已经迟到了15分钟,会议室里座无虚席。内容是
演讲话题:数据库架构设计与性能优化实践
演讲人:盖国强:恩墨科技技术总监,ITPUB论坛超级版主
演讲话题:银行业案例分析:企业信息系统性能调优实践
演讲人:郑保卫:《海量数据库解决方案》译者,韩国最权威数据库公司EN-CORE顾问
第一位专家主要是偏重于Oracle的优化和原理,但是我对Oracle的熟悉只是在使用客户端连过几次的程度,他讲的内容我好多都不记得了,但是他讲的Oracle 11g的对物理数据表进行访问的新功能,我记得很清楚,Oracle的缓存是:第一次从物理表查询到结果后,把内容写到缓存,并且把写到缓存的位置记录到一个索引表里,同时还有一个索引表专门记录没有被使用的缓存块。由于一些查询是全表索引,这样会把缓存占满,把别人的SQL结果清除,因而出现直接读取物理表的功能。
我后来问了一个问题“如何放在随机条件查询的攻击,在这种情况下先读缓存再读物理表会比直接读物理表慢?”,他只是说Oracle不提供绕过缓存的功能。
第一位专家主要是从大的方面介绍
第二位专家主要是从各个方面介绍如何优化数据库性能
虽然他是根据Oracle讲的,但是对我帮助很大
主要是下面四个方面
1.数据库配置优化
2.存储过程
3.从sql语句
4.数据结构设计
1)数据库配置优化
增加查询缓存,增加索引空间,分区,增加缓存,增加线程数等等
2)存储过程
SQL语句最大的特点是集合运算,因此不要在遍历游标里做SQL语句操作,因为查询出来10万行结果,那么对应的遍历游标里做SQL语句操作就得执行10万次。这个完全可以用join或者in来解决
3)SQL语句优化是我们经常使用的优化,优化最高能到10%
一般是对经常查询的语句进行分析,看看是否需要加索引,如何加,如何写SQL语句能够应用上索引,删除不必要的索引。
若是web的话避免查询大数据量而只显示小部分数据。
在重复调用相同语句,但是数据不一样时,一定要用预处理,因为预处理后的SQL语句只会在数据库里解析一次,下次传不同的数据时不需要再解析(软解析)。否则不用预处理而用字符串拼接构成SQL语句的话每次都要解析(硬解析),执行时间有50%在做解析,导致cpu和IO都很高。
主要 join和in的效率问题(这是我自己加的,他没讲到这个)
4)数据结构设计,优化最高能到80%
数据库结果的设计直接决定了你如何写SQL,好的数据库设计能够很方便写出处理海量数据的SQL语句,设计数据结构时考虑如何线性扩展。