postgresql/doc/FAQ_brazilian

917 lines
41 KiB
Plaintext
Raw Normal View History

Perguntas Frequentes (FAQ) sobre PostgreSQL
<20>ltima atualiza<7A><61>o: S<>b Out 14 19:08:19 EDT 2006
Mantenedor atual: Bruce Momjian (bruce@momjian.us)
Traduzido por: Euler Taveira de Oliveira (euler@timbira.com)
A vers<72>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<65>ficas s<>o respondidas em
http://www.postgresql.org/docs/faq/.
_________________________________________________________________
Perguntas Gerais
1.1) O que <20> PostgreSQL? Como ele <20> pronunciado?
1.2) Quem controla o PostgreSQL?
1.3) Qual <20> a licen<65>a do PostgreSQL?
1.4) Quais plataformas o PostgreSQL pode ser executado?
1.5) Onde eu posso conseguir o PostgreSQL?
1.6) Qual <20> a <20>ltima vers<72>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<65>sticas ausentes?
1.10) Que documenta<74><61>o est<73> dispon<6F>vel?
1.11) Como eu posso aprender SQL?
1.12) Como posso submeter uma corre<72><65>o (patch) ou me juntar a equipe
de desenvolvimento?
1.13) Como <20> o PostgreSQL comparado a outros SGBDs?
Perguntas sobre Clientes
2.1) Quais interfaces est<73>o dispon<6F>veis para PostgreSQL?
2.2) Quais ferramentas est<73>o dispon<6F>veis para utilizar o PostgreSQL
com p<>ginas Web?
2.3) O PostgreSQL tem interfaces gr<67>ficas para interagir com usu<73>rio?
Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de
/usr/local/pgsql?
3.2) Como eu controlo conex<65>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<65>sticas de depura<72><61>o est<73>o dispon<6F>veis?
3.5) Por que eu recebo "Sorry, too many clients" quando eu tento
conectar?
3.6) Qual <20> o processo de atualiza<7A><61>o do PostgreSQL? 3.7) Que tipo de
hardware eu devo usar?
Perguntas Operacionais
4.1) Como eu fa<66>o um SELECT somente dos primeiros registros de uma
consulta? Um registro rand<6E>mico?
4.2) Como eu descubro quais tabelas, <20>ndices, bancos de dados e
usu<73>rios est<73>o definidos? Como eu vejo as consultas utilizadas pelo
psql para mostr<74>-los?
4.3) Como voc<6F> muda o tipo de dado de uma coluna?
4.4) Qual <20> o tamanho m<>ximo de um registro, uma tabela e um banco de
dados?
4.5) Quanto espa<70>o em disco <20> necess<73>rio para armazenar dados de um
arquivo texto?
4.6) Por que minhas consultas est<73>o lentas? Por que elas n<>o est<73>o
utilizando meus <20>ndices?
4.7) Como eu vejo como o otimizador de consultas est<73> avaliando minha
consulta?
4.8) Como eu fa<66>o buscas com express<73>es regulares e buscas com
express<73>es regulares sem diferenciar mau<61>sculas de min<69>sculas? Como eu
utilizo um <20>ndice para buscas sem distinguir mai<61>sculas de min<69>sculas?
4.9) Em uma consulta, como eu detecto se um campo <20> NULL? Como eu
posso ordenar por um campo que <20> NULL ou n<>o?
4.10) Qual <20> a diferen<65>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<64><69>o de corrida com outros
usu<73>rios?
4.11.4) Por que os n<>meros da minha sequ<71>ncia n<>o s<>o reutilizados
quando uma transa<73><61>o <20> abortada? Por que h<> intervalos nos n<>meros da
minha sequ<71>ncia/coluna SERIAL?
4.12) O que <20> um OID? O que <20> um CTID?
4.13) Por que eu recebo o erro "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.14) Como eu informo qual vers<72>o do PostgreSQL eu estou utilizando?
4.15) Como eu crio uma coluna que conter<65> por padr<64>o a hora atual?
4.16) Como eu fa<66>o uma jun<75><6E>o externa (outer join)?
4.17) Como eu fa<66>o consultas utilizando m<>ltiplos bancos de dados?
4.18) Como eu retorno m<>ltiplos registros ou colunas de uma fun<75><6E>o?
4.19) Por que eu obtenho erros "relation with OID ###### does not
exist" ao acessar tabelas tempor<6F>rias em fun<75><6E>es PL/PgSQL?
4.20) Quais solu<6C><75>es de replica<63><61>o est<73>o dispon<6F>veis?
4.21) Por que os nomes de minhas tabelas e colunas n<>o s<>o
reconhecidos em minha consulta?
_________________________________________________________________
Perguntas Gerais
1.1) O que <20> PostgreSQL? Como ele <20> pronunciado?
PostgreSQL <20> pronunciado Post-Gres-Q-L, e <20>, <20>s vezes, referido apenas
como Postgres. Um arquivo de <20>udio est<73> dispon<6F>vel em formato MP3 para
aqueles que gostariam de ouvir a pron<6F>ncia.
O PostgreSQL <20> um sistema de banco de dados objeto-relacional que tem
as caracter<65>sticas de sistemas de bancos de dados comerciais
tradicionais com melhoramentos encontrados nos sistemas SGBDs de
pr<70>xima gera<72><61>o. PostgreSQL <20> livre e o c<>digo-fonte completo est<73>
dispon<6F>vel.
O desenvolvimento do PostgreSQL <20> feito por um grupo de
desenvolvedores volunt<6E>rios (na sua maioria) espalhados pelo mundo e
que se comunicam via Internet. <20> um projeto da comunidade e n<>o <20>
controlado por nenhuma empresa. Para se envolver, veja a FAQ do
desenvolvedor em
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
1.2) Quem controla o PostgreSQL?
Se voc<6F> est<73> procurando por um mantenedor, comit<69> central ou empresa
controladora do PostgreSQL, desista --- n<>o h<> um(a). N<>s temos um
comit<69> core e committers CVS, mas estes grupos s<>o mais para quest<73>es
administrativas do que controle. O projeto <20> direcionado pela
comunidade de desenvolvedores e usu<73>rios, que qualquer um pode se
juntar. Tudo o que voc<6F> precisa <20> se inscrever nas listas de discuss<73>o
e participar das discuss<73>es. Veja a FAQ do desenvolvedor para obter
informa<6D><61>es como se envolver com o desenvolvimento do PostgreSQL.
1.3) Qual <20> a licen<65>a do PostgreSQL?
O PostgreSQL <20> distribu<62>do sob a licen<65>a BSD cl<63>ssica. Basicamente,
ela permite que usu<73>rios fa<66>am qualquer coisa com o c<>digo, incluindo
revender os bin<69>rios sem o c<>digo-fonte. A <20>nica restri<72><69>o <20> que voc<6F>
n<>o nos responsabilize legalmente por problemas com o programa de
computador. H<> tamb<6D>m a exig<69>ncia de que esta licen<65>a apare<72>a em todas
as c<>pias do programa de computador. Aqui est<73> a licen<65>a BSD que
usamos atualmente:
PostgreSQL est<73> sujeito a seguinte licen<65>a:
PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2007, 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<61>vel com Unix deve ser
capaz de executar o PostgreSQL. As plataformas que foram testadas
antes do lan<61>amento de uma vers<72>o s<>o listadas nas instru<72><75>es de
instala<6C><61>o.
O PostgreSQL tamb<6D>m executa nativamente nos sistemas operacionais
Microsoft Windows baseados no NT tais como Win200 SP4, WinXP e
Win2003. Um instalador pr<70>-empacotado est<73> dispon<6F>vel em
http://pgfoundry.org/projects/pginstaller. Vers<72>es do Windows baseadas
no MS-DOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
o Cygwin.
H<> tamb<6D>m uma vers<72>o para o Novell Netware 6 em
http://forge.novell.com e uma vers<72>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 <20> a <20>ltima vers<72>o?
A <20>ltima vers<72>o do PostgreSQL <20> a vers<72>o 8.1.5.
N<>s planejamos lan<61>ar vers<72>es novas a cada ano com vers<72>es corretivas
em alguns meses.
1.7) Onde eu posso conseguir suporte?
A comunidade do PostgreSQL fornece assist<73>ncia a muitos de seus
usu<73>rios via e-mail. O principal s<>tio web para inscri<72><69>o nas listas
de e-mail <20> http://www.postgresql.org/community/lists/. As listas
general e bugs s<>o um bom lugar para in<69>cio.
O principal canal de IRC <20> o #postgresql na Freenode
(irc.freenode.net). Para se conectar voc<6F> pode utilizar o comando Unix
irc -c '#postgresql' "$USER" irc.freenode.net ou utilizar qualquer
outro cliente de IRC. Um canal hisp<73>nico (#postgresql-es) e um franc<6E>s
(#postgresqlfr) tamb<6D>m existem na mesma rede. H<> tamb<6D>m um canal
PostgreSQL na EFNet.
Uma lista de empresas que prestam suporte comercial est<73> dispon<6F>vel em
http://www.postgresql.org/support/professional_support.
1.8) Como eu informo a exist<73>ncia de um bug?
Visite o formul<75>rio que reporta bugs do PostgreSQL em
http://www.postgresql.org/support/submitbug.
Verifique tamb<6D>m o nosso ftp ftp://ftp.PostgreSQL.org/pub para ver se
h<> uma vers<72>o mais recente do PostgreSQL.
Bugs submetidos utilizando o formul<75>rio ou informado a qualquer lista
de discuss<73>o do PostgreSQL tipicamente gera uma das seguintes
respostas:
* N<>o <20> um bug e o porqu<71>
* <20> um bug conhecido e j<> est<73> na lista de AFAZERES (TODO)
* O bug foi corrigido na vers<72>o atual
* O bug foi corrigido mas n<>o foi empacotado em um vers<72>o oficial
* Um pedido foi feito para obter informa<6D><61>es detalhadas:
+ Sistema Operacional
+ Vers<72>o do PostgreSQL
+ Exemplo de teste que reproduz o bug
+ Informa<6D><61>es sobre depura<72><61>o
+ Sa<53>da reconstituidora de vest<73>gios (backtrace) do depurador
* O bug <20> novo. O seguinte pode ocorrer:
+ Uma corre<72><65>o <20> criada e ser<65> inclu<6C>da na pr<70>xima vers<72>o
+ O bug n<>o pode ser corrigido imediatamente e <20> adicionado a
lista de AFAZERES (TODO)
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 (TODO) que cont<6E>m bugs conhecidos, funcionalidades
ausentes e planos futuros.
Uma solicita<74><61>o de funcionalidade geralmente resulta em uma das
seguintes respostas:
* A funcionalidade j<> est<73> na lista de AFAZERES (TODO)
* A funcionalidade n<>o <20> desej<65>vel porque:
+ Ela duplica uma funcionalidade existente que j<> segue o
padr<64>o SQL
+ A funcionalidade aumentar<61> a complexidade do c<>digo mas
adicionar<61> pouco benef<65>cio
+ A funcionalidade ser<65> insegura ou n<>o-confi<66>vel
* A nova funcionalidade <20> adicionada a lista de AFAZERES (TODO)
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 (TODO) atualizada. Na pr<70>tica, bugs n<>o duram muito no
programa; e bugs que afetam uma grande quantidade de usu<73>rios s<>o
corrigidos rapidamente. O <20>nico lugar para encontrar todas as
mudan<61>as, melhorias e corre<72><65>es em uma vers<72>o do PostgreSQL <20> ler as
mensagens de log do CVS. At<41> mesmo as notas de lan<61>amento n<>o listam
todas as mudan<61>as feitas no programa.
1.10) Que documenta<74><61>o est<73> dispon<6F>vel?
O PostgreSQL inclui vasta documenta<74><61>o, incluindo um manual extenso,
p<>ginas de manuais (man pages) e alguns exemplos teste. Veja o
diret<65>rio /doc. Voc<6F> tamb<6D>m pode pesquisar os manuais online em
http://www.PostgreSQL.org/docs.
H<> dois livros sobre PostgreSQL dispon<6F>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<6F>veis para compra. Um dos mais populares <20> o do Korry
Douglas. Uma lista de an<61>lise sobre os livros pode ser encontrada em
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php.
O programa cliente de linha de comando psql tem alguns comandos \d
para mostrar informa<6D><61>es sobre tipos, operadores, fun<75><6E>es, agrega<67><61>es,
etc. - utilize \? para mostrar os comandos dispon<6F>veis.
Nosso s<>tio web cont<6E>m ainda mais documenta<74><61>o.
1.11) Como eu posso aprender SQL?
Primeiro, considere os livros espec<65>ficos sobre PostgreSQL mencionados
acima. Outro <20> o "Teach Yourself SQL in 21 Days, Second Edition" e
http://members.tripod.com/er4ebus/sql/index.htm. Muitos de nossos
usu<73>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<6D>m bons tutoriais dispon<6F>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<72><65>o (patch) ou me juntar a equipe de
desenvolvimento?
Veja a FAQ do Desenvolvedor.
1.13) Como <20> o PostgreSQL comparado a outros SGBDs?
H<> v<>rias maneiras de se medir um software: funcionalidades,
performance, confiabilidade, suporte e pre<72>o.
Funcionalidades
PostgreSQL tem muitas caracter<65>sticas presentes em muitos SGBDs
comerciais como transa<73><61>es, subconsultas, gatilhos, vis<69>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<73>rio, heran<61>a, regras e
controle de concorr<72>ncia de m<>ltiplas vers<72>es para reduzir
bloqueios (locks).
Performance
A performance do PostgreSQL <20> compar<61>vel a outros bancos de
dados comerciais e de c<>digo livre. Ele <20> mais r<>pido em
algumas coisas, mais lento em outras. Nossa performance <20>
geralmente +/- 10% comparada a de outros bancos de dados.
Confiabilidade
N<>s sabemos que um SGBD deve ser confi<66>vel ou ele <20> in<69>til. N<>s
empenhamos em lan<61>ar vers<72>es bem testadas, de c<>digo est<73>vel e
que tenha o m<>nimo de bugs. Cada vers<72>o tem no m<>nimo um m<>s de
teste em vers<72>o beta, e nosso hist<73>rico de vers<72>es mostra que
n<>s podemos fornecer vers<72>es est<73>veis e s<>lidas que est<73>o
prontas para uso em produ<64><75>o. N<>s acreditamos que somos
comparados a nosso favor com outros sistemas de bancos de dados
nessa <20>rea.
Suporte
Nossas listas de discuss<73>o fornecem contato com um grupo de
desenvolvedores e usu<73>rios para ajudar a resolver muitos
problemas encontrados. Enquanto n<>s n<>o podemos garantir o
conserto, SGBDs comerciais nem sempre fornecem tamb<6D>m. Com
acesso direto aos desenvolvedores, a comunidade de usu<73>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<6F>veis para aqueles que precisam de um. (Veja
se<73><65>o 1.7 da FAQ.)
Pre<72>o
N<>s somos livres para uso dele tanto comercial quanto n<>o
comercial. Voc<6F> pode adicionar nosso c<>digo ao seu produto sem
limita<74><61>es, exceto aquelas descritas na nossa licen<65>a BSD
mencionada acima.
_________________________________________________________________
Perguntas sobre Clientes
2.1) Quais interfaces est<73>o dispon<6F>veis para PostgreSQL?
A instala<6C><61>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<70>prias datas de lan<61>amento e time de desenvolvedores.
Algumas linguagens de programa<6D><61>o como PHP incluem uma interface para
PostgreSQL. Interfaces para linguagens como Perl, TCL, Python e muitas
outras est<73>o dispon<6F>veis em http://gborg.postgresql.org na se<73><65>o de
Drivers/Interfaces ou via busca na Internet.
2.2) Quais ferramentas est<73>o dispon<6F>veis para utilizar o PostgreSQL com
p<>ginas Web?
Uma boa introdu<64><75>o para p<>ginas web que utilizam bancos de dados pode
ser vista em: http://www.webreview.com
Para integra<72><61>o na Web, PHP (http://www.php.net) <20> 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<67>ficas para iteragir com o usu<73>rio?
H<> um vasto n<>mero de Ferramentas Gr<47>ficas (GUI), que est<73>o
dispon<6F>veis para o PostgreSQL, comerciais e de desenvolvedores de
c<>digo aberto. Uma lista detalhada pode ser encontrada em Documenta<74><61>o
da Comunidade PostgreSQL
_________________________________________________________________
Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de /usr/local/pgsql?
Especifique a op<6F><70>o --prefix quando executar o configure.
3.2) Como eu controlo conex<65>es de outras m<>quinas?
Por padr<64>o, o PostgreSQL s<> permite conex<65>es da m<>quina local
utilizando soquetes de dom<6F>nio Unix ou conex<65>es TCP/IP. Outras
m<>quinas n<>o poder<65>o conectar-se a menos que voc<6F> modifique
listen_addresses no postgresql.conf, habilite a autentica<63><61>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<74>s grandes <20>reas para melhorar a performance em potencial:
Mudan<61>a de Consultas
Isto involve modificar consultas para obter melhor performance:
+ Cria<69><61>o de <20>ndices, incluir express<73>es e <20>ndices parciais
+ Utiliza<7A><61>o o COPY ao inv<6E>s de m<>ltiplos comandos INSERTs
+ Agrupamento de m<>ltiplos comandos em uma <20>nica transa<73><61>o para
diminuir a despesa com efetiva<76><61>es (commit)
+ Utiliza<7A><61>o do CLUSTER quando recuperar v<>rios registros de um
<20>ndice
+ Utiliza<7A><61>o do LIMIT para retornar um subconjunto da sa<73>da da
consulta
+ Utiliza<7A><61>o de Consultas preparadas
+ Utiliza<7A><61>o de ANALYZE para manter as estat<61>sticas do
otimizador corretas
+ Utiliza<7A><61>o regular do VACUUM ou pg_autovacuum
+ Remo<6D><6F>o de <20>ndices durante grande mudan<61>a de dados
Configura<72><61>o do Servidor
Um grande n<>mero de configura<72><61>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<6E>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<6C><65>o do Hardware
O efeito do hardware na performance <20> detalhado em
http://www.powerpostgresql.com/PerfList/ e
http://momjian.us/main/writings/pgsql/hw_performance/index.html
.
3.4) Quais caracter<65>sticas de depura<72><61>o est<73>o dispon<6F>veis?
H<> muitas vari<72>veis de configura<72><61>o do servidor log_* que habilitam a
exibi<62><69>o de consultas e estat<61>sticas que podem ser muito <20>teis para
depura<72><61>o e medidas de performance.
3.5) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
Voc<6F> atingiu o limite padr<64>o que <20> de 100 sess<73>es. Voc<6F> precisa
aumentar o limite do postmaster, que diz quantos processos servidor
concorrentes ele pode iniciar, alterando o valor max_connections no
postgresql.conf e reiniciando o postmaster.
3.6) Qual <20> o processo de atualiza<7A><61>o do PostgreSQL?
O time do PostgreSQL faz somente pequenas mudan<61>as entre vers<72>es
corretivas, ent<6E>o atualizar da vers<72>o 7.4.8 para 7.4.9 n<>o requer uma
exporta<74><61>o e uma importa<74><61>o; basta para o servidor de banco de dados,
instalar os bin<69>rios atualizados e reiniciar o servidor.
Todos os usu<73>rios devem atualizar para as vers<72>es corretivas mais
recentes assim que elas estiverem dispon<6F>veis. Enquanto cada
atualiza<7A><61>o tem algum risco, vers<72>es corretivas do PostgreSQL s<>o
projetadas para corrigir somente bugs comuns com um risco m<>nimo. A
comunidade considera n<>o atualizar mais perigoso do que atualizar.
Vers<72>es novas (i.e. da 7.3 para 7.4) geralmente muda-se o formato
interno das tabelas de sistema e dos arquivo de dados. Essas mudan<61>as
geralmente s<>o complexas, ent<6E>o n<>s n<>o mantemos compatibilidade para
os arquivos de dados. Uma exporta<74><61>o/importa<74><61>o de um banco de dados <20>
necess<73>ria para atualiza<7A><61>es entre vers<72>es.
3.7) Que tipo de hardware eu devo usar?
Por causa do hardware de PC ser em sua maioria compat<61>vel, pessoas
tendem a acreditar que todos os hardwares de PC s<>o de mesma
qualidade. N<>o <20> verdade. ECC RAM, SCSI e placas m<>e de qualidade s<>o
mais confi<66>veis e t<>m uma melhor performance do que hardwares mais
baratos. O PostgreSQL executar<61> em quase todo hardware, mas se a
confiabilidade e a performance forem importantes <20> prudente pesquisar
sobre as op<6F><70>es de hardware. Nossas listas de discuss<73>o podem ser
usadas para discutir op<6F><70>es de hardware e dilemas.
_________________________________________________________________
Perguntas Operacionais
4.1) Como eu fa<66>o um SELECT somente dos primeiros registros de uma consulta?
Um registro rand<6E>mico?
Para obter somente alguns registros, se voc<6F> sabe o n<>mero de
registros necess<73>rios ao executar o SELECT utilize o LIMIT. Se um
<20>ndice corresponde no ORDER BY <20> poss<73>vel que a consulta toda n<>o
tenha que ser executada. Se voc<6F> n<>o sabe o n<>mero de registros ao
executar o SELECT, utilize um cursor e o FETCH.
Para obter um registro rand<6E>mico, utilize:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) Como eu descubro quais tabelas, <20>ndices, bancos de dados e usu<73>rios
est<73>o definidos? Como eu vejo as consultas utilizadas pelo psql para
mostr<74>-los?
Utilize o comando \dt para ver tabelas no psql. Para obter uma lista
completa dos comandos no psql voc<6F> pode utilizar \?. Alternativamente,
voc<6F> pode ler o c<>digo-fonte do psql no arquivo
pgsql/src/bin/psql/describe.c, ele cont<6E>m os comandos SQL que geram a
sa<73>da para os comandos de contrabarra do psql. Voc<6F> tamb<6D>m pode
iniciar o psql com a op<6F><70>o -E para que as consultas utilizadas para
executar os comandos que voc<6F> informou seja exibida. O PostgreSQL
tamb<6D>m fornece uma inteface compat<61>vel com SQL do INFORMATION SCHEMA
que voc<6F> pode consultar para obter informa<6D><61>o sobre o banco de dados.
H<> tamb<6D>m tabelas do sistema que come<6D>am com pg_ que os descrevem
tamb<6D>m.
Utilizando o psql -l listar<61> todos os bancos de dados.
Veja tamb<6D>m o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
muitos dos comandos SELECTs necess<73>rios para obter informa<6D><61>o das
tabelas de sistema do banco de dados.
4.3) Como voc<6F> muda o tipo de dado de uma coluna?
Mudar o tipo de dado de uma coluna pode ser feito facilmente na vers<72>o
8.0 ou superior com ALTER TABLE ALTER COLUMN TYPE.
Em vers<72>es anteriores, fa<66>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<6F> pode ent<6E>o querer fazer um VACUUM FULL tab para recuperar o
espa<70>o em disco utilizado pelos registros expirados.
4.4) Qual <20> 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 <20>ndices em uma tabela? ilimitado
<20> claro, que eles n<>o s<>o ilimitados, mas limitados ao espa<70>o em disco
dispon<6F>vel e espa<70>o em mem<65>ria/swap. A Performance ser<65> 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<6E>o o limite do sistema de arquivos n<>o <20>
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<64>o do bloco para 32k. O tamanho m<>ximo de uma tabela pode tamb<6D>m
ser aumentado utilizando particionamento de tabela.
Uma limita<74><61>o <20> que <20>ndices n<>o podem ser criados em colunas maiores
do que 2.000 caracteres. Felizmente, tais <20>ndices s<>o raramente
necess<73>rios. Unicidade <20> melhor garantida por um <20>ndice de uma fun<75><6E>o
de um hash MD5 de uma coluna longa, e indexa<78><61>o de texto longo permite
a busca de palavras dentro da coluna.
4.5) Quanto espa<70>o em disco <20> necess<73>rio para armazenar dados de um arquivo
texto?
Um banco de dados PostgreSQL ir<69> requerer at<61> cinco vezes a quantidade
de espa<70>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<72><69>o em cada linha. Suponha que o tamanho m<>dio da
descri<72><69>o <20> de vinte bytes. O arquivo ter<65> 2,8 MB. O tamanho do
arquivo do banco de dados PostgreSQL que cont<6E>m esses dados pode ser
estimado em 5,6 MB:
28 bytes: cada cabe<62>alho de registro (aproximadamente)
24 bytes: um campo int e um campo texto
+ 4 bytes: ponteiro na p<>gina para a tupla
-------------------------------------------
56 bytes por registro
O tamanho de uma p<>gina de dados no PostgreSQL <20> 8192 bytes (8 KB), ent<6E>o:
8192 bytes por p<>gina
------------------------ = 146 registros por p<>gina do banco de dados (arredondado para baixo)
56 bytes por registro
100000 registros de dados
---------------------------- = 685 p<>ginas do banco de dados (arredondadopara cima)
146 registros por p<>gina
685 p<>ginas do banco de dados * 8192 bytes por p<>gina = 5.611.520 bytes (5,6MB)
<20>ndices n<>o requerem muito espa<70>o, mas cont<6E>m dados que foram
indexados, ent<6E>o eles podem ocupar algum espa<70>o.
NULLs s<>o armazenados como bitmaps, ent<6E>o eles utilizam muito pouco
espa<70>o.
4.6) Por que minhas consultas est<73>o lentas? Por que elas n<>o est<73>o utilizando
meus <20>ndices?
<20>ndices n<>o s<>o utilizados por toda consulta. <20>ndices s<>o utilizados
somente se a tabela <20> maior do que um tamanho m<>nimo, e a consulta
seleciona somente uma pequena porcentagem dos registros da tabela.
Isto porque o acesso rand<6E>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 <20>ndice deveria ser utilizado, o PostgreSQL deve
ter estat<61>sticas sobre a tabela. Estas estat<61>sticas s<>o coletadas
utilizando o VACUUM ANALYZE ou simplesmente o ANALYZE. Utilizando
estat<61>sticas, o otimizador sbae quantos registros est<73>o na tabela, e
pode melhor determinar se <20>ndices deveriam ser utilizados.
Estat<61>sticas tamb<6D>m s<>o <20>teis para determinar a ordem de jun<75><6E>o <20>tima
e m<>todos de jun<75><6E>o. Cole<6C><65>o de estat<61>sticas deveriam ser feitas
periodicamente a medida que o conte<74>do da tabela muda.
<20>ndices n<>o s<>o normalmente utilizados para ORDER BY ou para fazer
jun<75><6E>es. Uma busca sequencial seguido por uma ordena<6E><61>o expl<70>cita <20>
geralmente mais r<>pida do que uma busca indexada em uma tabela grande.
Contudo, LIMIT combinado com ORDER BY frequentemente utilizar<61> <20>ndice
porque somente uma pequena por<6F><72>o da tabela ser<65> retornada.
Se voc<6F> acredita que o otimizador est<73> incorreto ao escolher uma busca
sequencial, utilize SET enable_seqscan TO 'off' e execute a consulta
novamente para ver se uma busca indexada <20> realmente mais r<>pida.
Ao utilizar operadores curinga tais como LIKE ou ~, <20>ndices podem ser
utilizados somente em algumas condi<64><69>es:
* O in<69>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<73>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<61>sculas de min<69>sculas tais como ILIKE
e ~* n<>o utilizam <20>ndices. Em vez disso, utilize <20>ndice de
express<73>o, que <20> descrito na se<73><65>o 4.8.
* O idioma padr<64><72>o C deve ser usando durante o initdb porque n<>o <20>
poss<73>vel saber o pr<70>ximo caracter em idiomas que n<>o sejam o C.
Voc<6F> pode criar um <20>ndice especial text_pattern_ops para tais
casos que funcionam somente para indexa<78><61>o com LIKE.
Em vers<72>es anteriores a 8.0, <20>ndices frequentemente n<>o podem ser
utilizados a menos que os tipos de dados correspondam aos tipos de
coluna do <20>ndice. Isto era particularmente verdadeiro para <20>ndices de
coluna int2, int8 e numeric.
4.7) Como eu vejo como o otimizador de consulta est<73> avaliando a minha
consulta?
Veja o comando EXPLAIN no manual.
4.8) Como eu fa<66>o buscas com express<73>es regulares e buscas com express<73>es
regulares sem diferenciar mai<61>sculas de min<69>sculas? Como eu utilizo um <20>ndice
para buscas que n<>o diferenciam mai<61>sculas de min<69>sculas?
O operador ~ faz avalia<69><61>o de express<73>es regulares, e ~* faz avalia<69><61>o
n<>o sens<6E>vel a mai<61>sculas de express<73>es regulares. A variante n<>o
sens<6E>vel a mai<61>sculas do LIKE <20> chamada de ILIKE.
Compara<72><61>es de igualdade n<>o sens<6E>veis a mai<61>sculas s<>o normalmente
expressadas como:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Isso n<>o ir<69> utilizar o <20>ndice padr<64>o. Contudo, se voc<6F> criar um
<20>ndice de express<73>o, ele ser<65> utilizado:
CREATE INDEX tabindex ON tab (lower(col));
Se o <20>ndice acima <20> criado como UNIQUE, embora a coluna possa
armazenar caracteres mai<61>sculos e min<69>sculos, ele n<>o pode ter valores
id<69>nticos que diferem apenas em letras mai<61>sculas e min<69>sculas. Para
for<6F>ar uma letra mai<61>scula ou min<69>scula a ser armazenada na coluna,
utilize uma restri<72><69>o CHECK ou um gatilho.
4.9) Em uma consulta, como eu detecto se um campo <20> NULL? Como eu posso
ordenar por um campo que <20> NULL ou n<>o?
Voc<6F> testa a coluna com IS NULL e IS NOT NULL, como a seguir:
SELECT *
FROM tab
WHERE col IS NULL;
Para ordenar pelo status NULL, utilize os modificadores IS NULL e IS
NOT NULL na sua cl<63>usula ORDER BY. Coisas que s<>o verdadeiro ser<65>o
ordenadas acima das coisas que s<>o falso, ent<6E>o a consulta a seguir
ir<69> colocar entradas NULL no in<69>cio da lista de resultados:
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
4.10) Qual <20> a diferen<65>a entre os v<>rios tipos de dado de caracteres?
Tipo Nome Interno Observa<76><61>o
VARCHAR(n) varchar tamanho especifica o tamanho m<>ximo, sem
preenchimento
CHAR(n) bpchar preenchimento em branco para comprimento fixo
espec<65>fico
TEXT text nenhum limite superior espec<65>fico no comprimento
BYTEA bytea vetor de bytes de comprimento vari<72>vel (seguro a byte
nulo)
"char" char um caracter
Voc<6F> ver<65> o nome interno quando examinar o cat<61>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<70>o atual utilizado <20> ligeiramente maior
do que o tamanho declarado. Contudo, valores longos s<>o tamb<6D>m
sujeitos a compress<73>o, ent<6E>o o espa<70>o em disco pode tamb<6D>m ser bem
menor do que o esperado.
VARCHAR(n) <20> melhor quando est<73> armazenando cadeias de caracteres de
comprimento vari<72>vel e h<> um limite de tamanho desta cadeia. TEXT <20>
para cadeias de caracteres de comprimento ilimitado, com o m<>ximo de
um gigabyte.
CHAR(n) <20> para armazenar cadeias de caracteres que s<>o todas do mesmo
tamanho. CHAR(n) preenche com espa<70>os em branco at<61> o tamanho
especificado, enquanto o VARCHAR(n) armazena somente os caracteres
fornecidos. BYTEA <20> para armazenar dados bin<69>rios, particularmente
valores que incluem bytes NULL. Todos os tipos descritos aqui tem
caracter<65>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<71>ncia. Por exemplo:
CREATE TABLE pessoa (
id SERIAL,
nome TEXT
);
<20> automaticamente traduzido em:
CREATE SEQUENCE pessoa_id_seq;
CREATE TABLE pessoa (
id INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
nome TEXT
);
Veja a p<>gina sobre create_sequence no manual para obter informa<6D><61>es
adicionais sobre sequ<71>ncias.
4.11.2) Como eu consigo o valor de um campo SERIAL?
Uma abordagem <20> obter o pr<70>ximo valor SERIAL de uma sequ<71>ncia com a
fun<75><6E>o nextval() antes de inserir e ent<6E>o inserir com o valor
explicitamente. Utilizando o exemplo da tabela em 4.11.1, um exemplo
em pseudo-linguagem se pareceria com isto:
novo_id = execute("SELECT nextval('pessoa_id_seq')");
execute("INSERT INTO pessoa (id, nome) VALUES (novo_id, 'Blaise Pascal')");
Voc<6F> poderia ent<6E>o ter tamb<6D>m o novo valor armazenado em novo_id para
utilizar em outras consultas (i.e., como uma chave estrangeira da
tabela pessoa). Note que o nome da SEQUENCE criada automaticamente
ser<65> <tabela>_<coluna>_seq, onde tabela e coluna s<>o os nomes da
tabela e da coluna SERIAL, respectivamente.
Alternativamente, voc<6F> poderia obter o valor SERIAL atribu<62>do com a
fun<75><6E>o currval() depois de t<>-lo inserido por padr<64>o, i.e.,
execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
novo_id = execute("SELECT currval('pessoa_id_seq')");
4.11.3) currval() n<>o lida com condi<64><69>o de corrida com outros usu<73>rios?
N<>o. currval() retorna o valor atual atribuido pela sua sess<73>o, e n<>o
por todas as sess<73>es.
4.11.4) Por que os n<>meros da minha sequ<71>ncia n<>o s<>o reutilizados quando uma
transa<73><61>o <20> abortada? Por que h<> intervalos nos n<>meros da minha
sequ<71>ncia/coluna SERIAL?
Para melhorar a concorr<72>ncia, valores da sequ<71>ncia s<>o atribu<62>dos a
transa<73><61>es correntes e n<>o s<>o travados at<61> que a transa<73><61>o seja
finalizada. Isso causa intervalos na numera<72><61>o por causa de transa<73><61>es
abortadas.
4.16) O que <20> um OID? O que <20> um CTID?
Cada registro que <20> criado no PostgreSQL recebe um OID <20>nico a menos
que seja criado com WITHOUT OIDS. OIDs s<>o automaticamente atribu<62>dos
como inteiros de 4 bytes que s<>o <20>nicos ao longo de toda instala<6C><61>o.
Contudo, eles s<>o limitados em 4 bilh<6C>es, e ent<6E>o os OIDs come<6D>am a
ser duplicados. O PostgreSQL utiliza OIDs para ligar as tabelas do
sistema.
Para numerar registros nas tabelas do usu<73>rios, <20> melhor utilizar
SERIAL ao inv<6E>s de OIDs porque sequ<71>ncias SERIAL s<>o <20>nicas somente em
uma tabela; e s<>o menos prop<6F>cias a atingir o limite. SERIAL8 est<73>
dispon<6F>vel para armazenar valores de sequ<71>ncias com oito bytes.
CTIDs s<>o utilizados para identificar registros f<>sicos espec<65>ficos
com valores de block e deslocamento. CTIDs mudam ap<61>s registros serem
modificados ou recarregados. Eles s<>o utilizados por <20>ndices para
apontar registros f<>sicos.
4.13) Por que eu recebo o erro "ERROR: Memory exhausted in AllocSetAlloc()"?
Voc<6F> provavelmente est<73> sem mem<65>ria virtual no seu sistema, ou o seu
n<>cleo (kernel) tem um limite baixo para certos recursos. Tente isto
antes de iniciar o postmaster:
ulimit -d 262144
limit datasize 256m
Dependendo da sua shell, somente um desses comando ter<65> sucesso, mas
ele definir<69> o segmento de dados do seu processo com um limite maior e
talvez permita que a consulta seja feita. Este comando <20> aplicado ao
processo atual e todos os subprocessos criados depois do comando ser
executado. Se voc<6F> 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<72>o do PostgreSQL eu estou utilizando?
No psql, digite SELECT version();
4.15) Como eu crio uma coluna que conter<65> por padr<64>o a hora atual?
Utilize CURRENT_TIMESTAMP:
CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP);
4.23) Como eu fa<66>o uma jun<75><6E>o externa (outer join)?
PostgreSQL suporta jun<75><6E>es externas utilizando a sintaxe padr<64>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<6E>nticas juntam t1.col com t2.col, e tamb<6D>m
retornam qualquer registro que n<>o foi juntado em t1 (aqueles que n<>o
combinaram com t2). Uma jun<75><6E>o a direita RIGHT adicionaria registros
que n<>o foram juntados da tabela t2. Uma jun<75><6E>o completa (FULL)
retornaria os registros combinados mais todos os registros n<>o
combinados de t1 e t2. A palavra OUTER <20> opcional e <20> assumida nas
jun<75><6E>es LEFT, RIGHT e FULL. Jun<75><6E>es ordin<69>rias s<>o chamadas jun<75><6E>es
naturais (INNER).
4.17) Como eu fa<66>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<61>logos do sistema espec<65>ficos
do banco de dados, <20> 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<75><6E>es. <20> claro, que um cliente pode fazer
conex<65>es simult<6C>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<75><6E>o?
<20> f<>cil utilizando fun<75><6E>es que retornam conjunto,
http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
acessar tabelas tempor<6F>rias em fun<75><6E>es PL/PgSQL?
PL/PgSQL armazena o conte<74>do da fun<75><6E>o, e o efeito indesejado <20> que se
uma fun<75><6E>o PL/PgSQL acessa uma tabela tempor<6F>ria, e aquela tabela <20>
removida e criada novamente, e a fun<75><6E>o <20> chamada novamente, a fun<75><6E>o
ir<69> falhar porque o conte<74>do armazenado da fun<75><6E>o ainda apontar<61> para
a tabela tempor<6F>ria antiga. A solu<6C><75>o <20> utilizar o EXECUTE para acesso
a tabelas tempor<6F>rias no PL/PgSQL. Isto ir<69> fazer com que a consulta
seja avaliada toda vez.
4.20) Quais solu<6C><75>es de replica<63><61>o est<73>o dispon<6F>veis?
Embora "replica<63><61>o" seja um termo simples, h<> v<>rias tecnologias para
fazer replica<63><61>o, com vantagens e desvantagens para cada um.
Replica<63><61>o mestre/escravo permite que um mestre receba consultas de
leitura e escrita, enquanto os escravos s<> podem aceitar
leitura/consultas SELECT. A solu<6C><75>o mais popular de replica<63><61>o
mestre-escravo para PostgreSQL dispon<6F>vel livremente <20> Slony-I.
Replica<63><61>o com m<>ltiplos mestres permite que consultas leitura/escrita
sejam enviadas para m<>ltiplos computadores replicadores. Esta
capacidade tamb<6D>m tem um s<>rio impacto na performance por causa da
necessidade de sincronizar as mudan<61>as entre os servidores. Pgcluster
<20> a solu<6C><75>o mais popular dispon<6F>vel livremente para PostgreSQL.
H<> tamb<6D>m solu<6C><75>es de replica<63><61>o comerciais e baseadas em hardware
dispon<6F>veis que suportam uma variedade de modelos de replica<63><61>o.
4.21) Por que os nomes de minhas tabelas e colunas n<>o s<>o reconhecidos em
minha consulta?
O caso mais comum <20> o uso de aspas ao redor dos nomes da tabela ou
coluna durante a cria<69><61>o da tabela. Ao utilizar aspas, nomes de tabela
e coluna (chamados de identificadores) s<>o armazenados como
especificado, significando que voc<6F> deve utilizar aspas quando se
referir aos nomes na consulta. Algumas interfaces, como pgAdmin,
automaticamente coloca aspas nos identificadores durante a cria<69><61>o da
tabela. Ent<6E>o, para identificadores serem reconhecidos, voc<6F> deve:
* Evitar colocar aspas no identificador ao criar tabelas
* Utilizar somente caracteres min<69>sculos em identificadores
* Colocar aspas em identificadores ao referenci<63>-los nas consultas