сторінці>. При цьому кортеж може реально розташовуватися в даній сторінці:
або в іншій сторінці:
У другому випадку описувач кортежу містить не координати кортежу в даній сторінці, а tid, що вказує на реальне положення кортежу в іншій сторінці. Легко бачити, що застосування такого підходу дозволяє обмежитися максимум одним рівнем непрямого відношення.
Оскільки допускається знаходження в одній сторінці даних кортежів різних відносин, кожний кортеж повинен, крім змістовної частини, включати службову інформацію, що ідентифікує відношення, якому належить даний кортеж. Крім того, в System R (точніше, в мові SQL) допускається динамічне доповнення полів до існуючих відносин. При цьому реально відбувається лише модифікація описувача відношення у відношенні-каталозі відносин. У існуючому кортежі відношення нове поле виникає тільки при модифікації цього кортежу, що торкається нове поле. Це дозволяє уникнути масової перебудови відношення, що зберігається при доданні до нього нових полів, але, природно, вимагає зберігання при кортежі додаткової службової інформації, що визначає реальне число полів в даному кортежі. (Помітимо, що видаляти існуючі поля існуючого відношення в SQL System R не дозволяється).
На основі наявності незмінних під час існування кортежів tid'ів в System R підтримуються додаткові керуючі структури - індекси. Кожний індекс визначений на одному або декількох полях відношення, значення яких складають його ключ, і дозволяє проводити прямий пошук по ключу кортежів (їх tid'ів) і послідовне сканування відношення по індексу, починаючи з вказаного ключа, в порядку зростання або убування значень ключа. Деякі індекси при їх створенні можуть володіти атрибутом унікальності. У такому індексі не допускаються дублікати ключа. Цей єдиний засіб SQL вказівки системі первинного ключа відношення (фактично, набору первинного і всіх альтернативних ключів відношення).
Для організації індексів в System R застосовується техніка В-дерев. Кожний індекс займає окремий набір сторінок, номер кореневої сторінки запам'ятовується в описувачі індексу. Використання В-дерев дозволяє досягнути ефективності при прямому пошуку, оскільки вони в силу своєї сильної гіллястості володіють невеликою глибиною. Крім того, В-дерева зберігають порядок ключів в листових блоках ієрархії, що дозволяє проводити послідовне сканування відношення в порядку зростання або убування значень полів, на яких визначений індекс. Фундаментальна властивість В-дерев - автоматичне балансування дерева - допускає вироблення лише локальних модифікацій індексу при переповненнях і спустошеннях сторінок індексу. (Ми досить вільно використовуємо тут термін В-дерево. Насправді в System R використовується модифікований в порівнянні з вихідним варіант В-дерев, який називають В*-, а іноді В+-деревами). У самих В-деревах System R нічого особливого ні; більш детально ми на цьому зупинятися не будемо. Зазначимо тільки, що System R, наскільки нам відомо, була першою системою, в якій для організації індексів використовувалися В-дерева. Цю традицію дотримує більшість реляційних систем, що виникли після System R.
Видимо, найбільш важливою особливістю фізичної організації баз даних в System R є можливість забезпечення кластеризації пов'язаних кортежів одного або декількох відносин. Під кластеризацією кортежів розуміється фізично близьке розташування (в межах однієї сторінки даних) логічно пов'язаних кортежів. Забезпечення відповідної кластеризації дозволяє добитися високої ефективності системи при виконанні виділеного класу запитів. Внаслідок великої важливості поняття кластеризації в System R і її розвитках розглянемо історію питання більш детально.
У остаточному варіанті System R існує тільки один засіб визначення умов кластеризації відношення - оголосити до заповнення відношення один (і тільки один) індекс, визначений на полях цього відношення, кластеризованим. Тоді, якщо заповнення відношення кортежами виготовляється в порядку зростання або убування значень полів кластеризації (в залежності від атрибутики індексу), система фізично розташовує кортежі в сторінках даних в тому ж порядку. Крім того, в кожній сторінці даних кластеризованого відношення залишається деякий резервний вільний простір. При подальших вставках кортежів в таке відношення система прагне вмістити кожний кортеж в одну з сторінок даних, в яких вже знаходяться кортежі цих відносин з такими ж (або близькими) значеннями полів кластеризації. Природно, що підтримувати ідеальну кластеризацію відношення можна тільки до певної межі, поки не вичерпається резервна пам'ять в сторінках. Далі цієї межі міра кластеризації відношення починає меншати, і для відновлення ідеальної кластеризації відношення потрібна фізична реорганізація відношення (її можна виробити коштами SQL).
Очевидною перевагою кластеризації відношення є те, що при послідовному скануванні кластеризованого відносин з використанням кластеризованого індексу буде потрібне рівне стільки читання сторінок даних із зовнішньої пам'яті, скільки сторінок займають кортежі цього відношення. Отже, при правильно вибраних критеріях кластеризації запити, пов'язані із завданням умов на полях кластеризації можна виконати майже оптимально.
У ранніх версіях System R існував ще один спосіб фізичного доступу до кортежів відношення і, відповідно, ще один спосіб вказівки умови кластеризації з використанням так званих зв'язків (links). На рівні фізичного уявлення зв'язок - це фізичне посилання (tid) з одного кортежу на інший (не обов'язково одного відношення). У мові SEQUEL (до того моменту, коли його сталі називати SQL) існували засоби визначення зв'язків в ієрархічній манері: можна було оголосити деяке відношення батьківським по відношенню до того ж або іншому відношенню-нащадку. При цьому вказувалися поля батьківського відношення і відношення-нащадка, у відповідності зі значеннями яких утворювалася ієрархія. Правила побудови були дуже простими - проводилися зв'язки між кортежем батьківського відношення до всіх кортежів відношення-нащадка з тими ж значеннями полів скріплення. Насправді, всі кортежі відношення-нащадка із загальним значенням полів скріплення утворювали кільцевий список, на який проводився один зв'язок з відповідного кортежу батьківського відношення. Природно, від відношення-родителя була потрібна унікальність по відношенню до