uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

Greenplum secrets🎩

Greenplum secrets🎩

Відкрити в Telegram

The channel about best practice coding for Greenplum / Канал о том как писать оптимальный код в Greenplum. by @smartyru

Показати більше
683
Підписники
Немає даних24 години
-17 днів
+130 днів
Архів дописів
На заметку 8 марта: История праздника Многие из вас удивятся тому что, корни 8 марта уходят в события конца XIX — начала XX века, когда женщины в индустриально развитых странах начали массово выступать против тяжелых условий труда и социального неравенства. Так, например, в 1857 году в Нью-Йорке прошел "марш пустых кастрюль" — работницы текстильных фабрик вышли на протест, требуя 10-часовой рабочий день и равную с мужчинами зарплату . Потом в 1908 году снова выступали, около 15 тысяч женщин вновь вышли на улицы Нью-Йорка с требованиями сокращения рабочего дня, повышения зарплаты и предоставления избирательного права . Поворотным моментом стала Международная конференция женщин-социалисток в Копенгагене в 1910 году. Именно там немецкая активистка Клара Цеткин предложила учредить Международный женский день . Ее идея заключалась в том, чтобы женщины всего мира могли ежегодно проводить митинги и шествия, привлекая внимание к своим проблемам . В Российскую империю этот день пришел в 1913 году, когда в Петербурге провели "Научное утро по женским вопросам" . Однако ключевую роль в закреплении даты 8 марта сыграли события 1917 года. 23 февраля (8 марта по новому стилю) 1917 года женщины Петрограда вышли на улицы с лозунгами «Хлеба и мира!» . Эта массовая демонстрация стала одним из искр, разжегших Февральскую революцию, которая привела к падению монархии . В память об этом дне в 1921 году 8 марта было официально установлено в Советской России как государственный праздник . В 1920-1930-е годы праздник носил политический характер и назывался "Международный коммунистический женский день". В этот день проводились собрания, чествования женщин-ударниц, ставились задачи по вовлечению их в производство и общественную жизнь . И только в 1965 году 8 марта было объявлено нерабочим днем, и праздник постепенно начал терять свою политическую окраску, становясь "днем всех женщин" . В 1975 год ООН официально признала 8 марта Международным женским днем и призвала все страны отмечать его как день борьбы за права женщин .

Используешь мессенжер MAX ?
Anonymous voting

Repost from Yaplakal.com
Рабочая тема! 😁

Вопрос 11 В GP 6 при inner join хэш таблицы создаются на обе сопрягаемые таблицы ? In GP 6, for inner join, hash tables are created for both joined tables?

На заметку Получить коментарии на колонках таблы Note Get comments on table columns
SELECT
    att.attname AS column_name,
    d.description AS comment,
  att.attnum  column_num
FROM
    pg_attribute att
LEFT JOIN
    pg_description d ON att.attrelid = d.objoid AND att.attnum = d.objsubid
WHERE
    att.attrelid = 'schema_name.table_name'::regclass
    AND att.attnum > 0
    AND NOT att.attisdropped
ORDER BY att.attnu

На заметку pg_stat_last_operation - трекер последних операций в метаданных объектов БД, как-то: Note pg_stat_last_operation - a tracker that tracks the last operations in the metadata of database objects, such as: CREATE ALTER PRIVILEGE ANALYZE VACUUM TRUNCATE PARTITIION

Под капотом Чтобы видеть какие запросы формируются для метакоманд psql, надо выполнить psql -E : To see what queries are generated for psql meta-commands, you need to run psql -E :
$ psql -E postgres

postgres=# \dE gp_toolkit.*
********* QUERY **********
select pg_catalog.version()
**************************

********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','s','f','')
AND c.relstorage IN ('x','f','')
      AND n.nspname !~ '^pg_toast'
  AND n.nspname OPERATOR(pg_catalog.~) '^(gp_toolkit)$'
ORDER BY 1,2;
**************************

                  List of relations
   Schema   |         Name         | Type  |  Owner  
------------+----------------------+-------+---------
 gp_toolkit | __gp_log_master_ext  | table | gpadmin
 gp_toolkit | __gp_log_segment_ext | table | gpadmin
 gp_toolkit | gp_disk_free         | table | gpadmin
(3 rows)

На заметку Так как часто работаю с внешними PXF таблицами и мне надоело палить время на обновление дерева в DataGrip из тысяч таблиц, чтобы получить DDL нужной, оставлю здесь рабочий вариант генерации DDL, для GP6 - работает, для 7-ки не проверял. Note Since I often work with external PXF tables and am tired of wasting time updating a DataGrip tree of thousands of tables to get the DDL I need, lemme drop a working version of DDL generation here. It works for GP6, but I haven't tested it for 7.

Repost from Arenadata
Группа Arenadata на инвестиционном форуме ВТБ «Россия зовёт!» Сегодня в Санкт-Петербурге проходит первый в 2026 году инвестиц
+1
Группа Arenadata на инвестиционном форуме ВТБ «Россия зовёт!» Сегодня в Санкт-Петербурге проходит первый в 2026 году инвестиционный форум, где Группа приняла участие в панельной сессии «Искусственный интеллект, технологии и будущее частных инвестиций». Среди спикеров: 🔷Пётр Емельянов, директор по исследованиям и разработкам компании УБИК (Группа Arenadata); 🔷Максим Радюков, директор по информационным технологиям, «Циан»; 🔷Сергей Карпович, замруководителя направления, Т1 ИИ (ИТ-холдинг Т1); 🔷Александр Диденко, руководитель Лаборатории ИИ, Школа управления Сколково и другие. В ходе дискуссии обсуждались вопросы применения ИИ в финансах, ответственности за принятые решения, бизнес-эффекта от внедрения в компаниях и потенциала развития технологии. Вопросы от Алевтины Пенкальской, модератора сессии:
— В России реально только около 10% компаний используют ИИ для обработки данных и принятия решений. Почему по сути мы находимся на стадии технологического хайпа и что мешает бизнесу полноценно автоматизировать процессы и довериться ИИ?
📞Пётр Емельянов:
— Электричество принесло ощутимую отдачу не тем, кто просто заменил паровой котёл на электрический, а тем, кто построил фабрику. История повторяется: котлы на тяге искусственного интеллекта есть более или менее у всех, а фабрики построили те самые 10%, которые утверждают, что достигли своих целей. Остальным эти фабрики придётся строить. Это долгий путь с множеством препятствий в социальных и технологических областях. 1. Саботаж со стороны интеллекта естественного. Закон истории. Луддиты в первую промышленную революцию разбивали станки кувалдами и сжигали фабрики. Программисты и менеджеры среднего звена сжигать ничего не станут, но «итальянские забастовки» будут. Уже есть. 2. Котлы ИИ питаются не только электричеством, но и данными, системы управления которыми мы строим десятилетиями и регулярно перестраиваем, приспосабливаясь под разные типы рабочих нагрузок. ИИ — это совершенно новая, неисследованная и абсолютно не типичная рабочая нагрузка. Те, кто построил свои хранилища качественно и смог оперативно перестроиться под нагрузки ИИ, видят ощутимый эффект от его
применения. Тем, у кого такого фундамента нет, придётся его заложить. Самая короткая дорога — партнёрство с вендорами систем управления базами данных, которые и в России, и в мире довольно активно адаптируют свои продукты под бурно меняющийся ИИ-ландшафт. Полагаю, у них это получится лучше и быстрее, чем у непрофильных организаций.
Алевтина Пенкальская:
— Не находимся ли мы в таком случае уже в фазе переоценки ожиданий от ИИ, аналогичной другим технологическим циклам?
📞Пётр Емельянов:
— Если верить отчёту Gartner за 2025 год, почти всё, что большинство понимает под искусственным интеллектом, всё ещё на хайпе, сверху самой крутой горки на кривой. Так что в этом смысле мы всё ещё на стадии формирования ожиданий. А вообще, не так важно, где мы находимся, важнее то, как долго мы будем там находиться. Например, вы помните, что в 1995-м видеозвонки находились на дне ямы разочарования, а в 2020-м акции Zoom взлетели почти в 8 раз. Такое никакой искусственный интеллект не предскажет. Как правило, технологические революции долго запрягают, зато потом быстро едут.
#ИИ #AI

Используете/создаете свои индексы в GP ? Do you use or create your own indexes in GP?
Anonymous voting

Оставлю на память о том, что не все то золото, что публикуется на хабре, https://habr.com/ru/articles/996560/

На заметку⏰ Дефолтная таймзона БД доступна по команде gpconfig -s timezone Values on all segments are consistent GUC : timezone Master value: Europe/Moscow Segment value: Europe/Moscow Параметр определен в postgresql.conf Переопределить таймзону можно, используя настройки 1) глобального guc 2) зоны для бд 3) зоны для роли 4) зоны для определенной сессии Note⏰ The default time zone of the database is available by command gpconfig -s timezone Values on all segments are consistent GUC : timezone Master value: Europe/Moscow Segment value: Europe/Moscow The parameter is defined in postgresql.conf You can override the time zone using the settings 1) global guc 2) zone for the database 3) zone for the role 4) zone for a specific session

Вопрос 10 Как узнать дефолтную таймзону для БД SQL запросом? How to find out the default time zone for a database using an SQL query?

#DATA, Самый лучший день заходил вчера... Аренадата ( амбассадор MPP технологии в России ) беспрецедентно отракетила на больш
#DATA, Самый лучший день заходил вчера... Аренадата ( амбассадор MPP технологии в России ) беспрецедентно отракетила на больших объемах на предварительной отчетности по МСФО, гораздо лучше ожиданий, +16.33% капитализации. То ли еще будет!

Ответ на тест выше Да. Подробнее В продолжение https://t.me/mpp_secrets/66 старина Мерфи с нами снова в одной компании: если что-то может пойти не так - оно пойдет не так, Карл! Неожиданно, если не сказать, выбивает из седла, но если в IN фильтр добавить ключевое слово VALUES, то получим Hash Join, т.к. GPORCA транслирует фильтр в таблицу, например
explain analyze
select * from t where id in (values (1),(2),(3))
Gather Motion 384:1  (slice2; segments: 384)  (cost=0.00..1649.70 rows=1000000 width=531) (actual time=473.260..473.260 rows=0 loops=1)
  ->  Hash Join  (cost=0.00..475.17 rows=2605 width=531) (actual time=0.000..474.050 rows=0 loops=1)
"        Hash Cond: ((""Values"".column1)::bigint = t.id)"
"        Extra Text: (seg0)   Hash chain length 1.1 avg, 4 max, using 2368 of 16384 buckets."
"        Extra Text: (seg275) Hash chain length 1.1 avg, 4 max, using 3056 of 16384 buckets."
        ->  Result  (cost=0.00..0.00 rows=1 width=4) (actual time=0.284..0.284 rows=1 loops=1)
              ->  Result  (cost=0.00..0.00 rows=1 width=4) (actual time=0.269..0.269 rows=1 loops=1)
                    ->  GroupAggregate  (cost=0.00..0.00 rows=1 width=4) (actual time=0.205..0.207 rows=3 loops=1)
"                          Group Key: ""Values"".column1"
                          ->  Sort  (cost=0.00..0.00 rows=1 width=4) (actual time=0.192..0.194 rows=3 loops=1)
"                                Sort Key: ""Values"".column1"
                                Sort Method:  quicksort  Memory: 12672kB
"                                ->  Values Scan on ""Values""  (cost=0.00..0.00 rows=1 width=4) (actual time=0.017..0.019 rows=3 loops=1)"
        ->  Hash  (cost=438.68..438.68 rows=2605 width=531) (actual time=430.122..430.122 rows=3368 loops=1)
              ->  Redistribute Motion 384:384  (slice1; segments: 384)  (cost=0.00..438.68 rows=2605 width=531) (actual time=79.233..427.725 rows=3368 loops=1)
                    Hash Key: t.id
                    ->  Seq Scan on t  (cost=0.00..431.78 rows=2605 width=531) (actual time=50.463..53.733 rows=2754 loops=1)
Planning time: 16.008 ms
  (slice0)    Executor memory: 6036K bytes.
"  (slice1)    Executor memory: 6635K bytes avg x 384 workers, 6668K bytes max (seg352)."
"  (slice2)    Executor memory: 4145K bytes avg x 384 workers, 4535K bytes max (seg0).  Work_mem: 1735K bytes max."
Memory used:  524288kB
Optimizer: Pivotal Optimizer (GPORCA)
Execution time: 575.536 ms
Более того, подобный запрос к 100 млрдной табле по списку из 10 ключей создал спилл 30 TB. В моем тесте выше в тбл 1 млн строк, и план, что интересно, на последнем шаге финального слайса содержит rows=1000000 что не имеет место для классического IN фильтра, где уже там же rows=2 :
explain analyze
select * from t where id in (1,2,3)
Gather Motion 384:1  (slice1; segments: 384)  (cost=0.00..431.87 rows=2 width=531) (actual time=97.183..97.183 rows=0 loops=1)
  ->  Seq Scan on t  (cost=0.00..431.87 rows=1 width=531) (actual time=0.000..76.004 rows=0 loops=1)
"        Filter: (id = ANY ('{1,2,3}'::bigint[]))"
Planning time: 9.617 ms
  (slice0)    Executor memory: 5989K bytes.
"  (slice1)    Executor memory: 6635K bytes avg x 384 workers, 6668K bytes max (seg352)."
Memory used:  524288kB
Optimizer: Pivotal Optimizer (GPORCA)
Execution time: 115.799 ms
⁉️Зачем кто-то обвесил тривиальный запрос перламутровыми пуговицами, тратя усилия на лишний код - остается загадкой. Для чего сделана такая реализация в БД, ума не приложу. Подумал сперва, что для больших списков GPORCA считает, что Hash Join с In-memory таблой даст выигрыш в сравнении с перебором каждого тапла по большому списку аля Nested Loop, но тестирование фильтра по набору от 1 000 до в 50 000 ключей гипотезу опровергло - план запроса везде такой же, как и выше, т.е. с фильтром ANY ('{1,2,...50000}'::bigint[])).

Закончилась реставрация фасада Центрального телеграфа на Тверской — к 1 сентября 2026 года будут готовы три этажа, где начнут учиться студенты Центрального университета. Полностью проект завершат к осени 2027 года. По словам ректора Евгения Ивашкевича, кампус в объекте культурного наследия рассчитан на 5000 студентов и преподавателей вуза. Локация для банкстеров знаковая, именно она определила название вуза. Три года назад, во время осмотра здания, президент Т-Технологий Станислав Близнюк предложил заменить в названии «Телеграф» на «Университет» — так и появился бренд. Вуз готовит IT-специалистов и развивает олимпиадное движение в стране и мире. В новом кампусе планируют запустить школу естественных наук.

Может ли SELECT к таблице вызвать Hash Join ?Can a SELECT query against a table cause a Hash Join ?
Anonymous voting

Вопрос 9 Пытаюсь выполнить скрипт, который пересоздает 600 вью в GP ( create or replace view ), при пересоздании 67й получаю ошибку ERROR: cannot drop columns from view. Вью была создана при предыдущем прогоне скрипта, соотв-но в pg_views она есть. Набор полей не менялся После drop view, пересоздается. Кто сталкивался с проблемой? I'm trying to run a script that recreates view 600 in GP (create or replace view). When re-creating view 67, I get the error: ERROR: cannot drop columns from view. The view was created during the previous run of the script, so it's in pg_views. Fields set has not changed After I drop the view, it's re-created. Has anyone encountered this problem?

explain analyze
 SELECT count(*)
   FROM (datamart a
     JOIN ( SELECT b.agreement_rk,
            max(b.version_id) AS version_id
           FROM datamart b
          WHERE (NOT (b.version_id IN ( SELECT version.version_id
                   FROM etl.version
                  WHERE ((version.processed_flg IS NOT TRUE) AND (version.version_id IS NOT NULL)))))
          GROUP BY b.agreement_rk 
         ) c USING (agreement_rk, version_id));
Aggregate  (cost=0.00..3174.35 rows=1 width=8) (actual time=6121.445..6121.446 rows=1 loops=1)
  ->  Gather Motion 384:1  (slice2; segments: 384)  (cost=0.00..3174.35 rows=1 width=8) (actual time=4720.682..6121.174 rows=384 loops=1)
        ->  Aggregate  (cost=0.00..3174.35 rows=1 width=8) (actual time=5100.692..5100.692 rows=1 loops=1)
              ->  Hash Join  (cost=0.00..3174.35 rows=354659 width=1) (actual time=2462.405..4831.502 rows=3552024 loops=1)
                    Hash Cond: ((datamart.agreement_rk = datamart_1.agreement_rk) AND (datamart.version_id = (max(datamart_1.version_id))))
"                    Extra Text: (seg293) Hash chain length 2.0 avg, 10 max, using 420969 of 524288 buckets.Hash chain length 3.4 avg, 15 max, using 250497 of 262144 buckets; total 13 expansions."
""
                    ->  Seq Scan on datamart  (cost=0.00..609.48 rows=886648 width=16) (actual time=0.236..370.840 rows=3562584 loops=1)
                    ->  Hash  (cost=2020.66..2020.66 rows=354659 width=16) (actual time=2461.861..2461.861 rows=856639 loops=1)
                          ->  HashAggregate  (cost=0.00..2020.66 rows=354659 width=16) (actual time=2129.655..2298.390 rows=856639 loops=1)
                                Group Key: datamart_1.agreement_rk
"                                Extra Text: (seg293) Hash chain length 3.4 avg, 15 max, using 250497 of 262144 buckets; total 13 expansions."
""
                                ->  Hash Left Anti Semi (Not-In) Join  (cost=0.00..1974.28 rows=354659 width=16) (actual time=66.666..875.964 rows=3562584 loops=1)
                                      Hash Cond: (datamart_1.version_id = version.version_id)
"                                      Extra Text: (seg310) Hash chain length 1.0 avg, 2 max, using 4683 of 1048576 buckets."
                                      ->  Seq Scan on datamart datamart_1  (cost=0.00..609.48 rows=886648 width=16) (actual time=0.262..371.033 rows=3562584 loops=1)
                                      ->  Hash  (cost=462.34..462.34 rows=2462631 width=8) (actual time=63.438..63.438 rows=4694 loops=1)
                                            ->  Broadcast Motion 384:384  (slice1; segments: 384)  (cost=0.00..462.34 rows=2462631 width=8) (actual time=20.057..62.342 rows=4694 loops=1)
                                                  ->  Seq Scan on version  (cost=0.00..433.19 rows=6414 width=8) (actual time=0.040..1.784 rows=24 loops=1)
                                                        Filter: ((processed_flg IS NOT TRUE) AND (NOT (version_id IS NULL)))
Planning time: 33.320 ms
  (slice0)    Executor memory: 755K bytes.
"  (slice1)    Executor memory: 58K bytes avg x 384 workers, 58K bytes max (seg0)."
"  (slice2)    Executor memory: 129415K bytes avg x 384 workers, 129591K bytes max (seg293).  Work_mem: 33463K bytes max."
Memory used:  524288kB
Optimizer: Pivotal Optimizer (GPORCA)
Execution time: 6158.032 ms

Aggregate  (cost=0.00..3354.41 rows=1 width=8) (actual time=10057.772..10057.772 rows=1 loops=1)
  ->  Gather Motion 384:1  (slice2; segments: 384)  (cost=0.00..3354.41 rows=1 width=8) (actual time=7808.033..10057.358 rows=384 loops=1)
        ->  Aggregate  (cost=0.00..3354.41 rows=1 width=8) (actual time=8246.089..8246.089 rows=1 loops=1)
              ->  Hash Join  (cost=0.00..3354.41 rows=504057 width=1) (actual time=5720.044..8099.520 rows=3552024 loops=1)
                    Hash Cond: ((datamart.agreement_rk = datamart_1.agreement_rk) AND (datamart.version_id = (max(datamart_1.version_id))))
"                    Extra Text: (seg293) Hash chain length 2.0 avg, 10 max, using 420969 of 524288 buckets.Hash chain length 3.4 avg, 15 max, using 250497 of 262144 buckets; total 13 expansions."
""
                    ->  Seq Scan on datamart  (cost=0.00..609.48 rows=886648 width=16) (actual time=0.297..372.338 rows=3562584 loops=1)
                    ->  Hash  (cost=2116.06..2116.06 rows=504057 width=16) (actual time=5718.276..5718.276 rows=856639 loops=1)
                          ->  HashAggregate  (cost=0.00..2116.06 rows=504057 width=16) (actual time=5393.607..5572.408 rows=856639 loops=1)
                                Group Key: datamart_1.agreement_rk
"                                Extra Text: (seg293) Hash chain length 3.4 avg, 15 max, using 250497 of 262144 buckets; total 13 expansions."
""
                                ->  Hash Semi Join  (cost=0.00..2003.55 rows=886648 width=16) (actual time=2383.912..4216.727 rows=3562584 loops=1)
                                      Hash Cond: (datamart_1.version_id = version.version_id)
                                      Extra Text: (seg0)   Initial batch 0:
(seg0)     Wrote 90113K bytes to inner workfile.
(seg0)     Wrote 57826K bytes to outer workfile.
(seg0)   Overflow batches 1..3:
"(seg0)     Read 119367K bytes from inner workfile: 39789K avg x 3 nonempty batches, 59290K max."
(seg0)     Wrote 29254K bytes to inner workfile.
"(seg0)     Read 57826K bytes from outer workfile: 19276K avg x 3 nonempty batches, 41691K max."
"(seg0)   Work file set: 6 files (0 compressed), avg file size 25225898, compression buffer size 0 bytes"
"(seg0)   Hash chain length 1.9 avg, 11 max, using 3226565 of 4194304 buckets."
                                      ->  Seq Scan on datamart datamart_1  (cost=0.00..609.48 rows=886648 width=16) (actual time=0.345..367.694 rows=3562584 loops=1)
                                      ->  Hash  (cost=461.81..461.81 rows=2462631 width=8) (actual time=2372.849..2372.849 rows=6151981 loops=1)
                                            ->  Broadcast Motion 384:384  (slice1; segments: 384)  (cost=0.00..461.81 rows=2462631 width=8) (actual time=17.736..654.410 rows=6151981 loops=1)
                                                  ->  Seq Scan on version  (cost=0.00..432.67 rows=6414 width=8) (actual time=0.012..6.276 rows=16390 loops=1)
                                                        Filter: (processed_flg IS TRUE)
Planning time: 58.635 ms
  (slice0)    Executor memory: 755K bytes.
"  (slice1)    Executor memory: 58K bytes avg x 384 workers, 58K bytes max (seg0)."
"* (slice2)    Executor memory: 182096K bytes avg x 384 workers, 182204K bytes max (seg3).  Work_mem: 93600K bytes max, 192250K bytes wanted."
Memory used:  524288kB
Memory wanted:  577648kB
Optimizer: Pivotal Optimizer (GPORCA)
Execution time: 10102.550 ms