|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
Доброго дня всем! В набор скриптов создания демо схемы OE для Oracle 18c (взят с GitHub) входит скрипт coe_v3.sql. В нем есть строки: --- CREATE TABLE inventories ( product_id NUMBER(6) , warehouse_id NUMBER(3) CONSTRAINT inventory_warehouse_id_nn NOT NULL ... , CONSTRAINT inventory_pk PRIMARY KEY (product_id, warehouse_id) DISABLE NOVALIDATE); CREATE INDEX inventory_ix ON inventories (warehouse_id, product_id); ALTER TABLE inventories ENABLE CONSTRAINT inventory_pk; --- Эти операторы идут подряд, т.е. загрузки данных в таблицу между ее созданием и созданием индекса нет. Вопрос: зачем PRIMARY KEY создается с опциями DISABLE NOVALIDATE, потом создается НЕуникальный индекс с теми же полями, но в ОБРАТНОМ ПОРЯДКЕ, и потом PRIMARY KEY активируется? В SQL Developer видно, что в свойствах таблицы OE.inventories присутствует PRIMARY KEY inventory_pk, у которого индекс inventory_ix. В самом скрипте есть такой комментарий: -- Enhancement request 2376117 suggested to have a PRIMARY KEY constraint -- supported by a non-unique index -- Starting with 10i R1, this is implemented in table INVENTORIES: Не понимаю, в чем смысл такого тройного трюка с PK и индексом: 1. их создание разделено; 2. индекс НЕуникальный (т.к. одно из полей product_id не объявлено как NOT NULL); 3. у PK порядок полей один, а у индекса - противоположный И как обеспечивается уникальность PRIMARY KEY, если он опирается на НЕуникальный индекс? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 08:24 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
PRIMARY KEY по определению уникален и NOT NULL (да, его можно построить на неуникальном индексе, но это, как правмло, делается только для отложенного ограничения, но сам ключ всегда поддерживает именно уникальность) Код, похоже, кросс-БД-платформенный Где-то это надо, где-то нет... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 08:45 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
Вячеслав , правильно ли я понял, что в данном случае весь смысл _разделения_ создания первичного ключа и индекса состоит в том, чтобы использовать для PK _неуникальный_ индекс (вообще-то созданный для _другой_ цели - т.к. в нем даже порядок поле другой) и тем самым не плодить для PK отдельный _уникальный_ индекс по тем же полям (но в другом порядке)? То есть просто экономия на пространстве под второй индекс (все же равно PK будет уникальным даже на базе неуникального индекса). Ведь в данном случае отложенного ограничения фактически нет - PK активируется сразу после создания индекса, когда таблица еще пустая. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 09:34 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
Ну я же не знаю, чем руководствовались разработчики, которые подготовили этот скрипт Скорее всего, это просто вопрос кросс-платформенности Сделай как считаешь нужным и забудь -- ведь это один раз ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 10:03 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
SBremen2. индекс НЕуникальный ( т.к. одно из полей product_id не объявлено как NOT NULL ); индекс неуникальный не из-за NOT NULL, его создали неуникальным гляньте структуру таблички после ENABLE CONSTRAINT ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 10:15 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
Вячеслав , я оставил как было в оригинальном скрипте. Просто пытался понять, в чем _может быть_ смысл неочевидного действия, которое выполнили заведомо профессиональные люди. И чтобы научиться чему-то новому. В любом случае спасибо за ответ. Stax , согласен, я некорректно написал. Да, индекс создали неуникальным и с именем, _отличным_ от имени PK. Но Oracle подхватил именно этот индекс для PK, не создавая нового (с полями в том порядке, в котором они описаны в самом PK). В более ранней версии скрипта (файл oe_cre.sql в том же архиве демо, не является актуальным и не вызывается при создании схемы OE в Oracle 18c) была всего одна строчка вместо трех: Код: plaintext 1. 2. 3. 4. 5. 6.
_Уникальный_ индекс создавался автоматически при определении PK (при создании таблицы). Получается, сейчас создание индекса отделено от активизации PK только для того, чтобы для PK использовать _НЕуникальный_ индекс. У меня других идей нет. Если у Вас есть идеи, для чего еще это могло быть сделано - поделитесь. Еще одна любопытная ситуация в скрипте coe_v3.sql (из того же комплекта создания демо схемы OE), где есть такие строки, идущие подряд: --- Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В данном случае создается _уникальный_ комбинированный индекс и только потом отдельно создается _одноименный_ PK с теми же полями (который, конечно, использует этот индекс). Но вопрос: зачем уникальный индекс создавать отдельно от PRIMARY KEY и до него? Ведь если CONSTRAINT PK просто описать в CREATE TABLE, то создание уникального индекса произойдет автоматически и последующие две строки будут просто лишними, верно? Или в таком выделении создания уникального индекса и PK в отдельные команды есть какой-то неочевидный смысл? Просто хочется понять - вдруг это фишка оптимизации или еще что-то полезное... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 15:11 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
SBremenили еще что-то полезное... ето ж демо, вот и демонтрируют возможности (мож для кого-то и полезные) ps я б напр в индексе и пк не додумался задать разный порядок следования ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 15:40 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
Индекс и ограничение целостности - разные сущности. Да, уникальный индекс в комбинации с not null делают то же, что и PK. Да, PK у многих в голове ассоциирован с уникальным индексом. Но из изложенного не следует, что сам по себе constraint PK обязан быть синтаксической затычкой над уникальным индексом и не может быть реализован иначе. Зачем может быть надо поднимать PK над неуникальным индексом: - в таблице есть поисковый индекс, префиксированный атрибутами, составляющими PK. В подобной ситуации нет смысла держать два индекса, достаточно поднять PK над поисковым. - есть желание выстроить атрибуты в индексе по селективности для обеспечения более эффективного поиска (или в обратном порядке ради компрессии), при этом порядок атрибутов в PK оставить без изменений. - есть желание построить PK над секционированной таблицей, не создавая глобальный индекс - есть потребность в отложенной проверке ограничения PK. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2019, 15:47 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
andrey_anonymous , спасибо за развернутый ответ. Это то, что нужно для понимания действий разработчиков демо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 19:07 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
По ходу дела возник еще один вопрос, связанный с демо схемой OE, но более общий. Можно ли в Oracle каким-то простым способом вывести / сохранить дерево вызовов скриптов SQL (из SQL Plus или из какой-то другой программы)? В схеме OE около 70 SQL-скриптов, но вся схема создается запуском единственного скрипта oe_main.sql, который запускает другие скрипты, которые запускают другие скрипты, которые запускают ... Существует ли средство отладки Oracle или какой-то иной механизм, который позволяет посмотреть это дерево вызовов всех этих скриптов (например, после окончания работы стартового скрипта)? Желательно без внесения изменений в каждый скрипт (типа добавления в начало скриптов вывода сообщения, что данный скрипт запущен). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 22:08 |
|
Вопрос по скриптам создания демо схем Oracle 18c
|
|||
---|---|---|---|
#18+
SBremenЖелательно без внесения изменений в каждый скрипт (типа добавления в начало скриптов вывода сообщения, что данный скрипт запущен). awk, sed... Выдираете "@что-то-там", грузите итог в табличку и стройте иерархию ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 14:19 |
|
|
start [/forum/topic.php?fid=52&msg=39859188&tid=1882096]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 258ms |
total: | 403ms |
0 / 0 |