@pgsql

Страница 985 из 1062
Volodymyr Kostyrko
13.09.2018
18:19:09
0xFF вчера было.

Anton [Mgn, az09@osm]
13.09.2018
18:21:08
а, сегодня 100

этим не должна заниматься БД
больше вроде бы некому в этом тулчейне

Google
Fike
13.09.2018
18:29:38
Легальный ответ на интервью на такой вопрос - это база не должна этим заниматься, тем более что это _крайне_ нетривиальный вопрос. "Использовал postgresql" - это какой язык?

Павел
13.09.2018
18:33:04
Ребят мне нужно задачку решить для оракла но после повторить для постгреса. Поэтому задам для постгреса а там может и для оракла направление увижу. Кароче Мне одновременно приходят 5 запросов на сервер, каждый в своем потоке. Каждый запрос хочет сходить в базу и вытащить одну строку. Для него там много подходящих, поэтому данные сортируются по дате и берется одна строка самая старая. Дальше запрос формирует ответ из данных строки. Но проблема что второй запрос берет эту же строку с базы и третий тоже. Так как вск 5 хотят ее. Вариант использовать блокировку. Первый запрос блокирует нужную запись. Второй уже ее не возьмет пока первый не отпустит. Но проблема в том, что приходят 5 запросов и делают 5 раз каждый по селекту. А селект всем возвращает сразу одну и ту же строку. Так как пока еще ее никто не успел заблокировать. Может есть какие варинты на уровне базы или ктото решал такие задачи? Я ожилаю так что пришло 5 запросов первый сделал селект и тут же когда второй делает селект он получает следующую строку, а не ту что уже щаблокирована первым, и работает с ней.

Anton [Mgn, az09@osm]
13.09.2018
18:34:15
приложение
блин ну там на входе и на выходе черные ящики (хоть и опенсорсные). речь про osm2pgsql и далее развёртывание тайл-сервера

Vladimir
13.09.2018
18:56:42
вот например вот эта буква, она заглавная? ﺽ
Чет пропустил Думаю если lower()=upper() то у неё нет регистра

Artem
13.09.2018
19:09:54
Ребят мне нужно задачку решить для оракла но после повторить для постгреса. Поэтому задам для постгреса а там может и для оракла направление увижу. Кароче Мне одновременно приходят 5 запросов на сервер, каждый в своем потоке. Каждый запрос хочет сходить в базу и вытащить одну строку. Для него там много подходящих, поэтому данные сортируются по дате и берется одна строка самая старая. Дальше запрос формирует ответ из данных строки. Но проблема что второй запрос берет эту же строку с базы и третий тоже. Так как вск 5 хотят ее. Вариант использовать блокировку. Первый запрос блокирует нужную запись. Второй уже ее не возьмет пока первый не отпустит. Но проблема в том, что приходят 5 запросов и делают 5 раз каждый по селекту. А селект всем возвращает сразу одну и ту же строку. Так как пока еще ее никто не успел заблокировать. Может есть какие варинты на уровне базы или ктото решал такие задачи? Я ожилаю так что пришло 5 запросов первый сделал селект и тут же когда второй делает селект он получает следующую строку, а не ту что уже щаблокирована первым, и работает с ней.
select for update skip locked ?

Михаил
13.09.2018
19:10:08
Ребят мне нужно задачку решить для оракла но после повторить для постгреса. Поэтому задам для постгреса а там может и для оракла направление увижу. Кароче Мне одновременно приходят 5 запросов на сервер, каждый в своем потоке. Каждый запрос хочет сходить в базу и вытащить одну строку. Для него там много подходящих, поэтому данные сортируются по дате и берется одна строка самая старая. Дальше запрос формирует ответ из данных строки. Но проблема что второй запрос берет эту же строку с базы и третий тоже. Так как вск 5 хотят ее. Вариант использовать блокировку. Первый запрос блокирует нужную запись. Второй уже ее не возьмет пока первый не отпустит. Но проблема в том, что приходят 5 запросов и делают 5 раз каждый по селекту. А селект всем возвращает сразу одну и ту же строку. Так как пока еще ее никто не успел заблокировать. Может есть какие варинты на уровне базы или ктото решал такие задачи? Я ожилаю так что пришло 5 запросов первый сделал селект и тут же когда второй делает селект он получает следующую строку, а не ту что уже щаблокирована первым, и работает с ней.
Так надо делать сразу select ... for update skip locked

Павел
13.09.2018
19:10:24
select for update skip locked ?
Да, пробовал. Не работает так как ожидается

Artem
13.09.2018
19:10:45
Михаил
13.09.2018
19:11:04
Да, пробовал. Не работает так как ожидается
Да ладно, по другому он работать и не может

Павел
13.09.2018
19:13:10
Ожидается как уже писал - все пять реквестов выплнят по одному селекту. В запросах для наглядности стоит задержка 5 сек, перед коммитом транзакции. Так вот ожидается что 5 запросов выполнят 5 селектов и отработают за 5 сек. По факту же, первый запрос берет строку и начинает работу 5 сек. Тоесть держит ее. Остальные 4 запроса в своем селекте получают эту же строку и так как она залочена отваливаются

Михаил
13.09.2018
19:14:02
Skip locked

Павел
13.09.2018
19:14:09
Да

Михаил
13.09.2018
19:14:29
Хм. Должны пропускать, а не ждать

Google
Павел
13.09.2018
19:14:48
А без него так - первый лочит, 4 ждут 5 сек. Второй берет уже новую строку лочит 3 ждут еще 5 сек и тд. 5 запросов 25 сек

Хм. Должны пропускать, а не ждать
Да. Видишь в чем суть все 5 приходят одновремено и делаю селект одной строки еще до того как хоть ктото ее залочит

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

Ожидается так - первый лочит строку. Второй делает селект и в него попадают тольео не залоченые и лочит свою строку и тд. Но почему то не работает

Скип локед работает так что селект вернет только незалоченые это понятно



Но потоки успевают взять строку одновремеено еще до того как ктото ее залочил

Может есть такая тема типо сразу сделать апдейт который вернет мне зааплейченую строку....

Михаил
13.09.2018
19:21:33
хм, похоже на баг. во всяком случае, не похоже на ожидаемую логику работы select for update. в постгресе не уверен, но в оракле никогда не сталкивался с подобными коллизиями.

Artem
13.09.2018
19:23:40
Но потоки успевают взять строку одновремеено еще до того как ктото ее залочил
так все потоки в один коннект чтоли ходят или у каждого свой? если у каждого свой, то все происходит немного не так, оно сначало пытается залочить и только если ок, возвращает строку, те вышеописанная ситуация невозможна

Павел
13.09.2018
19:23:58
хм, похоже на баг. во всяком случае, не похоже на ожидаемую логику работы select for update. в постгресе не уверен, но в оракле никогда не сталкивался с подобными коллизиями.
Смотри, тут еще стоит отметить как селект работает. Я достаю список удовлетворяющих условиям строк и сортирую его. Пото беру первую строку. И для нее делаю селект фор апдейт. Второй запрос делает тоже самое сортирует и берет первую строку. Но она уже залочена

Павел
13.09.2018
19:25:34
Михаил
13.09.2018
19:25:39
из-за этих стадий и образуется gap, если можно так сказать

Павел
13.09.2018
19:27:05
а не проще ли сразу сделать select for update для одной самой нужной строки?
Ну так она таким образом ищется. Задача такова что мой сервер каждую наносекнду могут долбить в 50 потоков. И я должен обработать каждый поток, и если есть данные вернуть их но на один поток одну строку даже если их есть несуолько

Мнн приходит 50 одинаковых запросов. Например - дай мне данные по васе если есть. Каждый так спрашивает. Я смотрю ок по васе есть 10 записей. На самую старую и иди отсюда.

Второму даю следующую

Осталось 8 третему еще одну

Anton [Mgn, az09@osm]
13.09.2018
19:29:30
Ну так она таким образом ищется. Задача такова что мой сервер каждую наносекнду могут долбить в 50 потоков. И я должен обработать каждый поток, и если есть данные вернуть их но на один поток одну строку даже если их есть несуолько
выглядит так как будто нужна менеджер-процедура, отдающая при очередном вызове именно что следующую строку. вот она то и будет разные флаги ставить-снимать. но это уже не про транзакции

Павел
13.09.2018
19:30:21
Google
Павел
13.09.2018
19:31:42
Как это загуглить можнт? Может название подхода или стратегии такой есть

Менеджер процедура так и называется?

Anton [Mgn, az09@osm]
13.09.2018
19:32:14
нет конечно, сам только что придумал название

но методологий на свете много, может и поумнее название найдется )

Михаил
13.09.2018
19:34:53
так это ж очереди, в оракле стоит покопать dbms_aq, а в постгресе самостоятельно фигачить

Artem
13.09.2018
19:45:43
Мнн приходит 50 одинаковых запросов. Например - дай мне данные по васе если есть. Каждый так спрашивает. Я смотрю ок по васе есть 10 записей. На самую старую и иди отсюда.
ну очереди конеч лучше всего тут, возможен еще такой изврат update stuff set done = true where id = (select id from stuff where not done order by tstamp desc limit 1 for update skip locked) returning *

Ilya
13.09.2018
19:55:07
Ребят мне нужно задачку решить для оракла но после повторить для постгреса. Поэтому задам для постгреса а там может и для оракла направление увижу. Кароче Мне одновременно приходят 5 запросов на сервер, каждый в своем потоке. Каждый запрос хочет сходить в базу и вытащить одну строку. Для него там много подходящих, поэтому данные сортируются по дате и берется одна строка самая старая. Дальше запрос формирует ответ из данных строки. Но проблема что второй запрос берет эту же строку с базы и третий тоже. Так как вск 5 хотят ее. Вариант использовать блокировку. Первый запрос блокирует нужную запись. Второй уже ее не возьмет пока первый не отпустит. Но проблема в том, что приходят 5 запросов и делают 5 раз каждый по селекту. А селект всем возвращает сразу одну и ту же строку. Так как пока еще ее никто не успел заблокировать. Может есть какие варинты на уровне базы или ктото решал такие задачи? Я ожилаю так что пришло 5 запросов первый сделал селект и тут же когда второй делает селект он получает следующую строку, а не ту что уже щаблокирована первым, и работает с ней.
Сделай таблицу в которой будешь хранить какую строчку выдал какому серваку по запросу и ещё там сделай очередь по 5 строк прозапас на каждый запрос от сервера. А строку выдавай через хранимку которая будет определять что кому выдать сейчас. И переодически дописывай очередь. В хранимку посылай имя сервера.

Павел
13.09.2018
19:55:33
Вобшем сорян что запутал немного. Уточнение два) кароче селект как я говорил вытаскивает допустим 10 записей и сортирует по дате. После этого я беру первую строку rownum = 1. Но взять ее нужно из уже отсортированного запроса. Поэтому select a.* from (select b.* from table b where .... order by b.date asc) a where rownum = 1 for update column skip loked. Тоесть внутренний селект вернул отсортированый список а внешний взял из него первую строку и уже ее пытается лочить. Потом приходит второй поток и делает так же. И ему внутренний селект возвращает такой же набор строк и где первая залочена. Или даже так - все пять потоков делают запрос в котором выполняется внутренний селект и возвращает один набор строк. Они все беруь первую. Потом один лочит ее а остальные крашатся так как рна залочена

Artem
13.09.2018
20:04:58
Вобшем сорян что запутал немного. Уточнение два) кароче селект как я говорил вытаскивает допустим 10 записей и сортирует по дате. После этого я беру первую строку rownum = 1. Но взять ее нужно из уже отсортированного запроса. Поэтому select a.* from (select b.* from table b where .... order by b.date asc) a where rownum = 1 for update column skip loked. Тоесть внутренний селект вернул отсортированый список а внешний взял из него первую строку и уже ее пытается лочить. Потом приходит второй поток и делает так же. И ему внутренний селект возвращает такой же набор строк и где первая залочена. Или даже так - все пять потоков делают запрос в котором выполняется внутренний селект и возвращает один набор строк. Они все беруь первую. Потом один лочит ее а остальные крашатся так как рна залочена
а так тут ораклепроблема ) это не оно https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9527937800346631524 ? в постгресе-то не нужен внешний запрос тк он умеет limit

Михаил
13.09.2018
20:19:31
Что-то мне подсказывает, что limit - не выход. В оракле он, кстати, тоже есть, начиная с 12с

Alexander
13.09.2018
20:19:54
Всегда был - rownum.

Misha
13.09.2018
20:24:28
select * from qq "1" 1 2 3 declare rec qq%rowtype; cursor c is select * from qq where rowid in ( select * from (select rowid from qq order by 1 desc) where rownum < 10) for update skip locked; begin open c; fetch c into rec; close c; dbms_output.put_line(rec."1"); end; session 1: 3 session 2: 2

Вобшем сорян что запутал немного. Уточнение два) кароче селект как я говорил вытаскивает допустим 10 записей и сортирует по дате. После этого я беру первую строку rownum = 1. Но взять ее нужно из уже отсортированного запроса. Поэтому select a.* from (select b.* from table b where .... order by b.date asc) a where rownum = 1 for update column skip loked. Тоесть внутренний селект вернул отсортированый список а внешний взял из него первую строку и уже ее пытается лочить. Потом приходит второй поток и делает так же. И ему внутренний селект возвращает такой же набор строк и где первая залочена. Или даже так - все пять потоков делают запрос в котором выполняется внутренний селект и возвращает один набор строк. Они все беруь первую. Потом один лочит ее а остальные крашатся так как рна залочена

Darafei
13.09.2018
21:02:11
https://github.com/wgnet/globalmap/blob/master/data/country_languages.csv

Vladimir
13.09.2018
21:42:12
Кто-нибудь пробовал timescale? Как ощущения?

Anton [Mgn, az09@osm]
14.09.2018
03:52:14
в этом контексте мы язык определяли join-ом с таблицей стран и базовых языков
Все name:<lang> в hstore лежат при этом? Потому что как только какой-то из них мапится на поле отдельное это уже джоином не сделать, не?

https://github.com/wgnet/globalmap/blob/master/data/country_languages.csv
Штука полезная, но мне не подходит. Спасибо)

Google
Anton [Mgn, az09@osm]
14.09.2018
03:58:26
А как назвать процесс обратный локализации? Интернационализация?..))

Англификация? Латинизация? Делокализация?

Nikolai
14.09.2018
03:59:35
Локализация это добавление языка. Обратное - удаление?

Anton [Mgn, az09@osm]
14.09.2018
04:00:54
Не удаление, скорее попытка преобразовать локальное имя в более интернациональное

Nikolai
14.09.2018
04:02:01
Глобализация?

Kirill
14.09.2018
04:02:10
подскажите, учитывается ли в timstamp поле таймзона бд ?

Anton [Mgn, az09@osm]
14.09.2018
04:03:37
И timestamp without timezone, к тому же.

Yaroslav
14.09.2018
04:08:14
подскажите, учитывается ли в timstamp поле таймзона бд ?
В каком смысле "учитывается"? Прочитали бы Вы лучше документацию про них целиком...

Terminator
14.09.2018
05:00:54
@tfgyuhhygf будет жить. Поприветствуем!

abc
14.09.2018
05:07:59
Всем привет. А можно ли Postgres как-то посмотреть когда был сделан ALTER поля в таблице? Есть такая информация в системных таблицах ?

Terminator
14.09.2018
05:39:38
@qewew221 будет жить. Поприветствуем!

Anton [Mgn, az09@osm]
14.09.2018
05:47:38
Сломался терминатор, несите следующего @pasha_golub @Komzpa

Anton [Mgn, az09@osm]
14.09.2018
05:49:51
Всех апрувит?
@qewew221 , @tfgyuhhygf пропустил только что

Михаил
14.09.2018
07:21:44
всем доброго, смотрю у себя вывод коменды в консоли: pidstat -dl -G postgres 30 на выходе примерно такие строки: 11:03:09 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 11:03:29 70 4466 0,00 0,40 0,00 2 postgres: wal writer process 11:03:29 70 4468 0,00 2,80 0,00 2 postgres: stats collector process 11:03:29 70 6211 0,00 585,80 0,00 0 postgres: postgres data24 [local] SELECT 11:03:29 70 31401 0,00 4761,40 2611,20 13 postgres: postgres data24 [local] SELECT 11:03:29 70 32025 0,00 1306,00 1305,60 3 postgres: postgres data24 [local] idle Почему и куда-что пишется на селектах и ожиданиях ПГ? Тупо ожидал чтения данных, а тут постоянно запись. Или я ошибаюсь.

artb1sh
14.09.2018
07:43:10
как скопировать таблицу без данных и воссоздать в другой бд такую же пустую?

Pavel
14.09.2018
07:52:25
@qewew221 , @tfgyuhhygf пропустил только что
Симпатичные аватарки были. Удалял и плакал

Google
artb1sh
14.09.2018
08:13:38
И флаг -s не забудь
Да там схема ещё в бд -s -t table db.scheme2 не прокатывает

Михаил
14.09.2018
08:37:22
Схема - это часть базы, к которой вы подключаетесь, никак не часть строки подключения

Darafei
14.09.2018
09:00:45
Не удаление, скорее попытка преобразовать локальное имя в более интернациональное
там рядом результаты работы латинизирующей нейросети лежат

Alexander
14.09.2018
09:21:55
Привет всем, хочу спросить, может быть кто нить уже сталкивался с подбным. На одном сервере кpутится сервер 1с и постгрес, при попытке присоединения базы 1с к постгресу появляется ошибка ERROR: type "mvarchar" does not exist at character 31 STATEMENT: create table Config (FileName mvarchar(128) not null, Creation timestamp not null, Modified timestamp not null, Attributes int not null, DataSize int8 not null, BinaryData bytea not null, PartNo int not null, PRIMARY KEY (FileName, PartNo)) Причём расширение/модуль mchar уже установлен

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