Oracle 学习之建表、索引、同义词以及SQL优化
栏目:耀世登录 发布时间:2024-03-04
一、Oracle建表:1、建表语句:二、建表注意事项:2.1在设计大型数据库时,把允许NULL的列放在表的后面。原因:在数据库存储的时候,如果字段为NULL,该值不会存储,正是因为这样数据库比较大或者空字段比较多的时候,把允许为空字段放在末尾,能减少数据库的存储空间2.2养

一、Oracle 建表:
1、建表语句:

 

二、建表注意事项:
2.1 在设计大型数据库时,把允许NULL的列放在表的后面
原因:在数据库存储的时候,如果字段为NULL,该值不会存储,正是因为这样数据库比较大或者空字段比较多的时候,把允许为空字段放在末尾,能减少数据库的存储空间
2.2 养成勤于写注释的习惯
2.3 选择合适的数据类型与长度
表的字段太长,会浪费存储空间;字段太短,会影响前台显示
不能够确认数据长度,最好采用变长的数据类型
2.4 确定表需要采用的完整性约束和默认值
2.5 确定表需要采用的类型
存储用户数据可以使用标准表、索引表、筑表和分区表。选择适当的类型,可以提高数据库性能。
栗子:数据库管理员可以使用筑表节省存储空间并提高特定类型的SQL语句的性能;在索引表中,可以通过溢出存储功能提高常用列的查询速度,但索引表所存储的数据,变化比较频繁的话,采用索引表这种类型的表格,反而会事倍功半。
三、栗子:

四、创建索引:
索引:对数据库表中的某些列进行排序,生成独立的索引表,便于提高查询效率。
创建索引:
 单一索引:Create Index On <Table_Name>(Column_Name);
 复合索引: Create Index i_deptno_job on emp(deptno,job);
4.1 创建索引的作用:

  • 可以大大加快数据的检索速度
  • 通过创建唯一索引,保证数据库表中每行数据的唯一性
  • 可以加速表和表之间的连接
  • 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

4.2 如何选择索引列:
4.2.1 应该建索引列的特点
a. 在经常需要搜索的列上,可以加快搜索的速度
b. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
c. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
d. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排好序,其指定的范围是连续的
e. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间
f. 在经常使用在where 子句的列上创建索引,加快条件的判断速度。

4.2.2 不应该建索引列的特点
a. 对于那些在查询中很少使用或者参考的列不应该创建索引。因为不常使用,所以有无索引不能提高速度。相反,增加了索引,反而降低了系统的维护速度和增大了空间需求。
b. 对于那些只有很少数据值的列也不应该增加索引。例如某表的性别列,在查询的结果中,结果集的数据行占据了表中数据行的很大比例,增加索引,不能明显加快检索速度。
c. 对于那些定义为blob 数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少
d. 当修改性能远远大于检索性能时,不应该创建索引(数据量庞大,可以考虑创建分区索引)。这是因为修改性能和检索性能是互相矛盾的。

4.3 限制索引:
a.使用不等于操作符(<>、!=)和NOT
如:SELECT Col FROM tbl WHERE col ! = 10
应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。
*注意:*通过把不等于操作符改成 OR 条件,就可以使用索引,以避免全表扫描。
b. 使用 is null 或 is not null (因为null 没有被定义)
c. 使用函数
如果不使用基于函数的索引,那么在 SQL 语句的 WHERE 子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
例如:select empno,ename,deptno from emp where trunc(hiredate)=‘01-MAY-81’; 不会使用索引,select empno,ename,deptno from emp where hiredate<(to_date(‘01-MAY-81’)+0.9999);会使用索引
SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = ‘ABC’
或者SELECT Col FROM tbl WHERE name LIKE ‘%ABC%’ 而SELECT Col FROM tbl WHERE name LIKE ‘ABC%’ 会使用索引
d.索引列上不能进行计算:
SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
SELECT Col FROM tbl WHERE col > 10 * 10
e. 比较不匹配的数据类型
f.用UNION替换OR(适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效.
g.用EXISTS替代IN、用NOT EXISTS替代NOT IN (NOT IN 对子查询中的表执行了一个全表遍历)

五、同义词的创建及其使用:
同义词即别名。是一种映射关系。
在使用同义词时,Oracle数据库将它翻译为对应方案对象的名字,与视图类似,同义词并不占实际存储空间,只是在数据字典中保存了同义词的定义。
1. 创建同义词语句:
create public synonym table_name for user.table_name;
如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个DB Link(数据库连接)来扩展访问,然后使用如下语句:create synonym table_name for table_name@DB_Link;
还需要授权:
grant select ,insert on 表 to 用户;
select * from dba_synonyms;//查看所有的同义词
drop public synonym table_name;//删除同义词
2.使用同义词的优势:
2.1 节省大量的数据库空间,不同的用户操作同一张表没有多少区别
2.2 扩展数据库使用范围,能够在不同的数据库用户之间实现无缝交互
2.3 同义词可以创建在不同的数据库服务器上,通过网络实现连接
3. 为什么使用同义词:
在Oracle中对数据库的管理是使用的方式来管理的。即我们想要使用数据库,就必须得有权限,只要将权限授予某用户,使用该用户就能对数据库进行操作,但如果是跨数据库(或者跨用户),就必须在表的名称前键入该表所有的的名称,这样比较麻烦。创建一个同义词就能解决,有了同义词就可以直接使用同义词来使用表。

 

4.Oracle同义词分类:
公用同义词:所有的用户都可以使用。
私用同义词:创建它的用户拥有,但可以授权给其他用户是否有权使用该同义词。
5.Oracle 同义词的作用
a.多用户协同开发中,可以屏蔽对象的名字及其持有者。栗子:如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,有了同义词之后,就可以省略user名。注意,如果给这个用户没有授权,也还是不能使用别名的。
b.为用户简化sql. 省略user名,也是一种简化sql的体现,如果表明过长,给其建同义词也是一种简化
c.为分布式数据库的远程对象提供位置透明性
6.Oracle同义词在数据库链中的作用:
是一个命名的对象,说用一个数据库到另外一个数据库的路径,通过其可以。
Create database link 数据库链名 connect to user名 identified by 口令 using ‘Oracle连接串’; 访问对象要通过 object名@数据库链名。同义词在数据库链中的作用就是提供位置透明性。

六、SQL优化:
1、SQL语句执行步骤:
语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执行计划”。
当Oracle数据库拿到SQL语句时,其会根据分析该语句,并根据分析结果生成查询。即数据库执行的是查询计划,而不是SQL语句。
查询优化器有:rule-based-optimizer(基于规则的查询优化器,10g版本已消失) 和Cost-Based-optimizer(基于成本的查询优化器), CHOOSE(选择性)
a.先执行From->Where ->Group By->Order By
b.执行From 字句是进行执行。因此必须选择记录条数最少的表放在右边。(ORACLE处理多个表时,会运用排序及合并的方式连接它们)
c.对于Where字句其执行顺序是执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。(这样连接是为了去掉大多不重复的项)
d.SELECT子句中避免使用,ORACLE在解析的过程中,会将*依次转换成所有列名,这个工作是由查询数据字典完成的,意味着将耗费更多的时间。
2、访问Table的方式:
全表扫描:
全表扫描就是顺序地访问表中每条记录,ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描
通过ROWID访问表:
ROWID包含了表中记录的物理位置信息,ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系,通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
3、共享SQL语句:
a.Oracle提供对执行过的SQL语句进行高速缓冲的机制。被解析过并且确定了执行路径的SQL语句存放在的共享池中
b.Oracle执行一个SQL语句之前每次先从SGA共享池中查找是否有缓冲的SQL语句,如果有则直接执行该SQL语句
c.可以通过适当调整SGA共享池大小来达到提高Oracle执行性能的目的。

4、分析sql语句的方式:
a.用Explain Plan分析SQL语句
用法:Explain Plan for 【SQL语句】;
b.SQL PLUS的TRACE
用法:set autotrace [traceonly/off/on];//traceonly不显示结果,on会显示结果。
栗子:
先连接到数据库:在这里插入图片描述
然后输入:set autotrace on;
在这里插入图片描述

平台注册入口