美文网首页
Oracle基础知识

Oracle基础知识

作者: 五十米_深蓝 | 来源:发表于2018-08-07 15:24 被阅读11次

一、oracle名词介绍
(1)Rowid:sql查询语句不带上Rowid字段,则不允许对查询结果进行更新操作。

rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。 对每个表都有一个rowid的伪列,
但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除改列,也不能对该列的值进行 修改、插入。
一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即使该行产生行迁移,行的rowid也不会改变。

二、索引建立原则
数据库建立索引的原则
(1)选择唯一性索引。唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。
(2)为经常需要排序、分组和联合操作的字段建立索引。经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。
(3)为常作为查询条件的字段建立索引。如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。
(4)限制索引的数目。索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。
(5)尽量使用数据量少的索引。如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。
(6)尽量使用前缀来索引。 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
(7)删除不再使用或者很少使用的索引;表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。
(8)最左前缀匹配原则,非常重要的原则。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
(9)尽量选择区分度高的列作为索引。
(10)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
(11)索引列不能参与计算,保持列“干净”。
三、执行计划

1、基于成本优化器:根据可用的访问路径、对象的统计信息、来选择一个成本最低的执行计划。
2、基于规则优化器:根据可用的访问路径和访问路径的等级来选择执行计划,
等级越高的访问路径通常运行SQL越慢,Oracle总是选择等级较低的访问路径。
Oracle表连接方式:
1、SORT MERGE JOIN(排序-合并连接):  通常情况下哈希连接的效果都比排序合并连接要好。然而如果行源已经被排过序,
在执行排序合并连接时不需要再排序了,这时排序归并连接的性能会忧于哈希连接。两个数据集可以并行处理:
2、NESTED LOOPS(嵌套循环):对于被连接的数据子集较小(外表驱动)的情况,嵌套循环连接是较好的选择。
3、HASH JOIN(哈希连接):哈希连接是大数据集连接时常用的方式,
优化器使用两个表中较小的表,利用连接键在内存中建立散列表,只适合等值连接;
4、CARTESIAN PRODUCT(笛卡尔积)

四、联合查询

1、内连接(inner Join 或 Join)
仅显示两个表中匹配行,即两表中都有才显示。

2、外连接(outer Join) 
(1)左外连接(left outer Join 或 left Join)
  左表有就显示,不论右表。
(2)右外连接(right outer Join 或 right Join)
  右表有就显示,不论左表。
(3)全外连接(full outer Join 或 full Join)、
  左表/右表,有一个有就显示。------mysql木有

3、交叉连接 (cross Join)
交叉连接是对A、B量表进行笛卡尔积的结果查询出来。即A的每条记录都有和B中所有记录相对应的信息。
A*B=结果总数

4、结果集链接 (union 和 union all)
将多个select结果集进行合并。值得注意的是,UNION 内部的 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
如果2个Select结果集中存在相同的结果,用Union则会把相同的记录进行合并,查询结果中仅仅会显示一条。
那么如果想都显示出来,把Union换成Union All 即可。

五、DDL、DML的区别

1、DML:数据操纵语言
就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。

2、DDL:数据库定义语言
其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。
DDL主要是用在定义或改变表的结构,数据类型;


3、DCL:数据库控制语言;
是用来设置或更改数据库用户或角色权限的语句,包括(grant等)语句。

六、角色权限表设计问题

一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。

当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。
这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。

七、高效sql原则

1、from 子句--执行顺序为从后往前、从右到左;
最后面的那个表名为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后;
2、where子句--执行顺序为自下而上、从右到左;
将可以过滤掉大量数据的条件写在where的子句的末尾性能最优;
3、select子句最好不要用*号(转换为所有的列名),尽量取具体字段名称。 使用列名意味着将减少消耗时间。
4、用where子句替换having子句;
where子句搜索条件在进行分组操作之前应用;而having自己条件在进行分组操作之后应用。
避免使用having子句,having子句只会在检索出所有纪录之后才对结果集进行过滤,这个处理需要排序,总计等操作。
如果能通过where子句限制记录的数目,那就能减少这方面的开销。
5、用exists、not exists和in、not in相互替代;
IN适合于外表大而内表小的情况;exists适合于外表小而内表大的情况;
6、使用exists替代distinct;
select dept_no,dept_name from dept d where  exists (select 'x' from emp e where e.dept_no=d.dept_no)
因为exists只是看子查询是否有结果返回,而不关心返回的什么内容,因此建议写一个常量,性能较高!
7、避免隐式数据类型转换;
隐式数据类型转换不能适用索引,导致全表扫描!
char型索引写成了num型,进行了数据隐士转换,导致索引失效;
8、不要在选择性较低的字段建立索引;
比如,性别列,男和女!
9、尽量使用前端匹配的模糊查询;
例如,column1 like 'ABC%'方式,可以对column1字段进行索引范围扫描;
而column1 kike '%ABC%'方式,即使column1字段上存在索引,也无法使用该索引,只能走全表扫描。
10、使用索引来避免排序操作;
如果order by、group by后面的字段上建有索引,将会大大提升效率!
11、避免对列的操作;
不要在where条件中对字段进行数学表达式运算;包括数据库函数,计算表达式等等;
12、尽量去掉"IN","OR";
含有"IN"、"OR"(前面不是索引、后面是索引,就会失效,基于最左原则)的where子句常会使用工作表,使索引失效,
如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引;
13、尽量去掉"<>";
尽量去掉"<>",避免全表扫描,如果数据是枚举值,且取值范围固定,可以使用"or"方式;
14、避免在索引列上使用IS NULL或者NOT;
避免在索引中使用任何可以为空的列,导致无法使用索引;
15、批量提交sql;
如果你需要在一个在线的网站上去执行一个大的DELETE或INSERT操作(这两种操作会锁表),可能导致线程积压,web应用崩溃;所以,如果你有一个大的处理,一定把其拆分。

相关文章

  • oracle基础知识

    oracle基本面试问题 数据库基础知识1.1 oracle的组件1.2 oracle12c的特性1.3 不能创建...

  • Oracle数据库学习整理(一)

    Oracle 基础知识 查询数据 本节将学习如何从Oracle数据库中查询数据。 ●Select语句-演示如何查询...

  • Oracle基础知识

    一、oracle名词介绍(1)Rowid:sql查询语句不带上Rowid字段,则不允许对查询结果进行更新操作。 二...

  • oracle基础知识

    系统用户: 1.sys system(sys权限最高) 2.sysman(操作企业管理器) 密码是安装的时候输入的...

  • Oracle 基础知识

    查询数据 本节将学习如何从Oracle数据库中查询数据。 ●Select语句-演示如何查询单个表中的数据。 排序数...

  • ORACLE-基础知识

    创建用户 SQLPLUS 插入数据乱码 CPU资源占用过高分析 先使用TOP命令,查看占用资源过高的进程 然后使用...

  • Oracle基础知识小结

    1、字符串类操作 CLOB字段操作: select * from tab1 t where DBMS_LOB.SU...

  • Oracle基础知识杂谈

    主题一: 体系结构 数据库很复杂---》体系结构很复杂---》为什么体系结构很复杂? 因为稀有资源不足,所以ora...

  • oracle 基础知识总结

    orcle 数据库名是orcl 有system scott hr 等多个用户,其中system为管理员账户,每个账...

  • Oracle 基础

    一。基础知识 Oracle - 数据库的实例、表空间、用户、表之间关系 数据库的实例 数据库实例名(instanc...

网友评论

      本文标题:Oracle基础知识

      本文链接:https://www.haomeiwen.com/subject/ajeipftx.html