![]() |
|
Программирование >> Oracle
Индексы 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. Завершается глава ответами на часто задаваемые мне вопросы об индексах. От простейших: работают ли индексы для представлений , до более сложных: правда ли, что пространство в индексе не используется повторно . Ответы на эти вопросы давались с использованием примеров, демонстрирующих суть проблем.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |