Oracle: полный доступ к таблице с первичным ключом? - PullRequest
2 голосов
/ 12 июня 2010

Имеется таблица:

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 показывает в той же ситуации сканирование кластерного индекса.В чем причина?

Ответы [ 2 ]

5 голосов
/ 12 июня 2010

select * with no where - означает чтение каждой строки таблицы, выборку каждого столбца.

Что вы получаете, используя индекс? Вы должны перейти к индексу, получить rowid, перевести rowid в смещение таблицы, прочитать файл.

Что происходит, когда вы выполняете полное сканирование таблицы? Вы идете по первому ряду в таблице, затем читаете по таблице до конца.

Какой из них быстрее, если учесть таблицу, которую вы имеете выше? Полное сканирование таблицы. Зачем? потому что он пропускает необходимость идти по индексу, получать значения, а затем возвращаться к другому, где таблица живет и выбирает.

2 голосов
/ 31 марта 2011

Чтобы ответить на этот вопрос проще, без mumbo-jumbo, причина в следующем:

Clustered Index = Table

Это по определению в SQL Server.Если это не ясно, посмотрите определение.

Чтобы быть совершенно ясным еще раз, поскольку большинство людей, кажется, упускают это, Clustered Index IS сама таблица.Отсюда следует, что «сканирование кластеризованного индекса» - это еще один способ сказать «сканирование таблицы».Или то, что Oracle называет «Полный доступ к таблице»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...