影响SQL性能的源头

【IT168 技术文档】任何事情都有它的源头,要解决问题,也得从源头开始,影响ORACLE性能的源头很是多,主要包括以下方面:数据库的硬件配置:CPU、内存、网络条件。sql

  1. CPU:在任何机器中CPU的数据处理能力每每是衡量计算机性能的一个标志,而且ORACLE是一个提供并行能力的数据库系统,在CPU方面的要求就更高了,若是运行队列数目超过了CPU处理的数目,性能就会降低,咱们要解决的问题就是要适当增长CPU的数量了,固然咱们还能够将须要许多资源的进程KILL掉;数据库

  2. 内存:衡量机器性能的另一个指标就是内存的多少了,在ORACLE中内存和咱们在建数据库中的交换区进行数据的交换,读数据时,磁盘I/O必须等待物理I/O操做完成,在出现ORACLE的内存瓶颈时,咱们第一个要考虑的是增长内存,因为I/O的响应时间是影响ORACLE性能的主要参数,我将在这方面进行详细的讲解缓存

  3. 网络条件:NET*SQL负责数据在网络上的来往,大量的SQL会令网络速度变慢。好比10M的网卡和100的网卡就对NET*SQL有很是明显的影响,还有交换机、集线器等等网络设备的性能对网络的影响很明显,建议在任何网络中不要试图用3个集线器来将网段互联。网络

  OS参数的设置异步

  下表给出了OS的参数设置及说明,DBA能够根据实际须要对这些参数进行设置xss

  内核参数名async

  说明性能

  bufpages大数据

  对buffer空间不按静态分配,采用动态分配,使bufpages值随nbuf一块儿对buffer空间进行动态分配。spa

  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

  有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可使用两种格式的子查询。

  第一种格式是使用IN操做符:

... where column in(select * from ... where ...);

第二种格式是使用EXIST操做符:

... where exists (select 'X' from ...where ...);

相关文章
相关标签/搜索