数据库 (三、优化学习)

来源:互联网 发布:mac上什么软件处理图片 编辑:程序博客网 时间:2024/06/06 07:34
 总的原则:避免全表扫描;建立索引(只对需要的列遍历查询);

1、调整数据结构的设计。
2、调整应用程序结构设计。程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两 层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行;
4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整 数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需 要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低 系统。
5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的 硬盘上,做到硬盘之间I/O负载均衡。
6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所
能使用的内存大小等参数。

1.在 where 及 order by 涉及的列上建立索引;2.避免在 where 子句中对字段进行 null 值判断;3.最好不要给数据库留NULL(可以的话可设为0),尽可能的使用 NOT NULL填充数据库;4.避免在 where 子句中使用 != / <> 操作符;5.避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而     进行全表扫描;union all每次单独查询走索引,可以替换or;6.避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索;7.避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:  select id from t where substring(name,1,3) = ’abc’       -–name以abc开头的id  select id from t where datediff(day,createdate,’2005-11-30′) = 0    -–‘2005-11-30’    --生成的id  应改为:  select id from t where name like 'abc%'  select id from t where createdate >= '2005-11-30' and createdate < '2005-12-1'8.对于多张大数据量的表JOIN,要先分页再JOIN;9.索引可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可     能会重建索引;10.,索引可分聚集clustered和非聚集索引,主要的区别:一个表的聚集索引只能有一个,是因为数据行在保存的时候,是按聚集索引的顺序保存的,你可以把它简单的理解成物    理存储的位置,这里涉及到页面的概念,你可以查查看。就是物理磁盘上分很多页面,一个有聚集索引的表,他的页面    链是按聚集索引排列的,举个例子,如果一个页面已经写满了数据,你要插入一行,如果是非聚集索引,sql会随便找       个地方保存,把地址记录进索引,但是如果是聚集索引,会把数据插入到这个页面,而后面的数据同时会往后移动(用        页面拆分的办法),看上去速度要慢,但是聚集索引在搜索时,速度会比非聚集索引快,因为他们是物理排序的;尽可        能的避免更新 clustered 索引数据列;11.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。12.在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多;

truncate table命令将快速删除数据表中的所有记录,但保留数据表结构。这种快速删除与delete from 数据表的删除

全部数据表记录不一样,delete命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而truncate

命令删除的数据是不可以恢复的 ;速度,一般来说: drop>; truncate >; delete ;安全性:小心使用drop 和

truncate,尤其没有备份的时候;使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大;想删除表

,当然用drop ;想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger, 还是用delete.

0 0
原创粉丝点击