GreenplumSQLClub
402 subscribers
48 photos
2 videos
13 files
46 links
Канал посвящен рецептам и практикам по работе с Greenplum / Arenadata DB

Наш основной канал https://t.me/sqlclub_ru

Если будут рецепты для истории можно написать в личку @SQL4Life
Download Telegram
Обратил внимание на следующую вещь.
Запрос ниже обязательно вернет несколько десятков строк
select rsgname
, query
, user
from pg_stat_activity
where rsgname = 'unknown'

оказывается
When resource groups are enabled. Only query dispatcher (QD) processes will have
a rsgid and rsgname. Other server processes such as a query executer (QE) process
or session connection processes will have a rsgid value of 0 and a rsgname value of
unknown. QE processes are managed by the same resource group as the dispatching
QD process.

что означает
Когда группы ресурсов включены. Только процессы диспетчера запросов (QD) будут иметь `rsgid` и `rsgname`. Другие серверные процессы, такие как процесс исполнителя запросов (QE) или процессы подключения сеанса, будут иметь значение `rsgid`, равное `0`, и значение `rsgname`, равное `unknown`. Процессы QE управляются той же группой ресурсов, что и диспетчерский процесс QD.
👍5
вывести config кластера:
select * from pg_settings;
Запрос для того что бы посмотреть конфиг, если Greenplum развернут в облаке и к нему нет доступа по ssh
select gp_execution_segment() seg_id, * 
from pg_settings
WHERE name = 'max_connections'
UNION ALL
select gp_execution_segment() seg_id, *
from gp_dist_random('pg_settings') dc
WHERE name = 'max_connections'
ORDER BY seg_id

gp_execution_segment - возвращает номер сегмента, где был выполнен запрос
gp_dist_random - псевдофункция, которая позволяет получить доступ к данным на каждом сегменте
upd. я не первый это в чат принес, первым был https://t.me/GreenplumSQLClub/173?comment=74
👍1
Нашел еще вот такой запрос в исходниках:
Этот запрос объединяет все просочившиеся временные схемы на координаторе, а также все сегменты.
Первая часть запроса использует gp_dist_random, который получает просочившиеся временные схемы только из сегментов
Вторая часть запроса получает просочившиеся временные схемы только из координатора
      SELECT nspname, replace(nspname, 'pg_temp_','')::int as sess_id
FROM gp_dist_random('pg_namespace')
WHERE nspname ~ '^pg_temp_[0-9]+'

может кому и пригодится
👍1
Как думаете где выполнится данная функция? на сегментах или нет?
И как можно изменить запрос что бы он выполнился таргетировано на мастере
SELECT gp_execution_segment(), * 
FROM generate_series(1,10) x
👍2
Очень интересная схема для изучения, нашел в чате, вот ссылка
https://t.me/greenplum_russia/79682
Статья с хабра про файловые дескрипторы AO таблиц
https://habr.com/ru/companies/arenadata/articles/576418/
UPD. еще одна статья
https://habr.com/ru/companies/axenix/articles/832126/
Запрос генерирует список сегментов, согласно их количеству:
select gp_execution_segment() seg_id 
from gp_dist_random('gp_id')
Задача найти спилл файл на диске
https://telegra.ph/Zadacha-najti-spill-fajl-na-diske-03-19
Скрины приложил.
Запрос скорее всего не выполнится и упадет из за нехватки памяти, но пока он крутится можно провести исследование.
🔥1
Посмотреть информацию о табличных пространствах
SELECT oid, * FROM pg_tablespace ;

вывести подробную информацию по табличному пространству:
WITH spc AS (SELECT * FROM  gp_tablespace_location(1663))
SELECT seg.role, spc.gp_segment_id as seg_id, seg.hostname, seg.datadir, tblspc_loc
FROM spc, gp_segment_configuration AS seg
WHERE spc.gp_segment_id = seg.content ORDER BY seg_id;
🔥2
THE 2024 MAD (MACHINE LEARNING, ARTIFICIAL INTELLIGENCE & DATA) LANDSCAPE
https://mattturck.com/landscape/mad2024.pdf
https://mad.firstmark.com/
GreenplumSQLClub
https://hub.docker.com/r/sql4mpp/greenplum_adgp docker pull sql4mpp/greenplum_adgp Билд greenplum в докер контейнере на исходнике: https://github.com/arenadata/gpdb Как минимум можно тестовую базу запустить по инструкции: https://github.com/arenadata/gpdb/tree/adb…
в продолжении данной сборки.
Для того что бы можно было воспользоваться в докер контейнере необходимо скачать репозиторий dev_adgp и запустить по инструкции docker образ
git clone https://github.com/sql-mpp-gp/dev_adgp

Create docker image:
docker build -t gpdb .

Run docker image:
docker run -v ./gpdemo:/tmp/gpdb/gpdemo -d -p2222:22 gpdb

Connect to docker image:
ssh gpadmin@localhost -p 2222 

(input yes and password gpadmin)
Create cluster:
make cluster

Stop cluster
gpstop


Общая инструкция - расположена тут (https://github.com/arenadata/gpdb/tree/adb-6.x/gpAux/gpdemo)

При необходимости можно увеличивать количество сегментов, либо изменять параметры запуска и конфигурации.

connect from localhost with psql utility
psql (password gpadmin)
psql -p6000 -hlocalhost -Ugpadmin -dpostgres
🔥2
Наткнулся на алгоритм вычисления hash для номера сегмента по ключу дистрибьюции таблицы, исходный код можно посмотреть OpenGPDB и Arenadata
строки 549~560; 255~287.
Думаю почитать про сам hash алгоритм :
https://arxiv.org/abs/1406.2294
до 6 версии он не использовался поэтому есть параметр gp_use_legacy_hashops который позволяет указать использование легаси хэш-функции для дистрибьюции данных
🔥1
Как вычисляется номер сегмента, который будет работать с distributed replicated таблицей, кажется так (а если порыться в исходниках можно найти правила для сегментов на которых выбирается выполнения pxf - внешних таблиц, но там чуть другая формула ):
mod(session_id, count_segmens)  
или
session_id % count_segments

Запрос для проверки:
SELECT (SELECT sess_id FROM pg_stat_activity WHERE pid = pg_backend_pid()) session_id
, gp_execution_segment() fact_execution_segment
, mod((SELECT sess_id FROM pg_stat_activity WHERE pid = pg_backend_pid())
, (SELECT count(*) FROM gp_segment_configuration WHERE ROLE = 'p' AND content != -1)
) calc_execution_segment
FROM dev.test_heap_replicated;

session_id - текущий session_id
calc_execution_segment - поле для проверки что расчет совпадет с фактом
fact_execution_segment - фактический сегмент выполнения запроса
Предварительно нужно создать таблицу и заполнить её:
create schema dev;
CREATE TABLE dev.test_heap_replicated (id int, descr_nm text)
WITH (APPENDONLY=false)
distributed replicated;
INSERT INTO dev.test_heap_replicated
SELECT n, 'dev_test_replicared_read' FROM generate_series(1,1000) n;
🔥1
Кому интересно, нужны Greenplum специалисты, подробнее тут - (можно посоветовать или попробовать для себя). Заходил HR но я ей не помог
👍1
Запрос для изучения - выводит сессии, которые не отображаются в pg_stat_activity
SELECT *
FROM session_state.session_state_memory_entries_f_on_master() AS C (
segid int,
sessionid int,
vmem_mb int,
runaway_status int,
qe_count int,
active_qe_count int,
dirty_qe_count int,
runaway_vmem_mb int,
runaway_command_cnt int,
idle_start timestamp with time zone
)
where sessionid not in (select sess_id from pg_stat_activity)
order by 1;

иногда нужен для изучения проблем
😱2😁1
то же что и предыдущий запрос но при этом выводи информацию по сегментам
SELECT *
FROM session_state.session_state_memory_entries_f_on_master() AS C (
segid int,
sessionid int,
vmem_mb int,
runaway_status int,
qe_count int,
active_qe_count int,
dirty_qe_count int,
runaway_vmem_mb int,
runaway_command_cnt int,
idle_start timestamp with time zone
)
where sessionid not in (select sess_id from pg_stat_activity)
order by 1;