Ganhe tempo automatizando com SQL
por Dickson S. Guedes
Ganhe tempo automatizando com SQL?
por Dickson S. Guedes
Objetivo e regras
SQL como uma linguagem declarativa
VARIAVEL = ‘valor’
psql como uma ferramenta que
entende melhor o SQL
Ganhe tempo automatizando com psql
por Dickson S. Guedes
Sim, foi um clickbait
AGENDA
Nossa Jornada…
Variáveis
Macros
Reuso
Criando “comandos”
format e gexec
Considerações finais
Público alvo:
Iniciante
set sauda ola mundo
echo :sauda
echo :"sauda"
echo :'sauda'
set sauda "ola mundo"
set sauda 'ola mundo'
Variáveis no psql
set sauda select 'ola mundo!';
:sauda
… e se …
?
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?
… 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)'
:ss_film
:ss_film_fields :ff_film
:ss_film_fields, first_name :ff_film :jj_film_actor :jj_actor
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_’
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_’
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'')'
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
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_'''
Podemos simplificar
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and :_ignored_tables
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
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
gexec e format( ) - a combinação perfeita
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
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
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
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
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
# .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
Que mais dá para
fazer?
Hands on?
CURTIU?
SEGUE A GENTE!
…
Ganhando tempo automatizando com SQL

Ganhando tempo automatizando com SQL

  • 1.
    Ganhe tempo automatizandocom SQL por Dickson S. Guedes
  • 2.
    Ganhe tempo automatizandocom SQL? por Dickson S. Guedes
  • 3.
  • 7.
    SQL como umalinguagem declarativa VARIAVEL = ‘valor’
  • 8.
    psql como umaferramenta que entende melhor o SQL
  • 9.
    Ganhe tempo automatizandocom psql por Dickson S. Guedes
  • 10.
    Sim, foi umclickbait
  • 11.
    AGENDA Nossa Jornada… Variáveis Macros Reuso Criando “comandos” formate gexec Considerações finais Público alvo: Iniciante
  • 12.
    set sauda olamundo echo :sauda echo :"sauda" echo :'sauda' set sauda "ola mundo" set sauda 'ola mundo' Variáveis no psql
  • 16.
    set sauda select'ola mundo!'; :sauda … e se … ?
  • 19.
    Dá para fazermacro 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?
  • 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)'
  • 24.
  • 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 * frompg_stat_all_tables where age(now(), :_analyze_mais_recente) > interval ‘10 days’ and :_ignored_tables
  • 35.
    E chegamos aesta 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 aesta 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
  • 38.
    gexec e format() - a combinação perfeita
  • 40.
    Vamos agora desconstruir selectformat( $$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 selectformat( $$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 selectformat( $$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 selectformat( $$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 selectformat( $$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
  • 47.
    Que mais dápara fazer?
  • 48.
  • 49.