@pgsql

Страница 902 из 1062
Yaroslav
24.07.2018
12:17:17
А альтенатива какая-то есть?
Использовать DDL для добавления характеристик, например.

The
24.07.2018
12:18:00
я правильно вас понял, что вы предлагаете на каждую характеристику создавать табличку отдельную?

или что вы имеете ввиду под DDL?

Yaroslav
24.07.2018
12:21:31
я правильно вас понял, что вы предлагаете на каждую характеристику создавать табличку отдельную?
Да, это один из вариантов (зачастую, кстати, не одну, а две). Т.е. это 6NF. Другой — flat table, с отдельным NULL-аble полями под каждую характеристику.

Google
The
24.07.2018
12:23:05
Вообще, я бы хотел строже с этим делом, потому что за JSON нужно следить, и подчищать/генерировать. Ваш вариант хорош, но не совсем понимаю на словах как это сделать. Может есть в интернете ERD какие-то, чтобы на картинке понять как это должно выглядеть?

Yaroslav
24.07.2018
12:30:10
Вообще, я бы хотел строже с этим делом, потому что за JSON нужно следить, и подчищать/генерировать. Ваш вариант хорош, но не совсем понимаю на словах как это сделать. Может есть в интернете ERD какие-то, чтобы на картинке понять как это должно выглядеть?
Вариант flat table очень простой — добавляете поля, когда нужны новые харакеристики, прямо в таблицу товаров: BEGIN TRANSACTION; CREATE TABLE item_характеристика(id text PRIMARY KEY, <description и/или что-то ещё, если нужно>); ... вставляете допустимые значения... ALTER TABLE items ADD COLUMN <характеристика> text REFERENCES item_характеристика; COMMIT;

Ram 1/40 от объема примерно
Странно, всё же... интересно запросы посмотреть. :) Может быть, индексированные поля — относительно длинные тексты?

Uuidы, кстати, тоже есть и тоже помогли сильно с расчетами )
Как это они помогают? ;) Кстати, если они у вас используются как PK, уже бесполезно сравнивать b-tree (для которого это худший случай) и hash (для которого все случаи такие, UUID там или нет...).

The
24.07.2018
12:33:16
я понял, а если характеристик будет штук 100? таблица items разростется, на сколько это критично?

Tolya
24.07.2018
12:33:58
при переходе на реальные сильно место подрезалось )

varchar(36) vs uuid

Yaroslav
24.07.2018
12:36:37
я понял, а если характеристик будет штук 100? таблица items разростется, на сколько это критично?
"It depends". Т.е. около сотни обычно не без особых проблем. Но если проблемы появляются, эту модель можно и усложнить (разбиением на таблицы 1:1 просто для ускорения доступа).

The
24.07.2018
12:38:14
я вас понял, спасибо. а можете ещё привести небольшой пример с вариантом по 6NF, тот который альтернативный для flat table? буду очень признателен

Google
Yaroslav
24.07.2018
12:44:49
я вас понял, спасибо. а можете ещё привести небольшой пример с вариантом по 6NF, тот который альтернативный для flat table? буду очень признателен
Просто на каждую характеристику — отдельная таблица, т.е.: — таблица допустимых значений характеристики: CREATE TABLE item_характеристика_value(value text (или любой другой тип, как и в первом случае) PRIMARY KEY, <description и/или что-то ещё, если нужно>); ... вставляете допустимые значения... CREATE TABLE item_характеристика(item_id int PRIMARY KEY REFERENCES item, характеристика NOT NULL REFERENCES item_характеристика_value); При этом обычно используют соотв. VIEW-ы для доступа к характеристикам, т.к. нужен JOIN для каждой. Кроме того, обычно можно распределить характеристики по группам, т.е., например, все товары-газонокосилки будут иметь много сходных характеристик, и для оптимизации поместить их в одну таблицу: CREATE TABLE item_характеристики_газонокосилок(item_id int PRIMARY KEY REFERENCES item, характеристика1 NOT NULL REFERENCES ..., характеристика1 NOT NULL REFERENCES ..., );

Естественно, записи в таблицы для не относящихся к данному товару характеристик просто не вставляются.

The
24.07.2018
12:46:37
Спасибо, ушел обдумывать. Вот ещё нашел, http://www.softwaregems.com.au/Documents/Student%20Resolutions/5NF%206NF%20Simple.pdf

Фамилию
24.07.2018
12:52:48
Добрый день всем. Поделитесь пожалуйста ссылочкой на книгу Postgresql для профессионалов. Или где можно скачать эти знания

Yaroslav
24.07.2018
12:56:29
Спасибо, ушел обдумывать. Вот ещё нашел, http://www.softwaregems.com.au/Documents/Student%20Resolutions/5NF%206NF%20Simple.pdf
Да, знакомая схема (хмм... PerformanceDBA... и автора этого я откуда-то помню ;) ). Она помогает решать связанную с этим моделированием проблему: вот добавилось у вас в таблицу (flat или 6NF, неважно) какое-то новое поле... и приложение "тупо смотрит" на него и "думает" — "и что?". ;) Т.е. откуда ему знать, что это вообще характеристика? Как её показывать пользователю? Откуда брать для неё значения? (Но часть этих вопросов относится вообще к любому полю любой таблицы, поэтому, возможно, уже как-то автоматически решается вашим приложением.)

Tolya
24.07.2018
13:05:13
партиционирование, потому что табличка 5-титерабайтная, хотим таким образом решить проблемы раздельного хранения на разных дисках и ускорения изменения структуры

Alexander
24.07.2018
13:07:37
коллеги, а как лучше восстановить работоспособность слейва? сейчас он у меня, как я понимаю ушел на далеко расстояние от мастера и лежит с такими логами cp: cannot stat '/var/lib/postgresql/9.6/main/archive/0000000100000052000000EC': No such file or directory 2018-07-24 16:04:58 MSK LOG: started streaming WAL from primary at 52/EC000000 on timeline 1 2018-07-24 16:04:58 MSK FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 0000000100000052000000EC has already been removed

Tolya
24.07.2018
13:07:50
по схеме просто пока идея есть, что при использовании служебного ключа самые актуальные данные будут +- в самых свежих партициях, следовательно можно будет с большей вероятностью гарантировать, что к старым данным на старых дисках будет обращений меньше

Tolya
24.07.2018
13:09:08
хотя вот тут первый косяк сам и нашел ? получается, что запрашиваемые на чтение данные не будут никак отмечаться недавно используемыми и тогда смысла в таком делении особого нет

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

Tolya
24.07.2018
13:27:49
да, думал часто изменяемые данные подтягивать в первые партиции, остальные в старых оставлять

и условно первые три месяца держать на ssd, остальные сносить на sas

при изменении записи приложением будет меняться служебное поле и запись будет мигрировать в свежую партицию

типа кеширования ?

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

есть еще один вопрос по партициям кто-то сравнивал производительность при вставках в партиции inheritance и нативные (PostgreSQL 10.4)?

Google
Yaroslav
24.07.2018
13:31:43
и условно первые три месяца держать на ssd, остальные сносить на sas
То есть, сама схема статичная, по year+month? > потому что часто читаемые записи могут все равно оставаться на медленных дисках Причём тут чтение, вообще? ;) Я думал, вам для maintenance нужно...

Tolya
24.07.2018
13:32:55
одна из целей - максимально данные вынести на медленные диски, но при этом не замедлять работу системы поэтому хочется часто используемые данные иметь на ssd

чтение при этом)

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

и если в случае с изменением данных заодно еще и обновить поле последнего изменения не накладно, то при каждом чтении проставлять еще отдельным апдейтом это поле уже так себе идея, мне кажется ?

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

а значит и смысла связываться с такой схемой + создавать доп нагрузку из-за перетеканий между партициями данных нету

Tolya
24.07.2018
13:43:20
да, я тоже на ней в итоге остановился

пока только не знаю, делать на нативном партиционировании или через inheritance

потестирую оба варианта

Yaroslav
24.07.2018
13:44:55
да, я тоже на ней в итоге остановился
Да, всё равно при ваших объёмах лучше партиционировать, т.к. maintenance (индексация, VACUUM (особенно anti-wraparound) и т.п.) будет гораздо веселее, по идее. :)

Tolya
24.07.2018
13:45:39
основные проблемы с новыми индексами и изменением структуры таблицы, там пока боль, да ) с вакуумами проблем нет

изменения данных тоже в основном в онлайне начали пускать уже) а вот индексы concurrently идут очень долго

Yaroslav
24.07.2018
13:46:33
пока только не знаю, делать на нативном партиционировании или через inheritance
По идее, нативное a) немного быстрее сейчас b) будет намного быстрее в будущем (v11, v12), причём вам, скорее всего, это достанется без дополнительных усилий с вашей стороны. ;)

Tolya
24.07.2018
13:47:17
в будущем – да но до перехода на 11тую версию в проде еще не меньше, чем пол года пройдет

и перейти с inheritance в любом случае относительно просто

Yaroslav
24.07.2018
13:48:27
основные проблемы с новыми индексами и изменением структуры таблицы, там пока боль, да ) с вакуумами проблем нет
Точно нет проблем с VACUUM? Впрочем, это теперь (после улучшений в 9.6 (кажется)) "как повезёт"... и почти всегда везёт, да. ;)

Tolya
24.07.2018
13:48:44
да, проблемы как раз до 9.6 были

Google
Yaroslav
24.07.2018
13:48:48
и перейти с inheritance в любом случае относительно просто
А зачем два раза делать ту же работу? ;)

Tolya
24.07.2018
13:48:51
с новой vm-фичей все ок

А зачем два раза делать ту же работу? ;)
чтобы пол года не просаживаться по производительности (Если будет критически большой разрыв, конечно)

если будет +- одно и то же, смысла мудрить нет

может декларативное все-таки быстрее окажется, как и ожидалось ?

Yaroslav
24.07.2018
13:50:13
чтобы пол года не просаживаться по производительности (Если будет критически большой разрыв, конечно)
А почему вы думаете, что будет "просаживаться"? Наоборот должно быть, уже сейчас! :)

Admin
ERROR: S client not available

Tolya
24.07.2018
13:51:17
на 10 версии мы перешли на декларативное и почувствовали просадку производительносит вероятно, это совпало с нашими доработками системы и декларативное партиционирование тут ни при чем, но теперь хочется убедиться

Yaroslav
24.07.2018
13:51:57
может декларативное все-таки быстрее окажется, как и ожидалось ?
Сейчас (v10) декларативное мало отличается от синтаксического сахара над inheritance, но! триггеры на вставку-то написаны на C (т.е. это машинный код), и, казалось бы, должны выигрывать у plpgsql... ;)

Tolya
24.07.2018
13:52:36
мне тоже так казалось, на тестах не почувствовали почти никакой разницы, на проде стало в логи больше медленных запросов сыпаться

опять же, логически это вряд ли связано с переходом, но проверить хочется ?

The
24.07.2018
14:02:57
ребятки, какую информацию о файлах вы храните в базе, например на примере картинок? я счел разумным хранить ширину/высоту в пикселях, информация о плане фото (например, для товара это "коробка", "вид спереди" и т.д.), что ещё пишете туда?

удобно будет находить товары, где нету "фото спереди" или "фото упаковки".

ну и отстойные по качеству фотки тоже можно легко найти

Yaroslav
24.07.2018
14:10:48
опять же, логически это вряд ли связано с переходом, но проверить хочется ?
Да, это было бы странно. По крайней мере, я знаю очевидных причин.

Tolya
24.07.2018
14:11:28
тот же самый скип полностью видимых страничек был крутой фичей тоже ) но с багом )

всякое бывает

Vladimir
24.07.2018
14:19:51
Может кто подскажет, делаю pg_dump базы, вылетает с ошибкой MultiXactId .... прекратил существование, видимо произошло наложение. Вменяемых манулов по данной проблеме не нашел

Pavlo
24.07.2018
14:29:33
Всем прив,как сделать такой запрос в postgre? UPDATE table SET count = count + 1 WHERE id = '1234';

Google
ко?TEXHIK
24.07.2018
14:32:21
Может кто подскажет, делаю pg_dump базы, вылетает с ошибкой MultiXactId .... прекратил существование, видимо произошло наложение. Вменяемых манулов по данной проблеме не нашел
о, ещё один. У меня было такое пару месяцев назад. уУ тебя варианта два либо вакуум фриз либо табличку пересоздавать

Yaroslav
24.07.2018
14:32:45
всякое бывает
Это да... я, кстати, читал по диагонали threads (в -hackers), связанные с разработкой partitioning в v11, и у меня сложилось впечатление, что как-то там всё с первого раза не очень гладко получилось. :( Потом стали исправлять, естественно, но чем кончилось, не знаю — не следил.

Pavlo
24.07.2018
14:41:06
Так и сделать)
У меня не тот формат стоял, но теперь уже немогу єво сменить:/



Eugene
24.07.2018
14:42:17
написано ж using

elfiki
24.07.2018
14:42:37
ну или count = count::integer+1

Pavlo
24.07.2018
14:45:59
ко?TEXHIK
24.07.2018
14:46:02
Так пересоздать таблицу то как? Дропнуть её не могу
ты для начала зафроизить попробуй, может транзакции кончились. У меня просто была база корапчена видимо электрон отрубили

Так пересоздать таблицу то как? Дропнуть её не могу
Если не прокатит значит и тебе не повезло. Суть в том, что этот айди транзакции - системные данные, они в select не попадают. создаёшь вторую таблицу myTable2 с точно такой же схемой, делаешь insert into myTable2 select * from myTable1 дальше truncate myTable1 (не смотрит данные вообще, просто грохает к херам, так что ей тоже пофиг на кривую транзакцию) потом дропаешь спокойно пустую старую таблицу, новую переименовываешь. Сразу предупреждаю - столкнёшься с жопой в виде перенатягивания ручками всех внешних ключей на новую таблицу.

Я так делал. Но чел как-то ещё по хитрому один решил, я на форуме находил обьсуждение древнее. Сейчас попробую ещё раз откопать

ко?TEXHIK
24.07.2018
14:53:17
Так это же какой-то (известный) bug, нет? Т.е. "чистый" (самый надёжный) способ — добиться того, чтобы получился dump (любым способом), потом обновить PostgreSQL, перенициализировать кластер и залить дамп. :(
https://www.postgresql.org/message-id/flat/CA%2BMJ4cRdt__yBCGhz2pqhAZ%2B1WLRTKZ-afJi0ZPBT-ti-YUVtw%40mail.gmail.comвот вроде та тема. Да, они там до чего-то докопались, но я уже не помню и это не мой кейс был

Демоны

Yaroslav
24.07.2018
14:54:55
Vacuum freeze даёт ошибку - не удалось открыть файл pg_clog/0A85, no such file or directory
Хмм... похоже на что-то другое (но я точно не помню). Можете попробовать почитать thread по ссылке.

Страница 902 из 1062