有一张桌子:
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在相同的情况下显示聚簇索引扫描。是什么原因?
答案 0 :(得分:5)
select * with no where子句 - 表示读取表中的每一行,获取每一列。
使用索引可以获得什么?你必须转到索引,获取rowid,将rowid转换为表偏移量,读取文件。
进行全表扫描时会发生什么?你去表中的第一个rowid,然后通过表读到最后。
根据您上面的表,哪一个更快?全表扫描。为什么?因为它跳过必须去索引,检索值,然后回到另一个表所在的位置和提取。
答案 1 :(得分:2)
为了更简单地回答这个问题,没有mumbo-jumbo,原因是:
Clustered Index = Table
这是SQL Server中的定义。如果不清楚,请查看定义。
再次绝对清楚,因为大多数人似乎都错过了这个,集群索引 IS 表本身。因此,“聚集索引扫描”是另一种说“表扫描”的方式。或者Oracle称之为“TABLE ACCESS FULL”