Oracle10g Oracle:使用主键完全访问表?
有一张桌子:Oracle10g Oracle:使用主键完全访问表?,oracle10g,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
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在相同的情况下显示聚集索引扫描。原因是什么?选择*不带where子句-表示读取表中的每一行,获取每一列 使用索引可以获得什么?您必须转到索引,获取rowid,将rowid转换为表偏移量,读取文件 执行完整表扫描时会发生什么情况?你在表格中找到第一个rowid,然后把表格读到底
根据上面的表格,哪一个更快?全表扫描。为什么?因为它不必去索引、检索值,然后返回到另一个表所在的位置并获取数据。要更简单地回答这个问题,而不必费解,原因是:
Clustered Index = Table
这是SQL Server中的定义。如果不清楚,请查阅定义
再一次明确地说,由于大多数人似乎忽略了这一点,聚集索引就是表本身。因此,聚集索引扫描是表示表扫描的另一种方式。或者Oracle称之为“表访问完整”(TABLE ACCESS FULL)很好,但如果没有原因,为什么microsoft的人会使用聚集索引扫描?@tim,聚集索引保存在SQL Server的数据块中-其他引擎可能不同,因此使用它不会产生任何开销,而不是简单的完整表扫描。thanx Alex,合理的回答,全表扫描可以使用多块读取来读取数据。