Palestra ministrada na PGConf.Brasil 2022.
A linguagem SQL possui recursos que podem ser utilizados em benefício da nossa preguiça para que possamos automatizar boa parte de algumas tarefas. O forte está na geração de texto e execuções de consultas dinamicamente geradas. Passearemos por alguns exemplos com dicas, casos de usos e um pouco de código, porque ninguém é de ferro.
19. Dá para fazer macro no psql?
set top101 select * from pg_stat_activity order by 17, 13 desc limit 10;
set top102 "select * from pg_stat_activity order by 17, 13 desc limit 10;"
set top103 'select * from pg_stat_activity order by 17, 13 desc limit 10;'
Quais dos 3 acima funcionarão?
20.
21.
22.
23. … e se …
set ss_film 'select * from film'
set ss_film_fields 'select title, description'
set ff_film ' from film'
set jj_film_actor ' join film_actor using (film_id)'
set jj_actor ' join actor using (actor_id)'
29. Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
coalesce(
last_autoanalyze,
last_analyze,
now() - interval ‘1 year’)) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
30. Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
coalesce(
last_autoanalyze,
last_analyze,
now() - interval ‘1 year’))> interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
31. Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
set _analyze_mais_recente 'coalesce(last_autoanalyze, last_analyze, now() - interval ''1 year'')'
32. Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
33. Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and :_ignored_tables
set _ignored_tables 'relname !~ ''^pg_toast_|sql_'''
34. Podemos simplificar
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and :_ignored_tables
35. E chegamos a esta simplificação
ss_mant_tabelas_analisadas_ha_mais_de_10_dias
E podemos fazer isto …
with dados as (
:ss_mant_tabelas_analisadas_ha_mais_de_10_dias
)
select format('ANALYZE %I', relname) from dados gexec
36. E chegamos a esta simplificação
ss_mant_tabelas_analisadas_ha_mais_de_10_dias
E podemos fazer isto …
with dados as (
:ss_mant_tabelas_analisadas_ha_mais_de_10_dias
)
select format('ANALYZE %I', relname) from dados gexec
40. Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
41. Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
42. Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
43. Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
44. Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
45. # .psqlrc
… corte …
echo 'gerando extended_commands.sql'
t on
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
t off
ir extended_commands.sql