Вопрос про порядок выдачи записей

Urt
Дата: 05.08.2005 17:35:35
Хотелось бы узнать, в каком порядке выдаются записи из базы - скажем, есть ли какой-то порядок, определённый внутренней логикой работы базы, или это как повезёт. Я имею ввиду - вот делаем запрос -
 select * from product 
- и я всегда получаю записи вроде как в одном порядке, но они приэтом не упорядочены по primary key.
И ещё вопрос - primary key назначается всегда по возрастанию или как попало?
hell
Дата: 05.08.2005 17:40:55
Urt
Хотелось бы узнать, в каком порядке выдаются записи из базы - скажем, есть ли какой-то порядок, определённый внутренней логикой работы базы, или это как повезёт. Я имею ввиду - вот делаем запрос -
 select * from product 
- и я всегда получаю записи вроде как в одном порядке, но они приэтом не упорядочены по primary key.
И ещё вопрос - primary key назначается всегда по возрастанию или как попало?


какой-то порядок есть - но полагаться на то, что ты его "вроде как знаешь" - не надо, используй order by

primary key не берется из небес, его назначает кто-то(не оракл) - у этого кого-то и спроси
VasyakinM
Дата: 05.08.2005 17:44:43
Порядок выдачи записей соотвествует порядку их извлечения(хранения).
Т.е. вы с легстью можете получить совершенно дугой порядок, если просто удалите записи и вставите заново. Без конструкции order by никто порядок вам не гарантирует.
Ааз
Дата: 05.08.2005 18:17:45
VasyakinM
Без конструкции order by никто порядок вам не гарантирует.
За исключением IOT. В кластерах (не путать с RAC) некая упорядоченность по кластерному ключу (или хеш-функции).

Всего
softwarer
Дата: 05.08.2005 18:37:11
Ааз
За исключением IOT. В кластерах (не путать с RAC) некая упорядоченность по кластерному ключу (или хеш-функции).

Насколько я понимаю, это тоже не "гарантия" а просто "в текущей версии наблюдения показывают, что это выполняется". Примерно так же, как "если создать таблицу без единого индекса, и никогда не удалять и не модифицировать записи в ней и никогда не вставлять записи параллельно из нескольких сессий, то они будут выданы в селекте в порядке вставки".
Andrew Max
Дата: 05.08.2005 18:47:14
Вспомнилось весьма показательное обсуждение на ту же тему.
Ааз
Дата: 05.08.2005 19:02:03
softwarer
Насколько я понимаю, это тоже не "гарантия"...
Возможно, ты более прав ;-). Щаз пришло в голову, что будет при FFS по IOT... Мда...

А если в чистом виде
SELECT * FROM <iot>;
??? Где-то я видел однозначное утверждение, что записи будут отсортированы по PK. В курсах, что-ли? ПризнАюсь честно, с IOT работал не так много... Надо бы пошуршать по возможным access path для IOT. Если FFS там фигурирует, то вроде как я соврамши.

Всего
sstetsen
Дата: 05.08.2005 19:10:29
Да-а, при появлении секционированных IOT картина становится ещё более удручающей...
Andrew Max
Дата: 05.08.2005 19:27:46
sstetsen
Да-а, при появлении секционированных IOT картина становится ещё более удручающей...

Да она и без секционирования безрадостная. :)

Время свободное есть - вот, пример соорудил:
SQL> create table iot_test
  2   (
  3    a integer,
  4    b varchar2(30),
  5    longcol char(2000),
  6    constraint pk_iot_test primary key(a, b)
  7   )
  8   organization index overflow;

Таблица создана.

SQL> insert into iot_test
  2  select * from
  3   (
  4    select object_id, owner, rpad('*', 2000, '*')
  5     from all_objects
  6     where rownum <= 20
  7   ) order by 1 desc, owner asc;

20 строк создано.

SQL> select a, b from iot_test;

         A B
---------- ------------------------------
         5 SYS
        11 SYS
        48 SYS
        51 SYS
        54 SYS
        43 SYS
        45 SYS
        47 SYS
        38 SYS
        39 SYS
        42 SYS
        30 SYS
        34 SYS
        36 SYS
        21 SYS
        26 SYS
        28 SYS
        14 SYS
        17 SYS
        18 SYS

20 строк выбрано.

SQL> select a, b from iot_test order by a, b;

         A B
---------- ------------------------------
         5 SYS
        11 SYS
        14 SYS
        17 SYS
        18 SYS
        21 SYS
        26 SYS
        28 SYS
        30 SYS
        34 SYS
        36 SYS
        38 SYS
        39 SYS
        42 SYS
        43 SYS
        45 SYS
        47 SYS
        48 SYS
        51 SYS
        54 SYS

20 строк выбрано.

SQL> explain plan for
  2  select a, b from iot_test;

Объяснено.

SQL> @utlxpls

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------

--------------------------------------------------------------------------
| Id  | Operation            |  Name        | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |     1 |    30 |    12   (9)|
|   1 |  INDEX FAST FULL SCAN| PK_IOT_TEST  |     1 |    30 |    12   (9)|
--------------------------------------------------------------------------

7 строк выбрано.