PGDay Ceará 2013
16 de Abril de 2013, 0:00 - sem comentários aindaEste artigo foi escrito por telles
No dia 3 de maio estarei participando do PGDay Ceará, no Centro Universitário Christus. Estarei presente com duas palestras e teremos também a presença do Nabucodonosor Coutinho, Marx Haron Gomes Barbosa e Cláudio Leopoldino. Vai ser o primeiro evento que eu participo no Ceará então estou bem animado. Já estou preparando o material aqui e você já pode conferir a grade do evento
O artigo PGDay Ceará 2013 apareceu primeiro em Savepoint.
Movendo objetos no Postgres
12 de Abril de 2013, 0:00 - sem comentários aindaEste artigo foi escrito por telles
Quando você cria um objeto seja ele uma tabela, visão, função, etc, a não ser que você especifique o contrário, ele vai ser criado no esquema ‘public’, no tablespace ‘pg_default’ e o dono do objeto será o ‘postgres’. Dependendo da aplicação, não há nenhum problema nisso. Sério, existem aplicações que funcionam muito bem com este arranjo padrão. Mas você pode querer organizar melhor os seus objetos em diferentes esquemas, pode querer melhorar a segurança e criar donos diferentes para os objetos e pode também querer armazenar seus objetos em discos ou partições diferentes.
Note no padrão ISO esquema e dono de objeto se confundem. Isto pode ou não ocorrer no PostgreSQL dependendo de como você organizar as coisas. Note que por padrão, a variável ‘search_path’ sempre aponta para ‘$user’, public’. Ou seja, se você criar um esquema com o nome de um usuário, os objetos vão ser sempre procurados neste esquema em primeiro lugar. Se não achar lá, vai procurar no esquema public.
Bom, por algum motivo você resolveu mudar as coisas… você pode se surpreender como é simples mudar um único objeto de lugar. Imagine uma tabela ‘foo’, uma sequência ‘foo_seq’ e uma visão ‘foo_vw’ que vão ser migrados para o esquema ‘bar’, usuário ‘bar’ e tablespace ‘novo_tablespace’:
-
Para mudar um objeto de esquema, basta utilizar o SET SCHEMA:
ALTER TABLE foo SET SCHEMA bar; ALTER SEQUENCE foo_set SET SCHEMA bar; ALTER VIEW foo_vw SET SCHEMA bar;
-
Para mudar o dono de um objeto, basta utilizar o OWNER TO
ALTER TABLE foo OWNER TO bar; ALTER SEQUENCE foo_seq OWNER TO bar; ALTER VIEW foo_vw OWNER TO bar;
- Para mudar o tablespace de um objeto (no caso só se aplica para tabelas e índices, pois os demais objetos são armazenados apenas no catálogo):
ALTER TABLE foo SET TABLESPACE novo_tablespace; ALTER INDEX foo_idx SET TABLESPACE novo_tablespace;
Automatizando
Claro que se você quiser migrar um conjunto enorme de objetos, você vai querer automatizar um pouco este trabalho. Aqui vou demonstrar apenas um exemplo de migração de tabelas, sequências, visões e funções para um novo esquema. Você pode migrar outros objetos como tipos, domínios, agregações, extensões, tabelas externas, operadores e outros bichos avançados do Postgres. Aqui eu coloquei apenas os objetos mais utilizados para não complicar:
-- Script para mover tabelas, sequências, visões e funções do esquema 'PUBLIC' para o esquema 'bar' -- Cria o esquema novo CREATE SCHEMA AUTHORIZATION abizi; -- Os comandos \t e \o são interpretados apenas pelo psql. -- São utilizados para exportar o resultado das consultas abaixo \t \o move.sql SELECT 'ALTER TABLE ' || table_schema || '.' || table_name || ' SET SCHEMA bar;' FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name; SELECT 'ALTER SEQUENCE ' || sequence_schema || '.' || sequence_name || ' SET SCHEMA bar;' FROM information_schema.sequences WHERE sequence_schema = 'public' ORDER BY sequence_name; SELECT 'ALTER VIEW ' || table_schema || '.' || table_name || ' SET SCHEMA bar;' FROM information_schema.views WHERE table_schema = 'public' ORDER BY table_name; SELECT 'ALTER FUNCTION ' || n.nspname || '.' || p.proname || ' (' || pg_catalog.pg_get_function_arguments(p.oid) || ') SET SCHEMA bar;' FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = 'public' ORDER BY p.proname; \o \t -- O comando \i é interpretado pelo psql apenas. -- Ele é utilizado para executar o script indicado. \i move.sql
Navegando pelo psql
Os usuários do pgAdmin III muitas vezes ficam perdidos ao utilizarem o psql. Na verdade é mais fácil e rápido do que parece. Utilize os comandos \dn para ver os esquemas existentes na sua base, o \dp para ver as permissões nos objetos e o \db para ver os tablespaces.
Cuidado ao mover objetos grandes para um novo tablespace
Uma observação importante é que ao alterar o esquema e o dono de um objeto, apenas o registro no catálogo do sistema é alterado (mais especificamente na pg_catalog.pg_class). Então esta alteração é bem rápida. Para alterar o tablespace, além de alterar o catálogo, o postgres ainda tem de copiar o objeto fisicamente para o novo tablespace. Então, um objeto grande pode levar um bom tempo para mover.
O artigo Movendo objetos no Postgres apareceu primeiro em Savepoint.
LIMIT e OFFSET no Oracle
9 de Abril de 2013, 0:00 - sem comentários aindaEste artigo foi escrito por telles
Outra coisa pentelha no Oracle, fazer paginação de registros.
Vamos ver 2 métodos aqui. O primeiro é o definido pelo mago do Oracle, o Tom Kyte, do Ask Tom:
SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM tabela_enorme ORDER BY campo_indexado ) a WHERE ROWNUM <= 61200 ) WHERE rnum >= 61000 ; ... ... ... Decorrido: 00:00:31.39
Agora outro método utilizando algo que eu realmente adoro, Window Functions:
SELECT * FROM (SELECT row_number() OVER (ORDER BY campo_indexado) myrow, p.* FROM tabela_enorme) WHERE myrow BETWEEN 91000 AND 91200; ... ... ... Decorrido: 00:00:29.34
Ou seja, utilizando Window Functions você tem uma sintaxe mais elegante e compacta e ainda ganha no desempenho. Para variar, a solução mais simples é a melhor.
Claro… eu ainda espero que alguém na Oracle tenha o bom senso de implementar o LIMIT e OFFSET, assim como uma infinidade de outras coisas que tornam a vida do desenvolvedor mais simples.
O artigo LIMIT e OFFSET no Oracle apareceu primeiro em Savepoint.
Oracle Q-quoting
9 de Abril de 2013, 0:00 - sem comentários aindaEste artigo foi escrito por telles
Sim, eu adoro o dollar-quoting do Postgres. Mas é verdade que o Oracle também tem algo similar, o q-quoting. Funciona de forma parecida… o q + aspas simples + uma string de abertura e outra de fechamento. Então você pode usar algo como q’$ sua string $’. Você pode trocar o $ por qualquer outra. Vale a pena lembrar que se a sua string tiver algo como $’ ou ‘$, aí vai tudo para o brejo…
SQL> CREATE TABLE teste(abizi varchar(1024)); Tabela criada. SQL> INSERT INTO teste VALUES ( q'$teste com McDonald's, Joana D'arc "citação", 'apóstrofes', ~ $ $$ % %% '' ' $'); 1 linha criada. SQL> SELECT * FROM TESTE; ABIZI ---------------------------------------------------------------------------------------------------------------------------------- teste com McDonald's, Joana D'arc "citação", 'apóstrofes', ~ $ $$ % %% '' ' SQL> DROP TABLE teste; Tabela eliminada.
É isso, só para eu não esquecer novamente.
O artigo Oracle Q-quoting apareceu primeiro em Savepoint.
PostgreSQL 9.3: o que vem por aí
12 de Março de 2013, 0:00 - sem comentários aindaEste artigo foi escrito por telles
Bom, a lista de novas funcionalidades do 9.3 ainda não está completamente fechada. Ainda tem alguns patchs que podem entrar. Mas já temos uma boa lista para a série “waiting for 9.3″, tradicionalmente escrita pelo Depez. Então este post é para falar de um post que fala sobre outros posts… segue o link de uma compilação de artigos sobre as novas funcionalidades…
PostgreSQL 9.3: feature preview articles
Vale à pena começar a testar algumas coisas. Em breve teremos o primeiro alpha release. Aguardem.
O artigo PostgreSQL 9.3: o que vem por aí apareceu primeiro em Savepoint.