Oracle数据库优化(重点)


一、数据库优化

数据库性能的最关键因素在于IO,因为内存是快速的,但读写磁盘的速度很慢,优化数据库的关键就是减少磁盘的IO,数据库的优化可以分为物理优化和逻辑优化。


从图上可以看到基本上每种设备都有两个指标:

延时(响应时间):表示硬件的突发处理能力;

带宽(吞吐量):代表硬件持续处理能力。

从上图可以看出,计算机系统硬件性能从高到代依次为:

CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘

由于SSD硬盘还处于快速发展阶段,所以本文的内容不涉及SSD相关应用系统。

根据数据库知识,我们可以列出每种硬件主要的工作内容:

CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算;

网络:结果数据传输、SQL请求、远程数据库访问(dblink);

硬盘:数据访问、数据写入、日志记录、大数据量排序、大表连接。


二、物理优化

对机器设备进行硬件的升级


三、逻辑优化(核心:在操作数据时,采用索引,避免全表扫描

1、创建并正确使用索引,要避免进行全表扫描

B-TREE索引也称为平衡树索引(Balance Tree),它是一种按字段排好序的树形目录结构,主要用于提升查询性能和唯一约束支持。B-TREE索引的内容包括根节点、分支节点、叶子节点。

叶子节点内容:索引字段内容+表记录ROWID

根节点,分支节点内容:当一个数据块中不能放下所有索引字段数据时,就会形成树形的根节点或分支节点,根节点与分支节点保存了索引树的顺序及各层级间的引用关系。


2、尽量使用明确的查询条件,在使用模糊查询时,要注意查询时的条件设置。

LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。


3、where子句优化

Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引


4、用exists和not  exists代替  in  和  not  in(重点)

注意:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

通俗讲:外查询的每一条记录,都代入到内查询中进行检验,如果内查询中有结果,返回true,保存该条记录;如果内查询中没有结果,返回false,舍弃该条记录。

例如:select * from  emp    where  exists  ( select  1  from  dept  where  emp.deptno = dept.deptno);

注意:例子中select 1 ,注意select后面可以加数字会作为表的一个新字段,不能加字符串或者字母,因为他会和表中的字段进行对比,表中没有一样的字段名就会报错。

exists子句的解析过程:

分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

注意:将表导入内存中时,接着找到where关键字,如果没有找到where就回到select关键字,分析后面的字段。

本质:就是返回一个含有真假的虚表,来决定是否执行该条外查询语句。exists子句是根据where后面的条件判断真假

外部查询的项和内部查询项对比时只会看是否为ture,如果为ture则列出结果。

例子:select  *  from  dept  where  exists (select  1  from  salgrade); 

结果会返回dept表的所有记录,因为exists()表示都为真。




猜你喜欢

转载自blog.csdn.net/qq30211478/article/details/78740217
今日推荐