oracle中select*的性能与全部字段查询 哪个性能好一点_快速入门全栈(七) DBMS性能调优...

如果对您有帮助

请点击上方“程序猿干货铺”关注我们

您的关注对我们意义重大

本文共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效率


46051739e9a9fa7cb73877ccb08c57d4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值