• Oracle中的伪列<三>


    ROWID: 表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行,ROWID值可以唯一的标识表中的一行,由于ROWID返回的是该行的物理地址,因此使用ROWID可以显示行是如何存储的。
    SELECT ROWID, ename FROM emp WHERE sal > 2000;
     
    ROWNUM: 在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数。
    SELECT ROWNUM, ename, job, sal FROM emp WHERE ROWNUM <= 5; // 取前5名员工的信息
    SELECT ROWNUM, T.* FROM
    (SELECT ename, job, sal FROM emp ORDER BY sal DESC) T
    WHERE ROWNUM <= 5); // 取工资最高的前5
    SELECT * FROM
    (SELECT ROWNUM R, ename, job, sal FROM emp WHERE ROWNUM <= 10)
    WHERE R > 5;
     
    ROWIDROWNUM不同,ROWID是插入数据时生成的,而ROWNUM是查询数据时生成的,ROWID是表示行的物理地址,ROWNUM标识的是查询结果中的行的次序。
     
    这里牵涉到oracle的分页问题,可以写出如下代码,查询速度很快:

    参考:

    http://zhidao.baidu.com/link?url=qFnZn0Rk9RNCOJkdwHxz9tQEPDb1Bt4zj1ifc5k-oH4ppNA2-UgG4UwwFv271NIVwjuKfHXV8Fox1fmpvjQ1na

    select * from 

    (select tftl.*, rownum rn from
    (select * from test where req_brh_code='111' order by id desc) tftl
    where rownum <= 40
    )
    where rn > 20;

    或者使用如下,使用HINT方式:

    select /*+ FIRST_ROWS */ * from
    ( select A.*, rownum rn
    FROM (select * from test where req_brh_code='111' order by id desc) A
    where rownum <= 40)
    where rn > 20;

    ORACLE HINT:

    参考:http://www.cnblogs.com/ebs-blog/archive/2011/09/05/2167730.html

    Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式,因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Oracle提供给DBA用来分析问题的工具 。在SQL代码中使用Hint,可能导致非常严重的后果,因为数据库的数据是变化的,在某一时刻使用这个执行计划是最优的,在另一个时刻,却可能很差,这也是CBO 取代RBO的原因之一,规则是死的,而数据是时刻变化的,为了获得最正确的执行计划,只有知道表中数据的实际情况,通过计算各种执行计划的成本,则其最优,才是最科学的,这也是CBO的工作机制。 在SQL代码中加入Hint,特别是性能相关的Hint是很危险的做法。

    CBO和RBO区别:http://blog.sina.com.cn/s/blog_48e13c9e0100luur.html

    Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO),在Oracle8及以后的版本,Oracle强列推荐用CBO的方式
        RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

        CBO方式:它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。

    路慢慢其休远羲,吾将上下而求所
  • 相关阅读:
    Android与js交互实例
    动态规划-最长公共子序列
    android调用js
    比特币不是虚拟货币,这是一个真实世界----李笑来
    Linux进程同步之POSIX信号量
    编程至死第0天
    JMX操作ActiveMQ(2)
    Oracle层次查询和with函数的使用
    boost::asio async_write也不能保证一次发完所有数据 一
    解决Eclipse一直loading workbench无法启动的问题
  • 原文地址:https://www.cnblogs.com/garinzhang/p/2558372.html
Copyright © 2020-2023  润新知