zoukankan      html  css  js  c++  java
  • Oracle笔记收藏

    一、Oracle复制表结构及数据

    1.复制表结构及数据

    create table table_name_new as select * from table_name_old 

    2.只复制表结构

    create table table_name_new as select * from table_name_old where 1=2; 

    或者

    create table table_name_new like table_name_old

    3.只复制表数据,如果两张表结构一样的话

    insert into table_name_new select * from table_name_old 

    4.如果两张表结构不一样的话

    insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

    二、Oracle 建立索引及SQL优化

    数据库索引:

    索引有单列索引
    复合索引之说


    如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。

    建设原则:

     1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。

     2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。

     3、不应该在小表上建设索引。

    优缺点:
     1、索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。

    创建索引:
     单一索引:Create Index <Index-Name> On <Table_Name>(Column_Name);

     复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。

      select * from emp where deptno=66 and job='sals' ->走索引。

      select * from emp where deptno=66 OR job='sals' ->将进行全表扫描。不走索引

      select * from emp where deptno=66 ->走索引。

      select * from emp where job='sals' ->进行全表扫描、不走索引。

      如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。

     


    Sql 优化:

    当Oracle数据库拿到SQL语句时,其会根据查询优化器分析该语句,并根据分析结果生成查询执行计划。
    也就是说,数据库是执行的查询计划,而不是Sql语句。
    查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器)。
    其中基于规则的查询优化器在10g版本中消失。
    对于规则查询,其最后查询的是全表扫描。而CBO则会根据统计信息进行最后的选择。


    1、先执行From ->Where ->Group By->Order By

    2、执行From 字句是从右往左进行执行。因此必须选择记录条数最少的表放在右边。这是为什么呢?  

    3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。
    因为这样进行连接时,可以去掉大多不重复的项。  

    4. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

    5、索引失效的情况:
     ① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null。 则会是索引失效。
     ② 索引列上不要使用函数,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%' 会使用索引。

     ③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
    SELECT Col FROM tbl WHERE col > 10 * 10

     ④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10
    应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。

    6、用UNION替换OR(适用于索引列)
      union:是将两个查询的结果集进行追加在一起,它不会引起列的变化。 由于是追加操作,需要两个结果集的列数应该是相关的,
    并且相应列的数据类型也应该相当的。union 返回两个结果集,同时将两个结果集重复的项进行消除。 如果不进行消除,用UNOIN ALL.

    通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效.
    如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.

      高效:
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE LOC_ID = 10
      UNION
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE REGION = “MELBOURNE”

      低效:
      SELECT LOC_ID , LOC_DESC , REGION
      FROM LOCATION
      WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
      如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.

    7. 用EXISTS替代IN、用NOT EXISTS替代NOT IN
    在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接. 在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.
    在子查询中, NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下, NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历).
    为了避免使用NOT IN, 我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

    例子:

    高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)

    低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)

    三、Oracle 序列(sequence)的创建、修改及删除

    1.Oracle 创建序列化:create sequence xxxx

    create sequence student_id
    minvalue 1  --最小值
    nomaxvalue  --不设置最大值(由机器决定),或 根据表字段的值范围设置 maxvalue
    maxvalue 999  -- 最大值
    start with 1   --从1开始计数,数值可变
    increment by 1  --每次加1,数值可变
    nocycle  --一直累加,不循环;cycle:达到最大值后,将从头开始累加
    nocache;  --不建缓冲区。   如果建立cache那么系统将自动读取cache值个seq,这样会加快运行速度;如果在单机中使用cache,或者oracle死了,那么下次读取的seq值将不连贯,所以不建议使用cache。
    

     2.Oracle 修改序列化:alter sequence xxxx

    alter sequence student_id -- 序列名 也可以更改
    minvalue 1   
    maxvalue 99999999  
    start with 10   
    increment by 1  
    cycle    -- 到10000后,从头开始
    nocache;
    

    注:

      1、如果想要改变start的值,必须 drop  sequence 再重建一个序列

      2、如果想要改变minvalue的值,必须删除序列化后再重新建立序列化。不可以修改序列化的minvalue。

     3.Oracle 删除序列化:drop sequence xxxx

    drop sequence student_id;
    

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

    oracle安装教程:https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html

  • 相关阅读:
    使用 ASP.NET 2.0 ObjectDataSource 控件

    掌握 ASP.NET 之路:自定义实体类简介
    将 JavaScript 与 ASP.NET 2.0 配合使用
    C# 程序的通用结构
    实例化web service里类的实例
    Web服务枚举组件不可用 修复 (转载)
    09年初步学习计划
    Javascript return false的作用
    如何识别 SQL Server 的版本
  • 原文地址:https://www.cnblogs.com/js2ja/p/10696605.html
Copyright © 2011-2022 走看看