Программирование >>  Oracle 

1 ... 118 119 120 [ 121 ] 122 123 124 ... 469


Индексы

SELECT /*+ INDEX(t t idx l) */COUNT(*)

FROM

T WHERE OBJECT NAME = :bl AND OBJECT TYPE =

:b2 AND OWNER

call

count

elapsed

disk

query current

Parse 10.00 0.00 0 0

Execute 21975 2.35 2.55 0 0

Fetch 21975 1.40 1.57 0 44088

21975

total 43951 3.75

Rows Execution Plan

4.12

44088

21975

0 SELECT STATEMENT

GOAL: CHOOSE

21975 SORT (AGGREGATE)

21975 INDEX (RANGE SCAN) OF T IDX 1 (NON-UNIQUE)

SELECT /*+ INDEX(t t idx 2) */COONT(*) FROM

WHERE OBJECT NAME

:b1 AND OBJECT TYPE

:b2 AND OWNER

call

count

elapsed disk

query current

Parse

Execute

Fetch

10.00 21975 2.10 21975 1.65

0.00 2.44 1.60

44088

0 21975

total 43951 3.75

Rows Execution Plan

4.04

44088

21975

0 SELECT STATEMENT GOAL: CHOOSE 21975 SORT (AGGREGATE)

21975 INDEX (RANGE SCAN) OF T IDX 2 (NON-UNIQUE)

Итак, в обоих случаях обработано одинаковое количество строк, блоков, затрачено одинаковое процессорное время; совпадает и реальное время выполнения (выполните этот тест еще раз, и значения CPU и ELAPSED будут немного отличаться, но в среднем они одинаковы). Никаких существенных преимуществ перечисление столбцов в порядке уменьшения избирательности не дает.

Решение поместить столбец С1 перед столбцом С2 должно определяться тем, как используется индекс. Если имеется множество запросов вида:

select * from t where cl = :x and c2 = :y; select * from t where c2 = :y;

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

rows

rows




Глава 7

рое мы уже рассматривали в контексте таблиц, организованных по индексу, и позже рассмотрим еще), можно создать меньший по размеру индекс, если столбец С2 указан первым. Дело в том, что значения столбца С2 повторяются в индексе в среднем четыре раза. Если оба столбца, С1 и С2, имеют средний размер 10 байт, записи этого индекса займут не более 2000000 байт (100000 * 20). Прибегнув к сжатию ключей индекса по столбцам (С2, С1), можно сжать индекс до 1250000 (100000 * 12,5) байт, поскольку 3 из 4 повторяющихся значений столбца С2 можно убрать.

В Oracle 5 (да, в версии 5), б1ла одна причина указывать наиболее избирательные столбцы в индексе первыми. Это было связано с тем, как в версии 5 реализовывалось сжатие индексов (не путайте со сжатием ключа индекса). Эта возможность была убрана в версии 6 и одновременно добавлено блокирование на уровне строк. После этого указание наиболее избирательных столбцов в индексе первыми уже не позволяет уменьшить индекс или сделать его более эффективным. С учетом возможности сжатия ключей, появился убедительный аргумент для того, чтобы поступать как раз наоборот, поскольку это позволяет уменьшить индекс. Однако все зависит от того, как используется индекс.

Резюме

В этой главе описаны различные типы индексов, поддерживаемые в Oracle. Мы начали с простого индекса на основе В*-дерева, затем рассмотрели подтипы этого индекса, такие как индексы с обращенным ключом, созданные для сред: Oracle Parallel Server, и индексы по убыванию - для извлечения данных упорядоченными по возрастанию по одному столбцу, и по убыванию - по другому. Мы выяснили, когда стоит использовать индекс и почему в некоторых случаях индекс не помогает.

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

Потом мы перешли к индексам по функциям, которые являются отдельным случаем индексов на основе В*-дерева и битовых карт. Индексы по функциям позволяют создавать индекс по выражению над столбцами, т.е. предварительно вычислять и запоминать результаты вычисления сложных выражений и заданных пользователем функций, чтобы в дальнейшем быстро выбирать их по индексу. Мы рассмотрели ряд важных особенностей реализации индексов по функциям, в частности необходимые для их использования установки на уровне системы или сеанса. После этого были рассмотрены примеры создания индексов как по встроенным функциям Oracle, так и по функциям, заданным пользователями. Наконец, мы рассмотрели проблему, возникающую при использовании индексов по встроенной функции Oracle TODATE и способ обойти ее.



Индексы

Затем мы рассмотрели очень специфический тип индексов - прикладные индексы. Вместо того чтобы создавать подобный индекс с нуля (что долго и сложно), мы рассмотрели пример использования уже реализованного прикладного индекса interMedia Text. К этому очень важному типу индексов мы еще вернемся в специально посвященной ему главе 17.

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



1 ... 118 119 120 [ 121 ] 122 123 124 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика