Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle10g Oracle:使用主键完全访问表?_Oracle10g - Fatal编程技术网

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,合理的回答,全表扫描可以使用多块读取来读取数据。