|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Начинаю потихоньку разбираться с особенностями сабжа. 1. Читаю про UNIQUE: Constrains the data that a column (or group of columns) contains to be unique with respect to all the rows in the table. If you insert or update the column with a duplicate value, HP Vertica does not give an error . 2. С PRIMARY KEY такая же беда: несмотря на отсутствие в pdf страницей выше аналогичного упоминания про does not give an error - два подряд insert-а с одним id отлично залетают в таблицу и тащатся select-ом. Зачем тогда данные типы constraints вообще поддерживаются? Ради упрощения можно допустить, что данные летят из нескольких независимых источников, но только на одну ноду. Существует ли способ блокировать вставку (по нарушению PRIMARY KEY или UNIQUE) и обновление (по нарушению UNIQUE) неуникальных записей? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 15:45 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
FOREIGN KEY тоже не работает. Вставляю что угодно без наличия записи в родительской табле. Вот структура: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Ну и всякое прочее баловство вида insert into ver (id_ver) values (1) insert into ver (id_ver) values (2) insert into ver (id_ver) values (1) и insert into test (id, id_ver, descript) values (44, 44, '4_4') insert into test (id, id_ver, descript) values (44, 44, '4_4') Всё успешно отрабатывает. А хотелось бы error-ом по лицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 16:05 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
А как по вашему база данных, которая не умеет строить индексы, будет поддерживать проверку PK или FK на лету? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 16:31 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Alexander RyndinА как по вашему база данных, которая не умеет строить индексы А кто Вам сказал, что FOREIGN KEY на всех СУБД в природе и в истории обязательно и всегда предполагает наличие индекса(ов) по полю(ям)? Индекс и declarative integrity - лишь один из способов упрощения реализации ссылочной целостности. И вообще вопросы на тему моего понимания ситуации предлагаю оставить за рамками темы. Я ж не спрашиваю Вас, на кой по-вашему в pdf-ке написано про поддержку constraint-ов данного типа, а они не поддерживаются, причём только про unique написано что не будет error. По теме - прихожу к выводу, что работать в такой ситуации предлагается только через MERGE, и в ON clause фактически дублировать constraints. Хотя USING там на всю голову ущербный: Source data can come from a base or external table only. Subqueries and joins are not allowed. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 16:41 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Сергей, мне кажется вы из ежа пытаетесь построить удава. Проверка PK/UK/FK это забота слоя загрузки, а не аналитической DWH. Предполагается, что масс вставка записей в таблицу уже идет чистых данных. Вы зря ожидаете от DWH поведения OLTP. Сами констрейнты нужны, чтобы обозначить правила схем данных. Это используется оптимизатором при построении планов запросов. Это используется при том же MERGE для оптимизации, если объединение идет по первичному ключу. Это используется для построения преджойн проекций аля MASTER-DETAIL, чтобы Вертика могла навесить преджойн на фактовую таблицу, а не измерение. В комплекте Вертики для проверки констрейнтов по таблицам есть специальные функции, их описание в разделе документации "Constraint Management Functions". P.S. В единичных DML типа "INSERT VALUES" кстати констрейнты полноценно работают, оно и понятно, можно быстро проверить. Если же вы в COPY говорите подгрузить парочку тб данных, странно было бы ожидать от хранилища, чтобы оно все это проверяло во время загрузки, да еще быстро грузило :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 17:48 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
ASCRUSВ комплекте Вертики для проверки констрейнтов по таблицам есть специальные функции, их описание в разделе документации "Constraint Management Functions" Ок, спасибо за наводку, посмотрю что там есть. Отпишусь. ASCRUSВ единичных DML типа "INSERT VALUES" кстати констрейнты полноценно работают, оно и понятно, можно быстро проверить Если речь идёт про обычные констрейнты, то в моём примере выше - ничего не работает. Точнее, ничего не блокируется даже когда всё просто и происходит единичная вставка. Если же речь про дополнительные специальные телодвижения - возможно. Но я пока не знаю, как это сделать. ASCRUSЕсли же вы в COPY говорите подгрузить парочку тб данных Тут как бы ситуация довольно простая, обычный простой INSERT или UPDATE, штучный, не террабайтами и даже не INSERT...SELECT, но из пары-тройки разных коннектов одновременно. И усложнять предельно простую логику конечно незачем. При bulk load - вопросов нет, там и на sybase было "кто не спрятался - я не виноват", на то он и bulk load. Ждал именно Вашего ответа. Пролистал тут темы, натыкался на обсуждение одновременной загрузки в хранилища, по идее как раз у вертики в моём понимании не должно было бы быть с этим проблем, а вот надо же. Сказать что удивлён - это ничего не сказать. Смутно надеялся на наличие каких-нибудь настроек хранилища или коннекта или ещё чего, что бы включало contraint-ы, и что Вы подскажете. Но за "Constraint Management Functions" уже спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 19:45 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Штучные INSERT/UPDATE вообще Вертике противопоказаны исходя из архитектуры хранения данных. Если многопоточно начать заваливать сервер единичными DML, то не так много времени пройдет, как появится ошибка "too many ROS containers" :) Если вам хватает штучных DML в потоках, то Вертика не та база, которая нужна ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 20:26 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
В общем, не полегчало. Может ещё надо где-то что-то подправить, но вот такое: delete from ver; select * from ver; SELECT REENABLE_DUPLICATE_KEY_ERROR(); insert into ver (id_ver, version) values (1,'2'); insert into ver (id_ver, version) values (1,'2'); select * from ver; тоже не работает, как хочется. Вызывать после BEGIN TRAN и INSERT команду SELECT ANALYZE_CONSTRAINTS('ver'); до COMMIT и если там что будет, то звать ROLLBACK? Логично и прозрачно, чего уж тут, особенно с учётом того, что ANALYZE_CONSTRAINTS из чужого коннекта то же самое вернёт. Надо видимо чего другое пощупать, что то не растёт этот кокос и крокодил плохо ловится. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 20:46 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Сергей, зачем вам это ? Вы с первоисточников льете дубликаты, OLTP источники их не гарантируют? Откуда информация льется, что она с дубликатами, что в ХД хранится будет и какая аналитика делаться? Не очень понятна задача, пока вижу попытку использования Вертики как OLTP. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 00:10 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
>OLTP источники их не гарантируют? Основная куча данных - гарантируют. Однако чтобы было понятнее: есть некий "справочник", который настолько прост, что может формироваться автоматически (и на который ссылается основная часть данных). И вот на разных источниках эти данные могут дублироваться по первичному ключу и дополнительному уникальному индексу, с частичным заполнением прочих полей в записи (по-разному на разных источниках), соответственно, крайне удобно было бы просто сливать MERGE-ем такую мелочь (нет - вставилось, есть - обновилось в части тех полей, где NULL). Без предварительной и пост- обработки. >какая аналитика делаться? Да по сути никакой серьёзной. Просто доступ 99.(9)% только чтение и дозапись новых объёмов данных - глупо держать это в "OLTP-серверах". Обычные агрегаты. Детский сад, короче. Даже JOIN-ить данные с этим "справочником" и "разворачивать" их при загрузке нет никакой необходимости. >пока вижу попытку использования Вертики как OLTP Я бы скорее это назвал попыткой попробовать избавиться от одной прослойки между всеми источниками и финишным хранилищем. Но охотно соглашусь, что я не прав, и что обязательно предполагается ещё один промежуточный слой. А на тему множества DML и загаживания памяти - там вроде как есть возможность писать напрямую на диск, если немного и осторожно. >Если вам хватает штучных DML в потоках Э нет ))), вопрос не в том, что этого хватает (потому что этого не хватает), а в том, что достаточно удобно было бы по мелочи этим пользоваться, когда это не основной способ заливки. Ну нет - значит нет. Может чего другое подойдёт. У MonetDB например с этим проблем не возникло. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 01:50 |
|
Vertica 7.1.1 Column- Constraint: UNIQUE (ну и PRIMARY KEY за компанию)
|
|||
---|---|---|---|
#18+
Сергей ВаскецовОднако чтобы было понятнее: есть некий "справочник", который настолько прост, что может формироваться автоматически (и на который ссылается основная часть данных). И вот на разных источниках эти данные могут дублироваться по первичному ключу и дополнительному уникальному индексу, с частичным заполнением прочих полей в записи (по-разному на разных источниках), соответственно, крайне удобно было бы просто сливать MERGE-ем такую мелочь (нет - вставилось, есть - обновилось в части тех полей, где NULL). Без предварительной и пост- обработки. Обычно в хранилищах делают несколько слоев. В стейджинговый слой заливается информация с первоисточников как есть, далее формируется консолидированный слой, где уже все очищается, приводится к единым ключам и приводится к 3 нормальной форме, а уже из него формируются слой витрин, в котором помимо агрегации как раз происходит частичная денормализация данных до уровня звезды. MERGE конечно тоже никто делать не запрещает, делаете буферную табличку, в нее заливаете справочник, потом мержите с основной. Но учтите, UPDATE/DELETE/MERGE накладывают эклюзивную блокировку на таблицу, пока коммит не пройдет, ни какая другая сессия изменить данные в таблице не сможет, только вставлять новые. Ну и так же разные нюансы, когда в кластере рекаверится нода, идет ребалансировка кластера и т.д. - тоже X/U блокировки будут здорово мешаться, если они часто будут идти - в итоге просто придется останавливать изменения, пока эти операции не пройдут. Сергей ВаскецовА на тему множества DML и загаживания памяти - там вроде как есть возможность писать напрямую на диск, если немного и осторожно. Я именно про диск и говорю. Почитайте архитектуру Вертики по хранению данных в ROS контейнерах. Именно для этого WOS и сделан, чтобы оптимизировать работу часто пишущих но коротких сессий, но он на вставках хорошо работать будет, а на изменениях данных выплывут нюансы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 13:49 |
|
|
start [/forum/topic.php?fid=56&msg=38972169&tid=2015141]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 155ms |
0 / 0 |