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

1 ... 112 113 114 [ 115 ] 116 117 118 ... 469


Индексы 373

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

С другой стороны, в таблицу с индексом по функции, заданной пользователем и требующей обращения к SQL-машине, нельзя загружать данные в непосредственном режиме. Это означает, что нельзя выполнять непосредственную загрузку в таблицу, проиндексированную пo MY SOUNDEX(X), но можно, - если проиндексировано выражение UPPER(x).

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

В общем случае преимущества индексов по функции существенно перевешивают недостатки.

Прикладные индексы

Прикладные индексы в базах данных Oracle обеспечивают расширяемое индексирование. Они позволяют создавать собственные индексные структуры, работающие аналогично стандартным индексам сервера Oracle. При выполнении оператора CREATE INDEX, использующего прикладной тип индекса, сервер Oracle будет выполнять соответствующий код создания индекса. Если проанализировать индекс для получения его статистической информации, сервер Oracle будет выполнять соответствующий код для генерации этих данных в том формате, который предполагался создателями индекса. Когда сервер Oracle анализирует запрос и вырабатывает план, который может использовать прикладной индекс, он спросит у прикладного кода: Сколько будет стоить выполнение этой функции? , поскольку ему приходится оценивать разные планы. Если коротко, прикладные индексы позволяют создавать новые, еще не существующие в базе данных, типы индексов. Например, если создается приложение, анализирующее хранящиеся в базе данных изображения и выдающее информацию об этих изображениях - скажем, используемые цвета - можно создать специальный индекс по изображениям. При добавлении изображений в базу данных будет вызываться код для извлечения информации о цветах, которая будет сохраняться отдельно (там, где сочтет нужным разработчик). При выполнении запросов, требующих вернуть изображения в синих тонах , сервер Oracle при необходимости потребует от прикладного индекса вернуть ответ.

Лучший пример - собственный текстовый индекс компонента interMedia. Этот индекс обеспечивает поиск по ключевым словам в больших текстах. Компонент interMedia предлагает собственный тип индекса:



374 Глава 7

ops$tkyte@ORA8I.WORLD> create index myindex on mytable(docs)

2 indextype is ctxsys.context

Index created.

и отдельные специальные операторы в языке SQL:

select * Irom mytable where contains (docs, some words) > 0;

Этот индекс позволяет даже выполнять команды вида:

ops$tkyte@ORA8I.WORLD> analyze index myindex compute statistics; Index analyzed.

Он будет взаимодействовать с оптимизатором в ходе выполнения оператора, при определении относительной стоимости использования текстового индекса по сравнению с другим индексом или полным просмотром таблицы. Интересно, что такого рода индекс может разработать кто угодно. Реализация текстового индекса interMedia не использует внутренние особенности ядра. Все было сделано на основе открытых и описанных интерфейсов прикладных программ для создания такого рода структур. Ядро сервера Oracle не знает , как хранится текстовый индекс interMedia (для хранения каждого создаваемого индекса используется несколько физических таблиц). Сервер Oracle не знает о том, что происходит при вставке новой строки. Компонент interMedia - это фактически приложение, построенное на основе базы данных, но полностью в нее интегрированное. Для пользователей оно не отличается от других средств ядра сервера Oracle, но на самом деле в ядро не входит.

Лично я не вижу особой нужды создавать новые экзотические типы индексных структур. Эту возможность используют в основном сторонние производители, предлагающие революционные методы индексирования. Например, компания Virage, Inc. использовала этот же функциональный интерфейс для реализации специального индекса в базах данных Oracle. Этот индекс позволяет индексировать загружаемые в базу данных изображения. Затем можно искать картинки, похожие на другие картинки по текстуре, цветам, освещению и т.п. Можно б1ло бы создать индекс, позволяющий осуществлять поиск по отпечаткам пальцев, хранящимся в базе данных как большой двоичный объект, из внешнего приложения, считывающего отпечатки пальцев. Он мог бы хранить информацию о ключевых точках отпечатков в таблицах базы данных, кластерах или, возможно, в обычных внешних файлах - в зависимости от того, что лучше подойдет. После этого можно будет с помощью операторов SQL вводить отпечатки и сравнивать с отпечатками, хранящимися в базе данных, так же просто, как и числа: SELECT * FROM T WHERE X BETWEEN 1 AND 2.

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



Индексы 375

можности компонента interMedia, реализованные с помощью прикладных индексов, позволяют это сделать. Со временем набор доступн1х типов индексов растет. Например, в базу данных Oracle 8.1.7 добавлены индексы Rtree (индексы Rtree используются для индексирования пространственных данных).

Часто задаваемые вопросы об индексах

Как уже было сказано во введении, мне приходится отвечать на множество вопросов о СУБД Oracle. Я - именно тот Том, который ведет рубрику AskTom в журнале Oracle Magazine и поддерживает сайт http: asktom.oracle.com, где пользователи могут получить ответы на вопросы о базе данных и средствах разработки Oracle. Практика показывает, что наибольшее количество вопросов касается индексов. В этом разделе я дам ответы на некоторые из наиболее часто и постоянно задаваемых вопросов об индексах. Некоторые ответы могут показаться очевидными, другие - могут вас удивить. Надо сказать, что с индексами связано множество мифов и непонимания.

Работают ли индексы с представлениями?

Часто задают похожий вопрос: Как проиндексировать представление? . Суть в том, что представление - это сохраненный запрос. Сервер Oracle будет подставлять в текст запроса к представлению определение самого представления. Представления обеспечивают удобство для конечных пользователей, оптимизатор же работает с запросом к базовым таблицам. Любые индексы, которые могли бы использоваться в запросе, непосредственно обращающемся к базовым таблицам, будут учтены при использовании представления. Чтобы проиндексировать представление, надо просто проиндексировать базовые таблицы.

Индексы и пустые значения

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

Чтобы понять, как сказывается то, что значения Null не хранятся, рассмотрим следующий пример:

ops$tkyte@ORA8I.WORLD> create table t (x int, у int); Table created.

ops$tkyte@ORA8I.WORLD> create unique index t idx on t(x,y); Index created.

ops$tkyte@ORA8I.WORLD> insert into t values (1, 1) ; 1 row created.

ops$tkyte@ORA8I.WORLD> insert into t values (1, NULL); 1 row created.



1 ... 112 113 114 [ 115 ] 116 117 118 ... 469

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