|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Всем привет! Я строю динамическое секционирование таблицы по метке времени с интервалом в час и у меня не получается писать в новую таблицу. Родительская таблица: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Текст функции, которая создает динамически новые секционные таблицы, и текст триггера перед INSERT: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
При выполнении записи новых строк я получаю вот такую ошибку и уже голову сломал в чем проблема: SQL Error [23514]: ERROR: new row for relation "dwh.raw_data_2020-03-23-04" violates check constraint "dwh.raw_data_2020-03-23-04_ts_timestamp_check" Detail: Failing row contains (1218483, 4161341a-ad79-4021-b6fa-f6754f34f5cb, frequency, 49.8486557006835938, 1584974047062000, 2020-03-23 16:34:07, 2020-03-23 16:54:30.598366, 2020-03-23 16:54:30.598366). Where: SQL statement "INSERT INTO "dwh.raw_data_2020-03-23-04" (equipment_id,parameter_id,value,ts_original,ts_timestamp) VALUES($1,$2,$3,$4,$5)" PL/pgSQL function dwh.fact_raw_insert_function() line 38 at EXECUTE SQL statement "insert into dwh.fact_measures_raw (equipment_id, parameter_id, value, ts_original, ts_timestamp) select id, column_name, cast(column_value as float8),cast(ts as bigint), to_timestamp( NULLIF(ts, '')::bigint/1000000) from dwh.vw_stg_raw where column_value is not null and column_name not in ('ts','created_at') and created_at < date_insert" PL/pgSQL function dwh.insert_fact_measures_raw() line 6 at SQL statement Что я делаю не так? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 17:58 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
kirill demidov, CHECK ( date_trunc(\'hour\', ts_timestamp) где ts_timestamp = 2020-03-23 16:34:07 но new row for relation "dwh.raw_data_2020-03-23-04" Почему? Странная разница в 12 часов не побуждает проверить вполне определённую штуку? https://www.postgresql.org/docs/current/functions-formatting.html HH hour of day (01-12) А вообще не надо создавать партиции из триггера. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 18:50 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, Спасибо за замечание! А как бы вы создавали динамические секции? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 07:15 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij kirill demidov, CHECK ( date_trunc(\'hour\', ts_timestamp) где ts_timestamp = 2020-03-23 16:34:07 но new row for relation "dwh.raw_data_2020-03-23-04" Почему? Странная разница в 12 часов не побуждает проверить вполне определённую штуку? https://www.postgresql.org/docs/current/functions-formatting.html HH hour of day (01-12) А вообще не надо создавать партиции из триггера. Я изменил функцию: Код: plsql 1. 2. 3. 4. 5. 6. 7.
но продолжаю получать ту же ошибку: SQL Error [23514]: ERROR: new row for relation "dwh.raw_data_2020-03-24-07" violates check constraint "dwh.raw_data_2020-03-24-07_ts_timestamp_check" Detail: Failing row contains (25631259, 4161341a-ad79-4021-b6fa-f6754f34f5cb, frequency, 50.6228485107421875, 1585026909342000, 2020-03-24 07:15:09, 2020-03-24 07:15:21.33603, 2020-03-24 07:15:21.33603). Where: SQL statement "INSERT INTO "dwh.raw_data_2020-03-24-07" (equipment_id,parameter_id,value,ts_original,ts_timestamp) VALUES($1,$2,$3,$4,$5)" PL/pgSQL function dwh.fact_raw_insert_function() line 38 at EXECUTE SQL statement "insert into dwh.fact_measures_raw (equipment_id, parameter_id, value, ts_original, ts_timestamp) select id, column_name, cast(column_value as float8),cast(ts as bigint), to_timestamp( NULLIF(ts, '')::bigint/1000000) from dwh.vw_stg_raw where column_value is not null and column_name not in ('ts','created_at') and created_at < date_insert" PL/pgSQL function dwh.insert_fact_measures_raw() line 6 at SQL statement Может у меня еще где-то есть проблема? У меня такое ощущение что проблема в части создания новой таблицы-секции, но я не понимаю, блин, как это дебагнуть. Я просто пришел из мира SQL Server и только начинаю свои первые шаги в постгресе... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 08:20 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
kirill demidov А как бы вы создавали динамические секции? Никак. Какие разделы нужны известно заранее. kirill demidov start_of_hour := to_char((NEW.ts_timestamp), 'YYYY-MM-DD HH24:DD:SS') || '-01'; И что же тут может пойти не так... Посмотрите какой check constraint создали и почему оно violates для заданного timestamp. Опять же весьма очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 10:53 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
kirill demidov, Посмотрите на timescaledb . То что вам нужно оно умеет делать. Хотя в долгосрочной перспективе у меня есть сомнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 11:15 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, Заранее почасовые секции для таблицы с более чем миллионом транзакций в час на ближайший год сделать проблематично - "Это же так очевидно!" У таблицы нет одного констрейнта - я ведь показал скрипт создания таблицы - других объектов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 11:37 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
kirill demidov Melkij, Заранее почасовые секции для таблицы с более чем миллионом транзакций в час на ближайший год сделать проблематично - "Это же так очевидно!" Миллион в час - это не много. Тысячи партиций - это много. Слишком много для OLTP. Для партиций по времени создания у вас есть знание куда новые данные будут писаться и когда. Кроном их создают немного загодя, чтобы иметь время на манёвры. kirill demidov У таблицы нет одного констрейнта - я ведь показал скрипт создания таблицы - других объектов нет. CREATE TABLE %I (CHECK ( - вы писали? Вот таблица. На ней constraint. Почему это вдруг "нет одного констрейнта" когда он есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 11:54 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, спасибо - буду проверять где проблема в процедуре и почему не работает инсерт ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:41 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Поменял весь концепт секционирования! Благодаря совету Melkij, ушел от принципа триггеров и наследования и использую функцию Partition By в момент создания таблицы Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
и динамическое создание секций еженедельно (кронтаб )с помощью процедуры: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Melkij спасибо за совет! Тему можно закрывать ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2020, 23:00 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Уважаемые, доброго времени суток! Помогите старому ораклисту, у которого кривая судьбы завернула в сторону PG, понять, что не так синтаксисом! Пытаюсь создать секционированную таблицу, сделал всё по доке (вроде бы), более того, используемый инструмент сгенерил тот же самый скрипт что и написал сам: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Выдаёт ошибку: Код: sql 1.
Подскажите, что не так? Перелопатил Гугл, что-нибудь вразумительного не нашёл... Версия 12.2 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 15:33 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
MacArrow, голова партицированной таблицы не может указывать tablespace. tablespace могут быть определены для разделов с данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 15:51 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij MacArrow, голова партицированной таблицы не может указывать tablespace. tablespace могут быть определены для разделов с данными. О! Спасибо! Отработало! Где-то в Гугле вычитал, что наоборот, нужно явное указание ТС... Вот и купился! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 16:13 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, потребовалось другое решение... но возникли трудности с реализацией. Подскажите пожалуйста, как обойти ошибку? Или же как это правильно реализовать в PG? Версия 12.2 Таблица с секциями по методу "список" и по полю типа "дата": Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Но при создании секции выдаёт ошибку: Код: plsql 1.
Ошибка: Код: plaintext
В общем, вопрос: как избавиться/обойти? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 22:13 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
MacArrow, а что вы сделать хотите? Показанный partition разумеется некорректный. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2020, 23:02 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, Да, разумеется... И решение тут "стандартное" - для "списка" в худшем случае должен быть тип "текст" (видимо). А если хотим по дате секционировать, то решение только через "диапазон" (но к сожалению, при "дате" диапазон не может быть в 1 день). Всё верно я интерпретирую? И обходов никаких не может быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 09:48 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
MacArrow И решение тут "стандартное" - для "списка" в худшем случае должен быть тип "текст" (видимо). Чего вдруг? Ошибку вы получаете именно потому что указанная строка 'od_dt' не есть дата. Укажите литерал даты. MacArrow но к сожалению, при "дате" диапазон не может быть в 1 день Отчего же? range partition подразумевает условие from >= value < to ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 10:52 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Melkij, Спасибо Вам за терпение и вразумительные ответы. MelkijОтчего же? range partition подразумевает условие from >= value < to При создании секции (условно: " from '01.01.2020' to '01.01.2020'"), выдало ошибку, что не может быть диапазон с одинаковыми границами... ЧЯДНТ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 11:11 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
MacArrow Melkij, Спасибо Вам за терпение и вразумительные ответы. MelkijОтчего же? range partition подразумевает условие from >= value < to При создании секции (условно: " from '01.01.2020' to '01.01.2020'"), выдало ошибку, что не может быть диапазон с одинаковыми границами... ЧЯДНТ? не читаете то что вам Melkij написал MelkijОтчего же? range partition подразумевает условие from >= value < to ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 11:28 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
Lonepsycho, А по существу? Это как раз был его ответ на мой вопрос о том, что нельзя создать диапазон в 1 день (в условном примере). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 11:35 |
|
Ошибка при создании секционированной таблицы в постгресе
|
|||
---|---|---|---|
#18+
for values from '01.01.2020' to '01.01.2020' означает условие: '01.01.2020' >= value and value < '01.01.2020' and value is not null Что в принципе невозможно ни для какого значения. Всегда пустая таблица. Партиция для данных первого января записывается как for values from ('2020-01-01') to ('2020-01-02'). До второго января, не включая его. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2020, 11:47 |
|
|
start [/forum/topic.php?fid=53&msg=39940614&tid=1994703]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 421ms |
0 / 0 |