SQL优化原则(七)

2014-11-24 12:24:56 · 作者: · 浏览: 3
  3. 网络条件:NET*SQL负责数据在网络上的来往,大量的SQL会令网络速度变慢。
比如10M的网卡和100的网卡就对NET*SQL有非常明显的影响,还有 交换机、集线器等
等网络设备的性能对网络的影响很明显,建议在任何网络中不要试图用3个集线器来将网段互联。
  OS参数的设置
  下表给出了OS的参数设置及说明,DBA可以根据实际需要对这些参数进行设置
  内核参数名
  说明
  bufpages
  对buffer空间不按静态分配,采用动态分配,使bufpages值随nbuf一起对buffer空
间进行动态分配。
  create_fastlinks
  对HFS文件系统允许快速符号链接
  dbc_max_pct
  加大最大动态buffer空间所占物理内存的百分比,以满足应用系统的读写命中率的需要。
  dbc_min_pct
  设置最小动态buffer空间所占物理内存的百分比
  desfree
  提高开始交换操作的最低空闲内存下限,保障系统的稳定性,防止出现不
可预见的系统崩溃(Crash)。
  fs_async
  允许进行磁盘异步操作,提高CPU和磁盘的利用率
  lotsfree
  提高系统解除换页操作的空闲内存的上限值,保证应用程序有足够的可用内存空间。
  maxdsiz
  针对系统数据量大的特点,加大最大数据段的大小,保证应用的需要。(32位)
  maxdsiz_64bit
  maximum process data segment size for 64_bit
  Maxssiz
  加大最大堆栈段的大小。(32_bit)
  maxssiz_64bit
  加大最大堆栈段的大小。(64_bit)
  Maxtsiz
  提高最大代码段大小,满足应用要求
  maxtsiz_64bit
  原值过大,应调小
  Minfree
  提高停止交换操作的自由内存的上限
  Shmem
  允许进行内存共享,以提高内存的利用率
  Shmmax
  设置最大共享内存段的大小,完全满足目前的需要
  Timeslice
  由于系统的瓶颈主要反映在磁盘I/O上,因此 降低时间片的大小,一方面可避
免因磁盘I/O不畅造成CPU的等待,从而提高了CPU的综合利用率。另一方面减少了进程的阻塞量。
  unlockable_mem
  提高了不可锁内存的大小,使可用于换页和交换的内存空间扩大,用以满足系统对内存管理的要求。
用户SQL质量
  以上讲的都是硬件方面的东西,在条件有限的条件下,我们可以调整应用程序的SQL质量:
  1. 不要进行全表扫描(Full Table Scan):全表扫描导致大量的I/O
  2. 尽量建好和使用好索引:建索引也是有讲究的,在建索引时,也不是索引越
多越好,当一个表的索引达到4个以上时,ORACLE的性能可能还是改善不了,因
为OLTP系统每表超过5个索引即会降低性能,而且在一个sql 中, Oracle 从不能使
用超过 5个索引;当我们用到GROUP BY和ORDER BY时,ORACLE就会自动对数据
进行排序,而ORACLE在INIT.ORA中决定了sort_area_size区的大小,当排序不能在
我们给定的排序区完成时,ORACLE就会在磁盘中进行排序,也就是我们讲的临时表空
间中排序, 过多的磁盘排序将会令 free buffer waits 的值变高,而这个区间并不只是
用于排序的,对于开发人员我提出如下忠告:
  1)、select,update,delete 语句中的子查询应当有规律地查找少于20%的表行.
如果一个语句查找的行数超过总行数的20%,它将不能通过使用索引获得性能上的提高.
  2)、索引可能产生碎片,因为记录从表中删除时,相应也从表的索引中删除.表释放的
空间可以再用,而索引释放的空间却不能再用.频繁进行删除操作的被索引的表,应当
阶段性地重建索引,以避免在索引中造成空间碎片,影响性能.在许可的条件下,也可以
阶段性地truncate表,truncate命令删除表中所有记录,也删除索引碎片.
  3)、在使用索引时一定要按索引对应字段的顺序进行引用。
  4)、用(+)比用NOT IN更有效率。
  降低ORACLE的竞争:
  先讲几个ORACLE的几个参数,这几个参数关系到ORACLE的竞争:
  1)、freelists 和 freelist 组:他们负责ORACLE的处理表和索引的空间管理;
  2)、pctfree 及 pctused:该参数决定了freelists 和 freelist 组的行为,pctfree
和pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出
  设置好pctfree 及 pctused对块在freelists的移走和读取很重要。
  其他参数的设置
  1)、包括SGA区( 系统全局区):系统全局区(SGA)是一个分配给Oracle 的包含一
个 Oracle 实例的数据库的控制信息内存段。
  主要包括数据库高速缓存(the database buffer cache),
  重演日志缓存(the redo log buffer),
  共享池(the shared pool),
  数据字典缓存(the data dictionary cache)以及其它各方面的信息
  2)、db_block_buffers(数据高速缓冲区)访问过的数据都放在这一片内存区域,
该参数越大,Oracle在内存中找到相同数据的可能性就越大,也即加快了查询速度。
  3)、share_pool_size (SQL共享缓冲池):该参数是库高速缓存和数据字典的高速缓存。
  4)、Log_buffer (重演日志缓冲区)
  5)、sort_area_size(排序区)
  6)、processes (同时连接的进程数)
  7)、db_block_size (数据库块大小):Oracle默认块为2KB,太小了,因为如果
我们有一个8KB的数据,则2KB块的数据库要读4次盘,才能读完,而8KB块的数
据库只要1次就读完了,大大减少了I/O操作。数据库安装完成后,就不能再改变
db_block_size的值了,只能重新建立数据库并且建库时,要选择手工安装数据库。
  8)、open_links (同时打开的链接数)
  9)、dml_locks
  10)、open_cursors (打开光标数)
  11)、dbwr_io_slaves (后台写进程数)
  6. IN和EXISTS