pgsql | Unsorted

Telegram-канал pgsql - pgsql – PostgreSQL

9404

Чат русскоязычного сообщества PostgreSQL, здесь мы обсуждаем технические вопросы, для поиска работы и предложения вакансий есть группа https://t.me/pgsqljobs For English discussion visit https://t.me/pg_sql

Subscribe to a channel

pgsql – PostgreSQL

Нет, из роли public никого исключить нельзя.

Надо сделать revoke со схемы public для роли public.

Читать полностью…

pgsql – PostgreSQL

Спасибо за развернутый ответ.

Получается надо new_user исключить из роли PUBLIC?

Или как сделать чтобы не мог таблицы создавать?

Сейчас ситуация странная, чтение таблиц, уже существующих запрещено, а свои создавать пользователь может (

Читать полностью…

pgsql – PostgreSQL

Ага, ну это то гарантируется и исходя из описания функции acquire_sample_rows:

Stage two scans these blocks and uses the Vitter algorithm to create a random sample of targrows rows

Читать полностью…

pgsql – PostgreSQL

Нашёл, есть всё-таки случайный сэмплинг и для строк. Примерно вот тут: https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/commands/analyze.c#L1277

Читать полностью…

pgsql – PostgreSQL

Напротив, репрезентативность выборки — очень важная вещь. К счастью, она достигается используемыми алгоритмами PostgreSQL (в той мере, которую позволяет текущий параметр statistics_target, конечно).

Читать полностью…

pgsql – PostgreSQL

(должен заметить, у меня пока не получилось составить реалистичный пример, на котором это было бы важно. Просто зарылся в код по другому поводу и обнаружил вот такое, стало интересно.)

Читать полностью…

pgsql – PostgreSQL

ну вот я до сюда дошёл
https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/access/heap/heapam_handler.c#L1025
и там рядом функция heapam_scan_analyze_next_block. Вроде бы последовательно все строки в блоке читает.

Читать полностью…

pgsql – PostgreSQL

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

Читать полностью…

pgsql – PostgreSQL

да, я уже кнута с полки достал, читаю :)

Читать полностью…

pgsql – PostgreSQL

Не совсем, ГСЧ по требованию просто каждый раз выдает вещественное число из отрезка [0;1). Ему не надо ничего "маппить". При умножении получившегося числа на общее кол-во блоков достаточно его округлить до целого (по некоторым правилам) — это и будет очередной "случайный" номер блока. Эту операцию можно делать бесконечное кол-во раз (но нужно проверять, чтоб очередной "случайный" блок уже не был использован ранее при текущем "анализе" — это также тривиальная операция, работающая за O(1)).

Читать полностью…

pgsql – PostgreSQL

я вот тут смотрю
https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/utils/misc/sampling.c#L64
тут нейминг переменных конечно "от бога", так что я наскоро мог и не разобраться.

Читать полностью…

pgsql – PostgreSQL

но вопрос так ли это.
@Ilya_Portnov а есть ссылка на сорц?

Читать полностью…

pgsql – PostgreSQL

Почему вы решили, что случайно выбранные блоки будут читаться в порядке увеличения номера блока? (upd.: был не прав)

PostgreSQL гарантирует, что будет анализировать статистически рандомную выборку данных из таблицы (благодаря чему эта выборка может называться "репрезентативной").

Читать полностью…

pgsql – PostgreSQL

примерно так: берём общее количество блоков в таблице K, нужное количество блоков k, потом проходим блоки по порядку и каждый блок выбираем с вероятностью k/K. Там какие-то ещё тонкости есть, я не вдавался в детали, но кажется в общих чертах так.

Читать полностью…

pgsql – PostgreSQL

ну например N=100. Взяли блоки номер 2, 5, 10, 15,..., 178, всего 100 штук. Среднее количество строк на блок... ну например 5.
Получается из блока 2 прочитали 5 строк, из блока 5 прочитали 5 штук, из блока 10 прочитали 5 штук... ну и где-нибудь на блоке 75 уже остановились, потому что всё, уже 100 строк набрали. Блоки 80 ... 178 уже и не смотрим вовсе.

Читать полностью…

pgsql – PostgreSQL

Думаете, там сата SSD?

Читать полностью…

pgsql – PostgreSQL

test=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 14.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

test=# \du+ new_user
List of roles
Role name | Attributes | Member of | Description
-----------+------------+-----------+-------------
new_user | | {} |



Извиняюсь что долго отвечал

Читать полностью…

pgsql – PostgreSQL

Блин, а вы правы. Вчитался в функцию BlockSampler_Next — коя возвращает очередной номер блока (bs->t). Заметим, что в этой функции единственная мутирующая операция с bs->t — это инкремент). Таким образом, итератор BlockSampler выдает монотонно возрастающие номера блоков (т.е. там и правда Knuth's Algorithm S).

Однако, как я понимаю, в итоге будут перебраны ~все номера блоков, чем достигается эта гарантия:

every row has an equal chance of ending up in the final sample

А именно, вот тут открывается стрим на итератор BlockSampler, далее идет цикл while до тех пор, пока этот стрим способен выдавать значения (т.е. пока не пробежится по всем блокам).

--
На счет этого:
И кстати это немаловажная идея: т.к. собираемся читать заведомо много данных, их выгоднее читать последовательно

Согласен с вами, но это то, допустим, можно решить предварительной сортировкой номеров блоков (и/или таплов) Возможно, хотя бы пачками.

Читать полностью…

pgsql – PostgreSQL

в этом комментарии написано только что выбираются случайные блоки, в каком порядке они выбираются тут не написано. А вот в комментарии к BlockSampler_Next написано что используется алгоритм Кнута, я скрин выше кидал. У Кнута явно написано что это алгоритм для последовательного доступа к данным. И кстати это немаловажная идея: т.к. собираемся читать заведомо много данных, их выгоднее читать последовательно (ну т.к. PG всё ещё живёт на шпиндельных дисках в умах авторов). С этой точки зрения, идея прочитать сначала 5й блок, потом 100500й, а потом 6й — так себе идея.

Читать полностью…

pgsql – PostgreSQL

@Ilya_Portnov можете описание функции acquire_sample_rows почитать (начиная со слов "As of May 2004 <...>"), которую использует analyze_rel — функция для анализа отношения (таблицы). Там внутри используется BlockSampler, который является итератором который на каждый вызов Next возвращает "случайный" блок.

Короче говоря, происходит примерно то, что я описывал выше.

Читать полностью…

pgsql – PostgreSQL

какие-то конечно может пропустить из-за dead tuples или блокировки, но всё равно последовательно.

Читать полностью…

pgsql – PostgreSQL

ну то есть положим что кнутs даёт репрезентативную выборку блоков - полагаю надо смотреть дальше.
Далее предположу что при анализе либо блоки читаются полностью, либо всегда берётся первая строка блока/первые X строк блока.

Читать полностью…

pgsql – PostgreSQL

плюс какие-то оптимизации,чтобы не ^

Читать полностью…

pgsql – PostgreSQL

там вроде коммент есть,ссылается на https://rosettacode.org/wiki/Knuth%27s_algorithm_S

Читать полностью…

pgsql – PostgreSQL

ну то есть замаппить интервал [0, 1] на таблицу, насчитать подынтервалов из [0, 1], и сразу пойти взять нужные блоки..

Читать полностью…

pgsql – PostgreSQL

Нет, такой алгоритм не используется (upd.: был не прав) (он работал бы неприлично долго, ибо кол-во блоков может достигать сотни миллионов и более). На каждой итерации достаточно взять случайное число [0;1) и умножить его на общее кол-во блоков — так будем получать очередной "случайный" блок, грубо говоря. Эту операцию будем проделывать до тех пор, пока не достанем нужное кол-во строк.

Читать полностью…

pgsql – PostgreSQL

если это так - получается что по возрастанию.

Читать полностью…

pgsql – PostgreSQL

Надо смотреть распределение выбора блоков чтобы что-то сказать наверняка.

Читать полностью…

pgsql – PostgreSQL

ну тут непонятно как рандомно выбираются блоки.

Читать полностью…

pgsql – PostgreSQL

так ведь сказано "рандомно N блоков"
N строк - значит столько же сколько блоков?

НУ при большом N и малом размере блока может и норм

Читать полностью…
Subscribe to a channel