如果对您有帮助
请点击上方“程序猿干货铺”关注我们
您的关注对我们意义重大
本文共2150字,阅读需要约4.3分钟
前段时间太忙了,本人停更了好久,现在有时间了,各个专栏都会慢慢恢复更新的
1什么是DBMS?
数据库管理系统,Database Management System,用于建立、使用和维护数据库,简称DBMS。他对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。数据库管理系统是一个提供数据录入、删除、修改、查询的数据操作软件,具有数据定义、数据操作、数据存储与管理、数据维护、通信等功能。
2Oracle数据库硬件性能优化
Oracle数据库是目前业界较为成功的关系型数据库系统,可以运行在Unix、Windows等主流操作系统平台。
数据库的性能取决于CPU、内存、磁盘、网络条件。数据库建立在多个表空间上,分为控制文件、日志文件、数据文件、口令文件、参数文件。
磁盘读写进度对数据库是至关重要的,数据库对象在物理设备上的合理分布可以改善性能
磁盘镜像会减慢磁盘写的速度
通过日志文件和归档文件与控制文件和数据文件分离,可以提高系统性能
不同的数据库放在不同的硬盘上,建议把数据库、回滚段、日志放在不同设备上
减少无关I/O
Oracle中文件类型推荐使用RAID级别
RAID通常使用在数据库集群上,也就是RAC模式。当数据库访问压力较大时,我们需要做负载均衡。
3操作系统参数调整
在Linux系统上,我们可以通过一系列指令来查看系统负载
cat /proc/cpuinfocat /proc/meminfodf -h
我们还可以使用top和free来查看CPU和内存的使用情况
我们可以在Linux上修改用户的Shell限制
vim /etc/security/limits.conforacle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536
nofile是最大可以打开的文件数量,nproc是单个用户可用的最大进程数量。soft的是软限制,hard是硬限制,用户可以超过软限制但一定不能超过硬限制,一般soft比hard小。
PAM验证模块/lib/security/pam_limits.so可以限制用户会话过程中对各种系统资源的使用。
我们还可以修改Linux内核的shmall和shmmax参数。SHMMAX是Linux进程可以分配的单独共享内存段的最大值,一般设置为内存大小的一半。SHMALL设置共享内存总页数。这个值太小了可能导致数据库启动报错。
4Oracle数据库内存分配
自动SGA管理 (ASMM),可以自动分配Oracle使用的内存
ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;ALTER SYSTEM SET SGA_TARGET = 1024M SCOPE = SPFILE;ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 1024M SCOPE = SPFILE;
MEMORY_TARGET是动态控制SGA和PGA时,Oracle总共可以使用的共享内存大小。
MEMORY_MAX_TARGET是定义的MEMORY_TARGET最大可以达到而不用重启实例的值。SGA_TARGET与PGA_AGGREGATE_TARGET都设置为0,才能开启自动内存管理。
Oracle官方文档推荐,MEMORY_TARGET=物理内存x80%,MEMORY_MAX_SIZE=物理内存x80%.对于OLTP西永,SGA_TARGET=(物理内存x80%)x80%,SGA_MAX_SIZE=(物理内存x80%)x80%,PGA_AGGREGATE_TARGET=(物理内存x80%)x20%。对于OLAP系统,SGA_TARGET=(物理内存x80%)x50%,SGA_MAX_SIZE=(物理内存x80%)x50%,PGA_AGGREGATE_TARGET=(物理内存x80%)x50%
5Oracle数据结构设计
数据库设计规范
表中应该避免可为空的列,虽然表中允许空列,但是空字段是一种特殊的数据类型
表不应该有重复的值或者列
表中记录应该有一个唯一的标识符,在数据库表设计的时候应该用一个ID来唯一地标识行记录
数据库要有一个统一的前缀
尽量只存储单一实体类型的数据
字段的设计
字段的选择尽量避免隐式转换导致无法使用索引。
建议使用NUMBER(m,n)
VARCHAR2(n),n=10,20,50,100,200,500,1000,2000,4000, …
BLOB应该只在长度超过2000字节的时候使用
谨慎使用TIMESTAMP类型,这个类做查询的代价比较高
不建议使用CHAR类型,不建议选择LONG RAW类型
字段顺序
靠近记录开始的地方字段定位速度会明显快于记录尾的字段
常用的字段放在前面
末尾的null值不保存,因此建议null字段放表末端
索引设计
索引字段建议非空,如果有空值就设置一个缺省值
表索引原则上在5个内
单字段上索引原则上不能超过2个
复合索引原则上不能超过3个字段
分区表原则上全部使用LOCAL索引
索引字段的选择
频繁出现在where子句里的字段建议建立索引
用来和其他表关联的字段建议建立索引
索引字段建议有高的选择性和过滤性
对于枚举值较少的字段,建议不要创建B-tree索引,建议建立bitmap索引
在where子句里作为函数参数的字段,不能创建索引,不建议建立函数索引
建立索引的时候,建议考虑到select和insert,update,delete的平衡
一般建议在查询数据量10%以下使用索引
复合索引字段
增加索引选择性,降低I/O
where子句的查询条件构成索引字段前沿列
将频繁查询的字段放在前面
如果所有字段查询频率相同,则把选择性好的字段放在前面
如果所有字段查询频率相同,则把表中数据的排列顺序所依据的字段放在前面
6Oracle SQL语句优化
根据下面的方法,来提升SQL语句的执行效率
对于分区表的查询,原则上使用分区表
必要时,使用hint固定关键SQL语句执行计划,原则上批量作业要用hint指定索引
对于关键SQL语句,尽量简化,不要包含太多层次,原则上不超过2层
使用绑定变量,减少数据库硬解析
字符型字段建议加单引号,避免where查询条件做隐形转换后出现混乱
尽量减少in的使用
使用union的时候如果没有混合数据逻辑建议使用union all代替
注意like的使用方法,%变量%及%变量是用不到索引的,变量%要注意查询范围,%放到越靠后使用索引范围越大
commit不能单步提交,建议100-1000做一次提交
snapshot too old 错误原则是跟数据库无关,大多是select效率低引起
动态sql尽量少用,容易产生大量硬解析,并造成library cache pin等待
where子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描
用>=替代>,用UNION替代OR,用IN代替OR
IN和NOT IN也要慎用
用exists代替in,DISTINCT
避免在索引列上使用IS NULL和IS NOT NULL
避免改变索引列的类型
减少使用select * 来进行查询
摆放where子句时,把能过滤大量数据的条件放在最下边,where执行会从下往上执行
用TRUNCATE替代DELETE
用内部函数提高SQL效率