Получение В спящем режиме для генерации индексов на внешних ключах

Я использую, в спящем режиме 3.3.2 в довольно крупном проекте с PostgreSQL 8.4 с помощью PostgreSQLDialect.

Путем нам настраивали наши отношения, мы заканчиваем тем, что делали большой поиск на атрибутах Внешнего ключа наших таблиц.

По причинам производительности я хотел бы иметь, в спящем режиме, добавляют Индексы ко всем столбцам внешнего ключа, когда мы составляем наши таблицы с помощью hbm2dll.auto.

MySQL автоматически добавил бы Индексы к этим столбцам, но там, кажется, не способ сделать это в Пост-ГРЭС.

Существует ли опция, которую я могу установить где-нибудь, или что-то, что я могу добавить к своим файлам hbm.xml, чтобы заставить это произойти?

9
задан biggusjimmus 3 June 2010 в 11:17
поделиться

3 ответа

Попробуйте одно из:

<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>
1
ответ дан 3 November 2019 в 07:12
поделиться

Hibernate обеспечивает создание индекса только для MySQL, но не для PostgreSQL, Oracle и т. Д. MySQL не допускает внешних ключей без индекса, другие базы данных не имеют этого ограничения.

В Sybase есть объяснение , почему не применять индексы - это хорошо, на форуме Hibernate также есть тема об этом (связанная с Oracle), включая обходной путь. Но прежде чем вы начнете создавать множество индексов, начните проверять, нужны ли вам все эти индексы. Во многих случаях индексы можно комбинировать с другими для ускорения работы. Все это зависит!

Используйте EXPLAIN в своих запросах, чтобы увидеть, как база данных выполняет их, какие индексы используются, где индексы отсутствуют и т. Д.

2
ответ дан 3 November 2019 в 07:12
поделиться

Вот быстрый и грязный запрос, который генерирует 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 версии.

Также обратите внимание, что это не определяет, какие из них уже охвачены индексом, поэтому у вас, вероятно, будет некоторое дублирование.

2
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: