SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
PGDay Campinas 2013
PL/pg...ETL – Transformação de dados para DW e BI
usando linguagem procedural
2
Flavio Gurgel
● Líder de projetos especiais da 4Linux
● Consultor e instrutor PostgreSQL
● EnterpriseDB Associate Certificate
● Engenheiro Eletricista pela UFPR
Resuminho ETL
● Extrair - do(s) sistema(s) de origem
● Transformar - filtrar, traduzir, (de)codificar, (pré)calcular,
juntar, concatenar, transpor, separar
● Carregar - em um Data Warehouse
● Integrar!
● BI - Business Inteligence
Processo ETL - Tradicional
Processo ETL - PostgreSQL
Processo ETL – Tudo
Como é possível - FDW
● Foreign Data Wrappers
● Tabelas estrangeiras
● Acessíveis como se fossem locais
– Outros SGBD
– Arquivos
– Web Services
– Etc.
Como é possível – PL/pgSQL
● Linguagem procedural padrão do PostgreSQL
● Estende a linguagem SQL com estruturas de controle
● Pode fazer computação complexa
● Herda tipos, operadores e funções
● "Acreditada" - usuários fazem apenas o que lhes é
permitido
● É fácil de usar
Por que fazer ETL via PL/pgSQL?
● Desempenho
● Reduzir número de viagens pela rede
● Eliminar viagens de dados desnecessários
● Aproveitar recursos do PostgreSQL
● Funções avançadas internas
● Rede de extensões PGXN
● Outras PL
● Aproveitar conhecimento dos DBAs
Quando evitar
● Desconhecimento de SQL
● DBA não conhece estratégias DW
● O destino dos dados não é PostgreSQL
● FDW que escreve já disponível
● Normativos
● que podem ser revisados
FDW - Instalar
● Instalar o driver desejado
● Gerenciador de pacotes
● Contrib
● PGXN - http://pgxn.org/tag/fdw/
FDW – Exemplos de extensões
● Conectado ao banco desejado:
CREATE EXTENSION oracle_fdw;
CREATE EXTENSION postgres_fdw;
CREATE EXTENSION file_fdw;
FDW – Conectar aos servidores
CREATE SERVER ora123 FOREIGN DATA WRAPPER oracle_fdw
OPTIONS ('//192.168.0.1/meuoracle');
CREATE SERVER postgres_prod FOREIGN DATA WRAPPER
postgres_fdw OPTIONS (host '192.168.0.2' dbname
'prod');
CREATE SERVER csv_do_ze FOREIGN DATA WRAPPER file_fdw;
FDW – Mapear usuários
CREATE USER MAPPING FOR flavio SERVER postgres_prod
OPTIONS (user 'flavio', password '123456');
FDW – Conectar à tabela estrangeira
CREATE FOREIGN TABLE est.pedidos (
id bigint NOT NULL,
data date NOT NULL,
cliente bigint NOT NULL,
valor float
) SERVER postgres_prod;
FDW – Conectar a um arquivo CSV
CREATE FOREIGN TABLE est.tabelao_do_ze (
setor BIGINT;
vendas FLOAT;
) SERVER csv_do_ze OPTIONS ( filename
'/home/ze/tabelao.csv', format 'csv' );
Exemplo de esquemas
● est - onde as tabelas estrangeiras estão
● dw - onde serão armazenados os dados
de BI
Exemplo: Tabela -> Tabela
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
BEGIN
INSERT INTO dw.tabela SELECT colA, colB, colC FROM est.tabela;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Exemplo: 2 Tabelas -> Tabela com laço
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
resultado RECORD;
soma FLOAT;
BEGIN
FOR resultado IN SELECT id, nome FROM est.tabelaA LOOP
SELECT sum(valor) INTO soma FROM est.tabelaB WHERE id = resultado.id;
INSERT INTO dw.tabela VALUES (resultado.id, resultado.nome, soma);
END LOOP;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Exemplo: juntar sempre que possível
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
BEGIN
INSERT INTO dw.tabela
SELECT a.id, a.nome, sum(b.valor) as total
FROM est.tabelaA a
INNER JOIN est.tabelaB b ON b.id=a.id GROUP BY 1, 2;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Exemplo: Funcionalidades PostgreSQL
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
BEGIN
INSERT INTO dw.tabela SELECT
a.id,
a.nome,
left(a.nome, 1) as inicial,
CASE WHEN b.regiao = 1 THEN 'Sudeste', WHEN b.regiao = 2 THEN 'Sul' END as regiao,
EXTRACT(QUARTER from b.data) as trimestre,
sum(b.valor) as total,
avg(b.valor) as media
FROM est.tabelaA a INNER JOIN est.tabelaB b ON b.id=a.id GROUP BY 1, 2;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Exemplo: Transposição de tabelas
●
Original: tabela est.tabelaA
nome valor
João 100
Maria 200
José 150
Destino: tabela dw.salarios
João Maria José
100 200 150
Exemplo: Transposição
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
resultado RECORD;
montado1 TEXT;
montado2 TEXT;
BEGIN
montado1 := 'CREATE TABLE dw.salarios (';
montado2 := 'INSERT INTO dw.salarios VALUES (';
FOR resultado IN SELECT nome, valor FROM est.tabelaA LOOP
montado1 := montado1 || ''' || resultado.nome || ''' || ', ';
montado2 := montado2 || resultado.valor::text || ', ';
END LOOP;
montado1 := left (montado1, length(montado1) - 2) || ');';
montado2 := left (montado2, length(montado2) - 2) || ');';
PERFORM montado1;
PERFORM montado2;
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Exemplo: Avisos
CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS
$BODY$
DECLARE
BEGIN
RAISE NOTICE 'Iniciando carga da tabela';
INSERT INTO dw.tabela SELECT colA, colB, colC FROM est.tabela;
RAISE NOTICE 'Fim da carga da tabela';
RETURN true;
END;
$BODY$
LANGUAGE plpgsql;
Como disparar as transformações
● Manualmente:
SELECT dw.carrega();
● Automárico:
● cron
● PgAgent
Cardinalidade
● Entender 1:1, 1:n, n:n
● Os volumes serão grandes
● Selecionar sempre o menor subconjunto
possível
Cardinalidade – Tabela vendedores
id nome
1 João
2 Maria
3 Huguinho
4 Zezinho
Cardinalidade – Tabela salarios
id departamento salario
1 Vendas 1000
2 Vendas 1500
3 Vendas 1200
4 Vendas 1300
5 Produção 1150
6 Produção 1400
7 Produção 1300
8 Produção 1000
Cardinalidade - Consultas
● Funciona:
SELECT sum(b.salario) as folha
FROM vendedores a
INNER JOIN salarios b ON b.id=a.id;
● Melhor
SELECT sum(b.salario) as folha
FROM vendedores a
INNER JOIN salarios b ON b.id=a.id
WHERE departamento = 'Vendas';
Conclusão
● A estratégia é poderosa
● Já implementada com sucesso
● Centralização no DBA
● Com integração de times
● Desempenho
● Com as milhares de vantagens PostgreSQL
31
Obrigado!
● O nome mais forte em integração Open Source no Brasil
● O maior case Open Source em missão crítica: Caixa Econômica Federal
● Mais de 50.000 alunos treinados
● Mais de 10 anos apenas com Open Source
● Equipe multidisciplinar: analistas de negócios, programadores, arquitetos,
sysadmins e gerentes de projetos.
● Quando pega um desafio, sai do outro lado
● Parceira Red Hat, Zend, Puppetlabs, EnterpriseDB
● Orientada a padrões abertos e melhores práticas
● flavio@4linux.com.br
● 4Linux

Más contenido relacionado

La actualidad más candente

User Interface (in portuguese)
User Interface (in portuguese)User Interface (in portuguese)
User Interface (in portuguese)
Bruno Pedro
 

La actualidad más candente (18)

User Interface (in portuguese)
User Interface (in portuguese)User Interface (in portuguese)
User Interface (in portuguese)
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
 
Usando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpUsando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para php
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1
 
Acesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBCAcesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBC
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
Desenvolvimento de sistemas web com PHP Frameworks - Aula 4
Desenvolvimento de sistemas web com PHP Frameworks - Aula 4Desenvolvimento de sistemas web com PHP Frameworks - Aula 4
Desenvolvimento de sistemas web com PHP Frameworks - Aula 4
 
Php05
Php05Php05
Php05
 
PHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesPHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e Sessoes
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas Condicionais
 
PHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e QuerystringPHP Aula 06 - Include, Require e Querystring
PHP Aula 06 - Include, Require e Querystring
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 

Destacado

Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQL
Alpaca
 
PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlibPGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas
 
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
PGDay Campinas
 

Destacado (20)

EXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLEXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQL
 
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textualPGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
PGDay Campinas 2013 - Como Full Text Search pode ajudar na busca textual
 
PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords Safely
 
PgBouncer: Pool, Segurança e Disaster Recovery | Felipe Pereira
PgBouncer: Pool, Segurança e Disaster Recovery | Felipe PereiraPgBouncer: Pool, Segurança e Disaster Recovery | Felipe Pereira
PgBouncer: Pool, Segurança e Disaster Recovery | Felipe Pereira
 
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di CiurcioDevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
 
Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQL
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
 
PGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBAPGAnalytics - Facilitando sua vida do DBA
PGAnalytics - Facilitando sua vida do DBA
 
Pgday campinas 2015
Pgday campinas 2015Pgday campinas 2015
Pgday campinas 2015
 
Gerenciamento de Backup e Recovery com o Barman
Gerenciamento de Backup e Recovery com o BarmanGerenciamento de Backup e Recovery com o Barman
Gerenciamento de Backup e Recovery com o Barman
 
Jaime Casanova - Domando a la bestia Replicación
Jaime Casanova - Domando a la bestia ReplicaciónJaime Casanova - Domando a la bestia Replicación
Jaime Casanova - Domando a la bestia Replicación
 
PGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlibPGDay Campinas 2013 - Mineração de Dados com MADlib
PGDay Campinas 2013 - Mineração de Dados com MADlib
 
PGDay Campinas 2013 - Window Function e CTE – Surpreendente
PGDay Campinas 2013 - Window Function e CTE – SurpreendentePGDay Campinas 2013 - Window Function e CTE – Surpreendente
PGDay Campinas 2013 - Window Function e CTE – Surpreendente
 
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
 
Palestra Diogo Rubert - PGDAY Campinas 2015
Palestra Diogo Rubert - PGDAY Campinas 2015Palestra Diogo Rubert - PGDAY Campinas 2015
Palestra Diogo Rubert - PGDAY Campinas 2015
 
pgDay Campinas – 2015
pgDay Campinas – 2015pgDay Campinas – 2015
pgDay Campinas – 2015
 
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
CASE: O PostgreSQL em BI: Milhares de operações diárias consolidadas em "near...
 
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
PGDay Campinas 2013 - Implementando o PostgreSQL de maneira escalável e com a...
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
 

Similar a PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando linguagem procedural

Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A ObjetosSap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Marcelo Ramos
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
Pablo Dall'Oglio
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Impacta Eventos
 
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptxintroduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
SaraR49
 

Similar a PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando linguagem procedural (20)

Minicurso PostgreSQL
Minicurso PostgreSQLMinicurso PostgreSQL
Minicurso PostgreSQL
 
Aula1
Aula1Aula1
Aula1
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQL
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Stored Procedures com PostgreSQL: porque usar.
Stored Procedures com PostgreSQL:  porque usar.Stored Procedures com PostgreSQL:  porque usar.
Stored Procedures com PostgreSQL: porque usar.
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
 
Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1
 
Bread board
Bread boardBread board
Bread board
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A ObjetosSap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
 
Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptxintroduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
 
Smarty Template Engine
Smarty Template EngineSmarty Template Engine
Smarty Template Engine
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 

PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando linguagem procedural

  • 1. PGDay Campinas 2013 PL/pg...ETL – Transformação de dados para DW e BI usando linguagem procedural
  • 2. 2 Flavio Gurgel ● Líder de projetos especiais da 4Linux ● Consultor e instrutor PostgreSQL ● EnterpriseDB Associate Certificate ● Engenheiro Eletricista pela UFPR
  • 3. Resuminho ETL ● Extrair - do(s) sistema(s) de origem ● Transformar - filtrar, traduzir, (de)codificar, (pré)calcular, juntar, concatenar, transpor, separar ● Carregar - em um Data Warehouse ● Integrar! ● BI - Business Inteligence
  • 4. Processo ETL - Tradicional
  • 5. Processo ETL - PostgreSQL
  • 7. Como é possível - FDW ● Foreign Data Wrappers ● Tabelas estrangeiras ● Acessíveis como se fossem locais – Outros SGBD – Arquivos – Web Services – Etc.
  • 8. Como é possível – PL/pgSQL ● Linguagem procedural padrão do PostgreSQL ● Estende a linguagem SQL com estruturas de controle ● Pode fazer computação complexa ● Herda tipos, operadores e funções ● "Acreditada" - usuários fazem apenas o que lhes é permitido ● É fácil de usar
  • 9. Por que fazer ETL via PL/pgSQL? ● Desempenho ● Reduzir número de viagens pela rede ● Eliminar viagens de dados desnecessários ● Aproveitar recursos do PostgreSQL ● Funções avançadas internas ● Rede de extensões PGXN ● Outras PL ● Aproveitar conhecimento dos DBAs
  • 10. Quando evitar ● Desconhecimento de SQL ● DBA não conhece estratégias DW ● O destino dos dados não é PostgreSQL ● FDW que escreve já disponível ● Normativos ● que podem ser revisados
  • 11. FDW - Instalar ● Instalar o driver desejado ● Gerenciador de pacotes ● Contrib ● PGXN - http://pgxn.org/tag/fdw/
  • 12. FDW – Exemplos de extensões ● Conectado ao banco desejado: CREATE EXTENSION oracle_fdw; CREATE EXTENSION postgres_fdw; CREATE EXTENSION file_fdw;
  • 13. FDW – Conectar aos servidores CREATE SERVER ora123 FOREIGN DATA WRAPPER oracle_fdw OPTIONS ('//192.168.0.1/meuoracle'); CREATE SERVER postgres_prod FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.0.2' dbname 'prod'); CREATE SERVER csv_do_ze FOREIGN DATA WRAPPER file_fdw;
  • 14. FDW – Mapear usuários CREATE USER MAPPING FOR flavio SERVER postgres_prod OPTIONS (user 'flavio', password '123456');
  • 15. FDW – Conectar à tabela estrangeira CREATE FOREIGN TABLE est.pedidos ( id bigint NOT NULL, data date NOT NULL, cliente bigint NOT NULL, valor float ) SERVER postgres_prod;
  • 16. FDW – Conectar a um arquivo CSV CREATE FOREIGN TABLE est.tabelao_do_ze ( setor BIGINT; vendas FLOAT; ) SERVER csv_do_ze OPTIONS ( filename '/home/ze/tabelao.csv', format 'csv' );
  • 17. Exemplo de esquemas ● est - onde as tabelas estrangeiras estão ● dw - onde serão armazenados os dados de BI
  • 18. Exemplo: Tabela -> Tabela CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE BEGIN INSERT INTO dw.tabela SELECT colA, colB, colC FROM est.tabela; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 19. Exemplo: 2 Tabelas -> Tabela com laço CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE resultado RECORD; soma FLOAT; BEGIN FOR resultado IN SELECT id, nome FROM est.tabelaA LOOP SELECT sum(valor) INTO soma FROM est.tabelaB WHERE id = resultado.id; INSERT INTO dw.tabela VALUES (resultado.id, resultado.nome, soma); END LOOP; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 20. Exemplo: juntar sempre que possível CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE BEGIN INSERT INTO dw.tabela SELECT a.id, a.nome, sum(b.valor) as total FROM est.tabelaA a INNER JOIN est.tabelaB b ON b.id=a.id GROUP BY 1, 2; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 21. Exemplo: Funcionalidades PostgreSQL CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE BEGIN INSERT INTO dw.tabela SELECT a.id, a.nome, left(a.nome, 1) as inicial, CASE WHEN b.regiao = 1 THEN 'Sudeste', WHEN b.regiao = 2 THEN 'Sul' END as regiao, EXTRACT(QUARTER from b.data) as trimestre, sum(b.valor) as total, avg(b.valor) as media FROM est.tabelaA a INNER JOIN est.tabelaB b ON b.id=a.id GROUP BY 1, 2; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 22. Exemplo: Transposição de tabelas ● Original: tabela est.tabelaA nome valor João 100 Maria 200 José 150 Destino: tabela dw.salarios João Maria José 100 200 150
  • 23. Exemplo: Transposição CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE resultado RECORD; montado1 TEXT; montado2 TEXT; BEGIN montado1 := 'CREATE TABLE dw.salarios ('; montado2 := 'INSERT INTO dw.salarios VALUES ('; FOR resultado IN SELECT nome, valor FROM est.tabelaA LOOP montado1 := montado1 || ''' || resultado.nome || ''' || ', '; montado2 := montado2 || resultado.valor::text || ', '; END LOOP; montado1 := left (montado1, length(montado1) - 2) || ');'; montado2 := left (montado2, length(montado2) - 2) || ');'; PERFORM montado1; PERFORM montado2; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 24. Exemplo: Avisos CREATE OR REPLACE FUNCTION dw.carrega() RETURNS boolean AS $BODY$ DECLARE BEGIN RAISE NOTICE 'Iniciando carga da tabela'; INSERT INTO dw.tabela SELECT colA, colB, colC FROM est.tabela; RAISE NOTICE 'Fim da carga da tabela'; RETURN true; END; $BODY$ LANGUAGE plpgsql;
  • 25. Como disparar as transformações ● Manualmente: SELECT dw.carrega(); ● Automárico: ● cron ● PgAgent
  • 26. Cardinalidade ● Entender 1:1, 1:n, n:n ● Os volumes serão grandes ● Selecionar sempre o menor subconjunto possível
  • 27. Cardinalidade – Tabela vendedores id nome 1 João 2 Maria 3 Huguinho 4 Zezinho
  • 28. Cardinalidade – Tabela salarios id departamento salario 1 Vendas 1000 2 Vendas 1500 3 Vendas 1200 4 Vendas 1300 5 Produção 1150 6 Produção 1400 7 Produção 1300 8 Produção 1000
  • 29. Cardinalidade - Consultas ● Funciona: SELECT sum(b.salario) as folha FROM vendedores a INNER JOIN salarios b ON b.id=a.id; ● Melhor SELECT sum(b.salario) as folha FROM vendedores a INNER JOIN salarios b ON b.id=a.id WHERE departamento = 'Vendas';
  • 30. Conclusão ● A estratégia é poderosa ● Já implementada com sucesso ● Centralização no DBA ● Com integração de times ● Desempenho ● Com as milhares de vantagens PostgreSQL
  • 31. 31 Obrigado! ● O nome mais forte em integração Open Source no Brasil ● O maior case Open Source em missão crítica: Caixa Econômica Federal ● Mais de 50.000 alunos treinados ● Mais de 10 anos apenas com Open Source ● Equipe multidisciplinar: analistas de negócios, programadores, arquitetos, sysadmins e gerentes de projetos. ● Quando pega um desafio, sai do outro lado ● Parceira Red Hat, Zend, Puppetlabs, EnterpriseDB ● Orientada a padrões abertos e melhores práticas ● flavio@4linux.com.br ● 4Linux