@pgsql

Страница 625 из 1062
Petr
06.01.2018
10:28:19
@darthunix спасибо, гляну

Yaroslav
06.01.2018
10:30:09
да надо чтобы юзер не заметил залив очередной пачки ну и просто хочется сделать это оптимальным образом, в частности для минимизации износа системы
Что значит "не заметил"? Запись новых данных будет занимать ресурсы в любой системе / архитектуре, чудес не бывает. У Вас есть какая-то проблема (время выполнения запросов при заливке данных слишком велико) или нет? ;)

Petr
06.01.2018
10:31:09
на самом деле, на текущий момент способы сделать незаметным для юзера найдены, однако вопрос каков из них наиболее нормальный) сейчас договорились что данные будем лить раз в месяц пачкой в санитарный выходной день, когда юзеров нет

тут еще встает вопрос как сделать износ ресурсов (в том числе жестких дисков) наименьшим

Google
Petr
06.01.2018
10:33:30
я пока еще провожу тесты, если пачка 100кк вставится за сутки в таблицу с индексами — то задача "решена"

Yaroslav
06.01.2018
10:39:08
я пока еще провожу тесты, если пачка 100кк вставится за сутки в таблицу с индексами — то задача "решена"
По-моему, тут одно из трёх: . Железо в принципе не позволяет решить Вашу задачу. . Железо в принципе позволяет решить Вашу задачу, но что-то неправильно настроено. . Железо при текущих настройках позволяет решить Вашу задачу (т.е. проблемы вообще нет). Разве не так?

Yaroslav
06.01.2018
10:41:34
на самом деле, на текущий момент способы сделать незаметным для юзера найдены, однако вопрос каков из них наиболее нормальный) сейчас договорились что данные будем лить раз в месяц пачкой в санитарный выходной день, когда юзеров нет
Без определения того, что такое "незаметным", это беспредметное обсуждение, IMHO. Дело в том, что время выполнения одного и того же запроса, на тех же данных существенно "плавает" в многопользовательской системе даже при "нормальной" нагрузке.

Petr
06.01.2018
10:43:33
ну, учитывая тот факт, что выделили один день в месяц для "технических работ", то "незаметно для пользователя" эквивалентно управиться с задачей загрузки данных за сутки

при текущей конфигурации это задача должна решаться (правда пока тестирую) ежели так — то проблемы нет; вчера она решилась по большей части после обсуждения тут но решать ведь можно по-разному и что-то лучше, что-то хуже

Petr
06.01.2018
10:47:39
И какое решение Вы выбрали (просто любопытно)? Какое у Вас железо, кстати?
сейчас я выбрал не использовать MyRocks, а просто в течении месяца аккумулировать новые данные в отдельную табличку без индексов (вставка будет за O(1)) А раз в месяц пушить ее в основную за O(log(N)) в санитарный день

Данные у юзера будут месячной актуальности (это норма в моей задаче) Аккумулированная таблица ему на чтение доступна не будет

Petr
06.01.2018
10:49:45
И вставал вопрос: полностью пересчитать индексы (удалить индексы, вставить данные, построить индексы), или же сразу вставлять

решил пока что второе

Google
Petr
06.01.2018
10:51:34
O(N log N), вообще-то. ;) Понятно, спасибо!
если у вас N ≈ кол-во строк в таблице, то вы похоже что-то напутали :) Так как вставка за O(N log(N)) при 1ккк это как-то долговато

btree insert же O(log(N))

Yaroslav
06.01.2018
10:54:06
если у вас N ≈ кол-во строк в таблице, то вы похоже что-то напутали :) Так как вставка за O(N log(N)) при 1ккк это как-то долговато
N —- кол-во вставляемых строк. Если чуть точнее, то, если K —- кол-во строк в таблице-приёмнике, а N —- кол-во вставляемых строк, то это где-то O(N log K). ;)

Petr
06.01.2018
10:54:56
а, ну тогда разумеется :) напугали вы

кстати, кто-то занимался расчетом time complexity для билда индекса btree с нуля, когда данные уже вставлены?

Yaroslav
06.01.2018
11:03:06
кстати, кто-то занимался расчетом time complexity для билда индекса btree с нуля, когда данные уже вставлены?
O(N log N) если данные не сортированы, что тут заниматься-то? ;) "The devil is in the detail", т.е. вся разница в константах при O(N log N).

Petr
06.01.2018
11:04:24
я пытаюсь найти асимпт. подтверждение того что строить индекс после того как данные вставлены — быстрее, чем сразу пихать в таблицу с индексом (даже если изначально пуста)

точнее хочу прикинуть отношение time complexity между (удалить индексы, вставить данные, построить индексы) и (вставить данные в таблицу с индексом) при условии, что в таблице изначально имеется 1ккк записей

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

Petr
06.01.2018
11:13:24
и каково между ними различие?

и верно ли утверждение, что во втором случае износ ресурсов серверных (жесткий диск и тд) будет ≈ меньше?

Yaroslav
06.01.2018
11:14:44
точнее хочу прикинуть отношение time complexity между (удалить индексы, вставить данные, построить индексы) и (вставить данные в таблицу с индексом) при условии, что в таблице изначально имеется 1ккк записей
Тестируйте, что тут скажешь... кроме того, в Вашей ситуации можно менять настройки PostgreSQL на время заливки данных, что может дать существенный выигрыш.

Petr
06.01.2018
11:15:51
ну да, я ставлю меинтененс ворк мем в 4ГБ

спасибо :)

Тестируйте, что тут скажешь... кроме того, в Вашей ситуации можно менять настройки PostgreSQL на время заливки данных, что может дать существенный выигрыш.
Просто дело в том, что полный ребилд это 1ккк+ записей, а вставить надо только ≈30кк (к слову, вчера поставил билдиться в 20:16 индексы, так до сих пор считаются, что-то уже думаю что второй вариант быстрее выйдет)

Yaroslav
06.01.2018
11:20:16
ну да, я ставлю меинтененс ворк мем в 4ГБ
Это далеко не единственная настройка. https://www.postgresql.org/docs/current/static/populate.html читали? Кроме того, вполне возможно, что у Вас PostgreSQL вообще настроен не оптимальных образом. ;)

Просто дело в том, что полный ребилд это 1ккк+ записей, а вставить надо только ≈30кк (к слову, вчера поставил билдиться в 20:16 индексы, так до сих пор считаются, что-то уже думаю что второй вариант быстрее выйдет)
Вот от соотношения кол-ва записей в таблице, кол-ва добавляемых записей; и определений самих индексов это и зависит. Т.е., опять-таки, тестируйте. ;)

Petr
06.01.2018
11:22:14
Это далеко не единственная настройка. https://www.postgresql.org/docs/current/static/populate.html читали? Кроме того, вполне возможно, что у Вас PostgreSQL вообще настроен не оптимальных образом. ;)
читал конечно, именно оттуда я взял вот​ это: >If you are adding large amounts of data to an existing table, it might be a win to drop the indexes, load the table, and then recreate the indexes. Of course, the database performance for other users might suffer during the time the indexes are missing. One should also think twice before dropping a unique index, since the error checking afforded by the unique constraint will be lost while the index is missing.

Google
Petr
06.01.2018
11:24:33
сейчас гляну

Аггей
06.01.2018
11:56:43
точнее хочу прикинуть отношение time complexity между (удалить индексы, вставить данные, построить индексы) и (вставить данные в таблицу с индексом) при условии, что в таблице изначально имеется 1ккк записей
Петр, а вы не рассматривали brin индекс? Он конечно не совсем индекс, но для ваших объёмов небольшой seq scan может и не во вред. И обновляется он "руками" - как раз то, чего вы хотели

Не будет ли дешевле - на чтении - лёгкий index scan, а затем небольшой seq scan?

Xenos
06.01.2018
12:17:58
Господа, как мне получить количество дней, начиная с первой записи в таблице по сегодняший день 1 запросом? Могу получить дату первой записи и постчитать от неё на ЯП основной логики программы, но может есть способ получить это одним запросом?

Vladislav
06.01.2018
12:22:06
Sysdate-min

dq
06.01.2018
13:00:14
Привет всем ,возникла такая пробелма в боте тедеграм. Бот стоит на впс и в нем есть функция "Сделать рассылку на всех пользователей" С сегодняшнего утра выдает такую ошибку в консоли "sqlite3.OperationalError: Could not decode to UTF-8 column 'channels' with text '?�'"

Кто поможет решить ,деньгой не обижу

Сергей
06.01.2018
13:05:39
мигрируй с скулайт на постгре

а так кто то записал в колонку не UTF8 символ

попробуй своим ЯП просканировать строки и вывести в лог ту запись на которой у тебя приложение падает

типа такого делай last_id = 0 while True: row = 'select * from blabla where id > last_id order by id limit 1' last_id = row['id'] log.info(last_id)

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

ну и потом надо будет узнать как не UTF8 символ попал в базу

Кто поможет решить ,деньгой не обижу
bitcoin кошелек 1JmaXFNBfwnjuVDpekn8D79wNdrAepEPeA

Артур
06.01.2018
15:09:59
а можно ли для каждого пользователя генерировать свою таблицу?

например сделать у пользователей инвентарь и это будет отдельная таблица для пользователя

или так не эффективно?

Артур
06.01.2018
15:11:26
а как это потом связать?

Google
Артур
06.01.2018
15:11:31
у пользователя хранить название таблицы?

om
06.01.2018
15:11:45
или так не эффективно?
Да, это будет неэффективно

Артур
06.01.2018
15:11:56
а как лучше сделать?

не делал серверных БД

om
06.01.2018
15:12:27
у пользователя хранить название таблицы?
Лучше в таблице инвентарь хранить строки с айди этого пользователя

ээто внешний ключ называется

Две таблицы: user (Id serial, name text) и inventory (Id serial, userid int, name text, amount int)

И ты всегда сможешь посмотреть инвентарь игрока запросом select * from inventory where userid=123

не делал серверных БД
Нет различий между серверных или пользовательских бд. Есть нормализованные и не нормализованные.

Артур
06.01.2018
15:21:10
я в том смысле что не приходилось делать БД для многих пользователей, делал такие, где всего 1 пользователь



om
06.01.2018
15:23:42
я в том смысле что не приходилось делать БД для многих пользователей, делал такие, где всего 1 пользователь
И это тоже неважно. Всегда есть объекты и связи между ними. Это не зависит от количества пользователей бд. Это зависит от предметной области

Petr
06.01.2018
17:57:53
Петр, а вы не рассматривали brin индекс? Он конечно не совсем индекс, но для ваших объёмов небольшой seq scan может и не во вред. И обновляется он "руками" - как раз то, чего вы хотели
да, рассматривал) он не доступен как и партицирование, т.к. данные никак нельзя "поделить на куски" (по меньшей мере в силу того какой поиск хочет юзер) да в общем вроде и наладилось всё.. после тестов отпишусь

@netneladno если интересно, индексирование закончилось и заняло 20 часов 2 минуты :) теперь попробую вставить пачку 40млн и сделать замер

Anton [Mgn, az09@osm]
06.01.2018
18:15:12
что значит таблица в центре?

Артур
06.01.2018
18:25:42
я ее уже удалил, она без надобности

Nikolay
06.01.2018
18:28:47
Товарищи, поделитесь лучшими практиками по партицированию (мне предстоит импортировать два вида данных в количестве 125 млн и 4 млн строк). Вообще сабж потянет столько?

Anton [Mgn, az09@osm]
06.01.2018
18:31:31
я ее уже удалил, она без надобности
о как. по мне так нормальная табличка, только связь с апп в другую сторону бы

Google
Nikolay
06.01.2018
18:39:49
а зачем там собственно партицирование? как делятся эти 125 млн?
я пока не уверен точно, нужно ли оно, вот хотелось бы что-нибудь почитать, чтобы точно убедиться. Там что-то типа логов за несколько лет, их нужно конвертнуть в SQL для дальнейшего анализа. Я сразу подумал почему-то разбить их по датам

Артур
06.01.2018
18:42:48
схему уже сильно переделал)

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

например +100к записей в день

Darafei
06.01.2018
18:52:44
100k записей в день - это немного

Артур
06.01.2018
18:53:22
возможно, но за 10 дней там уже лям будет а по этим данным так же часто необходимо пробегаться и составлять анализ

Darafei
06.01.2018
18:53:23
паттерн чтения важнее

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

Артур
06.01.2018
18:54:10
их необходимо читать

Darafei
06.01.2018
18:54:47
как именно читать? по ключу, по интервалу, top-n, knn, ещё как-то? :)

Артур
06.01.2018
18:56:13
есть некое-кол воз записей принадлежашие юзеру, в этих записях хранятся данные статистики пользователя, вот эти данные необходимо прочитать, сделать анализ и обновить на основе анализа данные пользователя, либо вывести гистограмму по этим данным на сайте

id юзера - 30 символьный токен

Darafei
06.01.2018
18:58:31
если индекс по этому id есть, все будет нормально

Anton [Mgn, az09@osm]
06.01.2018
19:01:48
если индекс по этому id есть, все будет нормально
токен это же как ююид твой?.. нормально с ним, напомни? ?

Nikolay
06.01.2018
19:34:59
Зачем вам postgres?
А есть что-то получше?

Аггей
06.01.2018
19:36:16
Ну логи хранить можно много где... можно больше подробностей о логах... о их структурированности?

Просто хранение логов в pg - если это логи, а не аудит - у меня особый пунктик - много геммороя - большие объемы. При том, что 99% логов не будут прочитаны никогда

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