我个人关于ORACLE课程提纲的总结

1. 简单介绍下ORACLE的总体框架

oracle的体系很庞大,要学习它,首先让我们了解oracle的框架。在这里,简要的讲一下oracle的架构

1、 物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)

? 控制文件:包含维护和验证数据库完整性的必要信息、一个数据库至少需要一?

?

?

?

? 个控制文件 数据文件:存储数据的文件 重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件 参数文件:定义Oracle 例程的特性,例如它包含调整SGA 中一些内存结构大小的参数 归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。 密码文件:认证哪些用户有权限启动和关闭Oracle例程

2、 逻辑结构(表空间、段、区、块)

? 表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。

? 段:是对象在数据库中占用的空间

?

? 区:是为数据一次性预留的一个较大的存储空间 块:ORACLE最基本的存储单位,在建立数据库的时候指定

3、 内存分配(SGA和PGA)

? SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

? PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收

4、 后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)

?

?

?

?

?

?

?

? 数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件 系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复 进程监控:负责在一个Oracle 进程失败时清理资源 检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。 归档进程:在每次日志切换时把已满的日志组进行备份或归档 服务进程:用户进程服务。 用户进程:在客户端,负责将用户的SQL 语句传递给服务进程,并从服务器段拿回查询数据。

5、 oracle例程:Oracle 例程由SGA 内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。

6、 SCN(System Change Number):系统改变号,一个由系统内部维护的序列号。当

系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重

要标志。

2. 介绍项目中常用的标准SQL知识点

oracle左/右/全连接

inner join --内连接和where相同;相当于join;

left join --左向外连接,返回左边表所有符合条件的

right join --右向外连接,返回右边表所有符合条件的

full join --完整外部连接,左向外连接和右向外连接的合集

--建立测试数据

create table a(id number);

create table b(id number);

create table c(id number);

insert into a values(1);

insert into a values(2);

insert into a values(3);

insert into b values(1);

insert into b values(2);

insert into b values(4);

insert into c values(1);

--左:

--主流数据库通用的方法

select * from a left join b on a.id=b.id;

--Oracle特有的方法 --最好不要用这样,不便于sql语句的移植。

select * from a, b where a.id=b.id(+);

ID ID

---------- ----------

1 1

2 2

3

--右:

--主流数据库通用的方法

select * from a right join b on a.id=b.id;

--Oracle特有的方法

select * from a, b where a.id(+)=b.id;

ID ID

---------- ----------

1 1

2 2

4

--内

--主流数据库通用的方法

select * from a join b on a.id=b.id;

--where关联

select * from a, b where a.id=b.id;

ID ID

---------- ----------

1 1

2 2

--全外

--主流数据库通用的方法

select * from a full join b on a.id=b.id;

--Oracle特有的方法

select *

from a, b

where a.id = b.id(+)

union

select *

from a, b

where a.id(+) = b.id;

ID ID

---------- ----------

1 1

2 2

3

4

对于多表查询,如下:

select * from a

left join b on a.id=b.id

left join c on c.id=b.id;

ID ID

---------- ----------

1 1

2 2

3

相当于先进行第一个left join,得到结果集A(3条记录);结果集A再与第二个left join进行查询;

select * from a

left join b on a.id=b.id

right join c on c.id=b.id;

相当于先进行第一个left join,得到结果集A(3条记录);结果集A再与right join进行查询,即以c表为主,因为C表只有一个记录,所以最终才显示一条记录;

3. 查询效率优化方式介绍

表索引介绍,表索引的建立技巧

索引优点:

第一, 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二, 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三, 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四, 在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排序

的时间。

第五, 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

(哪给表中的所有列加上索引是否合理)

索引缺点:

第一, 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二, 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的

物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三, 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就

降低了数据的维护速度。

(索引是建立在数据库表中的某些列的上面。因此,在创建Oracle数据库索引

的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。) ?

?

?

?

?

?

? 建议创建索引的列: 在经常需要搜索的列上,可以加快搜索的速度; 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 不该创建索引的列: 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列

很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索? 引,反而降低了系统的维护速度和增大了空间需求。 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很

少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索? 速度。 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这

些列的数据量要么相当大,要么取值很少。

? 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和

检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建Oracle数据库索引。

? NESTED LOOP:

对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表(CBO 默认外表是驱动表),而且在内表的连接字段上一定要有索引。当然也可以用ORDERED 提示来改变CBO默认的驱动表,使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。

Nested loop一般用在连接的表中有索引,并且索引选择性较好的时候.

步骤:确定一个驱动表(outer table),另一个表为inner table,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)。需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。

?

4. ORACLE常用内部函数

5. ORACLE数据库的特点将结合第2和第3项讲

6. 安装ORACLE练习环境

 

第二篇:[转]Oracle的性能测试总结

[转]Oracle的性能测试总结

LR测试ORACLE进行1000用户的压力模拟测试.整个压力测试耗时两天.以下是一些经验:

1)压力测试过程中发现一些SQL脚本执行非常慢,进行了优化.

2)最好并发测试,否则服务基本上没有什么压力.

3)先从100用户开始,再慢慢向上加,直到CPU的承载达到90%以上.查看系统的性能情

况,包括TPS,响应时间,和内存等.

还包括oracle服务器的I/O流量和交易数。

这个方案是参考了淘宝的机房性能测试方案,下面是性能测试的具体步骤:

oracle的性能测试主要是模拟大量的sql语句操作,来对数据库服务器进行加压。在测试前,需要准备以下要模拟的sql语句,测试脚本,并将测试控制机、测试加压机、被

测数据库服务器准备妥当。

脚本协议选择oracle(2-Tier),将所有要模拟的sql语句放在一个sql文件内,使用sql-plus来操作数据库载入,使用 loadrunner来录制。录制好之后就是修改脚本了,

首先在vdf.h文件中定义变量(static void FAR * OraBind1;),定义参数(

static LRD_VAR_DESC UID =

{LRD_VAR_DESC_EYECAT, 1, 10, LRD_DBTYPE_ORACLE, {1, 1, 0},

DT_SF_STRIPPED_SPACES};)。

为什么要在这里定义而不直接只用参数化呢?因为那样会对加压机造成很大的压力,不利于测试。这里需要根据你的脚本来变化,你在脚本中使用了多少变量,多少参数,那么你就在要这里定义多少。接下来修改脚本的,将一次性的登陆退出放在init和end中,

使用lrd_assign和 lrd_ora8_bind_placeholder命令替代参数,如

lrd_ora8_stmt(OraStm6, "SELECT COUNT(*) as counter FROM ***** WHERE ***_id="

":U and ( status = 0 or "

"status is null)", 1, 0, 0);

lrd_assign(&UID , "{UID}", "", 0, 0);

lrd_ora8_bind_placeholder(OraStm6, &OraBind1, "U", &UID , 0, 0, 0);

这样,脚本就差不多大功告成了。编译一下,没有问题就通过了^o^

将脚本放在控制机上,就可以开始加压了,注意的是,被测数据库服务器的各个参数配置要记录下来,以便修改参数调优时能分析清晰。记录下数据库的iops,time,tps和

响应时间,结果汇总出报告。

相关推荐