mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
943 lines
56 KiB
HTML
943 lines
56 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<HTML>
|
||
<HEAD>
|
||
<META name="generator" content="HTML Tidy, see www.w3.org">
|
||
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||
<TITLE>FAQ do PostgreSQL</TITLE>
|
||
</HEAD>
|
||
|
||
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
|
||
alink="#0000ff">
|
||
<H1>Perguntas Frequentes (FAQ) sobre PostgreSQL</H1>
|
||
|
||
<P>Última atualização: Sex Nov 16 10:53:50 EST 2007</P>
|
||
|
||
<P>Mantenedor atual: Bruce Momjian (<A href=
|
||
"mailto:bruce@momjian.us">bruce@momjian.us</A>)
|
||
</P>
|
||
|
||
<P>Traduzido por: Euler Taveira de Oliveira (<A href=
|
||
"mailto:euler@timbira.com">euler@timbira.com</A>)</P>
|
||
|
||
<P>A versão mais recente desse documento pode ser vista em <A href=
|
||
"http://www.postgresql.org/files/documentation/faqs/FAQ.html">
|
||
http://www.postgresql.org/files/documentation/faqs/FAQ.html</A> (EN).<BR>
|
||
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ_brazilian.html">
|
||
http://www.postgresql.org/files/documentation/faqs/FAQ_brazilian.html</A> (pt_BR).</P>
|
||
|
||
<P>Perguntas sobre plataformas específicas são respondidas em <A href=
|
||
"http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</A>.</P>
|
||
<HR>
|
||
|
||
<H2 align="center">Perguntas Gerais</H2>
|
||
<A href="#item1.1">1.1</A>) O que é PostgreSQL? Como ele é pronunciado?
|
||
O que é Postgres?<BR>
|
||
<A href="#item1.2">1.2</A>) Quem controla o PostgreSQL?<BR>
|
||
<A href="#item1.3">1.3</A>) Qual é a licença do PostgreSQL?<BR>
|
||
<A href="#item1.4">1.4</A>) Quais plataformas o PostgreSQL pode ser executado?<BR>
|
||
<A href="#item1.5">1.5</A>) Onde eu posso conseguir o PostgreSQL?<BR>
|
||
<A href="#item1.6">1.6</A>) Qual é a última versão?<BR>
|
||
<A href="#item1.7">1.7</A>) Onde eu posso conseguir suporte?<BR>
|
||
<A href="#item1.8">1.8</A>) Como eu posso submeter um relato de um bug?<BR>
|
||
<A href="#item1.9">1.9</A>) Como eu posso saber quais são os bugs conhecidos ou características ausentes?<BR>
|
||
<A href="#item1.10">1.10</A>) Que documentação está disponível?<BR>
|
||
<A href="#item1.11">1.11</A>) Como eu posso aprender <SMALL>SQL</SMALL>?<BR>
|
||
<A href="#item1.12">1.12</A>) Como posso submeter uma correção (patch) ou me juntar a equipe de desenvolvimento?<BR>
|
||
<A href="#item1.13">1.13</A>) Como é o PostgreSQL comparado a outros <SMALL>SGBD</SMALL>s?<BR>
|
||
<A href="#item1.14">1.14</A>) O PostgreSQL gerenciar<61> as mudanças de horário devido ao horário de verão em vários países?<BR>
|
||
|
||
|
||
<H2 align="center">Perguntas sobre Clientes</H2>
|
||
<A href="#item2.1">2.1</A>) Quais interfaces estão disponíveis para PostgreSQL?<BR>
|
||
<A href="#item2.2">2.2</A>) Quais ferramentas estão disponíveis para utilizar o PostgreSQL com páginas Web?<BR>
|
||
<A href="#item2.3">2.3</A>) O PostgreSQL tem interfaces gráficas para interagir com usuário?<BR>
|
||
|
||
|
||
<H2 align="center">Perguntas Administrativas</H2>
|
||
<A href="#item3.1">3.1</A>) Como eu instalo o PostgreSQL em um local diferente de <I>/usr/local/pgsql</I>?<BR>
|
||
<A href="#item3.2">3.2</A>) Como eu controlo conexões de outras máquinas?<BR>
|
||
<A href="#item3.3">3.3</A>) Como eu ajusto o servidor de banco de dados para obter uma performance melhor?<BR>
|
||
<A href="#item3.4">3.4</A>) Quais características de depuração estão disponíveis?<BR>
|
||
<A href="#item3.5">3.5</A>) Por que eu recebo <I>"Sorry, too many clients"</I> quando eu tento conectar?<BR>
|
||
<A href="#item3.6">3.6</A>) Qual é o processo de atualização do PostgreSQL?<BR>
|
||
<A href="#item3.7">3.7</A>) Que tipo de hardware eu devo usar?<BR>
|
||
|
||
|
||
<H2 align="center">Perguntas Operacionais</H2>
|
||
<A href="#item4.1">4.1</A>) Como eu faço um <SMALL>SELECT</SMALL> somente dos primeiros registros de uma consulta? Um registro randômico?<BR>
|
||
<A href="#item4.2">4.2</A>) Como eu descubro quais tabelas, índices, bancos de dados e usuários estão definidos? Como eu vejo as consultas utilizadas pelo <I>psql</I> para mostrá-los?<BR>
|
||
<A href="#item4.3">4.3</A>) Como você muda o tipo de dado de uma coluna?<BR>
|
||
<A href="#item4.4">4.4</A>) Qual é o tamanho máximo de um registro, uma tabela e um banco de dados?<BR>
|
||
<A href="#item4.5">4.5</A>) Quanto espaço em disco é necessário para armazenar dados de um arquivo texto?<BR>
|
||
<A href="#item4.6">4.6</A>) Por que minhas consultas estão lentas? Por que elas não estão utilizando meus índices?<BR>
|
||
<A href="#item4.7">4.7</A>) Como eu vejo como o otimizador de consultas está avaliando minha consulta?<BR>
|
||
<A href="#item4.8">4.8</A>) 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?<BR>
|
||
<A href="#item4.9">4.9</A>) Em uma consulta, como eu detecto se um campo é <SMALL>NULL</SMALL>? Como eu posso concatenar possíveis <SMALL>NULL</SMALL>s? Como eu posso ordenar por um campo que é <SMALL>NULL</SMALL> ou não?<BR>
|
||
<A href="#item4.10">4.10</A>) Qual é a diferença entre os vários tipos de dado de caracteres?<BR>
|
||
<A href="#item4.11.1">4.11.1</A>) Como eu crio um campo serial/auto incremento?<BR>
|
||
<A href="#item4.11.2">4.11.2</A>) Como eu consigo o valor de um campo
|
||
<SMALL>SERIAL</SMALL>?<BR>
|
||
<A href="#item4.11.3">4.11.3</A>) <I>currval()</I> não lida com condição de corrida com outros usuários?<BR>
|
||
<A href="#item4.11.4">4.11.4</A>) 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?<BR>
|
||
<A href="#item4.12">4.12</A>) O que é um <SMALL>OID</SMALL>? O que é um <SMALL>CTID</SMALL>?<BR>
|
||
<A href="#item4.13">4.13</A>) Por que eu recebo o erro <I>"ERROR: Memory exhausted in AllocSetAlloc()"</I>?<BR>
|
||
<A href="#item4.14">4.14</A>) Como eu informo qual versão do PostgreSQL eu estou utilizando?<BR>
|
||
<A href="#item4.15">4.15</A>) Como eu crio uma coluna que conterá por padrão a hora atual?<BR>
|
||
<A href="#item4.16">4.16</A>) Como eu faço uma junção externa (outer join)?<BR>
|
||
<A href="#item4.17">4.17</A>) Como eu faço consultas utilizando múltiplos bancos de dados?<BR>
|
||
<A href="#item4.18">4.18</A>) Como eu retorno múltiplos registros ou colunas de uma função?<BR>
|
||
<A href="#item4.19">4.19</A>) Por que eu obtenho erros "relation with OID ######
|
||
does not exist" ao acessar tabelas temporárias em funções PL/PgSQL?<BR>
|
||
<A href="#item4.20">4.20</A>) Quais soluções de replicação estão disponíveis?<BR>
|
||
<A href="#item4.21">4.21</A>) 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?<BR>
|
||
|
||
|
||
<HR>
|
||
|
||
<H2 align="center">Perguntas Gerais</H2>
|
||
|
||
<H3 id="item1.1">1.1) O que é PostgreSQL? Como ele é pronunciado? O que é Postgres?</H3>
|
||
|
||
<P>PostgreSQL é pronunciado <I>Post-Gres-Q-L</I>.
|
||
(Para os curiosos que querem saber como se diz "PostgreSQL", um
|
||
<a href="http://www.postgresql.org/files/postgresql.mp3">arquivo de áudio</a> está disponível).</P>
|
||
|
||
<P>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 <SMALL>SGBD</SMALL>s de próxima geração.
|
||
PostgreSQL é livre e o código-fonte completo está disponível.</P>
|
||
|
||
<P>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 <A href=
|
||
"http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
|
||
http://www.postgresql.org/docs/faqs.FAQ_DEV.html</A>
|
||
</P>
|
||
|
||
<P>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'.</P>
|
||
|
||
<H3 id="item1.2">1.2) Quem controla o PostgreSQL?<BR></H3>
|
||
|
||
<P>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 <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
|
||
FAQ do desenvolvedor</A> para obter informações como se envolver com o
|
||
desenvolvimento do PostgreSQL.</P>
|
||
|
||
<H3 id="item1.3">1.3) Qual é a licença do PostgreSQL?</H3>
|
||
|
||
<P>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:</P>
|
||
<P>PostgreSQL está sujeito a seguinte licença:</P>
|
||
|
||
<P>PostgreSQL Data Base Management System</P>
|
||
|
||
<P>Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||
Portions Copyright (c) 1994-1996 Regents of the University of California</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<H3 id="item1.4">1.4) Quais plataformas o PostgreSQL pode ser executado?</H3>
|
||
|
||
<P>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.</P>
|
||
|
||
<P>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 <a href= "http://pgfoundry.org/projects/pginstaller">
|
||
http://pgfoundry.org/projects/pginstaller</a>. Versões do Windows baseadas no MS-DOS
|
||
(Win95, Win98, WinMe) podem executar o PostgreSQL utilizando o Cygwin.</P>
|
||
|
||
<p>Há também uma versão para o Novell Netware 6 em
|
||
<a href="http://forge.novell.com">http://forge.novell.com</a>
|
||
e uma versão para OS/2 (eComStation) em <a href=
|
||
"http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F">
|
||
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F</a>.</p>
|
||
|
||
<H3 id="item1.5">1.5) Onde eu posso conseguir o PostgreSQL?</H3>
|
||
|
||
<P>Via navegador web, utilize <a href="http://www.postgresql.org/ftp/">
|
||
http://www.postgresql.org/ftp/</a> e via ftp, utilize
|
||
<A href="ftp://ftp.postgresql.org/pub/">
|
||
ftp://ftp.postgresql.org/pub/</A>.</P>
|
||
|
||
|
||
<H3 id="item1.6">1.6) Qual é a última versão?</H3>
|
||
|
||
<P>A última versão do PostgreSQL é a versão 8.2.5.</P>
|
||
|
||
<P>Nós planejamos lançar versões novas a cada ano com versões
|
||
corretivas em alguns meses.</P>
|
||
|
||
<H3 id="item1.7">1.7) Onde eu posso conseguir suporte?</H3>
|
||
|
||
<P>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 é <a href="http://www.postgresql.org/community/lists/">
|
||
http://www.postgresql.org/community/lists/</a>. As listas <I>general</I>
|
||
e <I>bugs</I> são um bom lugar para início.</P>
|
||
|
||
<P>O principal canal de IRC é o <I>#postgresql</I> na Freenode (<I>irc.freenode.net</I>). Para se conectar você pode utilizar o comando Unix <code>irc -c '#postgresql' "$USER" irc.freenode.net</code> ou utilizar qualquer outro cliente de IRC. Um canal hispânico (<I>#postgresql-es</I>) e um francês (<I>#postgresqlfr</I>) também existem na mesma rede. Há também um canal PostgreSQL na EFNet.</P>
|
||
|
||
<P>Uma lista de empresas que prestam suporte comercial está disponível em <A href=
|
||
"http://www.postgresql.org/support/professional_support">
|
||
http://www.postgresql.org/support/professional_support</A>.</P>
|
||
|
||
<H3 id="item1.8">1.8) Como eu informo a existência de um bug?</H3>
|
||
|
||
<P>Visite o formulário que reporta bugs do PostgreSQL em <A href=
|
||
"http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</A>.</P>
|
||
<P>Verifique também o nosso ftp <A href=
|
||
"ftp://ftp.postgresql.org/pub">ftp://ftp.postgresql.org/pub</A> para
|
||
ver se há uma versão mais recente do PostgreSQL.</P>
|
||
|
||
<P>Bugs submetidos utilizando o formulário ou informado a qualquer
|
||
lista de discussão do PostgreSQL tipicamente gera uma das seguintes
|
||
respostas:</P>
|
||
<ul>
|
||
<li>Não é um bug e o porquê</li>
|
||
<li>É um bug conhecido e já está na lista de
|
||
<A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
|
||
<li>O bug foi corrigido na versão atual</li>
|
||
<li>O bug foi corrigido mas não foi empacotado em um versão oficial</li>
|
||
<li>Um pedido foi feito para obter informações detalhadas:
|
||
<ul>
|
||
<li>Sistema Operacional</li>
|
||
<li>Versão do PostgreSQL</li>
|
||
<li>Exemplo de teste que reproduz o bug</li>
|
||
<li>Informações sobre depuração</li>
|
||
<li>Saída reconstituidora de vestígios (backtrace) do depurador</li>
|
||
</ul>
|
||
</li>
|
||
<li>O bug é novo. O seguinte pode ocorrer:
|
||
<ul>
|
||
<li>Uma correção é criada e será incluída na próxima versão</li>
|
||
<li>O bug não pode ser corrigido imediatamente e é adicionado
|
||
a lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<H3 id="item1.9">1.9) Como eu posso saber quais são os bugs conhecidos
|
||
ou funcionalidades ausentes?</H3>
|
||
|
||
<P>O PostgreSQL suporta um subconjunto extendido do <SMALL>SQL:2003</SMALL>.
|
||
Veja nossa lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A>
|
||
que contém bugs conhecidos, funcionalidades ausentes e planos futuros.</P>
|
||
|
||
<P>Uma solicitação de funcionalidade geralmente resulta em uma das
|
||
seguintes respostas:</P>
|
||
<ul>
|
||
<li>A funcionalidade já está na lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
|
||
<li>A funcionalidade não é desejável porque:
|
||
<ul>
|
||
<li>Ela duplica uma funcionalidade existente que já segue o
|
||
padrão SQL</li>
|
||
<li>A funcionalidade aumentará a complexidade do código mas
|
||
adicionará pouco benefício</li>
|
||
<li>A funcionalidade será insegura ou não-confiável</li>
|
||
</ul>
|
||
</li>
|
||
<li>A nova funcionalidade é adicionada a lista de
|
||
<A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
|
||
</ul>
|
||
|
||
<P>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 <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A>
|
||
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
|
||
<a href="http://www.postgresql.org/developer/sourcecode/">CVS</a>. Até mesmo
|
||
as notas de lançamento não listam todas as mudanças feitas no programa.</P>
|
||
|
||
<H3 id="item1.10">1.10) Que documentação está disponível?</H3>
|
||
|
||
<P>O PostgreSQL inclui vasta documentação, incluindo um manual extenso,
|
||
páginas de manuais (man pages) e alguns exemplos teste. Veja o diretório
|
||
<I>/doc</I>. Você também pode pesquisar os manuais online em <A href=
|
||
"http://www.postgresql.org/docs">http://www.postgresql.org/docs</A>.
|
||
</P>
|
||
|
||
<P>Há dois livros sobre PostgreSQL disponíveis online em <A href=
|
||
"http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</A>
|
||
e <A href=
|
||
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
|
||
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 <A href=
|
||
"http://www.postgresql.org/docs/books/">http://www.postgresql.org/docs/books/</A>.
|
||
Há também uma coleção de artigos técnicos sbore PostgreSQL em <A href="http://www.postgresql.org/docs/techdocs/">http://www.postgresql.org/docs/techdocs/</A>.</P>
|
||
|
||
<P>O programa cliente de linha de comando <I>psql</I> tem alguns comandos \d para
|
||
mostrar informações sobre tipos, operadores, funções, agregações, etc. - utilize \?
|
||
para mostrar os comandos disponíveis.</P>
|
||
|
||
<P>Nosso sítio web contém ainda mais documentação.</P>
|
||
|
||
<H3 id="item1.11">1.11) Como eu posso aprender <SMALL>SQL</SMALL>?</H3>
|
||
|
||
<P>Primeiro, considere os livros específicos sobre PostgreSQL mencionados
|
||
acima. Muitos de nossos usuários gostam do <I>The Practical SQL Handbook</I>,
|
||
Bowman, Judith S., et al., Addison-Wesley. Outros do <I>The
|
||
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
|
||
|
||
<P>Há também bons tutoriais disponíveis online:
|
||
<UL>
|
||
<LI> <A href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</A>
|
||
</LI>
|
||
<LI>
|
||
<A href="http://sqlcourse.com/">http://sqlcourse.com</A>
|
||
</LI>
|
||
<LI>
|
||
<A href="http://www.w3schools.com/sql/default.asp">http://www.w3schools.com/sql/default.asp</A>
|
||
</LI>
|
||
<LI><A href=
|
||
"http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</A>
|
||
</LI>
|
||
</UL>
|
||
|
||
<H3 id="item1.12">1.12) Como posso submeter uma correção (patch) ou me juntar a equipe de desenvolvimento?</H3>
|
||
|
||
<P>Veja a <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
|
||
FAQ do Desenvolvedor</A>.</P>
|
||
|
||
<H3 id="item1.13">1.13) Como é o PostgreSQL comparado a outros <SMALL>SGBD</SMALL>s?</H3>
|
||
|
||
<P>Há várias maneiras de se medir um software: funcionalidades, performance, confiabilidade, suporte e preço.</P>
|
||
|
||
<DL>
|
||
<DT><B>Funcionalidades</B></DT>
|
||
|
||
<DD>PostgreSQL tem muitas características presentes em muitos <SMALL>SGBD</SMALL>s 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).<BR>
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Performance</B></DT>
|
||
|
||
<DD>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.
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Confiabilidade</B></DT>
|
||
|
||
<DD>Nós sabemos que um <SMALL>SGBD</SMALL> 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.<BR>
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Suporte</B></DT>
|
||
|
||
<DD>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, <SMALL>SGBD</SMALL>s 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 <SMALL>SGBD</SMALL>s. Há suporte comercial por incidente disponíveis para aqueles que precisam de um. (Veja <A href="#item1.7">seção 1.7 da FAQ</A>).<BR>
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Preço</B></DT>
|
||
|
||
<DD>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.<BR>
|
||
<BR>
|
||
</DD>
|
||
</DL>
|
||
|
||
<H3 id="item1.14">1.14) O PostgreSQL gerenciará mudanças no horário devido ao horário de verão em vários países?</H3>
|
||
|
||
<P>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.</P>
|
||
|
||
<HR>
|
||
|
||
<H2 align="center">Perguntas sobre Clientes</H2>
|
||
|
||
<H3 id="item2.1">2.1) Quais interfaces estão disponíveis para PostgreSQL?</H3>
|
||
|
||
<p>A instalação do PostgreSQL inclui somente as interfaces <SMALL>C</SMALL> e
|
||
<SMALL>C</SMALL> 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.</P>
|
||
|
||
<P>Algumas linguagens de programação como <SMALL>PHP</SMALL> incluem uma
|
||
interface para PostgreSQL. Interfaces para linguagens como Perl,
|
||
<SMALL>TCL</SMALL>, Python e muitas outras estão disponíveis em
|
||
<a href="http://www.pgfoundry.org">http://www.pgfoundry.org</A>.
|
||
</P>
|
||
|
||
<H3 id="item2.2">2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL com páginas Web?</H3>
|
||
|
||
<P>Uma boa introdução para páginas web que utilizam bancos de dados pode ser vista em:
|
||
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
|
||
|
||
<P>Para integração na Web, PHP (<A
|
||
href="http://www.php.net">http://www.php.net</A>)
|
||
é uma excelente interface.</P>
|
||
|
||
<P>Para casos complexos, muitos usam a Interface Perl e DBD::Pg com CGI.pm
|
||
ou mod_perl.</P>
|
||
|
||
<H3 id="item2.3">2.3) O PostgreSQL tem interfaces gráficas para iteragir com o usuário?</H3>
|
||
|
||
<P>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 <A href="http://www.postgresql.org/docs/techdocs.54">
|
||
Documentação da Comunidade PostgreSQL</A></P>
|
||
|
||
<HR>
|
||
|
||
<H2 align="center">Perguntas Administrativas</H2>
|
||
|
||
<H3 id="item3.1">3.1) Como eu instalo o PostgreSQL em um local diferente de <I>/usr/local/pgsql</I>?</H3>
|
||
|
||
<P>Especifique a opção <I>--prefix</I> quando executar o <I>configure</I>.</P>
|
||
|
||
<H3 id="item3.2">3.2) Como eu controlo conexões de outras máquinas?</H3>
|
||
|
||
<P>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 <I>listen_addresses</I> no <I>postgresql.conf</I>, habilite a autenticação por máquina modificando o arquivo <I>$PGDATA/pg_hba.conf</I> e reinicie o servidor PostgreSQL.</P>
|
||
|
||
<H3 id="item3.3">3.3) Como eu ajusto o servidor de banco de dados para obter uma performance melhor?</H3>
|
||
|
||
<P>Há três grandes áreas para melhorar a performance em potencial:</P>
|
||
|
||
<DL>
|
||
<DT><B>Mudança de Consultas</B></DT>
|
||
|
||
<DD>Isto involve modificar consultas para obter melhor performance:
|
||
<ul>
|
||
<li>Criação de índices, incluir expressões e índices parciais</li>
|
||
<li>Utilização o COPY ao invés de múltiplos comandos <SMALL>INSERT</SMALL>s</li>
|
||
<li>Agrupamento de múltiplos comandos em uma única transação para diminuir
|
||
a despesa com efetivações (commit)</li>
|
||
<li>Utilização do <SMALL>CLUSTER</SMALL> quando recuperar vários registros de
|
||
um índice</li>
|
||
<li>Utilização do <SMALL>LIMIT</SMALL> para retornar um subconjunto da saída
|
||
da consulta</li>
|
||
<li>Utilização de Consultas preparadas</li>
|
||
<li>Utilização de <SMALL>ANALYZE</SMALL> para manter as estatísticas do
|
||
otimizador corretas</li>
|
||
<li>Utilização regular do <SMALL>VACUUM</SMALL> ou <I>pg_autovacuum</I></li>
|
||
<li>Remoção de índices durante grande mudança de dados</li>
|
||
</ul><BR>
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Configuração do Servidor</B></DT>
|
||
|
||
<DD>Um grande número de configurações que afetam a performance.
|
||
Para obter detalhes adicionais, veja <a href=
|
||
"http://www.postgresql.org/docs/current/static/runtime-config.html">
|
||
Administration Guide/Server Run-time Environment/Run-time
|
||
Configuration</a> para listagem completa, e para
|
||
comentários veja <a href=
|
||
"http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">
|
||
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
|
||
e <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">
|
||
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>.
|
||
<BR>
|
||
<BR>
|
||
</DD>
|
||
|
||
<DT><B>Seleção do Hardware</B></DT>
|
||
|
||
<DD>O efeito do hardware na performance é detalhado em
|
||
<a href="http://www.powerpostgresql.com/PerfList/">
|
||
http://www.powerpostgresql.com/PerfList/</a> e <a
|
||
href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">
|
||
http://momjian.us/main/writings/pgsql/hw_performance/index.html</a>.
|
||
<BR>
|
||
<BR>
|
||
</DD>
|
||
</DL>
|
||
|
||
<H3 id="item3.4">3.4) Quais características de depuração estão disponíveis?</H3>
|
||
|
||
<P>Há muitas variáveis de configuração do servidor <CODE>log_*</CODE>
|
||
que habilitam a exibição de consultas e estatísticas que podem ser
|
||
muito úteis para depuração e medidas de performance.</P>
|
||
|
||
<H3 id="item3.5">3.5) Por que eu recebo <I>"Sorry, too many clients"</I> quando eu tento conectar?</H3>
|
||
|
||
<P>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 <I>max_connections</I> no <I>postgresql.conf</I> e
|
||
reiniciando o <I>postmaster</I>.</P>
|
||
|
||
<H3 id="item3.6">3.6) Qual é o processo de atualização do PostgreSQL?</H3>
|
||
|
||
<P>Veja <a
|
||
href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>
|
||
para discuss<73>o geral sobre atualiza<7A><61>es e <a href=
|
||
"http://www.postgresql.org/docs/current/static/install-upgrading.html">
|
||
http://www.postgresql.org/docs/current/static/install-upgrading.html</a>
|
||
para instruções específicas.</P>
|
||
|
||
<H3 id="item3.7">3.7) Que tipo de hardware eu devo usar?</H3>
|
||
|
||
<P>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.</P>
|
||
|
||
<HR>
|
||
|
||
<H2 align="center">Perguntas Operacionais</H2>
|
||
|
||
<H3 id="item4.1">4.1) Como eu faço um <SMALL>SELECT</SMALL> somente dos primeiros registros de uma consulta? Um registro randômico?</H3>
|
||
|
||
<P>Para obter somente alguns registros, se você sabe o número de
|
||
registros necessários ao executar o <SMALL>SELECT</SMALL> utilize
|
||
o <SMALL>LIMIT</SMALL>. Se um índice corresponde no <SMALL>ORDER
|
||
BY</SMALL> é 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
|
||
<SMALL>SELECT</SMALL>, utilize um cursor e o <SMALL>FETCH</SMALL>.</P>
|
||
|
||
<P>Para <SMALL>obter</SMALL> um registro randômico, utilize:</P>
|
||
<PRE>
|
||
SELECT col
|
||
FROM tab
|
||
ORDER BY random()
|
||
LIMIT 1;
|
||
</PRE>
|
||
|
||
<H3 id="item4.2">4.2) Como eu descubro quais tabelas, índices, bancos de dados e usuários estão definidos? Como eu vejo as consultas utilizadas pelo <I>psql</I> para mostrá-los?</H3>
|
||
|
||
<P>Utilize o comando \dt para ver tabelas no <I>psql</I>. Para obter
|
||
uma lista completa dos comandos no psql você pode utilizar \?.
|
||
Alternativamente, você pode ler o código-fonte do <I>psql</I> no arquivo
|
||
<I>pgsql/src/bin/psql/describe.c</I>, ele contém os comandos <SMALL>SQL</SMALL>
|
||
que geram a saída para os comandos de contrabarra do <I>psql</I>. Você
|
||
também pode iniciar o <I>psql</I> com a opção <I>-E</I> para que as consultas
|
||
utilizadas para executar os comandos que você informou seja exibida.
|
||
O PostgreSQL também fornece uma inteface compatível com <SMALL>SQL</SMALL> do
|
||
INFORMATION SCHEMA que você pode consultar para obter informação sobre o
|
||
banco de dados.</P>
|
||
|
||
<P>Há também tabelas do sistema que começam com <I>pg_</I> que os descrevem
|
||
também.</P>
|
||
|
||
<P>Utilizando o <I>psql -l</I> listará todos os bancos de dados.</P>
|
||
|
||
<P>Veja também o arquivo <I>pgsql/src/tutorial/syscat.source</I>. Ele
|
||
ilustra muitos dos comandos <SMALL>SELECT</SMALL>s necessários para obter
|
||
informação das tabelas de sistema do banco de dados.</P>
|
||
|
||
<H3 id="item4.3">4.3) Como você muda o tipo de dado de uma coluna?</H3>
|
||
|
||
<P>Mudar o tipo de dado de uma coluna pode ser feito facilmente na versão 8.0
|
||
ou superior com <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.</P>
|
||
|
||
<P>Em versões anteriores, faça isso:</P>
|
||
<PRE>
|
||
BEGIN;
|
||
ALTER TABLE tab ADD COLUMN col_nova <i>novo_tipo_dado</i>;
|
||
UPDATE tab SET col_nova = CAST(col_antiga AS <i>novo_tipo_dado</i>);
|
||
ALTER TABLE tab DROP COLUMN col_antiga;
|
||
COMMIT;
|
||
</PRE>
|
||
<P>Você pode então querer fazer um <I>VACUUM FULL tab</I> para recuperar
|
||
o espaço em disco utilizado pelos registros expirados.</P>
|
||
|
||
<H3 id="item4.4">4.4) Qual é o tamanho máximo de um registro, uma tabela e um banco de dados?</H3>
|
||
|
||
<P>Estes são os limites:</P>
|
||
<BLOCKQUOTE>
|
||
<TABLE>
|
||
<TR><TD>Tamanho máximo de um banco de dados?</TD><TD>ilimitado (existem bancos de dados de 32 TB)</TD></TR>
|
||
<TR><TD>Tamanho máximo de uma tabela?</TD><TD>32 TB</TD></TR>
|
||
<TR><TD>Tamanho máximo de um registro?</TD><TD>400 GB</TD></TR>
|
||
<TR><TD>Tamanho máximo de um campo?</TD><TD>1 GB</TD></TR>
|
||
<TR><TD>Número máximo de registros em uma tabela?</TD><TD>ilimitado</TD></TR>
|
||
<TR><TD>Número máximo de colunas em uma tabela?</TD><TD>250-1600 dependendo dos tipos das colunas</TD></TR>
|
||
<TR><TD>Número máximo de índices em uma tabela?</TD><TD>ilimitado</TD></TR>
|
||
</TABLE>
|
||
</BLOCKQUOTE>
|
||
|
||
<P>É 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.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<H3 id="item4.5">4.5) Quanto espaço em disco é necessário para armazenar dados de um arquivo texto?</H3>
|
||
|
||
<P>Um banco de dados PostgreSQL irá requerer até cinco vezes a quantidade de espaço requerida para armazenar dados em um arquivo texto.</P>
|
||
|
||
<P>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:</P>
|
||
<PRE>
|
||
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 (arredondado para cima)
|
||
158 registros por página
|
||
|
||
633 páginas do banco de dados * 8192 bytes por página = 5.185.536 bytes (5,2 MB)
|
||
</PRE>
|
||
|
||
<P>Índices não requerem muito espaço, mas contém
|
||
dados que foram indexados, então eles podem ocupar algum espaço.</P>
|
||
|
||
<P><SMALL>NULL</SMALL>s são armazenados como bitmaps, então eles
|
||
utilizam muito pouco espaço.</P>
|
||
|
||
<H3 id="item4.6">4.6) Por que minhas consultas estão lentas? Por que elas não estão utilizando meus índices?</H3>
|
||
|
||
<P>Í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.</P>
|
||
|
||
<P>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
|
||
<SMALL>VACUUM ANALYZE</SMALL> ou simplesmente o <SMALL>ANALYZE</SMALL>.
|
||
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.</P>
|
||
|
||
<P>Índices não são normalmente utilizados para <SMALL>ORDER BY</SMALL> 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, <SMALL>LIMIT</SMALL> combinado com <SMALL>ORDER BY</SMALL>
|
||
frequentemente utilizará índice porque somente uma pequena porção da tabela
|
||
será retornada.</P>
|
||
|
||
<P>Se você acredita que o otimizador está incorreto ao escolher uma busca
|
||
sequencial, utilize <CODE>SET enable_seqscan TO 'off'</CODE> e execute a
|
||
consulta novamente para ver se uma busca indexada é realmente mais rápida.</P>
|
||
|
||
<P>Ao utilizar operadores curinga tais como <SMALL>LIKE</SMALL> ou <I>~</I>,
|
||
índices podem ser utilizados somente em algumas condições:</P>
|
||
<UL>
|
||
<LI>O início da cadeia de caracteres da busca deve ser iniciar com uma
|
||
cadeia de caracteres, i.e.
|
||
<UL>
|
||
<LI>modelos <SMALL>LIKE</SMALL> não devem iniciar com <I>%</I>.</LI>
|
||
<LI>modelos <I>~</I> (expressões regulares) devem iniciar com <I>^</I>.</LI>
|
||
</UL></LI>
|
||
<LI>A cadeia de caracteres utilizada na busca não pode iniciar com a classe de
|
||
caracteres e.g. [a-e].</LI>
|
||
<LI>Busca que não diferenciam maiúsculas de minúsculas tais como <SMALL>ILIKE</SMALL> e
|
||
<I>~*</I> não utilizam índices. Em vez disso, utilize índice de expressão, que
|
||
é descrito na seção <a href="#item4.8">4.8</a>.</LI>
|
||
<LI>O idioma padrão <I>C</I> deve ser usando durante o <i>initdb</i>
|
||
porque não é possível saber o próximo caracter em idiomas que não sejam o C.
|
||
Você pode criar um índice especial <CODE>text_pattern_ops</CODE> para tais casos
|
||
que funcionam somente para indexação com <SMALL>LIKE</SMALL>. Também é
|
||
possível utilizar indexação de busca textual para buscas por palavras.
|
||
</LI>
|
||
</UL>
|
||
|
||
<P>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.</P>
|
||
|
||
<H3 id="item4.7">4.7) Como eu vejo como o otimizador de consulta está avaliando a minha consulta?</H3>
|
||
|
||
<P>Veja o comando <SMALL>EXPLAIN</SMALL> no manual.</P>
|
||
|
||
<H3 id="item4.8">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?</H3>
|
||
|
||
<P>O operador <I>~</I> faz avaliação de expressões regulares,
|
||
e <I>~*</I> faz avaliação não sensível a maiúsculas
|
||
de expressões regulares. A variante não sensível a maiúsculas
|
||
do <SMALL>LIKE</SMALL> é chamada de <SMALL>ILIKE</SMALL>.</P>
|
||
|
||
<P>Comparações de igualdade não sensíveis a maiúsculas
|
||
são normalmente expressadas como:</P>
|
||
<PRE>
|
||
SELECT *
|
||
FROM tab
|
||
WHERE lower(col) = 'abc';
|
||
</PRE>
|
||
Isso não irá utilizar o índice padrão. Contudo, se
|
||
você criar um índice de expressão, ele será utilizado:
|
||
<PRE>
|
||
CREATE INDEX tabindex ON tab (lower(col));
|
||
</PRE>
|
||
<P>Se o índice acima é criado como <SMALL>UNIQUE</SMALL>, 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 <SMALL>CHECK</SMALL> ou um gatilho.</P>
|
||
|
||
<H3 id="item4.9">4.9) Em uma consulta, como eu detecto se um campo é <SMALL>NULL</SMALL>? Como eu posso concatenar possíveis <SMALL>NULL</SMALL>s? Como eu posso ordenar por um campo que é <SMALL>NULL</SMALL> ou não?</H3>
|
||
|
||
<P>Você testa a coluna com <SMALL>IS NULL</SMALL> e <SMALL>IS
|
||
NOT NULL</SMALL>, como a seguir:</P>
|
||
|
||
<PRE>
|
||
SELECT *
|
||
FROM tab
|
||
WHERE col IS NULL;
|
||
</PRE>
|
||
|
||
<P>Para concatenar com possíveis <SMALL>NULL</SMALL>s, utilize <I>COALESCE()</I>, assim:</P>
|
||
<PRE>
|
||
SELECT COALESCE(col1, '') || COALESCE(col2, '')
|
||
FROM tab
|
||
</PRE>
|
||
|
||
<P>Para ordenar pelo status <SMALL>NULL</SMALL>, utilize os modificadores
|
||
<SMALL>IS NULL</SMALL> e <SMALL>IS NOT NULL</SMALL> na sua cláusula
|
||
<SMALL>ORDER BY</SMALL>. Coisas que são <I>verdadeiro</I> serão ordenadas acima
|
||
das coisas que são <I>falso</I>, então a consulta a seguir irá colocar
|
||
entradas NULL no início da lista de resultados:</P>
|
||
|
||
<PRE>
|
||
SELECT *
|
||
FROM tab
|
||
ORDER BY (col IS NOT NULL)
|
||
</PRE>
|
||
|
||
<H3 id="item4.10">4.10) Qual é a diferença entre os vários tipos de dado de caracteres?</H3>
|
||
<BLOCKQUOTE>
|
||
<TABLE>
|
||
<TR><TH>Tipo</TH><TH>Nome Interno</TH><TH>Observação</TH></TR>
|
||
<TR><TD>VARCHAR(n)</TD><TD>varchar</TD><TD>tamanho especifica o tamanho
|
||
máximo, sem preenchimento</TD></TR>
|
||
<TR><TD>CHAR(n)</TD><TD>bpchar</TD><TD>preenchimento em branco para
|
||
comprimento fixo específico</TD></TR>
|
||
<TR><TD>TEXT</TD><TD>text</TD><TD>nenhum limite superior específico no
|
||
comprimento</TD></TR>
|
||
<TR><TD>BYTEA</TD><TD>bytea</TD><TD>vetor de bytes de comprimento variável
|
||
(seguro a byte nulo)</TD></TR>
|
||
<TR><TD>"char"</TD><TD>char</TD><TD>um caracter</TD></TR>
|
||
</TABLE>
|
||
</BLOCKQUOTE>
|
||
|
||
<P>Você verá o nome interno quando examinar o catálogo do sistema e em algumas mensagens de erro.</P>
|
||
|
||
<P>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.</P>
|
||
|
||
<SMALL>VARCHAR(n)</SMALL> é melhor quando está armazenando cadeias de caracteres de comprimento variável e há um limite de tamanho desta cadeia. <SMALL>TEXT</SMALL> é para cadeias de caracteres de comprimento ilimitado, com o máximo de um gigabyte.
|
||
<P><SMALL>CHAR(n)</SMALL> é para armazenar cadeias de caracteres que são todas do mesmo tamanho. <SMALL>CHAR(n)</SMALL> preenche com espaços em branco até o tamanho especificado, enquanto o <SMALL>VARCHAR(n)</SMALL> armazena somente os caracteres fornecidos. <SMALL>BYTEA</SMALL> é para armazenar dados binários, particularmente valores que incluem bytes <SMALL>NULL</SMALL>. Todos os tipos descritos aqui tem características de performance similares.</P>
|
||
|
||
<H3 id="item4.11.1">4.11.1) Como eu crio um campo serial/auto incremento?</H3>
|
||
|
||
<P>PostgreSQL suporta o tipo de dados <SMALL>SERIAL</SMALL>. Ele cria
|
||
automaticamente uma sequência. Por exemplo:</P>
|
||
<PRE>
|
||
CREATE TABLE pessoa (
|
||
id SERIAL,
|
||
nome TEXT
|
||
);
|
||
</PRE>
|
||
|
||
é automaticamente traduzido em:
|
||
<PRE>
|
||
CREATE SEQUENCE pessoa_id_seq;
|
||
CREATE TABLE pessoa (
|
||
id INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
|
||
nome TEXT
|
||
);
|
||
</PRE>
|
||
|
||
<P>Sequências automaticamente criadas são nomeadas como
|
||
<<i>tabela</i>>_<<i>colunaserial</i>>_<i>seq</i>, onde
|
||
<i>tabela</i> e <i>colunaserial</i> são os nomes da tabela e
|
||
da coluna serial, respectivamente. Veja a página sobre
|
||
<I>create_sequence</I> no manual para obter informações
|
||
adicionais sobre sequências.
|
||
|
||
<H3 id="item4.11.2">4.11.2) Como eu consigo o valor de um campo
|
||
<SMALL>SERIAL</SMALL>?</H3>
|
||
|
||
<P>A maneira mais simples de obter o próximo valor <SMALL>SERIAL</SMALL>
|
||
de uma sequência é com <SMALL>RETURNING</SMALL>. Utilizando o
|
||
exemplo da tabela em <A href="#item4.11.1">4.11.1</A>, ele ficaria assim:
|
||
|
||
<PRE>
|
||
INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;
|
||
</PRE>
|
||
|
||
Você também pode chamar <I>nextval()</I> e utilizar o valor no
|
||
<SMALL>INSERT</SMALL> ou chamar <I>currval()</I> <I>após</I> o
|
||
<SMALL>INSERT</SMALL>.
|
||
|
||
<H3 id="item4.11.3">4.11.3) <I>currval()</I> não lida com condição de corrida com outros usuários?</H3>
|
||
|
||
<P>Não. <I>currval()</I> retorna o valor atual atribuido pela sua sessão, e não por todas as sessões.</P>
|
||
|
||
<H3 id="item4.11.4">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?</H3>
|
||
|
||
<P>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.</P>
|
||
|
||
<H3 id="item4.12">4.12) O que é um <SMALL>OID</SMALL>? O que é um <SMALL>CTID</SMALL>?</H3>
|
||
|
||
<P>Se uma tabela é criada com <SMALL>WITH OIDS</SMALL>, cada registro recebe um <SMALL>OID</SMALL> único.
|
||
O<SMALL>ID</SMALL>s 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 O<SMALL>ID</SMALL>s começam a ser duplicados. O PostgreSQL
|
||
utiliza <SMALL>OID</SMALL>s para ligar as tabelas do sistema.</P>
|
||
|
||
<P>Para numerar registros nas tabelas do usuários, é melhor utilizar
|
||
<SMALL>SERIAL</SMALL> ao invés de O<SMALL>ID</SMALL>s porque
|
||
sequências <SMALL>SERIAL</SMALL> são únicas somente em uma tabela; e
|
||
são menos propícias a atingir o limite.
|
||
<SMALL>SERIAL8</SMALL> está disponível para armazenar valores de sequências
|
||
com oito bytes.</P>
|
||
|
||
<P>C<SMALL>TID</SMALL>s são utilizados para identificar registros físicos
|
||
específicos com valores de block e deslocamento. C<SMALL>TID</SMALL>s mudam
|
||
após registros serem modificados ou recarregados. Eles são utilizados por
|
||
índices para apontar registros físicos.</P>
|
||
|
||
<H3 id="item4.13">4.13) Por que eu recebo o erro <I>"ERROR: Memory exhausted in AllocSetAlloc()"</I>?</H3>
|
||
|
||
<P>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:</P>
|
||
<PRE>
|
||
ulimit -d 262144
|
||
limit datasize 256m
|
||
</PRE>
|
||
|
||
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 <SMALL>SQL</SMALL> porque o processo servidor retornou muitos dados, tente-o antes de iniciar o cliente.
|
||
|
||
<H3 id="item4.14">4.14) Como eu informo qual versão do PostgreSQL eu estou utilizando?</H3>
|
||
|
||
<P>No <I>psql</I>, digite <CODE>SELECT version();</CODE></P>
|
||
|
||
<H3 id="item4.15">4.15) Como eu crio uma coluna que conterá por padrão a hora atual?</H3>
|
||
|
||
<P>Utilize <I>CURRENT_TIMESTAMP</I>:</P>
|
||
<PRE>
|
||
CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
|
||
</PRE>
|
||
|
||
<H3 id="item4.16">4.16) Como eu faço uma junção externa (outer join)?</H3>
|
||
|
||
<P>PostgreSQL suporta junções externas utilizando a sintaxe padrão do SQL. Aqui temos dois exemplos:</P>
|
||
<PRE>
|
||
SELECT *
|
||
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
|
||
</PRE>
|
||
or
|
||
<PRE>
|
||
SELECT *
|
||
FROM t1 LEFT OUTER JOIN t2 USING (col);
|
||
</PRE>
|
||
|
||
<P>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 <SMALL>RIGHT</SMALL>
|
||
adicionaria registros que não foram juntados da tabela t2.
|
||
Uma junção completa (<SMALL>FULL</SMALL>) retornaria os registros
|
||
combinados mais todos os registros não combinados de t1 e t2.
|
||
A palavra <SMALL>OUTER</SMALL> é opcional e é assumida nas
|
||
junções <SMALL>LEFT</SMALL>, <SMALL>RIGHT</SMALL> e <SMALL>FULL</SMALL>.
|
||
Junções ordinárias são chamadas junções
|
||
internas (<SMALL>INNER</SMALL>).</P>
|
||
|
||
<H3 id="item4.17">4.17) Como eu faço consultas utilizando múltiplos bancos de dados?</H3>
|
||
|
||
<P>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.</P>
|
||
|
||
<P><I>contrib/dblink</I> 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.</P>
|
||
|
||
<H3 id="item4.18">4.18) Como eu retorno múltiplos registros ou colunas de uma função?</H3>
|
||
|
||
<P>É fácil utilizando funções que retornam conjunto,
|
||
<a href="http://www.postgresql.org/docs/techdocs.17">
|
||
http://www.postgresql.org/docs/techdocs.17</a>.</P>
|
||
|
||
<H3 id="item4.19">4.19) Por que eu obtenho erros "relation with OID ######
|
||
does not exist" ao acessar tabelas temporárias em funções PL/PgSQL?</H3>
|
||
|
||
<P>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 <SMALL>EXECUTE</SMALL> para acesso a tabelas temporárias no PL/PgSQL. Isto irá fazer com que a consulta seja avaliada toda vez.</P>
|
||
|
||
<P>Este problema não ocorre no PostgreSQL 8.3 ou superior.</P>
|
||
|
||
<H3 id="item4.20">4.20) Quais soluções de replicação estão disponíveis?</H3>
|
||
|
||
<P>Embora "replicação" seja um termo simples, há várias tecnologias para fazer
|
||
replicação, com vantagens e desvantagens para cada um.</P>
|
||
|
||
<P>Replicação mestre/escravo permite que um mestre receba consultas de leitura e
|
||
escrita, enquanto os escravos só podem aceitar leitura/consultas <SMALL>SELECT</SMALL>.
|
||
A solução mais popular de replicação mestre-escravo para PostgreSQL disponível livremente
|
||
é <A href="http://main.slony.info">Slony-I</A>.</P>
|
||
|
||
<P>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. <A href="http://pgfoundry.org/projects/pgcluster/">PGCluster</a>
|
||
é a solução mais popular disponível livremente para PostgreSQL.</P>
|
||
|
||
<P>Há também soluções de replicação comerciais e baseadas em hardware disponíveis
|
||
que suportam uma variedade de modelos de replicação.</P>
|
||
|
||
<H3 id="item4.21">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?</H3>
|
||
|
||
<P>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 <a
|
||
href="http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">
|
||
como especificado</a>, 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:
|
||
<UL>
|
||
<LI>Evitar colocar aspas no identificador ao criar tabelas</LI>
|
||
<LI>Utilizar somente caracteres minúsculos em identificadores</LI>
|
||
<LI>Colocar aspas em identificadores ao referenciá-los nas consultas</LI>
|
||
</UL>
|
||
|
||
</BODY>
|
||
</HTML>
|
||
|