Я имел большой успех в хранении сложных объектов XML в PostgreSQL. Вместе с функциями функциональных индексов вы даже можете создавать индексы для значений узлов хранимых файлов XML и использовать эти индексы для очень быстрого поиска с использованием сканирования индекса без необходимости повторного анализа файла XML.
Это, однако, будет работать, только если вы знаете шаблоны запросов, произвольные запросы xpath также будут медленными.
Пример (непроверенный, содержит синтаксические ошибки наверняка):
Создать простую таблицу:
create table test123 (
int serial primary key,
myxml text
)
Теперь давайте предположим, что у вас есть XML-документы, такие как:
<test>
<name>Peter</name>
<info>Peter is a <i>very</i> good cook</info>
</test>
Теперь создайте индекс функции:
create index idx_test123_name on table123 using xpath(xml,"/test/name");
Теперь вы быстро ищите в XML:
SELECT xml FROM test123 WHERE xpath(xml,"/test/name") = 'Peter';
Вам также следует подумать о создании индекса с использованием text_pattern_ops, чтобы у вас был быстрый поиск префиксов, например:
SELECT xml FROM test123 WHERE xpath(xml,"/test/name") like 'Pe%';