СПАСОИ (10) - Лекция №8 - SQL

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску

...начало

Этап логического проектирования

Методы индексации данных в реляционных БД

Реверсивные индексы

Запись на листовом уровне индекса имеет вид:

<
    реверсивные значения индексируемого атрибута - mean,
    идентификатор записи - rowid
>

Преимущество реверсивного индекса:

  • используется в больших кластерных системах и позволяют равномерно распределить индексы по серверам кластера.

Это связано с тем, что окончание слова более равномерно распределено по буквам алфавита, чего его начало (это кто-то доказал).

Пусть для хранения индекса слов используется кластер, состоящий из 5 серверов:

Данный пример показывает, что применение реверсивного индекса позволяет снизить нагрузку на сервер вдвое (распределить её между другими).

Индекс таблиц

Является B-деревьями, и структура записи на листовом уровне имеет вид:

<
    ключ таблицы - key,
    остальные поля записи
>

Преимущество индекса таблиц:

  • из индекса читаются сами записи, что сокращает время доступа к данным, то есть не надо читать записи таблицы.

Недостатки индекса таблиц:

  • резко увеличивается объём индекса;
  • очень осложняется процедура ведения индекса, так как здесь индекс и БД едины.

После оптимизации схемы БД, выбора индексируемых атрибутов, характеристик атрибутов и их таблиц выполняется генерация DDL-сценария с помощью CASE-средств (ERwin Data Modeler, например).

DDL-сценарий содержит создание объектов БД (таблицы, индексы, триггеры). Сценарий выполняется средствами СУБД. После этого можно использовать язык манипулирования данными.

Некоторые возможности языка SQL

Является общесистемным:

  • является языком манипулирования данными;
  • является средством взаимосвязи между серверами (в случае с подзапросами);
  • используется почти во всех СУБД с архитектурой клиент-сервер.

Проиллюстрируем язык SQL на примере следующей БД. Поставщик поставляет детали для изделия в данном количестве.

Схема базы данных (таблицы $$S$$, $$P$$, $$J$$, $$SPJ$$) в виде ER-диаграммы:

Схема базы данных: $$\rho = (S, P, J, SPJ)$$.

здесь:

$$S$$ - таблица "Поставщик", описывающая поставщиков деталей. Имеет следующие поля:
  • номер поставщика - идентификационный номер поставщика (ключевое поле);
  • имя - фамилия, имя и отчество поставщика;
  • состояние - состояние поставщика (состояние счета);
  • город - город, в котором проживает поставщик и в котором находится его центральный офис.
$$P$$ - таблица "Деталь". Описывает поставляемые детали и включает следующие поля:
  • номер детали - идентификационный номер детали (ключевое поле);
  • название - название детали;
  • цвет - цвет детали;
  • вес - все детали в фунтах;
  • город - город, в котором изготавливается деталь.
$$J$$ - таблица "Изделие". Описывает изготавливаемые изделия и включает следующие поля
  • номер изделия - идентификационный номер изделия (ключевое поле);
  • название - название изделия;
  • город - город, где изготавливается изделие.
$$SPJ$$ - таблица "Сборка". Имеет следующие поля:
  • номер поставщика — идентификационный номер поставщика, поставляющего деталь (ключевое поле);
  • номер детали - идентификационный номер детали, поставляемой поставщиком (ключевое поле);
  • номер изделия - идентификационный номер изделия, в которое входит деталь, поставляемая поставщиком (ключевое поле);
  • количество - количество деталей, поставляемых поставщиком для данного изделия (количество деталей в поставке).

SQL состоит из языка описания данных (генерируется CASE-средствами) и языка манипулирования данными (SELECT, INSERT, UPDATE, DELETE).

SQL - непроцедурный язык, то есть программист определяет, что надо получить, но не определяет, как.

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

Существуют различные способы встраивания SQL в процедурный язык:

  • API;
  • операторы добавляются в язык (SQLJ = Java + SQL);
  • операторы используются как обычные операторы процедурного языка (PL/SQL).

Оператор SELECT

Моделирует выполнение операций реляционной алгебры. В результате выполнения оператор строит новую таблицу, в которой содержатся выбранные данные.

Порядок выполнения оператора SELECT на логическом уровне:

  1. из исходной таблицы выбираются записи по условию. Это операция селекции;
  2. из полученных записей выделяются указанные атрибуты;
  3. если есть GROUP BY, то результирующие записи группируется по атрибутам (по одинаковым значениям), указанным в условии;
  4. если есть ORDER BY, то результирующие записи сортируются по указанному атрибуту.

продолжение...