Oracle:带主键的表访问完全?

发布于 2024-09-05 14:29:09 字数 1035 浏览 4 评论 0原文

有一个表:

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)
)
;     

让我们看看select star查询的计划:

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在相同情况下显示聚集索引扫描。原因是什么?

There is a table:

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)
)
;     

Let's see the plan for select star query:

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 shows in the same situation Clustered index scan. What is the reason?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

撑一把青伞 2024-09-12 14:29:09

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

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

进行全表扫描时会发生什么?您转到表中的第一个 rowid,然后继续阅读表直至末尾。

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

select * with no where clause -- means read every row in the table, fetch every column.

What do you gain by using an index? You have to go to the index, get a rowid, translate the rowid into a table offset, read the file.

What happens when you do a full table scan? You go the th first rowid in the table, then read on through the table to the end.

Which one of these is faster given the table you have above? Full table scan. Why? because it skips having to to go the index, retreive values, then going back to the other to where the table lives and fetching.

待天淡蓝洁白时 2024-09-12 14:29:09

为了更简单地回答这个问题而不需要胡言乱语,原因是:

Clustered Index = Table

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

再次明确的是,由于大多数人似乎都忽略了这一点,聚集索引就是表本身。因此,“聚集索引扫描”是“表扫描”的另一种说法。或者 Oracle 称之为“表访问完整”

To answer this more simply without mumbo-jumbo, the reason is:

Clustered Index = Table

That's by definition in SQL Server. If this is not clear, look up the definition.

To be absolutely clear once again, since most people seem to miss this, the Clustered Index IS the table itself. It therefore follows that "Clustered Index Scan" is another way of saying "Table Scan". Or what Oracle calls "TABLE ACCESS FULL"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文