oracle学习

2019-03-03 19:08

Oracle 基本知识

一个表空间只能属于一个数据库

每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上) 每个数据库最少有一个表空间(SYSTEM表空间)

建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典 每个数据库最少有两个联机日志组,每组最少一个联机日志文件 一个数据文件只能属于一个表空间

一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中

建立新的表空间需要建立新的数据文件

数据文件被ORACLE格式化为ORACLE块,Oracle9i以前版本中,ORACLE块的大小是在第一次创建数据库时设定的,

并且以后不能改变,要想改变,只能重建数据库

一个段segment只能属于一个表空间,但可以属于多个数据文件

一个区extent只能属于一个数据文件,即区间(extent)不能跨越数据文件 PCTFREE和PCTUSED总和不能大于等于100 单独一个事务不能跨越多个回滚段 索引表不含ROWID值

拥有不同大小的回滚段没有任何益处

COMMIT后,数据不一定立即写盘(数据文件) 一个事务即使不被提交,也会被写入到重做日志中。

Oracle 8.0.4中,在初始安装时建立的缺省数据库,实例名为ORCL 一个块的最大长度为16KB(有2K、4K、8K、16K) 每个数据库最大文件数(按块大小) 2K块 20000个文件

4K块 40000个文件 8K块或以上 65536个文件 oracle server可以同时启动多个数据库

一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以) 一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例 每个ORACLE数据库拥有一个数据库实例(INSTANCE)(OPS除外) 所以,一套操作系统上同时可以有多个oracle数据库实例启动

Oracle在linux上安装的几个问题

Oracle在linux上安装的文章已经很多了,这里不再罗嗦。只是提出几个遇到过的值得注意的问题。

1.安装前的hosts文件 l. cat /etc/hosts

# 检查主机的域名解析,除127.0.0.1外,还要有主机IP hostname条目,否则安装过程中可能出现长时间无反应的情况。 2.配置大SGA(超过1.7G)的问题

安装完软件,建立数据库时配置大SGA(超过1.7G)需执行下面的操作: 1)如果有数据库正在运行,关闭所有的数据库及其服务。 2) echo 3000000000 > /proc/sys/kernel/shmmax

# 修改shmmax的值(可以修改/etc/sysctl.conf文件:kernel.shmmax = 3000000000,/sbin/sysctl –p使改变永久生效) 3) 用Oracle用户执行以下操作 % cd $ORACLE_HOME/rdbms/lib

% cp ksms.o ksms.o_orig # 备份ksms.o文件 % genksms -s 0x15000000 > ksms.s % make -f ins_rdbms.mk ksms.o % make -f ins_rdbms.mk ioracle 3.中文乱码问题

造成这些问题的原因都是一个, 就是这些程序都使用jdk, 相应的jdk(或jre) 使用的字体配置文件 font.properties 中的字体和操作系统的字体或者字体配置文件不匹配. 解决的办法是把两者改成一致.

1) 下载, 解包 ship.db.cpio.gz, 生成目录 Disk1

2) cd Disk1/stage/Components/oracle.swd.jre/1.4.2.0.0/1/DataFiles/ unzip all_except_bin.jar (这时生成一个 jre 的目录) cd jre/1.4.2/lib/

mv font.properties font.properties.bak

cp font.properties.zh_CN.Redhat8.0 font.properties cd ../../../

zip -r all_except_bin.jar.new jre/

mv all_except_bin.jar.new all_except_bin.jar

(其实就是把 font.properties 文件换掉. 这样安装时汉字显示就没有问题了)

3) 如法炮制, 把Disk1/stage/Components/oracle.jdk/1.4.2.0.0/1/DataFiles/sol_bin.1.1.jar 文件里面的font.properties 文件换掉, 创建数据库和执行网络配置时的乱码就没有了. isqlplus 和em 的乱码也解决了.

已经安装好的, 不需要重新安装, 只需将下面三个文件改好, 重新启动相应的程序或服务就可以了.

$ORACLE_HOME/javavm/lib/ojvmfonts/font.properties $ORACLE_HOME/jre/1.4.2/lib/font.properties $ORACLE_HOME/jdk/jre/lib/font.properties 4.版本匹配问题

10.1可以安装在rh3上。如果要在rh4上安装10.1,需要先安装补丁(可从metalink下载)。10.2在rh4上安装没有问题。

Oracle中的SQL语句性能调整原则 一、问题的提出

在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。

在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。

二、SQL语句编写注意问题

下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1. IS NULL 与 IS NOT NULL

不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。 如:

select *

from ncsys.v_fin_voucher where c_dptacc_no in

(select deptcode from yc.bd_deptdoc where pk_corp = '1001') and (c_send_flag is null or c_send_flag = '1') order by c_seq_no

Create Index i_yc_fin_voucher On yc_fin_voucher(c_dptacc_no,c_send_flag); 这时由于c_send_flag 的值都是null。增加索引后,效率没有提交。但是改为 select *

from ncsys.v_fin_voucher where c_dptacc_no in

(select deptcode from yc.bd_deptdoc where pk_corp = '1001') and (nvl(c_send_flag, 1) = 1) order by c_seq_no 性能提交近10倍。

2. 联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采用联接查询的SQL语句, select * from employss where first_name||''||last_name ='Beill Cliton';

上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。

当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。 Select * from employee where first_name ='Beill' and last_name ='Cliton';

遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着Bill Cliton这个员工的姓名,对于这种情况我们又如何避免全程遍历,使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本: select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1) and last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1) 3. 带通配符(%)的like语句

同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句: select * from employee where last_name like '%cliton%';

这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like 'c%';

4. Order by语句

ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语


oracle学习.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:教你学会八字算命判断命知识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: