Oracle:使用主键完全访问表的访问权限?

时间:2010-06-12 16:17:22

标签: oracle10g

有一张桌子:

CREATE TABLE temp
(
   IDR decimal(9) NOT NULL,
   IDS decimal(9) NOT NULL,
   DT date NOT NULL,
   VAL decimal(10) NOT NULL,
   AFFID decimal(9),
   CONSTRAINT PKtemp PRIMARY KEY (IDR,IDS,DT)
)
;     

让我们看一下选择星形查询的计划:

SQL>explain plan for select * from temp;

Explained.

SQL> select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

---------------------------------------------------------------
| Id  | Operation     | Name | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------
|   0 | SELECT STATEMENT  |   |     1 |    61 |     2   (0)|
|   1 |  TABLE ACCESS FULL| TEMP |     1 |    61 |     2   (0)|
---------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version

11 rows selected.

SQL Server 2008在相同的情况下显示聚簇索引扫描。是什么原因?

2 个答案:

答案 0 :(得分:5)

select * with no where子句 - 表示读取表中的每一行,获取每一列。

使用索引可以获得什么?你必须转到索引,获取rowid,将rowid转换为表偏移量,读取文件。

进行全表扫描时会发生什么?你去表中的第一个rowid,然后通过表读到最后。

根据您上面的表,哪一个更快?全表扫描。为什么?因为它跳过必须去索引,检索值,然后回到另一个表所在的位置和提取。

答案 1 :(得分:2)

为了更简单地回答这个问题,没有mumbo-jumbo,原因是:

Clustered Index = Table

这是SQL Server中的定义。如果不清楚,请查看定义。

再次绝对清楚,因为大多数人似乎都错过了这个,集群索引 IS 表本身。因此,“聚集索引扫描”是另一种说“表扫描”的方式。或者Oracle称之为“TABLE ACCESS FULL”