Замените столбец внешнего ключа сжатым индексом

#oracle #oracle18c

Вопрос:

Я хотел бы сэкономить несколько таблиц в своей базе данных.

Например, в одной таблице есть простой столбец идентификатора первичного ключа и столбец VARCHAR2. Столбец VARCHAR2 не имеет повторяющихся значений, но имеет разные уникальные идентификаторы.

На столбец PK этой таблицы просто один раз ссылаются как на внешний ключ в другой таблице.

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

Теперь я мог бы удалить ссылку на внешний ключ, удалить таблицу и получить новый столбец со всеми (повторяющимися) значениями VARCHAR2. Их я хотел бы сжать уникальным/особым способом.

Я слышал об индексе в базе данных Oracle для сжатия столбцов, но я не совсем уверен, какой индекс мне нужен или как их использовать…

Базовая функция (и экономия памяти) должна быть примерно такой же, как и в предыдущей таблице уникальных значений и ссылки на внешний ключ.

Заранее благодарю вас за вашу помощь!

Комментарии:

1. Передача атрибутов родительской таблицы в дочернюю таблицу называется денормализацией (также нарушением правил нормальной формы ). Хотя его можно использовать в некоторых сценариях хранилища данных , его следует избегать любой ценой при настройке OLTP из-за высокого риска несоответствий. Если у вас высокое среднее число детей, то перемещение атрибута в дочернюю таблицу и удаление родителя не будет иметь эффекта экономии памяти — наоборот.

2. @MarmiteBomber вы абсолютно правы насчет денормализации… Однако я все равно хотел бы знать, как использовать сжатый столбец индекса.

3. Насколько я знаю, Oracle не хранит столбцы вне строки, за исключением полей, поэтому вы не можете сжать один столбец в общей таблице. Exadata, сжатие таблиц и IOT выходят за рамки этой области

4. @astentx как насчет «простого» (не уникального) индекса в столбце varchar2 с «сжатием» ? Будет ли это ответом? Или это какое-то другое сжатие?

5. Индекс-это отдельная сущность, он не заменяет столбец и использует дополнительное хранилище. Вы можете проверить концепции для получения информации об основных элементах СУБД Oracle и о том, как она работает с ними.

Ответ №1:

Базовое сжатие Oracle позволяет нам сжимать таблицы. Он имеет несколько явных ограничений, не последним из которых является то, что он не подходит для баз данных OLTP. Прямые вставки, обновления и удаления пути не приносят пользы. Так что ты не можешь делать то, что хочешь, таким образом. Если ваша организация обратилась за лицензией на расширенное сжатие, то у вас есть больше возможностей, но сжатие по-прежнему работает для таблицы, а не для отдельного столбца.

Я думаю, вы перепутали вещи со сжатием индекса, которое действительно работает со столбцами, поскольку оно позволяет нам сжимать ведущие столбцы составного индекса. Но его стоит применять только тогда, когда в этих столбцах много повторений. Если ваш индекс имеет уникальный идентификатор для ведущего столбца, то сжатие фактически увеличит общий объем занимаемого пространства. (Только одна причина, по которой составные индексы должны строиться с наименее избирательным столбцом первым и наиболее избирательным столбцом последним.)

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