Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Уникальное значение для огромной таблицы


Автор: TaNK 8.11.2013, 12:37
Добрый день!
Имеется огроманная таблица ~ 2млрд.строк. Она секционированна по месяцам, появилась необходимость создать уникальное поле. Есть ли возможность повесить уникальное значение на последнии портиции , так как предыдущие уникальные значения не нужны. Или подскажите в какой стороне поискать решения.
Спасибо.

Автор: Zloxa 8.11.2013, 13:14
Цитата

A local index can be created UNIQUE if the partitioning columns form a subset of the index columns. This restriction guarantees that rows with identical index keys always map into the same partition, where uniqueness violations can be detected.

http://docs.oracle.com/cd/E11882_01/server.112/e25523/part_avail.htm#VLDBG00403

Автор: Zloxa 8.11.2013, 13:44
TaNK, я долго медетировал над твоим постом и так и не понял чего же ты хочешь в конце концов добиться. 

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

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

Автор: TaNK 8.11.2013, 14:33
Цитата(Zloxa @  8.11.2013,  13:44 Найти цитируемый пост)
TaNK, я долго медетировал над твоим постом и так и не понял чего же ты хочешь в конце концов добиться

покажу на примере:
             дата                 номер          статус
08.11.2013 13:59:59       1                   c 
08.11.2013 14:00:00       1                   p
08.11.2013 14:00:00       1                   o

Хотя реально с татусы идут в порядке с,о,р

При сортировки таких данных мне очень важно понимать какая запись добавилась раньше или позже. Из примера строка 2 и 3 не понятно какая строка была добавлена последней. Хотел бы сделать следующее
ID                        дата                 номер       статус
 1              08.11.2013 13:59:59       1             с
 2              08.11.2013 14:00:00       1             о
 3              08.11.2013 14:00:00       1             р 

Сортируя по дате  и по значению ID - становится понятным какая строка добавлена последняя.

Автор: Zloxa 8.11.2013, 14:38
Цитата(TaNK @  8.11.2013,  15:33 Найти цитируемый пост)
Сортируя по дате  и по значению ID - становится понятным какая строка добавлена последняя.

Во первых - как бы далеко не факт что id присваивается именно в порядке добавления. Но то не суть, надеюсь у вас действитлеьно есть основания так полгать. Более важно во вторых, и в главных,  - из вашего объяснения совершенно не понятно при чем здесь индексы и секции smile

Добавлено @ 14:46
понял
Возможно вы хотите добавить это поле ID, которого у вас вобще нет.
Вобще не вижу тут проблем - добавляйте(только не называйте его ID). Вам ведь не обязательно генерить его для всех двух миллиардов. Единственно, обратите внимание на предложение http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6015.htm#SQLRF54341 сиквенса, и помните, что обеспечение упорядоченности требует сериализации доступа к выборке значений сиквенса, что может очень серьезно просадить конкурентную вставку (по меньшей мере на РАКе)

Автор: TaNK 8.11.2013, 14:46
Цитата(Zloxa @  8.11.2013,  14:38 Найти цитируемый пост)
Но то не суть, надеюсь у вас действитлеьно есть основания так полгать

Основания конечно же есть.
Цитата(Zloxa @  8.11.2013,  14:38 Найти цитируемый пост)
з вашего объяснения совершенно не понятно при чем здесь индексы и секции

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)