Комплексный поиск возможных методов доступа

ТЕМА 2.4. ОБЗОР НАИБОЛЕЕ РАСПРОСТРАНЕННЫХ МЕТОДОВ ВЗЛОМА

Набор операций над данными, выполняемых сервером для получения результата заданной выборки, называется путем доступа. Путь доступа можно представить в виде дерева с корнем, представляющим собой конечный результат. Каждый узел этого дерева называется методом доступа или источником данных. Объектами операций в методах доступа являются потоки данных. Каждый метод доступа либо формирует поток данных, либо трансформирует его по определенным правилам. Листовые узлы дерева называются первичными методами доступа. Их единственная задача - формирование потоков данных.

Существует три класса источников данных:

· первичный метод доступа - выполняет чтение из таблицы или хранимой процедуры;

· фильтр - трансформирует один входной поток данных в один выходной поток;

· слияние - преобразует два или более входных потоков данных в один выходной поток .

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

С точки зрения оценки производительности, каждый метод доступа имеет два обязательных атрибута - кардинальность (cardinality) и стоимость (cost). Первый отражает, сколько записей будет выбрано из источника данных. Второй оценивает стоимость выполнения метода доступа. Величина стоимости напрямую зависит от кардинальности и механизма выборки или трансформации потока данных. В текущих версиях сервера стоимость определяется количеством логических чтений (страничных фетчей, page fetches), необходимых для возврата всех записей методом доступа. Таким образом, более "высокие" методы всегда имеют большую стоимость, чем низкоуровневые.

· Первичные методы доступа

Группа этих методов доступа выполняет создание потока данных на основе низкоуровневых источников, таких как таблицы (внутренние и внешние) и процедуры. Далее мы рассмотрим каждый из первичных источников данных отдельно.

· Индексный доступ

Идея индексного доступа проста - помимо таблицы с данными у нас есть еще структура, содержащая пары "ключ - номер записи" в виде, позволяющем выполнять быстрый поиск по значению ключа. В Firebird индекс представляет собой страничное B+ дерево с префиксной компрессией ключей.

Индексы могут быть простыми (односегментными) и составными (многосегментными или композитными). Следует отметить, что совокупность полей композитного индекса представляет собой единый ключ. Поиск в индексе может осуществляться как по ключу целиком, так и по его подстроке (подключу).

· Процедурный доступ

Данный метод доступа используется при выборке из хранимых процедур, использующих предложение SUSPEND для возврата результата. В Firebird хранимая процедура всегда представляет собой черный ящик, о внутренностях и деталях реализации которого сервер не делает никаких предположений. Процедура всегда считается недетерминированным источником данных, то есть может возвращать разные данные при двух последующих вызовах, выполненных в равных условиях Индексация результатов процедуры невозможна. Процедурный метод доступа также представляет собой аналог полного сканирования таблицы. При каждом фетче из процедуры она выполняется с момента предыдущего останова (начала процедуры для первого фетча) до следующего предложения SUSPEND, после чего ее выходные параметры формируют строку данных, которая и возвращается из данного метода доступа.