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

1 ... 280 281 282 [ 283 ] 284 285 286 ... 469


1262

Глава 17

SQL> desc dr$mytext idx$n;

Name Null? Type

NLT DOCID NOT NULL NUMBER(38)

NLT MARK NOT NULL CHAR(l)

SQL> desc dr$mytext idx$r;

Name Null? Type

ROW NO NUMBER(3)

DATA BLOB

Для каждого индекса interMedia Text создается набор таблиц с подобной структурой. Таблица лексем, DR$MYTEXT IDX$I, - это основная таблица индекса interMedia Text. Эта таблица используется для хранения каждой проиндексированной лексемы и битовой карты с установленными битами для всех документов, содержащих эту лексему. В этой таблице хранится и другая двоичная информация для оценки близости лексем в тексте. Обратите внимание, что я умышленно использую термин лексема в этом абзаце, поскольку компонент interMedia Text позволяет индексировать тексты на языках с иероглифической письменностью, включая китайский, японский и корейский. Бхло бы некорректно говорить об использовании таблицы DR$I для индексирования слов .

Таблицы DR$K и DR$R по сути поддерживают соответствие между идентификаторами строк (ROWID) и идентификаторами документов.

Последняя таблица, DRSN, или таблица отсутствующих строк , используется для поддержки списка удаленных документов/строк. При удалении строки из таблицы, по которой создан индекс interMedia Text, физическое удаление информации об этой строке из индекса interMedia Text откладывается. В этой служебной таблице записываются идентификаторы документов из удаленных строк для последующего удаления при следующей перестройке или оптимизации индекса.

Учтите также, что таблицы DR$K и DR$N создаются как организованные по индексу. Обращения к этим таблицам в коде компонента interMedia Text обычно затрагивают оба столбца таблиц. Для повышения эффективности и сокращения объема ввода-вывода эти таблицы организуются по индексу.

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

Индексирование с помощью interMedia Text

Используя простую таблицу, созданную в пред],дущем разделе, давайте по шагам пройдем процесс вставки текста, чтобы увидеть момент фактического выполнения соответствующих изменений компонентом interMedia Text:

SQL> delete from mytext;

2 rows deleted.



interMedia 1263

SQL> insert into mytext(id, thetext)

2 values(1, interMedia Text is ite simple to use) ;

1 row created.

SQL> insert into mytext(id, thetext)

2 values(2, interMedia Text is powerful, yet easy to learn);

1 row created.

SQL> commit;

Commit complete.

Итак, можно ли сейчас по запросу поиска Text получить обе строки таблицы? Может быть. Если индекс interMedia Text не синхронизирован, то выполненные изменения в нем еще не учтены. Синхронизация индекса означает выполнение всех ожидающих учета изменений. Как же определить, есть ли в индексе interMedia Text изменения, ожидающие учета?

SQL> select pnd index name, pnd rowid from ctx user pending;

PND INDEX NAME PND ROWID

MYTEXT IDX AAAGF1AABAAAIV0AAA

MYTEXT IDX AAAGF1AABAAAIV0AAB

Выполняя запрос к представлению CTX USER PENDING, можно определить, что ожидают изменения две строки индекса interMedia Text с именем MYTEXT IDX. Представление CTX USER PENDING создано по принадлежащей пользователю CTXSYS таблице DRSPENDING. При любой вставке строки в таблицу MYTEXT в таблицу DRSPENDING будет вставляться строка для индекса MYTEXT IDX interMedia Text. Обе вставки выполняются в одной физической транзакции, поэтому, если транзакция, вставившая строку в таблицу MYTEXT, будет отменена, произойдет также отмена вставки в таблицу DRSPENDING.

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

Простейший метод синхронизации индекса - запуск программы ctxsrv. Эта программа работает аналогично демонам в ОС UNIX. Программа запускается, работает в фоновом режиме и время от времени автоматически синхронизирует индекс. Этот метод рекомендуется использовать при работе с небольшим количеством (до 10000) строк, каждая из которых содержит небольшой объем текста.

Другой метод синхронизации индекса - выполнение оператора ALTER INDEX. Можно организовать очередь изменений, ожидающих выполнения, а затем построить и выполнить пакет действий по синхронизации индекса. Во многих случаях это лучший метод синхронизации индекса, обеспечивающий минимальную фрагментацию. Для синхронизации индекса используется следующий оператор:

alter index [схема.]индекс rebuild [online]

parameters(sync [memory обьем памяти] )

Имеет смысл пересоздавать индекс в оперативном режиме (online), чтобы он оставался доступным в процессе синхронизации. Кроме того, можно задать объем исполь-



1264

Глава 17

зуемой при этом памяти. Чем больше памяти выделено процессу синхронизации, большим может быть пакет индексируемых изменений и тем меньше окажется в итоге индекс interMedia Text.

Хотя многие и сочтут третий метод синхронизации индекса одноразовым, я настаиваю, что простое пересоздание индекса тоже является методом синхронизации. При выполнении оператора CREATE INDEX для создания индекса типа CONTEXT бу создан индекс и проиндексированы все данные столбцов, по которым он создается. При этом часто действия выполняются циклически: в таблице есть данные, мы создаем индекс, а затем добавляем новые строки. Поскольку изменения, связанные с добавлением новых строк, не выполняются до момента синхронизации индекса, многие приходят к выводу, что единственный способ поддержать актуальность индекса - удалить и создать его заново! Индекс действительно синхронизируется, но такой метод крайне неэффективен, и я не рекомендую его использовать.

Семантика языка SQL принципиально не позволяет двум пользователям одновременно выполнять оператор ALTER INDEX REBUILD для одного и того же индекса, но ничто не мешает пересоздавать или синхронизировать одновременно несколько индексов interMedia Text.

Продолжая пример, синхронизируем индекс:

SQL> alter index mytext idx rebuild online parameters(sync memory 20M) ; Index altered.

SQL> select pnd index name, pnd rowid from ctx user pending; no rows selected

Теперь индекс синхронизирован, и можно выполнять запрос, использующий его:

SQL> select id

2 from mytext

3 where contains(thetext, easy) > 0

Просмотрим данные в одной из служебных таблиц, созданных автоматически при создании индекса interMedia Text:

SQL> select token text, token type from dr$mytext idx$i;

TOKEN TEXT TOKEN TYPE

EASY 0

INTERMEDIA 0

LEARN 0

POWERFUL 0

QUITE 0

SIMPLE 0

TEXT 0

USE 0

YET 0



1 ... 280 281 282 [ 283 ] 284 285 286 ... 469

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