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

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

Если будут рецепты для истории можно написать в личку @SQL4Life
Download Telegram
Конфигурационные параметры сервера можно увидеть из представления:
select * 
from pg_settings
order by category;

Типы и значения параметров описывают типы данных и значения параметров.
Установка параметров описывает ограничения на то, кто может их изменять, а также где или когда их можно устанавливать.
Категории параметров организуют параметры по функциональности.
Параметры конфигурации перечисляют описания параметров в алфавитном порядке.
исходник
🔥2
Получить список полей таблиц, сокращенный способ:
select * 
from pg_attribute
where attrelid = 'my_schema.me_table'::regclass::oid;
🔥4👍2
https://github.com/open-gpdb/gpdb
Исходный код для знакомства с mpp совместимой с greenplum.
В разделе https://github.com/open-gpdb/gpdb?tab=readme-ov-file#repositories несколько интересных дополнений к greenplum, например хранение AO таблиц в s3
DBT Greenplum. Адаптер.
Если не указвать в config distributed_by и distributed_replicated то будет randomly distribution для таблицы
{% macro distribution(distributed_by, distributed_replicated) %}
{% set distribution %}
{% if distributed_by is not none %}
DISTRIBUTED BY ({{ distributed_by }})
{% elif distributed_replicated %}
DISTRIBUTED REPLICATED
{% else %}
DISTRIBUTED RANDOMLY
{% endif %}
{% endset %}

{{ return(distribution) }}
{% endmacro %}
Наткнулся на документацию по PXF
она прикреплена в комментах
Запись появилась митапа
https://youtu.be/LuZoarjNF0w
думаю многим интересно будет посмотреть
https://yandex.cloud/ru/events/938?utm_referrer=about%3Ablank
👍1
позволяет увидеть доступные расширения для кластер
select * from pg_available_extensions;

позволяет увидеть установленные расширения
select * from pg_extension;
👍1
Пример чтения из s3 файла parquet со сжатием snappy
create readable EXTERNAL table "trs_tt"."test_tbl" (ID DECIMAL(38,0), field_dtm bigint, field_nm text)
LOCATION ('pxf://s3backetname/folder/path/path/?PROFILE=s3:parquet&SERVER=s3serverconfig&COMPRESSION_CODEC=snappy')
ON ALL FORMAT 'CUSTOM' ( FORMATTER='pxfwritable_import' ) ENCODING 'UTF8';
👍3
dbt
https://github.com/dbt-labs/dbt-core

greenplum адаптер
https://github.com/markporoshin/dbt-greenplum
https://github.com/hovercraft-github/dbt-greenplum
немного в тему данных, а в тему их визуализаций, наткнулся вот на такую визуализацию
https://www.jasondavies.com/maps/voronoi/airports/
На глобус нанесена карта разделения пространств аэропортов мира
👍2
что бы изменить ресурсную группу у пользователя
ALTER USER <name> RESOURCE GROUP {<group_name> | NONE}

и посмотреть ресурсные группы можно взять из представления
select * from gp_toolkit.gp_resgroup_config
Закопался в изучение вопроса как понимать в плане запроса узел вида:
->  Shared Scan (share slice:id 1:3)

Узел сканирования ввода общего доступа используется для совместного использования результата операции в двух разных ветвях дерева плана.
В интернете ничего не нашел, возможно плохо искал, полез в исходники, в результате получилась небольшая таблица.
исходник тут:
Ну и для того, что бы понять что выводится в скобках нашел следующий исходник, думаю это дублируется в выводе узла, но мне было интересно...
- slice_id
- share_id
https://github.com/open-gpdb/gpdb/blob/OPENGPDB_STABLE/src/backend/executor/nodeShareInputScan.c
https://github.com/open-gpdb/gpdb/blob/OPENGPDB_STABLE/src/backend/commands/explain.c
👍4
есть такой файл в исходниках greenplum: - cdbgroupingpaths.c
в нем описывается поведение формирование плана запроса для выполнения
вычисления агрегатов и например операторов count(distinct field_nm) - DQA(Distinct Qualified Aggregate)

ниже перевод комментариев из исходного кода:

Общая форма сгенерированного плана аналогична планам параллельной
агрегации:

Finalize Aggregate [3]
Motion [2]
Partial Aggregate [1]

но существует множество различных вариантов этой базовой формы:

[1] Частичная стадия может быть отсортирована или хэширована. Кроме того,
отсортированный Agg может быть получен путем сортировки самого дешевого входного пути
или из предварительно отсортированных путей.

[2] Для второго этапа необходимо собрать частичные результаты. Для простой агрегации, без использования GROUP BY, результаты должны быть
собраны в одном узле. С помощью GROUP BY они могут быть перераспределены в соответствии с группировкой ПО столбцам.

[3] Как и в первом случае, второй этап также может быть отсортирован или хэширован. Ситуация усложняется, если у любого из агрегатов есть различные
аргументы, также известные как DQAS или агрегаты с различными параметрами. Если есть только один DQA, и входной путь совпадает с аргументом
DISTINCT, тогда мы можем перейти к двухэтапному пути, как описано выше.
Но в противном случае потребуется три этапа и, возможно, узел с разделением на кортежи.
Подробности смотрите в разделах add_single_dqa_hash_agg_path() и add_multi_dqas_hash_agg_path()

изложенное нужно учитывать при использовании операторов distinct - точно, и как мне кажется оконных функций то же.
🤔2
как получить место, которое занимает таблица на каждом сегменте:
             select oid as table_oid, 
pg_size_pretty(pg_relation_size(oid)) as size
from gp_dist_random('pg_class')
where oid = 69756046 and relkind <> '%s'

нужно только знать её oid
👍7
Поддерживается вот такая конструкция
WITH deleted_rows AS (
DELETE FROM products
WHERE
"date" >= '2010-10-01' AND
"date" < '2010-11-01'
RETURNING *
)
SELECT * FROM deleted_rows;

но только для heap таблиц
Запрос - который поможет найти перекошенные таблицы, например все, имеющие тип 'c'
with get_size as (
select oid as realtion_oid
, pg_relation_size(oid) as size
from gp_dist_random('pg_class')
where relkind <> '%s'
--and oid in (your numbers or subquery)
and relstorage = 'c'
), prepare as (
select gs.*
, pgc.relname
, pg_size_pretty(pg_relation_size(gs.realtion_oid)) as size_nm
from get_size gs
inner join (select oid pgc_oid, relname from pg_class) pgc
on pgc.pgc_oid = gs.realtion_oid
)
select realtion_oid, relname
, pg_size_pretty(min(size)) min_size_per_seg
, pg_size_pretty(max(size)) max_size_per_seg
, pg_size_pretty(avg(size)) avg_size_per_seg
, case when max(size) != 0 then round((min(size)::decimal/max(size))*100,2)
else NULL
end koefficient_min_div_max
from prepare prep
group by realtion_oid, relname
order by max(size) desc
👍5
GPORCA поддерживает следующие типы CTEs:
- CTE, определяющее одну или несколько таблиц. В этом запросе CTE определяет две таблицы.
    WITH cte1 AS (SELECT a, sum(b) as s FROM T 
where c < 10 GROUP BY a),
cte2 AS (SELECT a, s FROM cte1 where s > 1000)
SELECT *
FROM cte1 as v1, cte2 as v2, cte2 as v3
WHERE v1.a < v2.a AND v1.s < v3.s;

- Вложенные (Nested) CTEs.
    WITH v AS (WITH w AS (SELECT a, b FROM foo 
WHERE b < 5)
SELECT w1.a, w2.b
FROM w AS w1, w AS w2
WHERE w1.a = w2.a AND w1.a > 2)
SELECT v1.a, v2.a, v2.b
FROM v as v1, v as v2
WHERE v1.a < v2.a;
🔥3
Получить по каждому сегменту суммарный объем данных:
select pg_size_pretty(sum(pg_relation_size(oid))) as size
, gp_segment_id
from gp_dist_random('pg_class')
where relkind <> '%s'
and pg_relation_filenode(oid) not in (69756046)
-- and relstorage = 'c'
group by gp_segment_id
order by gp_segment_id
👍3
В плане запросов встречается SharedTupleStore:
Простой механизм для совместного использования кортежей между бэкендами.
Этот механизм временного хранения кортежей, предоставляющий параллельное подмножество функций tuplestore.c.
Несколько бэкендов могут записывать в SharedTuplestore, а затем несколько бэкендов могут позже сканировать сохраненные кортежи.
В настоящее время поддерживается только один тип сканирования — параллельное сканирование, при котором каждый бэкенд считывает произвольное подмножество записанных кортежей.