Конфигурационные параметры сервера можно увидеть из представления:
Типы и значения параметров описывают типы данных и значения параметров.
Установка параметров описывает ограничения на то, кто может их изменять, а также где или когда их можно устанавливать.
Категории параметров организуют параметры по функциональности.
Параметры конфигурации перечисляют описания параметров в алфавитном порядке.
исходник
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
Исходный код для знакомства с 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 для таблицы
Если не указвать в 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 %}
Запись появилась митапа
https://youtu.be/LuZoarjNF0w
думаю многим интересно будет посмотреть
https://yandex.cloud/ru/events/938?utm_referrer=about%3Ablank
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
greenplum адаптер
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/
На глобус нанесена карта разделения пространств аэропортов мира
https://www.jasondavies.com/maps/voronoi/airports/
На глобус нанесена карта разделения пространств аэропортов мира
👍2
что бы изменить ресурсную группу у пользователя
и посмотреть ресурсные группы можно взять из представления
ALTER USER <name> RESOURCE GROUP {<group_name> | NONE}
и посмотреть ресурсные группы можно взять из представления
select * from gp_toolkit.gp_resgroup_config
Закопался в изучение вопроса как понимать в плане запроса узел вида:
Узел сканирования ввода общего доступа используется для совместного использования результата операции в двух разных ветвях дерева плана.
В интернете ничего не нашел, возможно плохо искал, полез в исходники, в результате получилась небольшая таблица.
исходник тут:
Ну и для того, что бы понять что выводится в скобках нашел следующий исходник, думаю это дублируется в выводе узла, но мне было интересно...
- 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
-> 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 - точно, и как мне кажется оконных функций то же.
в нем описывается поведение формирование плана запроса для выполнения
вычисления агрегатов и например операторов 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
Поддерживается вот такая конструкция
но только для heap таблиц
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 определяет две таблицы.
- Вложенные (Nested) 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, а затем несколько бэкендов могут позже сканировать сохраненные кортежи.
В настоящее время поддерживается только один тип сканирования — параллельное сканирование, при котором каждый бэкенд считывает произвольное подмножество записанных кортежей.
Простой механизм для совместного использования кортежей между бэкендами.
Этот механизм временного хранения кортежей, предоставляющий параллельное подмножество функций tuplestore.c.
Несколько бэкендов могут записывать в SharedTuplestore, а затем несколько бэкендов могут позже сканировать сохраненные кортежи.
В настоящее время поддерживается только один тип сканирования — параллельное сканирование, при котором каждый бэкенд считывает произвольное подмножество записанных кортежей.