
Darafei
08.09.2017
16:36:51
Надо данные смотреть
'256' - три байта, float - 8
А, text

Igor
08.09.2017
16:37:53
один столбец text, говорю же) по идее один-в-один должно быть, ну ладно, с небольшим оверхедом

Google

Igor
08.09.2017
16:38:16
я даже PK убрал на время инсерта

Darafei
08.09.2017
16:39:15
А какой utf у постгреса внутри?

Alexander
08.09.2017
16:39:59
Тоаст, нет?

Igor
08.09.2017
16:40:04
аэыыы, прекрасный вопрос. внутри это где, как можно посмотреть?
когда я делал createdb с сишной локалью, он, помню, ругнулся, что шаблон utf8.en_US использует
более задроченный запрос о размере таблицы показывает 8192 toast_bytes
вот этот https://gist.github.com/hatarist/675dc3debf6cf5f825b5c15aed4cbac0

Alexey
08.09.2017
16:41:15
а всё же зависит от среднего размера записи. если там в каждом text лежит по одному символу, так оверхед будет вообще ого-го

Igor
08.09.2017
16:41:16
ненене, там в среднем как раз 20-50 символов

Alexey
08.09.2017
16:42:04
оверхед на каджую запись — 28 байт
что в общем уже близко к наблюдаемому

Igor
08.09.2017
16:42:27
опа, а вот и причина, похоже. 100 млн строк
спасибо большое :) и с этим, понимаю, ничего не сделать?

Google

Alexey
08.09.2017
16:43:05
нет

Darafei
08.09.2017
16:46:45
Только cfs от pgpro

Igor
08.09.2017
16:47:07
как раз искал подобную штуку, посмотрел на цену, не искал подобную штуку

Alexey
08.09.2017
16:53:51
но я бы не советовал cfs, если планируется интенсивная нагрузка на запись. я почитал дизайн, сравнил с компрессией в innodb. подозреваю, в cfs всё плохо с обновлениями

Igor
08.09.2017
16:54:10
нене, никакой записи не будет больше, это одноразовая вставка нескольких миллиардов строчек

Alexey
08.09.2017
16:54:27
тогда да

Igor
08.09.2017
16:54:56
мне приходит в голову совершенно сумасшедшая мысль зафигачить кусками в JSONB, а строками, так скажем, партицировать, ггг
но это как-то слишком упорото, наверное

Darafei
08.09.2017
16:59:15
cstore_fdw глянь

Igor
08.09.2017
17:01:03
спасиб, что-то не подумал

Айтуар
08.09.2017
18:03:28

Darafei
08.09.2017
18:04:43
понимаешь, проблема в том, что это всё равно база данных, а хранить в базе, как мы поняли, религиозно не хочется

Mikhail
08.09.2017
19:22:14

Darafei
08.09.2017
19:22:35
ага. а чем индекс отличается от хеш таблицы?

Mikhail
08.09.2017
19:23:38
в моем случае
я а хочу свести их к одной
таким образом

Darafei
08.09.2017
19:24:50
ага. и чем хеш по трём колонкам отличается от индекса по трём колонкам?

Mikhail
08.09.2017
19:25:45

Google

Mikhail
08.09.2017
19:25:58
ну это хотелка, а не как оно в реальности :)

Darafei
08.09.2017
19:26:25
как выглядит структура данных, в которой ты хочешь это хранить?

Mikhail
08.09.2017
19:28:00
по трем колонкам

Darafei
08.09.2017
19:29:03
отлично.
где этот хеш лежит?
как он аллоцируется?
как он деаллоцируется?
как он синхронизируется между процессами?
как он синхронизируется между репликами?
как в этом хеше считается ключ?

Mikhail
08.09.2017
19:30:02

Darafei
08.09.2017
19:30:17
механизм есть, называется "индексы"

Mikhail
08.09.2017
19:30:19
Т.е. придумать хеш функцию по переменным в запросе и все

Darafei
08.09.2017
19:30:45
но ты вместо подумать и соотнести говоришь "без понятия", не надо так
вдруг ты можешь адекватно ответить на эти вопросы, а кто-то тут возьмёт и запилит такое
или окажется, что ты придумал shared_buffers

Igor
08.09.2017
20:42:55
Всем привет, а может кто-то подсказать, можно ли определить в postgres стратегию поведения, в случае, если primary key имеет дефолтное значение, вступающее в коллизию с другим существующим?

Ilya
08.09.2017
20:45:52
duplicate key error будед
потому я порой предпочитаю отказаться от дефолтных автоинкрементных ключей

Igor
08.09.2017
20:50:38
О'кей. Тогда еще вопрос, если я использую UUID тип для Primary ключа, и хочу генерить его с помощью DEFAULT uuid_generate_v1mc(), у меня может быть коллизия, или же postgre гарантирует их отсутствие?
Просто дико западло переписывать весь SQL из-за возможности коллизий в этом месте :)

Ilya
08.09.2017
20:59:10
там нет гарантий.
ты для начала почитай как оно работает
там вероятность совпадения очень мала + там в уид таймстемп входит

Google

Ilya
08.09.2017
20:59:50
чтобы в 1 момент так влететь....
но гарантий нет
(:
но все юзают. ибо вероятность <censored> мизерная

Igor
08.09.2017
21:03:05
А способ в рамках СУБД отловить коллизию и перегенерить есть?

Ilya
08.09.2017
21:03:47
https://www.postgresql.org/docs/9.6/static/errcodes-appendix.html

Igor
08.09.2017
21:05:07
Ну, это то понятно. А внутри никакой возможности отлавливать конфликты нет?

Алексей
08.09.2017
21:05:23
А почему бы не использовать uuid v4?

Igor
08.09.2017
21:06:51
Если правильно понимаю - v1mc должен быстрее вставляться.
и поиск соответственно быстрее работать.

Алексей
08.09.2017
21:08:25
Мне эти выводы кажутся странными. Возможно что-то недопонимаю.

Ilya
08.09.2017
21:08:30

Алексей
08.09.2017
21:09:10
А он нужен?
Основная задача, если я правильно понял - исключить возможные "коллизии", не так ли?

Ilya
08.09.2017
21:10:45
ну как. ноды на которых генеришь
это удобно
по ключу можно увидеть с какого конца его сгенерило
или тебе циферка версии повыше душу греет?

Алексей
08.09.2017
21:12:57
Мне душу греет большая степень рандомности, ибо задача ставилась именно такая.
А если жизненно необходима информация о ноде - пожалуйста, в отдельное поле. А иначе выходит как -то, что мы в uuid хотим запихнуть и имя ноды, и время генерации, но при этом желаем, чтобы он был рандомным и уникальным.

Google

Алексей
08.09.2017
21:15:53
Не, я не специалист, просто рассуждения вслух. Возможно я в корне заблуждаюсь.

Ilya
08.09.2017
21:16:29
ну как. идея с отдельным полем тоже здравая.

Алексей
08.09.2017
21:19:04
и поиск соответственно быстрее работать.
А вот это мне вообще никак не понять. Если скорость вставки еще можно как-то объяснить, типа дольше генерится UUID (хотя что-то мне подсказывает, что разница там абсолютно мизерная), то уж скорость поиска никак не объяснима.

Denis
08.09.2017
21:20:49

Алексей
08.09.2017
21:22:45
Ага, вот теперь понятно.

Ilya
08.09.2017
21:27:19
но вообще uuid это не о больших вставках

Igor
08.09.2017
21:32:05

Denis
08.09.2017
21:36:58

Igor
08.09.2017
21:40:20


Алексей
08.09.2017
21:43:42
да, вставка будет быстрее.
Это может показаться странным, но вот я сейчас провел несколько тестов - v1 на вставке проигрывает v4
10 млн записей v1mc вставляет 75-76 секунд, v4 - 56-57 секунд
Результат стабилен на нескольких прогонах. Правда эксперимент все же нельзя назвать "чистым", вставка в пустую таблицу вообще без индексов, возможно с индексами результат будет другим. Сейчас и это проверим.
C первичным ключом по uuid
v1mc - 107-114-108 секунд
v4 - 123-123 -118 секунды
Да, при вставке в индекс v4 действительно немного проигрывает. Хотя я бы и не назвал эту разницу существенной. В любом случае, во всех тестах "коллизий" замечено не было

Raracas
08.09.2017
23:45:30
https://telegram.me/telegidka — самые полезные и интересные каналы на просторах Телеграм. Присоединяйся.

Denis
08.09.2017
23:51:27
Так, кто там искал злобных админов на востоке, которым только выдай банхаммер? Я почти готов карать спамеров