mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-30 00:04:49 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			923 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			923 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
|                   Perguntas Frequentes (FAQ) sobre PostgreSQL
 | |
|                                        
 | |
|    Última atualização: 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 versão 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 específicas são 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 licença do PostgreSQL?
 | |
|    1.4) Quais plataformas o PostgreSQL pode ser executado?
 | |
|    1.5) Onde eu posso conseguir o PostgreSQL?
 | |
|    1.6) Qual é a última versão?
 | |
|    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 são os bugs conhecidos ou
 | |
|    características ausentes?
 | |
|    1.10) Que documentação está disponível?
 | |
|    1.11) Como eu posso aprender SQL?
 | |
|    1.12) Como posso submeter uma correção (patch) ou me juntar a equipe
 | |
|    de desenvolvimento?
 | |
|    1.13) Como é o PostgreSQL comparado a outros SGBDs?
 | |
|    1.14) O PostgreSQL gerenciará as mudanças de horário devido ao horário
 | |
|    de verão em vários países?
 | |
|    
 | |
|                           Perguntas sobre Clientes
 | |
|                                       
 | |
|    2.1) Quais interfaces estão disponíveis para PostgreSQL?
 | |
|    2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL
 | |
|    com páginas Web?
 | |
|    2.3) O PostgreSQL tem interfaces gráficas para interagir com usuário?
 | |
|    
 | |
|                          Perguntas Administrativas
 | |
|                                       
 | |
|    3.1) Como eu instalo o PostgreSQL em um local diferente de
 | |
|    /usr/local/pgsql?
 | |
|    3.2) Como eu controlo conexões de outras máquinas?
 | |
|    3.3) Como eu ajusto o servidor de banco de dados para obter uma
 | |
|    performance melhor?
 | |
|    3.4) Quais características de depuração estão disponíveis?
 | |
|    3.5) Por que eu recebo "Sorry, too many clients" quando eu tento
 | |
|    conectar?
 | |
|    3.6) Qual é o processo de atualização do PostgreSQL?
 | |
|    3.7) Que tipo de hardware eu devo usar?
 | |
|    
 | |
|                            Perguntas Operacionais
 | |
|                                       
 | |
|    4.1) Como eu faço um SELECT somente dos primeiros registros de uma
 | |
|    consulta? Um registro randômico?
 | |
|    4.2) Como eu descubro quais tabelas, índices, bancos de dados e
 | |
|    usuários estão 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 máximo de um registro, uma tabela e um banco de
 | |
|    dados?
 | |
|    4.5) Quanto espaço em disco é necessário para armazenar dados de um
 | |
|    arquivo texto?
 | |
|    4.6) Por que minhas consultas estão lentas? Por que elas não estão
 | |
|    utilizando meus índices?
 | |
|    4.7) Como eu vejo como o otimizador de consultas está avaliando minha
 | |
|    consulta?
 | |
|    4.8) Como eu faço buscas com expressões regulares e buscas com
 | |
|    expressões regulares sem diferenciar mauúsculas de minúsculas? Como eu
 | |
|    utilizo um índice para buscas sem distinguir maiúsculas de minúsculas?
 | |
|    4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu
 | |
|    posso concatenar possíveis NULLs? Como eu posso ordenar por um campo
 | |
|    que é NULL ou não?
 | |
|    4.10) Qual é a diferença entre os vários 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() não lida com condição de corrida com outros
 | |
|    usuários?
 | |
|    4.11.4) Por que os números da minha sequência não são reutilizados
 | |
|    quando uma transação é abortada? Por que há intervalos nos números da
 | |
|    minha sequência/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 versão do PostgreSQL eu estou utilizando?
 | |
|    4.15) Como eu crio uma coluna que conterá por padrão a hora atual?
 | |
|    4.16) Como eu faço uma junção externa (outer join)?
 | |
|    4.17) Como eu faço consultas utilizando múltiplos bancos de dados?
 | |
|    4.18) Como eu retorno múltiplos registros ou colunas de uma função?
 | |
|    4.19) Por que eu obtenho erros "relation with OID ###### does not
 | |
|    exist" ao acessar tabelas temporárias em funções PL/PgSQL?
 | |
|    4.20) Quais soluções de replicação estão disponíveis?
 | |
|    4.21) Por que os nomes de minhas tabelas e colunas não são
 | |
|    reconhecidos em minha consulta? Por que as maiúsculas não são
 | |
|    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á disponível).
 | |
|    
 | |
|    O PostgreSQL é um sistema de banco de dados objeto-relacional que tem
 | |
|    as características de sistemas de bancos de dados comerciais
 | |
|    tradicionais com melhoramentos encontrados nos sistemas SGBDs de
 | |
|    próxima geração. PostgreSQL é livre e o código-fonte completo está
 | |
|    disponível.
 | |
|    
 | |
|    O desenvolvimento do PostgreSQL é feito por um grupo de
 | |
|    desenvolvedores voluntários (na sua maioria) espalhados pelo mundo e
 | |
|    que se comunicam via Internet. É um projeto da comunidade e não é
 | |
|    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' difícil 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 --- não há um(a). Nós temos um
 | |
|    comitê core e committers CVS, mas estes grupos são mais para questões
 | |
|    administrativas do que controle. O projeto é direcionado pela
 | |
|    comunidade de desenvolvedores e usuários, que qualquer um pode se
 | |
|    juntar. Tudo o que você precisa é se inscrever nas listas de discussão
 | |
|    e participar das discussões. Veja a FAQ do desenvolvedor para obter
 | |
|    informações como se envolver com o desenvolvimento do PostgreSQL.
 | |
|    
 | |
|   1.3) Qual é a licença do PostgreSQL?
 | |
|   
 | |
|    O PostgreSQL é distribuído sob a licença BSD clássica. Basicamente,
 | |
|    ela permite que usuários façam qualquer coisa com o código, incluindo
 | |
|    revender os binários sem o código-fonte. A única restrição é que você
 | |
|    não nos responsabilize legalmente por problemas com o programa de
 | |
|    computador. Há também a exigência de que esta licença apareça em todas
 | |
|    as cópias do programa de computador. Aqui está a licença BSD que
 | |
|    usamos atualmente:
 | |
|    
 | |
|    PostgreSQL está sujeito a seguinte licença:
 | |
|    
 | |
|    PostgreSQL Data Base Management System
 | |
|    
 | |
|    Portions Copyright (c) 1996-2008, 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 compatível com Unix deve ser
 | |
|    capaz de executar o PostgreSQL. As plataformas que foram testadas
 | |
|    antes do lançamento de uma versão são listadas nas instruções de
 | |
|    instalação.
 | |
|    
 | |
|    O PostgreSQL também executa nativamente nos sistemas operacionais
 | |
|    Microsoft Windows baseados no NT tais como Win200 SP4, WinXP e
 | |
|    Win2003. Um instalador pré-empacotado está disponível em
 | |
|    http://pgfoundry.org/projects/pginstaller. Versões do Windows baseadas
 | |
|    no MS-DOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
 | |
|    o Cygwin.
 | |
|    
 | |
|    Há também uma versão para o Novell Netware 6 em
 | |
|    http://forge.novell.com e uma versão 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 versão?
 | |
|   
 | |
|    A última versão do PostgreSQL é a versão 8.2.5.
 | |
|    
 | |
|    Nós planejamos lançar versões novas a cada ano com versões corretivas
 | |
|    em alguns meses.
 | |
|    
 | |
|   1.7) Onde eu posso conseguir suporte?
 | |
|   
 | |
|    A comunidade do PostgreSQL fornece assistência a muitos de seus
 | |
|    usuários via e-mail. O principal sítio web para inscrição nas listas
 | |
|    de e-mail é http://www.postgresql.org/community/lists/. As listas
 | |
|    general e bugs são um bom lugar para início.
 | |
|    
 | |
|    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 hispânico (#postgresql-es) e um francês
 | |
|    (#postgresqlfr) também existem na mesma rede. Há também um canal
 | |
|    PostgreSQL na EFNet.
 | |
|    
 | |
|    Uma lista de empresas que prestam suporte comercial está disponível em
 | |
|    http://www.postgresql.org/support/professional_support.
 | |
|    
 | |
|   1.8) Como eu informo a existência de um bug?
 | |
|   
 | |
|    Visite o formulário que reporta bugs do PostgreSQL em
 | |
|    http://www.postgresql.org/support/submitbug.
 | |
|    
 | |
|    Verifique também o nosso ftp ftp://ftp.postgresql.org/pub para ver se
 | |
|    há uma versão mais recente do PostgreSQL.
 | |
|    
 | |
|    Bugs submetidos utilizando o formulário ou informado a qualquer lista
 | |
|    de discussão do PostgreSQL tipicamente gera uma das seguintes
 | |
|    respostas:
 | |
|      * Não é um bug e o porquê
 | |
|      * É um bug conhecido e já está na lista de AFAZERES
 | |
|      * O bug foi corrigido na versão atual
 | |
|      * O bug foi corrigido mas não foi empacotado em um versão oficial
 | |
|      * Um pedido foi feito para obter informações detalhadas:
 | |
|           + Sistema Operacional
 | |
|           + Versão do PostgreSQL
 | |
|           + Exemplo de teste que reproduz o bug
 | |
|           + Informações sobre depuração
 | |
|           + Saída reconstituidora de vestígios (backtrace) do depurador
 | |
|      * O bug é novo. O seguinte pode ocorrer:
 | |
|           + Uma correção é criada e será incluída na próxima versão
 | |
|           + O bug não pode ser corrigido imediatamente e é adicionado a
 | |
|             lista de AFAZERES
 | |
|        
 | |
|   1.9) Como eu posso saber quais são os bugs conhecidos ou funcionalidades
 | |
|   ausentes?
 | |
|   
 | |
|    O PostgreSQL suporta um subconjunto extendido do SQL:2003. Veja nossa
 | |
|    lista de AFAZERES que contém bugs conhecidos, funcionalidades ausentes
 | |
|    e planos futuros.
 | |
|    
 | |
|    Uma solicitação de funcionalidade geralmente resulta em uma das
 | |
|    seguintes respostas:
 | |
|      * A funcionalidade já está na lista de AFAZERES
 | |
|      * A funcionalidade não é desejável porque:
 | |
|           + Ela duplica uma funcionalidade existente que já segue o
 | |
|             padrão SQL
 | |
|           + A funcionalidade aumentará a complexidade do código mas
 | |
|             adicionará pouco benefício
 | |
|           + A funcionalidade será insegura ou não-confiável
 | |
|      * A nova funcionalidade é adicionada a lista de AFAZERES
 | |
|        
 | |
|    O PostgreSQL não utiliza sistema de acompanhamento de bugs porque nós
 | |
|    achamos mais eficiente responder diretamente o e-mail e manter a lista
 | |
|    de AFAZERES atualizada. Na prática, bugs não duram muito no programa;
 | |
|    e bugs que afetam uma grande quantidade de usuários são corrigidos
 | |
|    rapidamente. O único lugar para encontrar todas as mudanças, melhorias
 | |
|    e correções em uma versão do PostgreSQL é ler as mensagens de log do
 | |
|    CVS. Até mesmo as notas de lançamento não listam todas as mudanças
 | |
|    feitas no programa.
 | |
|    
 | |
|   1.10) Que documentação está disponível?
 | |
|   
 | |
|    O PostgreSQL inclui vasta documentação, incluindo um manual extenso,
 | |
|    páginas de manuais (man pages) e alguns exemplos teste. Veja o
 | |
|    diretório /doc. Você também pode pesquisar os manuais online em
 | |
|    http://www.postgresql.org/docs.
 | |
|    
 | |
|    Há dois livros sobre PostgreSQL disponíveis online em
 | |
|    http://www.postgresql.org/docs/books/awbook.html e
 | |
|    http://www.commandprompt.com/ppbook/. Há uma lista de livros sobre
 | |
|    PostgreSQL disponíveis para compra. Um dos mais populares é o do Korry
 | |
|    Douglas. Uma lista de análise sobre os livros pode ser encontrada em
 | |
|    http://www.postgresql.org/docs/books/. Há também uma coleção de
 | |
|    artigos técnicos sbore PostgreSQL em
 | |
|    http://www.postgresql.org/docs/techdocs/.
 | |
|    
 | |
|    O programa cliente de linha de comando psql tem alguns comandos \d
 | |
|    para mostrar informações sobre tipos, operadores, funções, agregações,
 | |
|    etc. - utilize \? para mostrar os comandos disponíveis.
 | |
|    
 | |
|    Nosso sítio web contém ainda mais documentação.
 | |
|    
 | |
|   1.11) Como eu posso aprender SQL?
 | |
|   
 | |
|    Primeiro, considere os livros específicos sobre PostgreSQL mencionados
 | |
|    acima. Muitos de nossos usuários 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á também bons tutoriais disponíveis 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 correção (patch) ou me juntar a equipe de
 | |
|   desenvolvimento?
 | |
|   
 | |
|    Veja a FAQ do Desenvolvedor.
 | |
|    
 | |
|   1.13) Como é o PostgreSQL comparado a outros SGBDs?
 | |
|   
 | |
|    Há várias maneiras de se medir um software: funcionalidades,
 | |
|    performance, confiabilidade, suporte e preço.
 | |
|    
 | |
|    Funcionalidades
 | |
|           PostgreSQL tem muitas características presentes em muitos SGBDs
 | |
|           comerciais como transações, subconsultas, gatilhos, visões,
 | |
|           integridade referencial de chave estrangeira e bloqueio (lock)
 | |
|           sofisticado. Nós temos algumas funcionalidades que eles não
 | |
|           tem, como tipos definidos pelo usuário, herança, regras e
 | |
|           controle de concorrência de múltiplas versões para reduzir
 | |
|           bloqueios (locks).
 | |
|           
 | |
|    Performance
 | |
|           A performance do PostgreSQL é comparável a outros bancos de
 | |
|           dados comerciais e de código livre. Ele é mais rápido em
 | |
|           algumas coisas, mais lento em outras. Nossa performance é
 | |
|           geralmente +/- 10% comparada a de outros bancos de dados.
 | |
|           
 | |
|    Confiabilidade
 | |
|           Nós sabemos que um SGBD deve ser confiável ou ele é inútil. Nós
 | |
|           empenhamos em lançar versões bem testadas, de código estável e
 | |
|           que tenha o mínimo de bugs. Cada versão tem no mínimo um mês de
 | |
|           teste em versão beta, e nosso histórico de versões mostra que
 | |
|           nós podemos fornecer versões estáveis e sólidas que estão
 | |
|           prontas para uso em produção. Nós acreditamos que somos
 | |
|           comparados a nosso favor com outros sistemas de bancos de dados
 | |
|           nessa área.
 | |
|           
 | |
|    Suporte
 | |
|           Nossas listas de discussão fornecem contato com um grupo de
 | |
|           desenvolvedores e usuários para ajudar a resolver muitos
 | |
|           problemas encontrados. Enquanto nós não podemos garantir o
 | |
|           conserto, SGBDs comerciais nem sempre fornecem também. Com
 | |
|           acesso direto aos desenvolvedores, a comunidade de usuários,
 | |
|           manuais e o código fonte faz com que o suporte do PostgreSQL
 | |
|           seja superior ao de outros SGBDs. Há suporte comercial por
 | |
|           incidente disponíveis para aqueles que precisam de um. (Veja
 | |
|           seção 1.7 da FAQ).
 | |
|           
 | |
|    Preço
 | |
|           Nós somos livres para uso dele tanto comercial quanto não
 | |
|           comercial. Você pode adicionar nosso código ao seu produto sem
 | |
|           limitações, exceto aquelas descritas na nossa licença BSD
 | |
|           mencionada acima.
 | |
|           
 | |
|   1.14) O PostgreSQL gerenciará mudanças no horário devido ao horário de verão
 | |
|   em vários países?
 | |
|   
 | |
|    Mudanças no horário de verão dos USA foram incluídas nas versões 8.0
 | |
|    .[4+] do PostgreSQL e em todas as versões grandes, i.e. 8.1. Mudanças
 | |
|    no Canadá e Austrália Oeste foram incluídas na 8.0.[10+], 8.1.[6+] e
 | |
|    em todas as versões grandes subsequentes. Versões do PostgreSQL
 | |
|    anteriores a 8.0 utilizam o banco de dados de zona horária do sistema
 | |
|    operacional para informações sobre horário de verão.
 | |
|      _________________________________________________________________
 | |
|    
 | |
|                           Perguntas sobre Clientes
 | |
|                                       
 | |
|   2.1) Quais interfaces estão disponíveis para PostgreSQL?
 | |
|   
 | |
|    A instalação do PostgreSQL inclui somente as interfaces C e C
 | |
|    embutida. Todas as outras interfaces são projetos independentes que
 | |
|    podem ser obtidos separadamente; sendo separados permitem que eles
 | |
|    tenham suas próprias datas de lançamento e time de desenvolvedores.
 | |
|    
 | |
|    Algumas linguagens de programação como PHP incluem uma interface para
 | |
|    PostgreSQL. Interfaces para linguagens como Perl, TCL, Python e muitas
 | |
|    outras estão disponíveis em http://www.pgfoundry.org.
 | |
|    
 | |
|   2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL com
 | |
|   páginas Web?
 | |
|   
 | |
|    Uma boa introdução para páginas web que utilizam bancos de dados pode
 | |
|    ser vista em: http://www.webreview.com
 | |
|    
 | |
|    Para integração 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 gráficas para iteragir com o usuário?
 | |
|   
 | |
|    Há um vasto número de Ferramentas Gráficas (GUI), que estão
 | |
|    disponíveis para o PostgreSQL, comerciais e de desenvolvedores de
 | |
|    código aberto. Uma lista detalhada pode ser encontrada em Documentação
 | |
|    da Comunidade PostgreSQL
 | |
|      _________________________________________________________________
 | |
|    
 | |
|                          Perguntas Administrativas
 | |
|                                       
 | |
|   3.1) Como eu instalo o PostgreSQL em um local diferente de /usr/local/pgsql?
 | |
|   
 | |
|    Especifique a opção --prefix quando executar o configure.
 | |
|    
 | |
|   3.2) Como eu controlo conexões de outras máquinas?
 | |
|   
 | |
|    Por padrão, o PostgreSQL só permite conexões da máquina local
 | |
|    utilizando soquetes de domínio Unix ou conexões TCP/IP. Outras
 | |
|    máquinas não poderão conectar-se a menos que você modifique
 | |
|    listen_addresses no postgresql.conf, habilite a autenticação por
 | |
|    máquina 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á três grandes áreas para melhorar a performance em potencial:
 | |
|    
 | |
|    Mudança de Consultas
 | |
|           Isto involve modificar consultas para obter melhor performance:
 | |
|           
 | |
|           + Criação de índices, incluir expressões e índices parciais
 | |
|           + Utilização o COPY ao invés de múltiplos comandos INSERTs
 | |
|           + Agrupamento de múltiplos comandos em uma única transação para
 | |
|             diminuir a despesa com efetivações (commit)
 | |
|           + Utilização do CLUSTER quando recuperar vários registros de um
 | |
|             índice
 | |
|           + Utilização do LIMIT para retornar um subconjunto da saída da
 | |
|             consulta
 | |
|           + Utilização de Consultas preparadas
 | |
|           + Utilização de ANALYZE para manter as estatísticas do
 | |
|             otimizador corretas
 | |
|           + Utilização regular do VACUUM ou pg_autovacuum
 | |
|           + Remoção de índices durante grande mudança de dados
 | |
|             
 | |
|    Configuração do Servidor
 | |
|           Um grande número de configurações que afetam a performance.
 | |
|           Para obter detalhes adicionais, veja Administration
 | |
|           Guide/Server Run-time Environment/Run-time Configuration para
 | |
|           listagem completa, e para comentários veja
 | |
|           http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
 | |
|           nf_e.html e
 | |
|           http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
 | |
|           
 | |
|    Seleção 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 características de depuração estão disponíveis?
 | |
|   
 | |
|    Há muitas variáveis de configuração do servidor log_* que habilitam a
 | |
|    exibição de consultas e estatísticas que podem ser muito úteis para
 | |
|    depuração e medidas de performance.
 | |
|    
 | |
|   3.5) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
 | |
|   
 | |
|    Você atingiu o limite padrão de 100 sessões. 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 atualização do PostgreSQL?
 | |
|   
 | |
|    Veja http://www.postgresql.org/support/versioning para discussão geral
 | |
|    sobre atualizações e
 | |
|    http://www.postgresql.org/docs/current/static/install-upgrading.html
 | |
|    para instruções específicas.
 | |
|    
 | |
|   3.7) Que tipo de hardware eu devo usar?
 | |
|   
 | |
|    Por causa do hardware de PC ser em sua maioria compatível, pessoas
 | |
|    tendem a acreditar que todos os hardwares de PC são de mesma
 | |
|    qualidade. Não é verdade. ECC RAM, SCSI e placas mãe de qualidade são
 | |
|    mais confiáveis e têm 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 opções de hardware. Nossas listas de discussão podem ser
 | |
|    usadas para discutir opções de hardware e dilemas.
 | |
|      _________________________________________________________________
 | |
|    
 | |
|                            Perguntas Operacionais
 | |
|                                       
 | |
|   4.1) Como eu faço um SELECT somente dos primeiros registros de uma consulta?
 | |
|   Um registro randômico?
 | |
|   
 | |
|    Para obter somente alguns registros, se você sabe o número de
 | |
|    registros necessários ao executar o SELECT utilize o LIMIT. Se um
 | |
|    índice corresponde no ORDER BY é possível que a consulta toda não
 | |
|    tenha que ser executada. Se você não sabe o número de registros ao
 | |
|    executar o SELECT, utilize um cursor e o FETCH.
 | |
|    
 | |
|    Para obter um registro randômico, utilize:
 | |
|     SELECT col
 | |
|     FROM tab
 | |
|     ORDER BY random()
 | |
|     LIMIT 1;
 | |
| 
 | |
|   4.2) Como eu descubro quais tabelas, índices, bancos de dados e usuários
 | |
|   estão 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 código-fonte do psql no arquivo
 | |
|    pgsql/src/bin/psql/describe.c, ele contém os comandos SQL que geram a
 | |
|    saída para os comandos de contrabarra do psql. Você também pode
 | |
|    iniciar o psql com a opção -E para que as consultas utilizadas para
 | |
|    executar os comandos que você informou seja exibida. O PostgreSQL
 | |
|    também fornece uma inteface compatível com SQL do INFORMATION SCHEMA
 | |
|    que você pode consultar para obter informação sobre o banco de dados.
 | |
|    
 | |
|    Há também tabelas do sistema que começam com pg_ que os descrevem
 | |
|    também.
 | |
|    
 | |
|    Utilizando o psql -l listará todos os bancos de dados.
 | |
|    
 | |
|    Veja também o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
 | |
|    muitos dos comandos SELECTs necessários para obter informação 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 versão
 | |
|    8.0 ou superior com ALTER TABLE ALTER COLUMN TYPE.
 | |
|    
 | |
|    Em versões anteriores, faça 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 então querer fazer um VACUUM FULL tab para recuperar o
 | |
|    espaço em disco utilizado pelos registros expirados.
 | |
|    
 | |
|   4.4) Qual é o tamanho máximo de um registro, uma tabela e um banco de dados?
 | |
|   
 | |
|    Estes são os limites:
 | |
|    
 | |
|    Tamanho máximo de um banco de dados? ilimitado (existem bancos de
 | |
|    dados de 32 TB)
 | |
|    Tamanho máximo de uma tabela? 32 TB
 | |
|    Tamanho máximo de um registro? 400 GB
 | |
|    Tamanho máximo de um campo? 1 GB
 | |
|    Número máximo de registros em uma tabela? ilimitado
 | |
|    Número máximo de colunas em uma tabela? 250-1600 dependendo dos tipos
 | |
|    das colunas
 | |
|    Número máximo de índices em uma tabela? ilimitado
 | |
|    
 | |
|    É claro, que eles não são ilimitados, mas limitados ao espaço em disco
 | |
|    disponível e espaço em memória/swap. A Performance será penalizada
 | |
|    quando estes valores se tornarem grandes.
 | |
|    
 | |
|    O tamanho máximo de uma tabela com 32 TB não requer suporte a arquivos
 | |
|    grandes do sistema operacional. Tabelas grandes são armazenadas como
 | |
|    múltiplos arquivos de 1 GB então o limite do sistema de arquivos não é
 | |
|    importante.
 | |
|    
 | |
|    O tamanho máximo de uma tabela, o tamanho de um registro e o número
 | |
|    máximo de colunas podem ser quadruplicados aumentando-se o tamanho
 | |
|    padrão do bloco para 32k. O tamanho máximo de uma tabela pode também
 | |
|    ser aumentado utilizando particionamento de tabela.
 | |
|    
 | |
|    Uma limitação é que índices não podem ser criados em colunas maiores
 | |
|    do que 2.000 caracteres. Felizmente, tais índices são raramente
 | |
|    necessários. Unicidade é melhor garantida por um índice de uma função
 | |
|    de um hash MD5 de uma coluna longa, e indexação de texto longo permite
 | |
|    a busca de palavras dentro da coluna.
 | |
|    
 | |
|   4.5) Quanto espaço em disco é necessário para armazenar dados de um arquivo
 | |
|   texto?
 | |
|   
 | |
|    Um banco de dados PostgreSQL irá requerer até cinco vezes a quantidade
 | |
|    de espaço requerida para armazenar dados em um arquivo texto.
 | |
|    
 | |
|    Como um exemplo, considere um arquivo com 100.000 linhas contendo um
 | |
|    inteiro e uma descrição em cada linha. Suponha que o tamanho médio da
 | |
|    descrição é de vinte bytes. O arquivo terá 2,8 MB. O tamanho do
 | |
|    arquivo do banco de dados PostgreSQL que contém esses dados pode ser
 | |
|    estimado em 5,2 MB:
 | |
|     24 bytes: cada cabeçalho de registro (aproximadamente)
 | |
|     24 bytes: um campo int e um campo texto
 | |
|    + 4 bytes: ponteiro na página para a tupla
 | |
|    -------------------------------------------
 | |
|     52 bytes por registro
 | |
| 
 | |
|    O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
 | |
| 
 | |
|    8192 bytes por página
 | |
|    ------------------------   =  158 registros por página do banco de dados (arredondado para baixo)
 | |
|      52 bytes por registro
 | |
| 
 | |
|    100000 registros de dados
 | |
|    ----------------------------  =  633 páginas do banco de dados (arredondadopara cima)
 | |
|       158 registros por página
 | |
| 
 | |
| 633 páginas do banco de dados * 8192 bytes por página  =  5.185.536 bytes (5,2MB)
 | |
| 
 | |
|    Índices não requerem muito espaço, mas contém dados que foram
 | |
|    indexados, então eles podem ocupar algum espaço.
 | |
|    
 | |
|    NULLs são armazenados como bitmaps, então eles utilizam muito pouco
 | |
|    espaço.
 | |
|    
 | |
|   4.6) Por que minhas consultas estão lentas? Por que elas não estão utilizando
 | |
|   meus índices?
 | |
|   
 | |
|    Índices não são utilizados por toda consulta. Índices são utilizados
 | |
|    somente se a tabela é maior do que um tamanho mínimo, e a consulta
 | |
|    seleciona somente uma pequena porcentagem dos registros da tabela.
 | |
|    Isto porque o acesso randômico 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 estatísticas sobre a tabela. Estas estatísticas são coletadas
 | |
|    utilizando o VACUUM ANALYZE ou simplesmente o ANALYZE. Utilizando
 | |
|    estatísticas, o otimizador sbae quantos registros estão na tabela, e
 | |
|    pode melhor determinar se índices deveriam ser utilizados.
 | |
|    Estatísticas também são úteis para determinar a ordem de junção ótima
 | |
|    e métodos de junção. Coleção de estatísticas deveriam ser feitas
 | |
|    periodicamente a medida que o conteúdo da tabela muda.
 | |
|    
 | |
|    Índices não são normalmente utilizados para ORDER BY ou para fazer
 | |
|    junções. Uma busca sequencial seguido por uma ordenação explícita é
 | |
|    geralmente mais rápida do que uma busca indexada em uma tabela grande.
 | |
|    Contudo, LIMIT combinado com ORDER BY frequentemente utilizará índice
 | |
|    porque somente uma pequena porção 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 rápida.
 | |
|    
 | |
|    Ao utilizar operadores curinga tais como LIKE ou ~, índices podem ser
 | |
|    utilizados somente em algumas condições:
 | |
|      * O início da cadeia de caracteres da busca deve ser iniciar com uma
 | |
|        cadeia de caracteres, i.e.
 | |
|           + modelos LIKE não devem iniciar com %.
 | |
|           + modelos ~ (expressões regulares) devem iniciar com ^.
 | |
|      * A cadeia de caracteres utilizada na busca não pode iniciar com a
 | |
|        classe de caracteres e.g. [a-e].
 | |
|      * Busca que não diferenciam maiúsculas de minúsculas tais como ILIKE
 | |
|        e ~* não utilizam índices. Em vez disso, utilize índice de
 | |
|        expressão, que é descrito na seção 4.8.
 | |
|      * O idioma padrão C deve ser usando durante o initdb porque não é
 | |
|        possível saber o próximo caracter em idiomas que não sejam o C.
 | |
|        Você pode criar um índice especial text_pattern_ops para tais
 | |
|        casos que funcionam somente para indexação com LIKE. Também é
 | |
|        possível utilizar indexação de busca textual para buscas por
 | |
|        palavras.
 | |
|        
 | |
|    Em versões anteriores a 8.0, índices frequentemente não 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 faço buscas com expressões regulares e buscas com expressões
 | |
|   regulares sem diferenciar maiúsculas de minúsculas? Como eu utilizo um índice
 | |
|   para buscas que não diferenciam maiúsculas de minúsculas?
 | |
|   
 | |
|    O operador ~ faz avaliação de expressões regulares, e ~* faz avaliação
 | |
|    não sensível a maiúsculas de expressões regulares. A variante não
 | |
|    sensível a maiúsculas do LIKE é chamada de ILIKE.
 | |
|    
 | |
|    Comparações de igualdade não sensíveis a maiúsculas são normalmente
 | |
|    expressadas como:
 | |
|     SELECT *
 | |
|     FROM tab
 | |
|     WHERE lower(col) = 'abc';
 | |
| 
 | |
|    Isso não irá utilizar o índice padrão. Contudo, se você criar um
 | |
|    índice de expressão, ele será utilizado:
 | |
|     CREATE INDEX tabindex ON tab (lower(col));
 | |
| 
 | |
|    Se o índice acima é criado como UNIQUE, embora a coluna possa
 | |
|    armazenar caracteres maiúsculos e minúsculos, ele não pode ter valores
 | |
|    idênticos que diferem apenas em letras maiúsculas e minúsculas. Para
 | |
|    forçar uma letra maiúscula ou minúscula a ser armazenada na coluna,
 | |
|    utilize uma restrição CHECK ou um gatilho.
 | |
|    
 | |
|   4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu posso
 | |
|   concatenar possíveis NULLs? Como eu posso ordenar por um campo que é NULL ou
 | |
|   não?
 | |
|   
 | |
|    Você testa a coluna com IS NULL e IS NOT NULL, como a seguir:
 | |
|    SELECT *
 | |
|    FROM tab
 | |
|    WHERE col IS NULL;
 | |
| 
 | |
|    Para concatenar com possíveis 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 cláusula ORDER BY. Coisas que são verdadeiro serão
 | |
|    ordenadas acima das coisas que são falso, então a consulta a seguir
 | |
|    irá colocar entradas NULL no início da lista de resultados:
 | |
|    SELECT *
 | |
|    FROM tab
 | |
|    ORDER BY (col IS NOT NULL)
 | |
| 
 | |
|   4.10) Qual é a diferença entre os vários tipos de dado de caracteres?
 | |
|   
 | |
|    Tipo Nome Interno Observação
 | |
|    VARCHAR(n) varchar tamanho especifica o tamanho máximo, sem
 | |
|    preenchimento
 | |
|    CHAR(n) bpchar preenchimento em branco para comprimento fixo
 | |
|    específico
 | |
|    TEXT text nenhum limite superior específico no comprimento
 | |
|    BYTEA bytea vetor de bytes de comprimento variável (seguro a byte
 | |
|    nulo)
 | |
|    "char" char um caracter
 | |
|    
 | |
|    Você verá o nome interno quando examinar o catálogo do sistema e em
 | |
|    algumas mensagens de erro.
 | |
|    
 | |
|    Os primeiros quatro tipos acima são do tipo "varlena" (i.e., os
 | |
|    primeiros quatro bytes no disco são o comprimento seguido pelos
 | |
|    dados). Consequentemente o espaço atual utilizado é ligeiramente maior
 | |
|    do que o tamanho declarado. Contudo, valores longos são também
 | |
|    sujeitos a compressão, então o espaço em disco pode também ser bem
 | |
|    menor do que o esperado.
 | |
|    VARCHAR(n) é melhor quando está armazenando cadeias de caracteres de
 | |
|    comprimento variável e há um limite de tamanho desta cadeia. TEXT é
 | |
|    para cadeias de caracteres de comprimento ilimitado, com o máximo de
 | |
|    um gigabyte.
 | |
|    
 | |
|    CHAR(n) é para armazenar cadeias de caracteres que são todas do mesmo
 | |
|    tamanho. CHAR(n) preenche com espaços em branco até o tamanho
 | |
|    especificado, enquanto o VARCHAR(n) armazena somente os caracteres
 | |
|    fornecidos. BYTEA é para armazenar dados binários, particularmente
 | |
|    valores que incluem bytes NULL. Todos os tipos descritos aqui tem
 | |
|    características 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 sequência. 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
 | |
|     );
 | |
| 
 | |
|    Sequências automaticamente criadas são nomeadas como
 | |
|    <tabela>_<colunaserial>_seq, onde tabela e colunaserial são os nomes
 | |
|    da tabela e da coluna serial, respectivamente. Veja a página sobre
 | |
|    create_sequence no manual para obter informações adicionais sobre
 | |
|    sequências.
 | |
|    
 | |
|   4.11.2) Como eu consigo o valor de um campo SERIAL?
 | |
|   
 | |
|    A maneira mais simples de obter o próximo valor SERIAL de uma
 | |
|    sequência é com RETURNING. Utilizando o exemplo da tabela em 4.11.1,
 | |
|    ele ficaria assim:
 | |
|     INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;
 | |
| 
 | |
|    Você também pode chamar nextval() e utilizar o valor no INSERT ou
 | |
|    chamar currval() após o INSERT.
 | |
|    
 | |
|   4.11.3) currval() não lida com condição de corrida com outros usuários?
 | |
|   
 | |
|    Não. currval() retorna o valor atual atribuido pela sua sessão, e não
 | |
|    por todas as sessões.
 | |
|    
 | |
|   4.11.4) Por que os números da minha sequência não são reutilizados quando uma
 | |
|   transação é abortada? Por que há intervalos nos números da minha
 | |
|   sequência/coluna SERIAL?
 | |
|   
 | |
|    Para melhorar a concorrência, valores da sequência são atribuídos a
 | |
|    transações correntes e não são travados até que a transação seja
 | |
|    finalizada. Isso causa intervalos na numeração por causa de transações
 | |
|    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 são automaticamente atribuídos como inteiros de 4 bytes
 | |
|    que são únicos ao longo de toda instalação. Contudo, eles são
 | |
|    limitados em 4 bilhões e, então, os OIDs começam a ser duplicados. O
 | |
|    PostgreSQL utiliza OIDs para ligar as tabelas do sistema.
 | |
|    
 | |
|    Para numerar registros nas tabelas do usuários, é melhor utilizar
 | |
|    SERIAL ao invés de OIDs porque sequências SERIAL são únicas somente em
 | |
|    uma tabela; e são menos propícias a atingir o limite. SERIAL8 está
 | |
|    disponível para armazenar valores de sequências com oito bytes.
 | |
|    
 | |
|    CTIDs são utilizados para identificar registros físicos específicos
 | |
|    com valores de block e deslocamento. CTIDs mudam após registros serem
 | |
|    modificados ou recarregados. Eles são utilizados por índices para
 | |
|    apontar registros físicos.
 | |
|    
 | |
|   4.13) Por que eu recebo o erro "ERROR: Memory exhausted in AllocSetAlloc()"?
 | |
|   
 | |
|    Você provavelmente está sem memória virtual no seu sistema, ou o seu
 | |
|    núcleo (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 versão do PostgreSQL eu estou utilizando?
 | |
|   
 | |
|    No psql, digite SELECT version();
 | |
|    
 | |
|   4.15) Como eu crio uma coluna que conterá por padrão a hora atual?
 | |
|   
 | |
|    Utilize CURRENT_TIMESTAMP:
 | |
|         CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP);
 | |
| 
 | |
|   4.16) Como eu faço uma junção externa (outer join)?
 | |
|   
 | |
|    PostgreSQL suporta junções externas utilizando a sintaxe padrão 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 indênticas juntam t1.col com t2.col, e também
 | |
|    retornam qualquer registro que não foi juntado em t1 (aqueles que não
 | |
|    combinaram com t2). Uma junção a direita RIGHT adicionaria registros
 | |
|    que não foram juntados da tabela t2. Uma junção completa (FULL)
 | |
|    retornaria os registros combinados mais todos os registros não
 | |
|    combinados de t1 e t2. A palavra OUTER é opcional e é assumida nas
 | |
|    junções LEFT, RIGHT e FULL. Junções ordinárias são chamadas junções
 | |
|    internas (INNER).
 | |
|    
 | |
|   4.17) Como eu faço consultas utilizando múltiplos bancos de dados?
 | |
|   
 | |
|    Não há outra maneira de consultar um banco de dados caso ele não seja
 | |
|    o atual. Porque o PostgreSQL carrega catálogos do sistema específicos
 | |
|    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 funções. É claro, que um cliente pode fazer
 | |
|    conexões simultâneas em bancos de dados diferentes e juntar os
 | |
|    resultados no cliente.
 | |
|    
 | |
|   4.18) Como eu retorno múltiplos registros ou colunas de uma função?
 | |
|   
 | |
|    É fácil utilizando funções 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 temporárias em funções PL/PgSQL?
 | |
|   
 | |
|    Em versões do PostgreSQL < 8.3, PL/PgSQL armazena o conteúdo da
 | |
|    função, e o efeito indesejado é que se uma função PL/PgSQL acessa uma
 | |
|    tabela temporária, e aquela tabela é removida e criada novamente, e a
 | |
|    função é chamada novamente, a função irá falhar porque o conteúdo
 | |
|    armazenado da função ainda apontará para a tabela temporária antiga. A
 | |
|    solução é utilizar o EXECUTE para acesso a tabelas temporárias no
 | |
|    PL/PgSQL. Isto irá fazer com que a consulta seja avaliada toda vez.
 | |
|    
 | |
|    Este problema não ocorre no PostgreSQL 8.3 ou superior.
 | |
|    
 | |
|   4.20) Quais soluções de replicação estão disponíveis?
 | |
|   
 | |
|    Embora "replicação" seja um termo simples, há várias tecnologias para
 | |
|    fazer replicação, com vantagens e desvantagens para cada um.
 | |
|    
 | |
|    Replicação mestre/escravo permite que um mestre receba consultas de
 | |
|    leitura e escrita, enquanto os escravos só podem aceitar
 | |
|    leitura/consultas SELECT. A solução mais popular de replicação
 | |
|    mestre-escravo para PostgreSQL disponível livremente é Slony-I.
 | |
|    
 | |
|    Replicação com múltiplos mestres permite que consultas leitura/escrita
 | |
|    sejam enviadas para múltiplos computadores replicadores. Esta
 | |
|    capacidade também tem um sério impacto na performance por causa da
 | |
|    necessidade de sincronizar as mudanças entre os servidores. PGCluster
 | |
|    é a solução mais popular disponível livremente para PostgreSQL.
 | |
|    
 | |
|    Há também soluções de replicação comerciais e baseadas em hardware
 | |
|    disponíveis que suportam uma variedade de modelos de replicação.
 | |
|    
 | |
|   4.21) Por que os nomes de minhas tabelas e colunas não são reconhecidos em
 | |
|   minha consulta? Por que as maiúsculas não são preservadas?
 | |
|   
 | |
|    A causa mais comum de nomes desconhecidos é o uso de aspas ao redor
 | |
|    dos nomes da tabela ou coluna durante a criação da tabela. Ao utilizar
 | |
|    aspas, nomes de tabela e coluna (chamados de identificadores) são
 | |
|    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 criação da tabela. Então, para identificadores serem
 | |
|    reconhecidos, você deve:
 | |
|      * Evitar colocar aspas no identificador ao criar tabelas
 | |
|      * Utilizar somente caracteres minúsculos em identificadores
 | |
|      * Colocar aspas em identificadores ao referenciá-los nas consultas
 |