
Yaroslav
24.07.2018
12:17:17

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

Yaroslav
24.07.2018
12:21:31

Google

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

Tolya
24.07.2018
12:26:46
Uuidы, кстати, тоже есть и тоже помогли сильно с расчетами )

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


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

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

Tolya
24.07.2018
12:39:28

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
по схеме просто пока идея есть, что при использовании служебного ключа самые актуальные данные будут +- в самых свежих партициях, следовательно можно будет с большей вероятностью гарантировать, что к старым данным на старых дисках будет обращений меньше

Ilia
24.07.2018
13:09:07

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

Yaroslav
24.07.2018
13:13:11


Tolya
24.07.2018
13:27:49
да, думал часто изменяемые данные подтягивать в первые партиции, остальные в старых оставлять
и условно первые три месяца держать на ssd, остальные сносить на sas
при изменении записи приложением будет меняться служебное поле и запись будет мигрировать в свежую партицию
типа кеширования ?
но я уже решил, что идея кроме возможных других минусов так себе, потому что часто читаемые записи могут все равно оставаться на медленных дисках
есть еще один вопрос по партициям
кто-то сравнивал производительность при вставках в партиции inheritance и нативные (PostgreSQL 10.4)?

Google

Yaroslav
24.07.2018
13:31:43


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


Yaroslav
24.07.2018
13:42:57

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

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

Yaroslav
24.07.2018
13:48:27

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

Google

Yaroslav
24.07.2018
13:48:48

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

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';

Сергей
24.07.2018
14:30:41

Google

ко?TEXHIK
24.07.2018
14:32:21

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

Vladimir
24.07.2018
14:43:45

Pavlo
24.07.2018
14:45:59

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

Vladimir
24.07.2018
14:52:00


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

ко?TEXHIK
24.07.2018
14:53:17
Демоны

Vladimir
24.07.2018
14:54:27

Yaroslav
24.07.2018
14:54:55