
                  Perguntas Frequentes (FAQ) sobre PostgreSQL
                                       
   ltima atualizao: Sb Out 14 19:08:19 EDT 2006
   
   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?
   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?
   
                          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 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?
     _________________________________________________________________
   
                              Perguntas Gerais
                                      
  1.1) O que  PostgreSQL? Como ele  pronunciado?
  
   PostgreSQL  pronunciado Post-Gres-Q-L, e , s vezes, referido apenas
   como Postgres. Um arquivo de udio est disponvel em formato MP3 para
   aqueles que gostariam de ouvir a pronncia.
   
   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/files/documentation/faqs/FAQ_DEV.html
   
  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-2006, 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.1.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 (TODO)
     * 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 (TODO)
       
  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 (TODO) 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 (TODO)
     * 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 (TODO)
       
   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 (TODO) 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://techdocs.PostgreSQL.org/techdocs/bookreviews.php.
   
   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. Outro  o "Teach Yourself SQL in 21 Days, Second Edition" e
   http://members.tripod.com/er4ebus/sql/index.htm. 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.
     _________________________________________________________________
   
                          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://gborg.postgresql.org na seo de
   Drivers/Interfaces ou via busca na Internet.
   
  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 que  de 100 sesses. Voc precisa
   aumentar o limite do postmaster, 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?
  
   O time do PostgreSQL faz somente pequenas mudanas entre verses
   corretivas, ento atualizar da verso 7.4.8 para 7.4.9 no requer uma
   exportao e uma importao; basta para o servidor de banco de dados,
   instalar os binrios atualizados e reiniciar o servidor.
   
   Todos os usurios devem atualizar para as verses corretivas mais
   recentes assim que elas estiverem disponveis. Enquanto cada
   atualizao tem algum risco, verses corretivas do PostgreSQL so
   projetadas para corrigir somente bugs comuns com um risco mnimo. A
   comunidade considera no atualizar mais perigoso do que atualizar.
   
   Verses novas (i.e. da 7.3 para 7.4) geralmente muda-se o formato
   interno das tabelas de sistema e dos arquivo de dados. Essas mudanas
   geralmente so complexas, ento ns no mantemos compatibilidade para
   os arquivos de dados. Uma exportao/importao de um banco de dados 
   necessria para atualizaes entre verses.
   
  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,6 MB:
    28 bytes: cada cabealho de registro (aproximadamente)
    24 bytes: um campo int e um campo texto
   + 4 bytes: ponteiro na pgina para a tupla
   -------------------------------------------
    56 bytes por registro

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

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

   100000 registros de dados
   ----------------------------  =  685 pginas do banco de dados (arredondadopara cima)
      146 registros por pgina

685 pginas do banco de dados * 8192 bytes por pgina  =  5.611.520 bytes (5,6MB)

   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.
       
   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
  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 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
    );

   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?
  
   Uma abordagem  obter o prximo valor SERIAL de uma sequncia com a
   funo nextval() antes de inserir e ento inserir com o valor
   explicitamente. Utilizando o exemplo da tabela em 4.11.1, um exemplo
   em pseudo-linguagem se pareceria com isto:
    novo_id = execute("SELECT nextval('pessoa_id_seq')");
    execute("INSERT INTO pessoa (id, nome) VALUES (novo_id, 'Blaise Pascal')");

   Voc poderia ento ter tambm o novo valor armazenado em novo_id para
   utilizar em outras consultas (i.e., como uma chave estrangeira da
   tabela pessoa). Note que o nome da SEQUENCE criada automaticamente
   ser <tabela>_<coluna>_seq, onde tabela e coluna so os nomes da
   tabela e da coluna SERIAL, respectivamente.
   
   Alternativamente, voc poderia obter o valor SERIAL atribudo com a
   funo currval() depois de t-lo inserido por padro, i.e.,
    execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
    novo_id = execute("SELECT currval('pessoa_id_seq')");

  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.16) O que  um OID? O que  um CTID?
  
   Cada registro que  criado no PostgreSQL recebe um OID nico a menos
   que seja criado com WITHOUT OIDS. 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 postmaster:
    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.23) 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
   naturais (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://techdocs.postgresql.org/guides/SetReturningFunctions.
   
  4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
  acessar tabelas temporrias em funes PL/PgSQL?
  
   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.
   
  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?
  
   O caso mais comum  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 coloca 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
