9404
Чат русскоязычного сообщества PostgreSQL, здесь мы обсуждаем технические вопросы, для поиска работы и предложения вакансий есть группа https://t.me/pgsqljobs For English discussion visit https://t.me/pg_sql
Нет, из роли public никого исключить нельзя.
Надо сделать revoke со схемы public для роли public.
Спасибо за развернутый ответ.
Получается надо new_user исключить из роли PUBLIC?
Или как сделать чтобы не мог таблицы создавать?
Сейчас ситуация странная, чтение таблиц, уже существующих запрещено, а свои создавать пользователь может (
Ага, ну это то гарантируется и исходя из описания функции acquire_sample_rows:
Stage two scans these blocks and uses the Vitter algorithm to create a random sample of targrows rowsЧитать полностью…
Нашёл, есть всё-таки случайный сэмплинг и для строк. Примерно вот тут: https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/commands/analyze.c#L1277
Читать полностью…
Напротив, репрезентативность выборки — очень важная вещь. К счастью, она достигается используемыми алгоритмами PostgreSQL (в той мере, которую позволяет текущий параметр statistics_target, конечно).
Читать полностью…
(должен заметить, у меня пока не получилось составить реалистичный пример, на котором это было бы важно. Просто зарылся в код по другому поводу и обнаружил вот такое, стало интересно.)
Читать полностью…
ну вот я до сюда дошёл
https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/access/heap/heapam_handler.c#L1025
и там рядом функция heapam_scan_analyze_next_block. Вроде бы последовательно все строки в блоке читает.
они даже имена переменных из Кнута взяли.
насколько я вижу, этот алгоритм выдаёт блоки в порядке возрастания.
да, я уже кнута с полки достал, читаю :)
Читать полностью…
Не совсем, ГСЧ по требованию просто каждый раз выдает вещественное число из отрезка [0;1). Ему не надо ничего "маппить". При умножении получившегося числа на общее кол-во блоков достаточно его округлить до целого (по некоторым правилам) — это и будет очередной "случайный" номер блока. Эту операцию можно делать бесконечное кол-во раз (но нужно проверять, чтоб очередной "случайный" блок уже не был использован ранее при текущем "анализе" — это также тривиальная операция, работающая за O(1)).
Читать полностью…
я вот тут смотрю
https://github.com/postgres/postgres/blob/e167191dc146b65146fbd32e147be30dd8f1f166/src/backend/utils/misc/sampling.c#L64
тут нейминг переменных конечно "от бога", так что я наскоро мог и не разобраться.
но вопрос так ли это.
@Ilya_Portnov а есть ссылка на сорц?
Почему вы решили, что случайно выбранные блоки будут читаться в порядке увеличения номера блока? (upd.: был не прав)
PostgreSQL гарантирует, что будет анализировать статистически рандомную выборку данных из таблицы (благодаря чему эта выборка может называться "репрезентативной").
примерно так: берём общее количество блоков в таблице K, нужное количество блоков k, потом проходим блоки по порядку и каждый блок выбираем с вероятностью k/K. Там какие-то ещё тонкости есть, я не вдавался в детали, но кажется в общих чертах так.
Читать полностью…
ну например N=100. Взяли блоки номер 2, 5, 10, 15,..., 178, всего 100 штук. Среднее количество строк на блок... ну например 5.
Получается из блока 2 прочитали 5 строк, из блока 5 прочитали 5 штук, из блока 10 прочитали 5 штук... ну и где-нибудь на блоке 75 уже остановились, потому что всё, уже 100 строк набрали. Блоки 80 ... 178 уже и не смотрим вовсе.
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 | | {} |
Блин, а вы правы. Вчитался в функцию 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_Next написано что используется алгоритм Кнута, я скрин выше кидал. У Кнута явно написано что это алгоритм для последовательного доступа к данным. И кстати это немаловажная идея: т.к. собираемся читать заведомо много данных, их выгоднее читать последовательно (ну т.к. PG всё ещё живёт на шпиндельных дисках в умах авторов). С этой точки зрения, идея прочитать сначала 5й блок, потом 100500й, а потом 6й — так себе идея.
Читать полностью…
@Ilya_Portnov можете описание функции acquire_sample_rows почитать (начиная со слов "As of May 2004 <...>"), которую использует analyze_rel — функция для анализа отношения (таблицы). Там внутри используется BlockSampler, который является итератором который на каждый вызов Next возвращает "случайный" блок.
Короче говоря, происходит примерно то, что я описывал выше.
какие-то конечно может пропустить из-за dead tuples или блокировки, но всё равно последовательно.
Читать полностью…
ну то есть положим что кнутs даёт репрезентативную выборку блоков - полагаю надо смотреть дальше.
Далее предположу что при анализе либо блоки читаются полностью, либо всегда берётся первая строка блока/первые X строк блока.
там вроде коммент есть,ссылается на https://rosettacode.org/wiki/Knuth%27s_algorithm_S
Читать полностью…
ну то есть замаппить интервал [0, 1] на таблицу, насчитать подынтервалов из [0, 1], и сразу пойти взять нужные блоки..
Читать полностью…
Нет, такой алгоритм не используется (upd.: был не прав) (он работал бы неприлично долго, ибо кол-во блоков может достигать сотни миллионов и более). На каждой итерации достаточно взять случайное число [0;1) и умножить его на общее кол-во блоков — так будем получать очередной "случайный" блок, грубо говоря. Эту операцию будем проделывать до тех пор, пока не достанем нужное кол-во строк.
Читать полностью…
если это так - получается что по возрастанию.
Читать полностью…
Надо смотреть распределение выбора блоков чтобы что-то сказать наверняка.
Читать полностью…
ну тут непонятно как рандомно выбираются блоки.
Читать полностью…
так ведь сказано "рандомно N блоков"
N строк - значит столько же сколько блоков?
НУ при большом N и малом размере блока может и норм