
                  Perguntas Frequentes (FAQ) sobre PostgreSQL
                                       
   ltima atualizao: Sex Nov 16 10:53:50 EST 2007
   
   Mantenedor atual: Bruce Momjian (bruce@momjian.us)
   
   Traduzido por: Euler Taveira de Oliveira (euler@timbira.com)
   
   A verso mais recente desse documento pode ser vista em
   http://www.postgresql.org/files/documentation/faqs/FAQ.html (EN).
   http://www.postgresql.org/files/documentation/faqs/FAQ_brazilian.html
   (pt_BR).
   
   Perguntas sobre plataformas especficas so respondidas em
   http://www.postgresql.org/docs/faq/.
     _________________________________________________________________
   
                              Perguntas Gerais
                                      
   1.1) O que  PostgreSQL? Como ele  pronunciado? O que  Postgres?
   1.2) Quem controla o PostgreSQL?
   1.3) Qual  a licena do PostgreSQL?
   1.4) Quais plataformas o PostgreSQL pode ser executado?
   1.5) Onde eu posso conseguir o PostgreSQL?
   1.6) Qual  a ltima verso?
   1.7) Onde eu posso conseguir suporte?
   1.8) Como eu posso submeter um relato de um bug?
   1.9) Como eu posso saber quais so os bugs conhecidos ou
   caractersticas ausentes?
   1.10) Que documentao est disponvel?
   1.11) Como eu posso aprender SQL?
   1.12) Como posso submeter uma correo (patch) ou me juntar a equipe
   de desenvolvimento?
   1.13) Como  o PostgreSQL comparado a outros SGBDs?
   1.14) O PostgreSQL gerenciar as mudanas de horrio devido ao horrio
   de vero em vrios pases?
   
                          Perguntas sobre Clientes
                                      
   2.1) Quais interfaces esto disponveis para PostgreSQL?
   2.2) Quais ferramentas esto disponveis para utilizar o PostgreSQL
   com pginas Web?
   2.3) O PostgreSQL tem interfaces grficas para interagir com usurio?
   
                         Perguntas Administrativas
                                      
   3.1) Como eu instalo o PostgreSQL em um local diferente de
   /usr/local/pgsql?
   3.2) Como eu controlo conexes de outras mquinas?
   3.3) Como eu ajusto o servidor de banco de dados para obter uma
   performance melhor?
   3.4) Quais caractersticas de depurao esto disponveis?
   3.5) Por que eu recebo "Sorry, too many clients" quando eu tento
   conectar?
   3.6) Qual  o processo de atualizao do PostgreSQL?
   3.7) Que tipo de hardware eu devo usar?
   
                           Perguntas Operacionais
                                      
   4.1) Como eu fao um SELECT somente dos primeiros registros de uma
   consulta? Um registro randmico?
   4.2) Como eu descubro quais tabelas, ndices, bancos de dados e
   usurios esto definidos? Como eu vejo as consultas utilizadas pelo
   psql para mostr-los?
   4.3) Como voc muda o tipo de dado de uma coluna?
   4.4) Qual  o tamanho mximo de um registro, uma tabela e um banco de
   dados?
   4.5) Quanto espao em disco  necessrio para armazenar dados de um
   arquivo texto?
   4.6) Por que minhas consultas esto lentas? Por que elas no esto
   utilizando meus ndices?
   4.7) Como eu vejo como o otimizador de consultas est avaliando minha
   consulta?
   4.8) Como eu fao buscas com expresses regulares e buscas com
   expresses regulares sem diferenciar mausculas de minsculas? Como eu
   utilizo um ndice para buscas sem distinguir maisculas de minsculas?
   4.9) Em uma consulta, como eu detecto se um campo  NULL? Como eu
   posso concatenar possveis NULLs? Como eu posso ordenar por um campo
   que  NULL ou no?
   4.10) Qual  a diferena entre os vrios tipos de dado de caracteres?
   4.11.1) Como eu crio um campo serial/auto incremento?
   4.11.2) Como eu consigo o valor de um campo SERIAL?
   4.11.3) currval() no lida com condio de corrida com outros
   usurios?
   4.11.4) Por que os nmeros da minha sequncia no so reutilizados
   quando uma transao  abortada? Por que h intervalos nos nmeros da
   minha sequncia/coluna SERIAL?
   4.12) O que  um OID? O que  um CTID?
   4.13) Por que eu recebo o erro "ERROR: Memory exhausted in
   AllocSetAlloc()"?
   4.14) Como eu informo qual verso do PostgreSQL eu estou utilizando?
   4.15) Como eu crio uma coluna que conter por padro a hora atual?
   4.16) Como eu fao uma juno externa (outer join)?
   4.17) Como eu fao consultas utilizando mltiplos bancos de dados?
   4.18) Como eu retorno mltiplos registros ou colunas de uma funo?
   4.19) Por que eu obtenho erros "relation with OID ###### does not
   exist" ao acessar tabelas temporrias em funes PL/PgSQL?
   4.20) Quais solues de replicao esto disponveis?
   4.21) Por que os nomes de minhas tabelas e colunas no so
   reconhecidos em minha consulta? Por que as maisculas no so
   preservadas?
     _________________________________________________________________
   
                              Perguntas Gerais
                                      
  1.1) O que  PostgreSQL? Como ele  pronunciado? O que  Postgres?
  
   PostgreSQL  pronunciado Post-Gres-Q-L. (Para os curiosos que querem
   saber como se diz "PostgreSQL", um arquivo de udio est disponvel).
   
   O PostgreSQL  um sistema de banco de dados objeto-relacional que tem
   as caractersticas de sistemas de bancos de dados comerciais
   tradicionais com melhoramentos encontrados nos sistemas SGBDs de
   prxima gerao. PostgreSQL  livre e o cdigo-fonte completo est
   disponvel.
   
   O desenvolvimento do PostgreSQL  feito por um grupo de
   desenvolvedores voluntrios (na sua maioria) espalhados pelo mundo e
   que se comunicam via Internet.  um projeto da comunidade e no 
   controlado por nenhuma empresa. Para se envolver, veja a FAQ do
   desenvolvedor em http://www.postgresql.org/docs/faqs.FAQ_DEV.html
   
   Postgres  um apelido para o PostgreSQL amplamente utilizado. Era o
   nome original do projeto em Berkeley e dentre os outros apelidos  o
   preferido. Se voc acha 'PostgreSQL' difcil de pronunciar, diga
   apenas 'Postgres'.
   
  1.2) Quem controla o PostgreSQL?
  
   Se voc est procurando por um mantenedor, comit central ou empresa
   controladora do PostgreSQL, desista --- no h um(a). Ns temos um
   comit core e committers CVS, mas estes grupos so mais para questes
   administrativas do que controle. O projeto  direcionado pela
   comunidade de desenvolvedores e usurios, que qualquer um pode se
   juntar. Tudo o que voc precisa  se inscrever nas listas de discusso
   e participar das discusses. Veja a FAQ do desenvolvedor para obter
   informaes como se envolver com o desenvolvimento do PostgreSQL.
   
  1.3) Qual  a licena do PostgreSQL?
  
   O PostgreSQL  distribudo sob a licena BSD clssica. Basicamente,
   ela permite que usurios faam qualquer coisa com o cdigo, incluindo
   revender os binrios sem o cdigo-fonte. A nica restrio  que voc
   no nos responsabilize legalmente por problemas com o programa de
   computador. H tambm a exigncia de que esta licena aparea em todas
   as cpias do programa de computador. Aqui est a licena BSD que
   usamos atualmente:
   
   PostgreSQL est sujeito a seguinte licena:
   
   PostgreSQL Data Base Management System
   
   Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
   Portions Copyright (c) 1994-1996 Regents of the University of
   California
   
   Permission to use, copy, modify, and distribute this software and its
   documentation for any purpose, without fee, and without a written
   agreement is hereby granted, provided that the above copyright notice
   and this paragraph and the following two paragraphs appear in all
   copies.
   
   IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
   FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
   INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
   ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   
   THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
   PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
   CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
   UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
   
  1.4) Quais plataformas o PostgreSQL pode ser executado?
  
   Em geral, qualquer plataforma moderna compatvel com Unix deve ser
   capaz de executar o PostgreSQL. As plataformas que foram testadas
   antes do lanamento de uma verso so listadas nas instrues de
   instalao.
   
   O PostgreSQL tambm executa nativamente nos sistemas operacionais
   Microsoft Windows baseados no NT tais como Win200 SP4, WinXP e
   Win2003. Um instalador pr-empacotado est disponvel em
   http://pgfoundry.org/projects/pginstaller. Verses do Windows baseadas
   no MS-DOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
   o Cygwin.
   
   H tambm uma verso para o Novell Netware 6 em
   http://forge.novell.com e uma verso para OS/2 (eComStation) em
   http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
   SQL&stype=all&sort=type&dir=%2F.
   
  1.5) Onde eu posso conseguir o PostgreSQL?
  
   Via navegador web, utilize http://www.postgresql.org/ftp/ e via ftp,
   utilize ftp://ftp.postgresql.org/pub/.
   
  1.6) Qual  a ltima verso?
  
   A ltima verso do PostgreSQL  a verso 8.2.5.
   
   Ns planejamos lanar verses novas a cada ano com verses corretivas
   em alguns meses.
   
  1.7) Onde eu posso conseguir suporte?
  
   A comunidade do PostgreSQL fornece assistncia a muitos de seus
   usurios via e-mail. O principal stio web para inscrio nas listas
   de e-mail  http://www.postgresql.org/community/lists/. As listas
   general e bugs so um bom lugar para incio.
   
   O principal canal de IRC  o #postgresql na Freenode
   (irc.freenode.net). Para se conectar voc pode utilizar o comando Unix
   irc -c '#postgresql' "$USER" irc.freenode.net ou utilizar qualquer
   outro cliente de IRC. Um canal hispnico (#postgresql-es) e um francs
   (#postgresqlfr) tambm existem na mesma rede. H tambm um canal
   PostgreSQL na EFNet.
   
   Uma lista de empresas que prestam suporte comercial est disponvel em
   http://www.postgresql.org/support/professional_support.
   
  1.8) Como eu informo a existncia de um bug?
  
   Visite o formulrio que reporta bugs do PostgreSQL em
   http://www.postgresql.org/support/submitbug.
   
   Verifique tambm o nosso ftp ftp://ftp.postgresql.org/pub para ver se
   h uma verso mais recente do PostgreSQL.
   
   Bugs submetidos utilizando o formulrio ou informado a qualquer lista
   de discusso do PostgreSQL tipicamente gera uma das seguintes
   respostas:
     * No  um bug e o porqu
     *  um bug conhecido e j est na lista de AFAZERES
     * O bug foi corrigido na verso atual
     * O bug foi corrigido mas no foi empacotado em um verso oficial
     * Um pedido foi feito para obter informaes detalhadas:
          + Sistema Operacional
          + Verso do PostgreSQL
          + Exemplo de teste que reproduz o bug
          + Informaes sobre depurao
          + Sada reconstituidora de vestgios (backtrace) do depurador
     * O bug  novo. O seguinte pode ocorrer:
          + Uma correo  criada e ser includa na prxima verso
          + O bug no pode ser corrigido imediatamente e  adicionado a
            lista de AFAZERES
       
  1.9) Como eu posso saber quais so os bugs conhecidos ou funcionalidades
  ausentes?
  
   O PostgreSQL suporta um subconjunto extendido do SQL:2003. Veja nossa
   lista de AFAZERES que contm bugs conhecidos, funcionalidades ausentes
   e planos futuros.
   
   Uma solicitao de funcionalidade geralmente resulta em uma das
   seguintes respostas:
     * A funcionalidade j est na lista de AFAZERES
     * A funcionalidade no  desejvel porque:
          + Ela duplica uma funcionalidade existente que j segue o
            padro SQL
          + A funcionalidade aumentar a complexidade do cdigo mas
            adicionar pouco benefcio
          + A funcionalidade ser insegura ou no-confivel
     * A nova funcionalidade  adicionada a lista de AFAZERES
       
   O PostgreSQL no utiliza sistema de acompanhamento de bugs porque ns
   achamos mais eficiente responder diretamente o e-mail e manter a lista
   de AFAZERES atualizada. Na prtica, bugs no duram muito no programa;
   e bugs que afetam uma grande quantidade de usurios so corrigidos
   rapidamente. O nico lugar para encontrar todas as mudanas, melhorias
   e correes em uma verso do PostgreSQL  ler as mensagens de log do
   CVS. At mesmo as notas de lanamento no listam todas as mudanas
   feitas no programa.
   
  1.10) Que documentao est disponvel?
  
   O PostgreSQL inclui vasta documentao, incluindo um manual extenso,
   pginas de manuais (man pages) e alguns exemplos teste. Veja o
   diretrio /doc. Voc tambm pode pesquisar os manuais online em
   http://www.postgresql.org/docs.
   
   H dois livros sobre PostgreSQL disponveis online em
   http://www.postgresql.org/docs/books/awbook.html e
   http://www.commandprompt.com/ppbook/. H uma lista de livros sobre
   PostgreSQL disponveis para compra. Um dos mais populares  o do Korry
   Douglas. Uma lista de anlise sobre os livros pode ser encontrada em
   http://www.postgresql.org/docs/books/. H tambm uma coleo de
   artigos tcnicos sbore PostgreSQL em
   http://www.postgresql.org/docs/techdocs/.
   
   O programa cliente de linha de comando psql tem alguns comandos \d
   para mostrar informaes sobre tipos, operadores, funes, agregaes,
   etc. - utilize \? para mostrar os comandos disponveis.
   
   Nosso stio web contm ainda mais documentao.
   
  1.11) Como eu posso aprender SQL?
  
   Primeiro, considere os livros especficos sobre PostgreSQL mencionados
   acima. Muitos de nossos usurios gostam do The Practical SQL Handbook,
   Bowman, Judith S., et al., Addison-Wesley. Outros do The Complete
   Reference SQL, Groff et al., McGraw-Hill.
   
   H tambm bons tutoriais disponveis online:
     * http://www.intermedia.net/support/sql/sqltut.shtm
     * http://sqlcourse.com
     * http://www.w3schools.com/sql/default.asp
     * http://mysite.verizon.net/Graeme_Birchall/id1.html
       
  1.12) Como posso submeter uma correo (patch) ou me juntar a equipe de
  desenvolvimento?
  
   Veja a FAQ do Desenvolvedor.
   
  1.13) Como  o PostgreSQL comparado a outros SGBDs?
  
   H vrias maneiras de se medir um software: funcionalidades,
   performance, confiabilidade, suporte e preo.
   
   Funcionalidades
          PostgreSQL tem muitas caractersticas presentes em muitos SGBDs
          comerciais como transaes, subconsultas, gatilhos, vises,
          integridade referencial de chave estrangeira e bloqueio (lock)
          sofisticado. Ns temos algumas funcionalidades que eles no
          tem, como tipos definidos pelo usurio, herana, regras e
          controle de concorrncia de mltiplas verses para reduzir
          bloqueios (locks).
          
   Performance
          A performance do PostgreSQL  comparvel a outros bancos de
          dados comerciais e de cdigo livre. Ele  mais rpido em
          algumas coisas, mais lento em outras. Nossa performance 
          geralmente +/- 10% comparada a de outros bancos de dados.
          
   Confiabilidade
          Ns sabemos que um SGBD deve ser confivel ou ele  intil. Ns
          empenhamos em lanar verses bem testadas, de cdigo estvel e
          que tenha o mnimo de bugs. Cada verso tem no mnimo um ms de
          teste em verso beta, e nosso histrico de verses mostra que
          ns podemos fornecer verses estveis e slidas que esto
          prontas para uso em produo. Ns acreditamos que somos
          comparados a nosso favor com outros sistemas de bancos de dados
          nessa rea.
          
   Suporte
          Nossas listas de discusso fornecem contato com um grupo de
          desenvolvedores e usurios para ajudar a resolver muitos
          problemas encontrados. Enquanto ns no podemos garantir o
          conserto, SGBDs comerciais nem sempre fornecem tambm. Com
          acesso direto aos desenvolvedores, a comunidade de usurios,
          manuais e o cdigo fonte faz com que o suporte do PostgreSQL
          seja superior ao de outros SGBDs. H suporte comercial por
          incidente disponveis para aqueles que precisam de um. (Veja
          seo 1.7 da FAQ).
          
   Preo
          Ns somos livres para uso dele tanto comercial quanto no
          comercial. Voc pode adicionar nosso cdigo ao seu produto sem
          limitaes, exceto aquelas descritas na nossa licena BSD
          mencionada acima.
          
  1.14) O PostgreSQL gerenciar mudanas no horrio devido ao horrio de vero
  em vrios pases?
  
   Mudanas no horrio de vero dos USA foram includas nas verses 8.0
   .[4+] do PostgreSQL e em todas as verses grandes, i.e. 8.1. Mudanas
   no Canad e Austrlia Oeste foram includas na 8.0.[10+], 8.1.[6+] e
   em todas as verses grandes subsequentes. Verses do PostgreSQL
   anteriores a 8.0 utilizam o banco de dados de zona horria do sistema
   operacional para informaes sobre horrio de vero.
     _________________________________________________________________
   
                          Perguntas sobre Clientes
                                      
  2.1) Quais interfaces esto disponveis para PostgreSQL?
  
   A instalao do PostgreSQL inclui somente as interfaces C e C
   embutida. Todas as outras interfaces so projetos independentes que
   podem ser obtidos separadamente; sendo separados permitem que eles
   tenham suas prprias datas de lanamento e time de desenvolvedores.
   
   Algumas linguagens de programao como PHP incluem uma interface para
   PostgreSQL. Interfaces para linguagens como Perl, TCL, Python e muitas
   outras esto disponveis em http://www.pgfoundry.org.
   
  2.2) Quais ferramentas esto disponveis para utilizar o PostgreSQL com
  pginas Web?
  
   Uma boa introduo para pginas web que utilizam bancos de dados pode
   ser vista em: http://www.webreview.com
   
   Para integrao na Web, PHP (http://www.php.net)  uma excelente
   interface.
   
   Para casos complexos, muitos usam a Interface Perl e DBD::Pg com
   CGI.pm ou mod_perl.
   
  2.3) O PostgreSQL tem interfaces grficas para iteragir com o usurio?
  
   H um vasto nmero de Ferramentas Grficas (GUI), que esto
   disponveis para o PostgreSQL, comerciais e de desenvolvedores de
   cdigo aberto. Uma lista detalhada pode ser encontrada em Documentao
   da Comunidade PostgreSQL
     _________________________________________________________________
   
                         Perguntas Administrativas
                                      
  3.1) Como eu instalo o PostgreSQL em um local diferente de /usr/local/pgsql?
  
   Especifique a opo --prefix quando executar o configure.
   
  3.2) Como eu controlo conexes de outras mquinas?
  
   Por padro, o PostgreSQL s permite conexes da mquina local
   utilizando soquetes de domnio Unix ou conexes TCP/IP. Outras
   mquinas no podero conectar-se a menos que voc modifique
   listen_addresses no postgresql.conf, habilite a autenticao por
   mquina modificando o arquivo $PGDATA/pg_hba.conf e reinicie o
   servidor PostgreSQL.
   
  3.3) Como eu ajusto o servidor de banco de dados para obter uma performance
  melhor?
  
   H trs grandes reas para melhorar a performance em potencial:
   
   Mudana de Consultas
          Isto involve modificar consultas para obter melhor performance:
          
          + Criao de ndices, incluir expresses e ndices parciais
          + Utilizao o COPY ao invs de mltiplos comandos INSERTs
          + Agrupamento de mltiplos comandos em uma nica transao para
            diminuir a despesa com efetivaes (commit)
          + Utilizao do CLUSTER quando recuperar vrios registros de um
            ndice
          + Utilizao do LIMIT para retornar um subconjunto da sada da
            consulta
          + Utilizao de Consultas preparadas
          + Utilizao de ANALYZE para manter as estatsticas do
            otimizador corretas
          + Utilizao regular do VACUUM ou pg_autovacuum
          + Remoo de ndices durante grande mudana de dados
            
   Configurao do Servidor
          Um grande nmero de configuraes que afetam a performance.
          Para obter detalhes adicionais, veja Administration
          Guide/Server Run-time Environment/Run-time Configuration para
          listagem completa, e para comentrios veja
          http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
          nf_e.html e
          http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
          
   Seleo do Hardware
          O efeito do hardware na performance  detalhado em
          http://www.powerpostgresql.com/PerfList/ e
          http://momjian.us/main/writings/pgsql/hw_performance/index.html
          .
          
  3.4) Quais caractersticas de depurao esto disponveis?
  
   H muitas variveis de configurao do servidor log_* que habilitam a
   exibio de consultas e estatsticas que podem ser muito teis para
   depurao e medidas de performance.
   
  3.5) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
  
   Voc atingiu o limite padro de 100 sesses. Voc precisa aumentar o
   limite do servidor PostgreSQL, que diz quantos processos servidor
   concorrentes ele pode iniciar, alterando o valor max_connections no
   postgresql.conf e reiniciando o postmaster.
   
  3.6) Qual  o processo de atualizao do PostgreSQL?
  
   Veja http://www.postgresql.org/support/versioning para discusso geral
   sobre atualizaes e
   http://www.postgresql.org/docs/current/static/install-upgrading.html
   para instrues especficas.
   
  3.7) Que tipo de hardware eu devo usar?
  
   Por causa do hardware de PC ser em sua maioria compatvel, pessoas
   tendem a acreditar que todos os hardwares de PC so de mesma
   qualidade. No  verdade. ECC RAM, SCSI e placas me de qualidade so
   mais confiveis e tm uma melhor performance do que hardwares mais
   baratos. O PostgreSQL executar em quase todo hardware, mas se a
   confiabilidade e a performance forem importantes  prudente pesquisar
   sobre as opes de hardware. Nossas listas de discusso podem ser
   usadas para discutir opes de hardware e dilemas.
     _________________________________________________________________
   
                           Perguntas Operacionais
                                      
  4.1) Como eu fao um SELECT somente dos primeiros registros de uma consulta?
  Um registro randmico?
  
   Para obter somente alguns registros, se voc sabe o nmero de
   registros necessrios ao executar o SELECT utilize o LIMIT. Se um
   ndice corresponde no ORDER BY  possvel que a consulta toda no
   tenha que ser executada. Se voc no sabe o nmero de registros ao
   executar o SELECT, utilize um cursor e o FETCH.
   
   Para obter um registro randmico, utilize:
    SELECT col
    FROM tab
    ORDER BY random()
    LIMIT 1;

  4.2) Como eu descubro quais tabelas, ndices, bancos de dados e usurios
  esto definidos? Como eu vejo as consultas utilizadas pelo psql para
  mostr-los?
  
   Utilize o comando \dt para ver tabelas no psql. Para obter uma lista
   completa dos comandos no psql voc pode utilizar \?. Alternativamente,
   voc pode ler o cdigo-fonte do psql no arquivo
   pgsql/src/bin/psql/describe.c, ele contm os comandos SQL que geram a
   sada para os comandos de contrabarra do psql. Voc tambm pode
   iniciar o psql com a opo -E para que as consultas utilizadas para
   executar os comandos que voc informou seja exibida. O PostgreSQL
   tambm fornece uma inteface compatvel com SQL do INFORMATION SCHEMA
   que voc pode consultar para obter informao sobre o banco de dados.
   
   H tambm tabelas do sistema que comeam com pg_ que os descrevem
   tambm.
   
   Utilizando o psql -l listar todos os bancos de dados.
   
   Veja tambm o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
   muitos dos comandos SELECTs necessrios para obter informao das
   tabelas de sistema do banco de dados.
   
  4.3) Como voc muda o tipo de dado de uma coluna?
  
   Mudar o tipo de dado de uma coluna pode ser feito facilmente na verso
   8.0 ou superior com ALTER TABLE ALTER COLUMN TYPE.
   
   Em verses anteriores, faa isso:
    BEGIN;
    ALTER TABLE tab ADD COLUMN col_nova novo_tipo_dado;
    UPDATE tab SET col_nova = CAST(col_antiga AS novo_tipo_dado);
    ALTER TABLE tab DROP COLUMN col_antiga;
    COMMIT;

   Voc pode ento querer fazer um VACUUM FULL tab para recuperar o
   espao em disco utilizado pelos registros expirados.
   
  4.4) Qual  o tamanho mximo de um registro, uma tabela e um banco de dados?
  
   Estes so os limites:
   
   Tamanho mximo de um banco de dados? ilimitado (existem bancos de
   dados de 32 TB)
   Tamanho mximo de uma tabela? 32 TB
   Tamanho mximo de um registro? 400 GB
   Tamanho mximo de um campo? 1 GB
   Nmero mximo de registros em uma tabela? ilimitado
   Nmero mximo de colunas em uma tabela? 250-1600 dependendo dos tipos
   das colunas
   Nmero mximo de ndices em uma tabela? ilimitado
   
    claro, que eles no so ilimitados, mas limitados ao espao em disco
   disponvel e espao em memria/swap. A Performance ser penalizada
   quando estes valores se tornarem grandes.
   
   O tamanho mximo de uma tabela com 32 TB no requer suporte a arquivos
   grandes do sistema operacional. Tabelas grandes so armazenadas como
   mltiplos arquivos de 1 GB ento o limite do sistema de arquivos no 
   importante.
   
   O tamanho mximo de uma tabela, o tamanho de um registro e o nmero
   mximo de colunas podem ser quadruplicados aumentando-se o tamanho
   padro do bloco para 32k. O tamanho mximo de uma tabela pode tambm
   ser aumentado utilizando particionamento de tabela.
   
   Uma limitao  que ndices no podem ser criados em colunas maiores
   do que 2.000 caracteres. Felizmente, tais ndices so raramente
   necessrios. Unicidade  melhor garantida por um ndice de uma funo
   de um hash MD5 de uma coluna longa, e indexao de texto longo permite
   a busca de palavras dentro da coluna.
   
  4.5) Quanto espao em disco  necessrio para armazenar dados de um arquivo
  texto?
  
   Um banco de dados PostgreSQL ir requerer at cinco vezes a quantidade
   de espao requerida para armazenar dados em um arquivo texto.
   
   Como um exemplo, considere um arquivo com 100.000 linhas contendo um
   inteiro e uma descrio em cada linha. Suponha que o tamanho mdio da
   descrio  de vinte bytes. O arquivo ter 2,8 MB. O tamanho do
   arquivo do banco de dados PostgreSQL que contm esses dados pode ser
   estimado em 5,2 MB:
    24 bytes: cada cabealho de registro (aproximadamente)
    24 bytes: um campo int e um campo texto
   + 4 bytes: ponteiro na pgina para a tupla
   -------------------------------------------
    52 bytes por registro

   O tamanho de uma pgina de dados no PostgreSQL  8192 bytes (8 KB), ento:

   8192 bytes por pgina
   ------------------------   =  158 registros por pgina do banco de dados (arredondado para baixo)
     52 bytes por registro

   100000 registros de dados
   ----------------------------  =  633 pginas do banco de dados (arredondadopara cima)
      158 registros por pgina

633 pginas do banco de dados * 8192 bytes por pgina  =  5.185.536 bytes (5,2MB)

   ndices no requerem muito espao, mas contm dados que foram
   indexados, ento eles podem ocupar algum espao.
   
   NULLs so armazenados como bitmaps, ento eles utilizam muito pouco
   espao.
   
  4.6) Por que minhas consultas esto lentas? Por que elas no esto utilizando
  meus ndices?
  
   ndices no so utilizados por toda consulta. ndices so utilizados
   somente se a tabela  maior do que um tamanho mnimo, e a consulta
   seleciona somente uma pequena porcentagem dos registros da tabela.
   Isto porque o acesso randmico ao disco causado pela busca indexada
   pode ser mais lento do que uma leitura ao longo da tabela ou busca
   sequencial.
   
   Para determinar se um ndice deveria ser utilizado, o PostgreSQL deve
   ter estatsticas sobre a tabela. Estas estatsticas so coletadas
   utilizando o VACUUM ANALYZE ou simplesmente o ANALYZE. Utilizando
   estatsticas, o otimizador sbae quantos registros esto na tabela, e
   pode melhor determinar se ndices deveriam ser utilizados.
   Estatsticas tambm so teis para determinar a ordem de juno tima
   e mtodos de juno. Coleo de estatsticas deveriam ser feitas
   periodicamente a medida que o contedo da tabela muda.
   
   ndices no so normalmente utilizados para ORDER BY ou para fazer
   junes. Uma busca sequencial seguido por uma ordenao explcita 
   geralmente mais rpida do que uma busca indexada em uma tabela grande.
   Contudo, LIMIT combinado com ORDER BY frequentemente utilizar ndice
   porque somente uma pequena poro da tabela ser retornada.
   
   Se voc acredita que o otimizador est incorreto ao escolher uma busca
   sequencial, utilize SET enable_seqscan TO 'off' e execute a consulta
   novamente para ver se uma busca indexada  realmente mais rpida.
   
   Ao utilizar operadores curinga tais como LIKE ou ~, ndices podem ser
   utilizados somente em algumas condies:
     * O incio da cadeia de caracteres da busca deve ser iniciar com uma
       cadeia de caracteres, i.e.
          + modelos LIKE no devem iniciar com %.
          + modelos ~ (expresses regulares) devem iniciar com ^.
     * A cadeia de caracteres utilizada na busca no pode iniciar com a
       classe de caracteres e.g. [a-e].
     * Busca que no diferenciam maisculas de minsculas tais como ILIKE
       e ~* no utilizam ndices. Em vez disso, utilize ndice de
       expresso, que  descrito na seo 4.8.
     * O idioma padro C deve ser usando durante o initdb porque no 
       possvel saber o prximo caracter em idiomas que no sejam o C.
       Voc pode criar um ndice especial text_pattern_ops para tais
       casos que funcionam somente para indexao com LIKE. Tambm 
       possvel utilizar indexao de busca textual para buscas por
       palavras.
       
   Em verses anteriores a 8.0, ndices frequentemente no podem ser
   utilizados a menos que os tipos de dados correspondam aos tipos de
   coluna do ndice. Isto era particularmente verdadeiro para ndices de
   coluna int2, int8 e numeric.
   
  4.7) Como eu vejo como o otimizador de consulta est avaliando a minha
  consulta?
  
   Veja o comando EXPLAIN no manual.
   
  4.8) Como eu fao buscas com expresses regulares e buscas com expresses
  regulares sem diferenciar maisculas de minsculas? Como eu utilizo um ndice
  para buscas que no diferenciam maisculas de minsculas?
  
   O operador ~ faz avaliao de expresses regulares, e ~* faz avaliao
   no sensvel a maisculas de expresses regulares. A variante no
   sensvel a maisculas do LIKE  chamada de ILIKE.
   
   Comparaes de igualdade no sensveis a maisculas so normalmente
   expressadas como:
    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';

   Isso no ir utilizar o ndice padro. Contudo, se voc criar um
   ndice de expresso, ele ser utilizado:
    CREATE INDEX tabindex ON tab (lower(col));

   Se o ndice acima  criado como UNIQUE, embora a coluna possa
   armazenar caracteres maisculos e minsculos, ele no pode ter valores
   idnticos que diferem apenas em letras maisculas e minsculas. Para
   forar uma letra maiscula ou minscula a ser armazenada na coluna,
   utilize uma restrio CHECK ou um gatilho.
   
  4.9) Em uma consulta, como eu detecto se um campo  NULL? Como eu posso
  concatenar possveis NULLs? Como eu posso ordenar por um campo que  NULL ou
  no?
  
   Voc testa a coluna com IS NULL e IS NOT NULL, como a seguir:
   SELECT *
   FROM tab
   WHERE col IS NULL;

   Para concatenar com possveis NULLs, utilize COALESCE(), assim:
   SELECT COALESCE(col1, '') || COALESCE(col2, '')
   FROM tab

   Para ordenar pelo status NULL, utilize os modificadores IS NULL e IS
   NOT NULL na sua clusula ORDER BY. Coisas que so verdadeiro sero
   ordenadas acima das coisas que so falso, ento a consulta a seguir
   ir colocar entradas NULL no incio da lista de resultados:
   SELECT *
   FROM tab
   ORDER BY (col IS NOT NULL)

  4.10) Qual  a diferena entre os vrios tipos de dado de caracteres?
  
   Tipo Nome Interno Observao
   VARCHAR(n) varchar tamanho especifica o tamanho mximo, sem
   preenchimento
   CHAR(n) bpchar preenchimento em branco para comprimento fixo
   especfico
   TEXT text nenhum limite superior especfico no comprimento
   BYTEA bytea vetor de bytes de comprimento varivel (seguro a byte
   nulo)
   "char" char um caracter
   
   Voc ver o nome interno quando examinar o catlogo do sistema e em
   algumas mensagens de erro.
   
   Os primeiros quatro tipos acima so do tipo "varlena" (i.e., os
   primeiros quatro bytes no disco so o comprimento seguido pelos
   dados). Consequentemente o espao atual utilizado  ligeiramente maior
   do que o tamanho declarado. Contudo, valores longos so tambm
   sujeitos a compresso, ento o espao em disco pode tambm ser bem
   menor do que o esperado.
   VARCHAR(n)  melhor quando est armazenando cadeias de caracteres de
   comprimento varivel e h um limite de tamanho desta cadeia. TEXT 
   para cadeias de caracteres de comprimento ilimitado, com o mximo de
   um gigabyte.
   
   CHAR(n)  para armazenar cadeias de caracteres que so todas do mesmo
   tamanho. CHAR(n) preenche com espaos em branco at o tamanho
   especificado, enquanto o VARCHAR(n) armazena somente os caracteres
   fornecidos. BYTEA  para armazenar dados binrios, particularmente
   valores que incluem bytes NULL. Todos os tipos descritos aqui tem
   caractersticas de performance similares.
   
  4.11.1) Como eu crio um campo serial/auto incremento?
  
   PostgreSQL suporta o tipo de dados SERIAL. Ele cria automaticamente
   uma sequncia. Por exemplo:
    CREATE TABLE pessoa (
        id   SERIAL,
        nome TEXT
    );

    automaticamente traduzido em:
    CREATE SEQUENCE pessoa_id_seq;
    CREATE TABLE pessoa (
        id   INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
        nome TEXT
    );

   Sequncias automaticamente criadas so nomeadas como
   <tabela>_<colunaserial>_seq, onde tabela e colunaserial so os nomes
   da tabela e da coluna serial, respectivamente. Veja a pgina sobre
   create_sequence no manual para obter informaes adicionais sobre
   sequncias.
   
  4.11.2) Como eu consigo o valor de um campo SERIAL?
  
   A maneira mais simples de obter o prximo valor SERIAL de uma
   sequncia  com RETURNING. Utilizando o exemplo da tabela em 4.11.1,
   ele ficaria assim:
    INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;

   Voc tambm pode chamar nextval() e utilizar o valor no INSERT ou
   chamar currval() aps o INSERT.
   
  4.11.3) currval() no lida com condio de corrida com outros usurios?
  
   No. currval() retorna o valor atual atribuido pela sua sesso, e no
   por todas as sesses.
   
  4.11.4) Por que os nmeros da minha sequncia no so reutilizados quando uma
  transao  abortada? Por que h intervalos nos nmeros da minha
  sequncia/coluna SERIAL?
  
   Para melhorar a concorrncia, valores da sequncia so atribudos a
   transaes correntes e no so travados at que a transao seja
   finalizada. Isso causa intervalos na numerao por causa de transaes
   abortadas.
   
  4.12) O que  um OID? O que  um CTID?
  
   Se uma tabela  criada com WITH OIDS, cada registro recebe um OID
   nico. OIDs so automaticamente atribudos como inteiros de 4 bytes
   que so nicos ao longo de toda instalao. Contudo, eles so
   limitados em 4 bilhes e, ento, os OIDs comeam a ser duplicados. O
   PostgreSQL utiliza OIDs para ligar as tabelas do sistema.
   
   Para numerar registros nas tabelas do usurios,  melhor utilizar
   SERIAL ao invs de OIDs porque sequncias SERIAL so nicas somente em
   uma tabela; e so menos propcias a atingir o limite. SERIAL8 est
   disponvel para armazenar valores de sequncias com oito bytes.
   
   CTIDs so utilizados para identificar registros fsicos especficos
   com valores de block e deslocamento. CTIDs mudam aps registros serem
   modificados ou recarregados. Eles so utilizados por ndices para
   apontar registros fsicos.
   
  4.13) Por que eu recebo o erro "ERROR: Memory exhausted in AllocSetAlloc()"?
  
   Voc provavelmente est sem memria virtual no seu sistema, ou o seu
   ncleo (kernel) tem um limite baixo para certos recursos. Tente isto
   antes de iniciar o servidor PostgreSQL:
    ulimit -d 262144
    limit datasize 256m

   Dependendo da sua shell, somente um desses comando ter sucesso, mas
   ele definir o segmento de dados do seu processo com um limite maior e
   talvez permita que a consulta seja feita. Este comando  aplicado ao
   processo atual e todos os subprocessos criados depois do comando ser
   executado. Se voc tiver problemas com o cliente SQL porque o processo
   servidor retornou muitos dados, tente-o antes de iniciar o cliente.
   
  4.14) Como eu informo qual verso do PostgreSQL eu estou utilizando?
  
   No psql, digite SELECT version();
   
  4.15) Como eu crio uma coluna que conter por padro a hora atual?
  
   Utilize CURRENT_TIMESTAMP:
        CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP);

  4.16) Como eu fao uma juno externa (outer join)?
  
   PostgreSQL suporta junes externas utilizando a sintaxe padro do
   SQL. Aqui temos dois exemplos:
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

   or
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 USING (col);

   Essas duas consultas indnticas juntam t1.col com t2.col, e tambm
   retornam qualquer registro que no foi juntado em t1 (aqueles que no
   combinaram com t2). Uma juno a direita RIGHT adicionaria registros
   que no foram juntados da tabela t2. Uma juno completa (FULL)
   retornaria os registros combinados mais todos os registros no
   combinados de t1 e t2. A palavra OUTER  opcional e  assumida nas
   junes LEFT, RIGHT e FULL. Junes ordinrias so chamadas junes
   internas (INNER).
   
  4.17) Como eu fao consultas utilizando mltiplos bancos de dados?
  
   No h outra maneira de consultar um banco de dados caso ele no seja
   o atual. Porque o PostgreSQL carrega catlogos do sistema especficos
   do banco de dados,  incerto como uma consulta em banco de dados
   distintos pode se comportar.
   
   contrib/dblink permite consultas em bancos de dados distintos
   utilizando chamadas de funes.  claro, que um cliente pode fazer
   conexes simultneas em bancos de dados diferentes e juntar os
   resultados no cliente.
   
  4.18) Como eu retorno mltiplos registros ou colunas de uma funo?
  
    fcil utilizando funes que retornam conjunto,
   http://www.postgresql.org/docs/techdocs.17.
   
  4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
  acessar tabelas temporrias em funes PL/PgSQL?
  
   Em verses do PostgreSQL < 8.3, PL/PgSQL armazena o contedo da
   funo, e o efeito indesejado  que se uma funo PL/PgSQL acessa uma
   tabela temporria, e aquela tabela  removida e criada novamente, e a
   funo  chamada novamente, a funo ir falhar porque o contedo
   armazenado da funo ainda apontar para a tabela temporria antiga. A
   soluo  utilizar o EXECUTE para acesso a tabelas temporrias no
   PL/PgSQL. Isto ir fazer com que a consulta seja avaliada toda vez.
   
   Este problema no ocorre no PostgreSQL 8.3 ou superior.
   
  4.20) Quais solues de replicao esto disponveis?
  
   Embora "replicao" seja um termo simples, h vrias tecnologias para
   fazer replicao, com vantagens e desvantagens para cada um.
   
   Replicao mestre/escravo permite que um mestre receba consultas de
   leitura e escrita, enquanto os escravos s podem aceitar
   leitura/consultas SELECT. A soluo mais popular de replicao
   mestre-escravo para PostgreSQL disponvel livremente  Slony-I.
   
   Replicao com mltiplos mestres permite que consultas leitura/escrita
   sejam enviadas para mltiplos computadores replicadores. Esta
   capacidade tambm tem um srio impacto na performance por causa da
   necessidade de sincronizar as mudanas entre os servidores. PGCluster
    a soluo mais popular disponvel livremente para PostgreSQL.
   
   H tambm solues de replicao comerciais e baseadas em hardware
   disponveis que suportam uma variedade de modelos de replicao.
   
  4.21) Por que os nomes de minhas tabelas e colunas no so reconhecidos em
  minha consulta? Por que as maisculas no so preservadas?
  
   A causa mais comum de nomes desconhecidos  o uso de aspas ao redor
   dos nomes da tabela ou coluna durante a criao da tabela. Ao utilizar
   aspas, nomes de tabela e coluna (chamados de identificadores) so
   armazenados como especificado, significando que voc deve utilizar
   aspas quando se referir aos nomes na consulta. Algumas interfaces,
   como pgAdmin, automaticamente colocam aspas nos identificadores
   durante a criao da tabela. Ento, para identificadores serem
   reconhecidos, voc deve:
     * Evitar colocar aspas no identificador ao criar tabelas
     * Utilizar somente caracteres minsculos em identificadores
     * Colocar aspas em identificadores ao referenci-los nas consultas
