Я использую, в спящем режиме 3.3.2 в довольно крупном проекте с PostgreSQL 8.4 с помощью PostgreSQLDialect.
Путем нам настраивали наши отношения, мы заканчиваем тем, что делали большой поиск на атрибутах Внешнего ключа наших таблиц.
По причинам производительности я хотел бы иметь, в спящем режиме, добавляют Индексы ко всем столбцам внешнего ключа, когда мы составляем наши таблицы с помощью hbm2dll.auto.
MySQL автоматически добавил бы Индексы к этим столбцам, но там, кажется, не способ сделать это в Пост-ГРЭС.
Существует ли опция, которую я могу установить где-нибудь, или что-то, что я могу добавить к своим файлам hbm.xml, чтобы заставить это произойти?
Попробуйте одно из:
<many-to-one name="master" class="Master" column="master_id" index="my_index_name" />
<many-to-one name="master" class="Master">
<column name="master_id" index="my_index_name" />
</many-to-one>
Hibernate обеспечивает создание индекса только для MySQL, но не для PostgreSQL, Oracle и т. Д. MySQL не допускает внешних ключей без индекса, другие базы данных не имеют этого ограничения.
В Sybase есть объяснение , почему не применять индексы - это хорошо, на форуме Hibernate также есть тема об этом (связанная с Oracle), включая обходной путь. Но прежде чем вы начнете создавать множество индексов, начните проверять, нужны ли вам все эти индексы. Во многих случаях индексы можно комбинировать с другими для ускорения работы. Все это зависит!
Используйте EXPLAIN в своих запросах, чтобы увидеть, как база данных выполняет их, какие индексы используются, где индексы отсутствуют и т. Д.
Вот быстрый и грязный запрос, который генерирует DDL для индексов для каждого определенного внешнего ключа в схеме:
SELECT 'CREATE INDEX fk_' || conname || '_idx ON '
|| relname || ' ' ||
regexp_replace(
regexp_replace(pg_get_constraintdef(pg_constraint.oid, true),
' REFERENCES.*$','',''), 'FOREIGN KEY ','','') || ';'
FROM pg_constraint
JOIN pg_class
ON (conrelid = pg_class.oid)
JOIN pg_namespace
ON (relnamespace = pg_namespace.oid)
WHERE contype = 'f'
AND nspname = 'public';
Это было протестировано только в PostgreSQL 8.4, но я думаю, что он должен работать в большинстве 8.x версии.
Также обратите внимание, что это не определяет, какие из них уже охвачены индексом, поэтому у вас, вероятно, будет некоторое дублирование.