Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
24
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
      1. Распределенная обработка запросов

В системе с распределенной базой данных могут возникать проблемы при обработке запросов, для выполнения которых требуется использовать данные, хранящиеся в нескольких узлах. Рассмотрим следующий пример.

Распределенная база данных компании состоит из двух файлов: Emp и Depts. В файле Emp содержится информация о сотрудниках кампании; он горизонтально фрагментирован по трем узлам. Файл Depts полностью хранится в одном узле и содержит информацию об отделах компании. Количественное распределение данных по узлам выглядит следующим образом:

УЗЕЛ 1 Depts: 10 записей, длина каждой записи 500 байтов; итого 5 000 байтов. Атрибуты: DeptRef (2 байта), DeptName (20 байтов). Emp: 100 записей, длина каждой 100 байтов; итого 10 000 байтов. Атрибуты: EmpNo (10 байтов), EmpName (30 байтов), DeptNo (2 байта). Все записи Emp имеют значение ‘Region = 1’.

УЗЕЛ 2 Emp: 2 000 записей, длина каждой записи 100 байтов, итого 200 000 байтов. Все записи Emp имеют значение 'Region = 2'.

УЗЕЛЗ Emp: 1 000 записей, длина каждой записи 100 байтов, итого 100 000 байтов. Все записи Emp имеют значение 'Region = 3'.

Предположим, в УЗЕЛ 2 поступил следующий запрос:

SELECT EmpNo, EmpName, DeptName FROM Emp E, Dept D WHERE E.Deptno = D. DeptRef AND Region = 3;

Если каждую запись Emp можно соединить с некой записью Depts, в результате выполнения данного запроса получится таблица из 1 000 строк, причем каждая строка будет содержать следующие атрибуты: EmpNo (10 байтов), EmpName (30 байтов) и DeptName (20 байтов), что составляет в сумме 60 000 байтов (1 000×60). Этот результат можно получить следующими способами:

1. а) Переслать содержимое файла Depts из узла 1 в узел 2 (5 000 байтов). б) Переслать данные Emp из узла 3 в узел 2 (100 000 байтов). в) Выполнить соединение в узле 2.

Общее количество пересланных данных: 105 000 байтов.

2. а) Переслать содержимое файла Depts из узла 1 в узел 3 (5 000 байтов). б) Выполнить соединение в узле 3. Переслать результат в узел 2 (60 000 байтов). Общее количество пересланных данных: 65 000 байтов.

3. а) Переслать данные Emp из узла 3 в узел 1 (100 000 байтов). б) Выполнить соединение в узле 1. Переслать результат в узел 2 (60 000 байтов).

Обще количество пересланных данных 160 000 байтов.

В распределенных системах наибольшие издержки связаны с пересылкой данных. В описанных выше стратегиях количество пересылаемых данных варьируется от 65 000 до 160 000 байтов. Разница будет еще более значительной, если условию соединения удовлетворяет лишь небольшое подмножество записей. Предположим, что только 10% сотрудников в узле 3 принадлежат к определенным отделам. Это означает, что в результате получится таблица, занимающая всего 6 000 байтов, а в стратегиях 2 и 3 нужно будет переслать 11 000 и 106 000 байтов соответственно.

В идеале распределенная система должна иметь статистическую информацию о размерах множеств данных, хранящихся в каждом из узлов, чтобы можно было выбрать наилучшую стратегию выполнения запроса. При обслуживании запроса следует также использовать особенности фрагментации. Так, в описанных выше стратегиях предполагается, что обработчик запросов в узле 2, "знает", что все записи Emp со значением Region=3 хранятся в узле 3. Если у процессора нет такой информации, он может действовать только путем исследования записей Emp во всех узлах с целью обнаружить требуемые данные. Стратегии 2 и 3 могут использоваться только в том случае, если существует определенный уровень кооперации между различными системами, который позволяет обработчику запросов в одном узле выполнять соединение, требуемое запросом, инициированным в другом узле.

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

Переслать множество различных значений DeptNo из узла 3 в узел 1 (максимум 10×2 = 20 байтов).

Возвратить значения DeptRef, DeptName, которые соответствуют этим номерам (10×22 = 220 байтов).

Завершить выполнение данного соединения (Join) в узле 3 и переслать результат в узел 2 (60 000 байтов),

Получится 60 240 байтов – наилучший результат из всех, полученных до сих пор.

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