Как использовать разные табличные пространства для таблиц и индексов с liquibase в Java

Я использую liquibase (3.6.3) в приложении Spring Boot (2.1.8) java (1.8) для управления изменениями схемы базы данных (Oracle 12.2). Мои наборы изменений liquibase не содержат параметров «табличного пространства», и все данные (включая индексы) создаются в табличном пространстве по умолчанию «ПОЛЬЗОВАТЕЛИ». Теперь мне нужно переместить все существующие индексы в другое табличное пространство «INDX» и создать все будущие индексы не в табличном пространстве «USERS» по умолчанию, а в новом табличном пространстве «INDX».

Итак, мои вопросы:

  1. Как я могу перенести старые индексы из табличного пространства USERS в табличное пространство INDX?

  2. Как создать новые индексы в табличном пространстве INDX? Я знаю параметр «primaryKeyTablespace» для элемента столбца/ограничения и параметр «tablespace» для элемента createIndex, есть ли другие решения? Возможно, я могу указать табличное пространство «INDX» для всех централизованных индексов?

Спасибо!


person antropoff    schedule 03.06.2020    source источник


Ответы (2)


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

<property name="index_tablespace" value="INDEX" dbms="oracle"/>
<property name="index_tablespace" value="" dbms="postgresql"/>

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

Обычно табличные пространства не используются в Postgres — по крайней мере, не так, как вам нужно в Oracle, поэтому вы можете просто оставить это поле пустым.

Затем используйте это свойство в изменении createIndex:

<createIndex indexName="idx_firstname" tableName="person" tablespace="${index_tablespace}"/>

Чтобы изменить существующий индекс для использования другого табличного пространства, вам придется использовать SQL для конкретной базы данных (см. ответ pmdba). Вы должны сделать это зависимым от dbms:

<changeSet id="fix-index-tablespace" author="arthur" dbms="oracle">
  <sql> 
    alter index ...
  </sql>
</changeSet>
person a_horse_with_no_name    schedule 03.06.2020

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

alter index [index_name] rebuild tablespace [tablespace_name];

Это заблокирует вашу таблицу на время, необходимое для завершения перестроения. Если вам нужно держать таблицу доступной для обновлений, используйте команду «онлайн»:

alter index [index_name] rebuild tablespace [tablespace_name] online;

Если в индексе много данных, вы можете добавить предложение «parallel», чтобы ускорить процесс. Как правило, не устанавливайте степень параллелизма выше, чем количество ядер ЦП в вашей системе:

alter index [index_name] rebuild tablespace [tablespace_name] online parallel [x];

Что касается вашего второго вопроса о табличных пространствах по умолчанию, вы можете решить это по-разному в зависимости от вашей версии Oracle. В Oracle 19c есть новая функция, позволяющая базе данных автоматически индексировать ваши таблицы (т. е. вам не нужно ничего делать!), о которой вы можете прочитать здесь: https://blogs.oracle.com/oraclemagazine/autonomous-indexing

Если вы используете более старую версию Oracle, вы будете ограничены любыми параметрами конфигурации, доступными в liquibase.

person pmdba    schedule 03.06.2020
comment
Спасибо за ваш ответ! Могу ли я перестроить индексы без собственных команд sql, используя только синтаксис liquibase? Мы хотим добавить поддержку базы данных Postgres в будущем и, насколько я понимаю, нам нужно избегать нативного SQL в наборах изменений Liquibase. - person antropoff; 03.06.2020
comment
Я недостаточно хорошо знаю Liquibase, чтобы сказать, но думаю, что нет, так как синтаксис для этого будет уникальным для Oracle. Лично я всегда рекомендую полностью избегать использования ORM именно по этой причине, особенно потому, что они заставляют вас использовать наименьший общий знаменатель и не позволяют вам воспользоваться тем, что делает каждую базу данных уникальной и мощной. - person pmdba; 03.06.2020
comment
@pmdba: Liquibase - это не ORM, это инструмент для управления сценариями миграции схемы. - person a_horse_with_no_name; 03.06.2020
comment
Снято - не одно и то же - person pmdba; 03.06.2020