Доступ к таблице

Оценить
(0 голоса)

Простым способом получения информации из таблицы является полное чтение ее данных. Эта операция называется table scan - сканирование таблицы. Предположим, например, что вам необходимо извлечь из таблицы "Служащие" фамилии всех служащих старше 70 лет. На первый взгляд сканирование таблицы кажется целесообразным. Однако, если вам необходимо найти служащих старше 70 лет, то большинство строк будет отброшено.

Этот пример более всего подходит для запросов к хранилищам данных; сканирование таблиц чаще всего используется в средах DSS. Сканирования любых таблиц, кроме очень маленьких, редко применяются в средах OLTP и, с точки зрения производительности, обычно непригодны. Поскольку для большинства транзакций необходимо только небольшое количество строк из таблицы, сканирование всей таблицы обычно является избыточным, и соответственно производительность при этом ухудшается.

Сканирования больших таблиц могут поглощать множество ресурсов ЦП и диска, если вы используете возможности параллельных запросов, а могут затратить еще и очень много времени, если вы не будете применять эти возможности. Даже и в таком случае оптимизатор может решить, что сканирование таблицы является наиболее эффективным способом получения необходимых вам данных.

Индексы, описываемые в разделе "Индексы" главы 5, состоят из узлов, не являющихся листовыми, или из индексных узлов, содержащих информацию о ключевых значениях, хранимых под ними, и листовых узлах, имеющих актуальные ключевые данные (состоящие из одного или более столбцов), а также указатель на rowid (или RID-идентификатор строки) в таблице. На рисунке 8.1 приведена структура индекса.

Поскольку ключевой столбец данных содержится в листовых индексных узлах, то возникают случаи, когда вся информация столбца, которую необходимо извлечь из таблицы, содержится в индексе. В этом случае оптимизатору вообще не нужно будет обращаться к базовой таблице; вместо этого может быть использован index-only access (доступ только-к-индексу).

Одним из типов доступа только-к-индексу является сканирование индекса, которое похоже на сканирование таблицы с той лишь разницей, что чтение производится по всему индексу, а не по таблице. Значения из столбцов, содержащиеся в листовых узлах, сохраняются, а индексные узлы просто отбрасываются.

Поскольку индекс содержится в отсортированном порядке, могут возникнуть случаи, когда для сокращения общего объема данных, считываемых из индекса, может использоваться range scan (сканирование диапазона) или selective index scan (выборочное сканирование индекса). Например, предикат, определяющий все счет-фактуры с января по июнь 2001 года, может помочь себе при сканировании диапазона индекса, если поле данных имеет индекс. Выборочные сканирования индекса могут быть использованы для доступа только-к-индексу или в качестве предварительного указателя для доступа к таблице. Сканирования диапазонов также могут использоваться в таблицах, разделенных соответствующим образом. Разделение на диапазоны обсуждается позже в этой главе.

Наиболее распространенное применение индекса в.приложениях OLTP направлено на использование значения ключа для обеспечения произвольного доступа к таблице. Для этой же цели индексы используются и в запросах DSS. Произвольный доступ (без последовательного перебора) к таблице по индексу может быть менее затратным в плане расходования ресурсов, чем сканирование таблицы или индекса, если при этом отбрасывается множество отсканированных данных. Распараллелить доступ по индексу тяжелее, так что выполнение такого запроса может происходить дольше. Если произвольный доступ по индексу направлен на получение более чем 0.5-2% информации таблицы, то, возможно, более эффективно выполнить сканирование таблицы. И наоборот, если отбор из таблицы существенно меньше 2%, вы можете поднять производительность запроса путем создания индекса, если он еще не существует.

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

Другим методом, используемым СУБД для оптимизации индексного доступа к таблице, является выборка sorted rowid - отсортированного rowid (идентификатора строки). На рисунке 8.1 индекс позволяет произвести доступ к страницам таблицы с использованием идентификаторов строк, найденных в листовых узлах. Обращение но идентификатору строки будет осуществляться в порядке индекса: 3042, 3040, 3052, 3031, 3043, 3022, 3041, 3053, 3051, 3021. Это означает, что доступ к страницам таблицы будет происходить в следующем порядке: третья, вторая, четвертая, вторая, третья, первая, третья, четвертая, четвертая, первая. Этот простой пример становится более пригодным для больших таблиц, в которых данные сильно рассредоточены. Если идентификаторы строк (rowid) отсортированы, то все значения в каждой странице таблицы могут быть обработаны одновременно, хотя строки не будут возвращены в ключевой последовательности.

Порядок объединения таблиц
Методы объединения
Объединения вложенного цикла
Объединения посредством слияния-сортировки
Хэш-объединения

Добавить комментарий


Защитный код
Обновить