代码之家  ›  专栏  ›  技术社区  ›  Moeb

查询时从何处获取ROWID?

  •  1
  • Moeb  · 技术社区  · 16 年前

    SELECT ROWID, name from emp where age > 30;
    

    由于ROWID不占用任何存储空间,是否每次运行这样的查询时都会计算它?


    here ,

    内部有一个伪列,名为 在列出 通过执行SELECT*FROM ... 陈述,或描述。。。 政府也没有 伪柱占用空间


    从评论中得到线索,

    创建索引时存储ROWID。假设除了主键的隐式索引之外没有其他索引( emp_id ).

    name age 列不是索引的一部分。

    2 回复  |  直到 16 年前
        1
  •  1
  •   APC    16 年前

    “假设我只有 (电磁脉冲id)。在这种情况下,上述 查询是否转到此隐式索引?怎么

    SQL> create table t72
      2      ( emp_id number not null primary key
      3        , name varchar2(10) not null
      4        , age number(3,0) )
      5  /
    
    Table created.
    
    SQL> select constraint_name from user_constraints
      2  where table_name = 'T72'
      3  and constraint_type='P'
      4  /
    
    CONSTRAINT_NAME
    ------------------------------
    SYS_C001145039
    
    1 row selected.
    
    SQL> select index_type, uniqueness
      2  from user_indexes
      3  where index_name = 'SYS_C001145039'
      4  /
    
    INDEX_TYPE                  UNIQUENES
    --------------------------- ---------
    NORMAL                      UNIQUE
    
    1 row selected.
    
    SQL>
    

    其次,查询过滤年龄列。因此,优化器将忽略EMP\u ID上的任何索引,在这种情况下,数据库将对EMP进行一次完整的表扫描,评估它检索到的每个AGE列的值。对于每个记录 AGE < 30 它将表的对象号、块号、插槽号和文件号连接到一个ROWID中。

    如果您想了解有关ROWID的更多信息,可以尝试一下DBMS\u ROWID包。RenNyffenegger在他的网站上有一个有用的教程。 Find out more.


    来自emp,其中emp\u id>100;. 会吗 查询从 “环境标识索引?”

    SQL> create unique index big_i on big_emp (empno)
      2  /
    
    Index created.
    
    SQL> exec dbms_stats.gather_table_stats(user, 'BIG_EMP', cascade=>true)
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    然后我们看到Oracle如何处理查询:

    SQL> explain plan for
      2      select empno, rowid from big_emp
      3      where empno > 10000;
    
    Explained.
    
    SQL> select * from table(dbms_xplan.display)
      2  /
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------
    Plan hash value: 3238483832
    
    ------------------------------------------------------------------------------
    | Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |       | 24319 |   403K|    16   (0)| 00:00:01 |
    |*  1 |  INDEX FAST FULL SCAN| BIG_I | 24319 |   403K|    16   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("EMPNO">10000)
    
    13 rows selected.
    
    SQL>
    

        2
  •  3
  •   Vincent Malgrat    16 年前

    rowid是行的一个属性。它包含与块的位置(文件号、块号)和该块中行的位置相关的信息。

    在查询时,这些信息并不是真正的“计算”出来的,而仅仅是从行的块头中的信息组合而成的。