zoukankan      html  css  js  c++  java
  • PL/SQL开发五年工作经验精典实例

    1. minus(差集)与intersect(交集)

    minus指令是运用在两个SQL语句上。它先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中,如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现; 
    如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃。 
    intersect指令是运用在两个SQL语句上,如果两个SQL语句的记录完全相同则显示相应记录,否则将不在结果中出现。
    -------------------------------------------------------------------------------------------
    2. 表空间(tablespace)、段(segment)、区段(extent)、块(block)的关系
    1)表空间:是Oracle中的一个逻辑存储容器,位于存储层次体系的顶层,包含一个或多个数据文件。
    2)段:占用存储空间的数据为对象,如表、索引、回滚段等;段由一个或多个区段组成。
    3)区段:是文件中一个逻辑上连续分配的空间;区段由块组成。 
    4)块:是Oracle中最小的空间分配单位;数据行、索引条目或临时排序结果就存储在块中;Oracle中常见的块大小:2K、4K、8K、16K(最大不能超过32K)。
    5)它们之间的关系:数据库由一个或多个表空间组成,表空间由一个或多个数据文件组成,表空间包含段,段由一个或多个区段组成,区段则由连续的块组成。

    -------------------------------------------------------------------------------------------
    3. 数据库分析技术语句
    分析表:  analyze table UNIT_PRE_CLAIM compute statistics;


    分析索引:analyze index PK_UNIT_PRE_CLAIM_RELA_ID compute statistics;


    分析列:  analyze table zl_yhjbqk compute statistics for columns hbs_bh;


    分析索引列:analyze table zl_yhjbqk compute statistics for all indexed columns;
    -------------------------------------------------------------------------------------------
    4. ORACLE的优化器共有3种:
    a. RULE (基于规则的优化器) 
    。总是使用索引 
    。总是从驱动表开始(from子句最右边的表) 
    。只有在不可避免的情况下,才使用全表扫描 


    b. COST (基于成本的优化器) 
    。需要表、索引的统计资料 
      Analyze table customer compute statistics; 
      Analyze table customer estimate statistics sample 5000 rows; 
    。表中设置并行度、表分区 


    c. CHOOSE (选择性)
    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS. 你当然也在SQL句级或是会话(session)级对其进行覆盖.
    为了使用基于成本的优化器(CBO, Cost-Based Optimizer), 你必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性.如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关,如果table已经被analyze过, 优化器模式将自动成为CBO, 反之,数据库将采用RULE形式的优化器. 缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan), 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器.注意: 在排序合并连接中不使用索引,如果查询返回两个表中大部分的数据快,那么CBO会认为全表扫描比索引扫描执行更快。 
    -------------------------------------------------------------------------------------------
    5. Hint的常用用法(注意/*和+之间不能有空格)
    1)/*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.


    2)/*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.


    3)/*+CHOOSE*/ 表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
    如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;


    4)/*+ RULE*/ 表明对语句块选择基于规则的优化方法.


    5)/*+ROWID(TABLE)*/ 提示明确表明对指定表根据ROWID进行访问.
    例如: SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'


    6)/*+INDEX(TABLE INDEX_NAME)*/ 表明对表选择索引的扫描方法.


    7)/*+INDEX_JOIN(TABLE INDEX_NAME)*/ 提示明确命令优化器使用索引作为访问路径.


    8)/*+APPEND*/ 直接插入到表的最后,可以提高速度.
    例如: insert /*+append*/ into test1 select * from test4;


    如用hint指定使用某个索引
    select /*+ index(表名) */ col1 from 表名;
    select /*+ index(表名 索引名) */ col1 from 表名;
    select /*+ index(a 索引名) */ col1 from 表名 a;
    其中
    TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
    INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;
    -------------------------------------------------------------------------------------------
    6. 位图索引
    位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。 
    -------------------------------------------------------------------------------------------
    7. 应该尽量避免出现left outer join, right outer join ,尤其是大表,大表更应该尽量避它作为外连接的驱动表

    -------------------------------------------------------------------------------------------
    8. 如获得完整的时间格式
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from  dual;
    select to_char(to_date('2008-06-24','yyyy-mm-dd'),'day') from dual; --可以转换成中文星期几
    -------------------------------------------------------------------------------------------
    9. 随机抽取前N条记录的问题
    select * from (select * from tablename order by sys_guid()) where rownum < N;


    抽取从N行到M行的记录,如从20行到30行的记录
    select * from (select rownum id,t.* from table where ……
    and rownum <= 30) where id > 20;

    -------------------------------------------------------------------------------------------
    10. 怎么样在ORACLE中定时运行存储过程
    可以利用dbms_job包来定时运行作业,如执行存储过程,一个简单的例子,提交一个作业:
    VARIABLE jobno number;
    BEGIN
      DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;', SYSDATE, 'SYSDATE + 1');
      commit;
    END;
    之后,就可以用以下语句查询已经提交的作业 select * from user_jobs;
    -------------------------------------------------------------------------------------------

    11. 固定列数的行列转换
    student  subject grade
    -------- ------- -----
    student1  语文   80
    student1  数学   70
    student1  英语   60
    student2  语文   90
    student2  数学   80
    student2  英语   100
    转换为: 
              语文  数学  英语
    student1   80    70    60
    student2   90    80    100
    …… …… …… …… …… 


    语句如下:
    Select Student,
           Sum(Decode(Subject, '语文', Grade, Null)) "语文",
           Sum(Decode(Subject, '数学', Grade, Null)) "数学",
           Sum(Decode(Subject, '英语', Grade, Null)) "英语"
      From Table
    Group By Student
    -------------------------------------------------------------------------------------------
    12. 怎么样实现分组取前N条记录 (如获取每个部门薪水前三名的员工)
    Select *
      From (Select Depno, Ename, Sal,
                   Row_Number() Over(Partition By Depno Order By Sal Desc) Rn
              From Emp)
    Where Rn <= 3;

    本文转自:http://sakyone.iteye.com/blog/812000

  • 相关阅读:
    Lavarel之环境配置 .env
    总结:关于留学网站使用laravel框架的总结
    新版 OSGi 即将发布
    Flex 4 的十大变化
    NetBeans IDE 6.8 Milestone 1 已经可用!
    JSF 2 简介,第 2 部分: 模板及复合组件
    JSF 2 简介,第 2 部分: 模板及复合组件
    Flex 4 的十大变化
    JSF 2 简介,第 1 部分: 流线化 Web 应用程序开发
    JSF 2 简介,第 3 部分: 事件处理、JavaScript 和 Ajax
  • 原文地址:https://www.cnblogs.com/nizuimeiabc1/p/4254159.html
Copyright © 2011-2022 走看看