postgresql/doc/FAQ_brazilian

1251 lines
56 KiB
Plaintext
Raw Normal View History

Perguntas Frequentes (FAQ) sobre PostgreSQL
<20>ltima atualiza<7A><61>o: Dom Jan 9 14:44:04 EDT 2005
Mantenedor atual: Bruce Momjian (pgman@candle.pha.pa.us)
2004-12-13 11:37:09 +08:00
Traduzido por: Euler Taveira de Oliveira (eulerto@yahoo.com.br)
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) Qual <20> a licen<65>a do PostgreSQL?
1.3) Quais plataformas Unix o PostgreSQL pode ser executado?
1.4) Quais portabilidades n<>o-Unix est<73>o dispon<6F>veis?
1.5) Onde eu posso conseguir o PostgreSQL?
1.6) Onde eu posso conseguir suporte?
1.7) Qual <20> a <20>ltima vers<72>o?
1.8) Que documenta<74><61>o est<73> dispon<6F>vel?
1.9) Como eu posso saber quais s<>o os bugs conhecidos ou
caracter<65>sticas ausentes?
1.10) Como eu posso aprender SQL?
1.11) O PostgreSQL est<73> livre do Bug do Mil<69>nio?
1.12) Como posso me juntar a equipe de desenvolvimento?
1.13) Como eu informo a exist<73>ncia de um bug?
1.14) Como <20> o PostgreSQL comparado a outros SGBDs?
1.15) Como eu posso ajudar financeiramente o projeto PostgreSQL?
Perguntas sobre Clientes
2.1) H<> drivers ODBC 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?
2.4) Quais linguagens est<73>o dispon<6F>veis para comunicar-se com o
PostgreSQL?
Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de
/usr/local/pgsql?
3.2) Quando eu inicio o postmaster, eu recebo a mensagem Bad System
Call ou uma descarga de mem<65>ria (core dump). Por que?
3.3) Quando eu tento iniciar o postmaster, eu recebo erros
IpcMemoryCreate. Por que? 3.4) Quando eu tento iniciar o postmaster,
eu recebo erros IpcSemaphoreCreate. Por que? 3.5) Como eu controlo
conex<65>es de outras m<>quinas?
3.6) Como eu ajusto o servidor de banco de dados para obter uma
performance melhor?
3.7) Quais caracter<65>sticas de depura<72><61>o est<73>o dispon<6F>veis?
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento
conectar?
3.9) O que est<73> no diret<65>rio pgsql_tmp?
3.10) O que eu preciso fazer para exportar e importar durante a
atualiza<7A><61>o de vers<72>es do PostgreSQL?
3.11) Que tipo de hardware eu devo usar?
Perguntas Operacionais
4.1) Qual <20> a diferen<65>a entre cursores bin<69>rios e normais?
4.2) Como eu fa<66>o um SELECT somente dos primeiros registros de uma
consulta? Um registro rand<6E>mico?
4.3) Como eu obtenho a lista de tabelas ou outras coisas que eu posso
ver no psql?
4.4) Como eu removo uma coluna de uma tabela ou mudo o seu tipo de
dados?
4.5) Qual <20> o tamanho m<>ximo de um registro, uma tabela e um banco de
dados?
4.6) Quanto espa<70>o em disco <20> necess<73>rio para armazenar dados de um
arquivo texto?
4.7) Como eu descubro quais tabelas, <20>ndices, bancos de dados e
usu<73>rios est<73>o definidos?
4.8) Minhas consultas est<73>o lentas ou n<>o est<73>o utilizando <20>ndices.
Por que?
4.9) Como eu vejo como o otimizador de consultas est<73> avaliando minha
consulta?
4.10) O que <20> um <20>ndice de <20>rvore R (R-tree)?
4.11) O que <20> um Otimizador Gen<65>tico de Consultas?
4.12) 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?
4.13) Em uma consulta, como eu detecto se um campo <20> NULL?
4.14) Qual <20> a diferen<65>a entre os v<>rios tipos de dados de caracteres?
4.15.1) Como eu crio um campo serial/auto incremento?
4.15.2) Como eu consigo o valor de um campo SERIAL?
4.15.3) currval() n<>o lida com condi<64><69>o de corrida com outros
usu<73>rios?
4.15.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.16) O que <20> um OID? O que <20> um TID?
4.17) Qual <20> o significado de alguns termos utilizados no PostgreSQL?
4.18) Por que eu recebo o erro "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.19) Como eu informo qual vers<72>o do PostgreSQL eu estou utilizando?
4.20) Por que minhas opera<72><61>es com objetos grandes retorna "invalid
large obj descriptor"?
4.21) Como eu crio uma coluna que conter<65> por padr<64>o a hora atual?
4.22) Por que as minhas subconsultas que utilizam IN est<73>o t<>o lentas?
4.23) Como eu fa<66>o uma jun<75><6E>o externa (outer join)?
4.24) Como eu fa<66>o consultas utilizando m<>ltiplos bancos de dados?
4.25) Como eu retorno m<>ltiplos registros ou colunas de uma fun<75><6E>o?
4.26) Por que eu n<>o posso confiar na cria<69><61>o/remo<6D><6F>o de tabelas
tempor<6F>rias em fun<75><6E>es PL/PgSQL?
4.27) Que op<6F><70>es para encripta<74><61>o est<73>o dispon<6F>veis?
Extendendo o PostgreSQL
5.1) Eu escrevi uma fun<75><6E>o. Quando eu executo-a no psql, por que ela
finaliza o programa com descarga de mem<65>ria (core dump)?
5.2) Como eu posso contribuir com alguns tipos e fun<75><6E>es novas para o
PostgreSQL?
5.3) Como eu escrevo uma fun<75><6E>o em C que retorna uma tupla?
5.4) Eu alterei um arquivo do c<>digo-fonte. Por que a recompila<6C><61>o n<>o
surtiu efeito?
_________________________________________________________________
Perguntas Gerais
1.1) O que <20> PostgreSQL? Como ele <20> pronunciado?
PostgreSQL <20> pronunciado Post-Gres-Q-L.
PostgreSQL <20> um melhoramento do sistema de ger<65>ncia de banco de dados
POSTGRES (e tamb<6D>m <20>, <20>s vezes, chamado simplesmente de "Postgres"),
um prot<6F>tipo de pesquisa de um SGBD de <20>ltima gera<72><61>o. Enquanto o
PostgreSQL ret<65>m a modelagem de dados poderosa e a grande quantidade
de tipos de dados do POSTGRES, ele substituiu a linguagem de consulta
PostQuel com um subconjunto extendido do SQL. 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 que est<73>o inscritos na lista de e-mails de
desenvolvimento do PostgreSQL. O coordenador atual <20> Marc G. Fournier
(scrappy@PostgreSQL.org). (Veja a se<73><65>o 1.6 para saber como se juntar
ao grupo). O grupo <20> respons<6E>vel por todo o desenvolvimento do
PostgreSQL. <20> um projeto da comunidade e n<>o <20> controlado por nenhuma
empresa. Para se juntar ao grupo, veja a FAQ do desenvolvedor em
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
Os autores do PostgreSQL 1.01 foram Andrew Yu e Jolly Chen. Muitos
outros contribuiram para portar, testar, depurar e melhorar o c<>digo.
O c<>digo original do Postgres, do qual o PostgreSQL foi derivado, foi
um esfor<6F>o de muitos estudantes de gradua<75><61>o e p<>s-gradua<75><61>o e uma
equipe de programadores trabalhando sobre a dire<72><65>o do Professor
Michael Stonebraker na Universidade da Calif<69>nia em Berkeley.
O nome original do software em Berkeley era Postgres. Quando o SQL foi
adicionado em 1995, seu nome foi mudado para Postgres95. O nome foi
mudado no fim de 1996 para PostgreSQL.
1.2) Qual <20> a licen<65>a do PostgreSQL?
PostgreSQL est<73> sujeito a seguinte licen<65>a:
PostgreSQL Sistema de Ger<65>ncia de Banco de Dados
Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of California
Permiss<73>o de uso, c<>pia, modifica<63><61>o e distribui<75><69>o desse software e
2004-11-29 09:58:10 +08:00
sua documenta<74><61>o para qualquer prop<6F>sito, sem taxa, e sem um acordo
escrito est<73> concedida por esse meio, contanto que a nota da licen<65>a
acima, esse par<61>grafo e os dois par<61>grafos seguintes apare<72>am em todas
as c<>pias.
EM NENHUM EVENTO A UNIVERSIDADE DA CALIF<49>RNIA SER<45> RESPONS<4E>VEL POR
QUALQUER PARTIDO EM DANOS DIRETOS, INDIRETOS, ESPECIAIS, INCIDENTAIS
OU CONSEQUENTES, INCLUINDO PERDA DE LUCROS, SURGIDOS A PARTIR DO USO
DO SOFTWARE E DE SUA DOCUMENTA<54><41>O, MESMO SE A UNIVERSIDADE DA
CALIF<49>RNIA ESTIVER SIDO AVISADA DA POSSIBILIDADE DE TAL DANO.
A UNIVERSIDADE DA CALIF<49>RNIA ESPECIFICADAMENTE N<>O D<> NENHUMA
GARANTIA, INCLUINDO, MAS N<>O LIMITADO A, GARANTIAS IMPL<50>CITAS DE
COMERCIALIZA<5A><41>O E ATENDIMENTO DE PROP<4F>SITO PARTICULAR. O SOFTWARE <20>
FORNECIDO ABAIXO "COMO <20>", E A UNIVERSIDADE DA CALIF<49>RNIA N<>O TEM
OBRIGA<47><41>O DE FORNECER MANUTEN<45><4E>O, SUPORTE, ATUALIZA<5A><41>ES, MELHORIAS OU
MODIFICA<43><41>ES.
O que est<73> descrito acima <20> a licen<65>a BSD, uma licen<65>a de c<>digo
aberto cl<63>ssica. Ela n<>o tem restri<72><69>es de como o c<>digo pode ser
utilizado. N<>s gostamos dela e n<>o temos inten<65><6E>es de mud<75>-la.
1.3) Quais plataformas Unix 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.
1.4) Quais portabilidades n<>o-Unix est<73>o dispon<6F>veis?
Iniciando com a vers<72>o 8.0, o PostgreSQL agora pode ser executado
nativamente nos sistemas operacionais Microsoft Windows baseados no NT
tais como Win2000, WinXP e Win2003. Um instalador est<73> dispon<6F>vel em
http://pgfoundry.org/projects/pginstaller Vers<72>es do Windows baseados
no MSDOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
o Cygwin.
H<> tamb<6D>m um porte para 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?
O servidor ftp principal do PostgreSQL <20> ftp://ftp.PostgreSQL.org/pub.
2004-11-29 09:58:10 +08:00
Para obter a rela<6C><61>o de servidores espelhos (mirrors), consulte nosso
website.
1.6) Onde eu posso conseguir suporte?
A lista de discuss<73>o principal <20>: pgsql-general@PostgreSQL.org. Ela
est<73> dispon<6F>vel para discuss<73>es relacionadas ao PostgreSQL. Para se
inscrever, envie um e-mail com as seguintes linhas no corpo (n<>o envie
no assunto):
subscribe
end
para pgsql-general-request@PostgreSQL.org.
H<> tamb<6D>m uma lista s<>ntese (digest) dispon<6F>vel. Para se inscrever,
envie um e-mail para: pgsql-general-digest-request@PostgreSQL.org com
o seguinte corpo:
subscribe
end
S<>nteses (Digests) s<>o enviadas aos membros dessa lista quando a lista
receber cerca de 30k em mensagens.
A lista de discuss<73>o sobre bugs est<73> dispon<6F>vel. Para se inscrever,
envie um e-mail para pgsql-bugs-request@PostgreSQL.org com o seguinte
corpo:
subscribe
end
H<> tamb<6D>m uma lista de discuss<73>o dos desenvolvedores dispon<6F>vel. Para
se inscrever, envie um e-mail para
pgsql-hackers-request@PostgreSQL.org com o seguinte corpo:
subscribe
end
Outras listas de discuss<73>es e informa<6D><61>es sobre o PostgreSQL podem ser
encontradas na homepage do PostgreSQL em:
http://www.PostgreSQL.org
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://techdocs.postgresql.org/companies.php.
1.7) Qual <20> a <20>ltima vers<72>o?
A <20>ltima vers<72>o do PostgreSQL <20> a vers<72>o 7.4.6.
N<>s planejamos lan<61>ar vers<72>es novas a cada seis ou oito meses.
1.8) Que documenta<74><61>o est<73> dispon<6F>vel?
V<>rios manuais, p<>ginas de manuais (man pages) e alguns exemplos para
teste est<73>o inclu<6C>dos na distribui<75><69>o. Veja o diret<65>rio /doc. Voc<6F>
pode acessar os manuais online em http://www.PostgreSQL.org/docs.
H<> dois livros sobre PostgreSQL dispon<6F>veis online em
http://www.PostgreSQL.org/docs/awbook.html e
http://www.commandprompt.com/ppbook/. H<> uma lista de livros sobre
PostgreSQL dispon<6F>veis para compra em
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. H<> tamb<6D>m uma
cole<6C><65>o de artigos t<>cnicos sobre PostgreSQL em
http://techdocs.PostgreSQL.org/.
O programa cliente de linha de comando psql tem alguns comandos \d
para mostrar informa<6D><61>o sobre tipos, operadores, fun<75><6E>es, agrega<67><61>es,
etc. Use \? para mostrar os comandos dispon<6F>veis.
Nosso web site cont<6E>m ainda mais documenta<74><61>o.
1.9) Como eu posso saber quais s<>o os bugs conhecidos ou caracter<65>sticas
ausentes?
PostgreSQL suporta um subconjunto extendido do SQL-92. Veja a nossa
lista de afazeres (TODO) para saber sobre bugs conhecidos,
caracter<65>sticas ausentes e planos futuros.
1.10) Como eu posso aprender SQL?
O livro "The PostgreSQL book" em
http://www.PostgreSQL.org/docs/awbook.html ensina SQL. H<> outro livro
sobre PostgreSQL em http://www.commandprompt.com/ppbook. H<> bons
tutoriais em http://www.intermedia.net/support/sql/sqltut.shtm, ,
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
e em http://sqlcourse.com.
Outro <20> o "Teach Yourself SQL in 21 Days, Second Edition" em
http://members.tripod.com/er4ebus/sql/index.htm
Muitos dos nossos usu<73>rios gostam do The Practical SQL Handbook,
Bowman, Judith S., et al., Addison-Wesley. Outros gostam do The
Complete Reference SQL, Groff et al., McGraw-Hill.
1.11) O PostgreSQL est<73> livre do Bug do Mil<69>nio?
Sim, n<>s podemos manipular datas ap<61>s o ano 2000 AD e antes do ano
2000 BC.
1.12) Como posso me juntar a equipe de desenvolvimento?
Primeiramente, fa<66>a o download do c<>digo-fonte e leia a documenta<74><61>o
para Desenvolvedores do PostgreSQL no nosso website ou na
distribui<75><69>o. Depois, se inscreva nas lista de discuss<73>o pgsql-hackers
e pgsql-patches. Ent<6E>o submeta patches de alta qualidade para
pgsql-patches.
H<> algumas pessoas que tem privil<69>gios para fazer mudan<61>as (commit) na
<20>rvore CVS do PostgreSQL. Cada um deles submeteram tantos patches de
alta qualidade que foi imposs<73>vel para os committers continuarem a
fazerem as mudan<61>as, e ent<6E>o n<>s confiamos que os patches que eles
submetem s<>o de alta qualidade.
1.13) 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 ou patches.
1.14) Como <20> o PostgreSQL comparado a outros SGBDs?
H<> v<>rias maneiras de se medir um software: caracter<65>sticas,
performance, confiabilidade, suporte e pre<72>o.
Caracter<65>sticas
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 travamento
(lock) sofisticado. N<>s temos algumas caracter<65>sticas 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
travamentos (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. Comparado ao MySQL ou
sistemas de bancos de dados "leves", n<>s somos mais r<>pidos com
m<>ltiplos usu<73>rios, consultas complexas e carga de consultas de
leitura/escrita. MySQL <20> mais r<>pido para consultas simples com
SELECT feitas por poucos usu<73>rios. <20> claro que o MySQL n<>o tem
muitas das caracter<65>sticas mencionadas na se<73><65>o Caracter<65>sticas
acima. N<>s desenvolvemos buscando confiabilidade e
caracter<65>sticas, e n<>s continuamos a melhorar a performance a
cada vers<72>o.
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.6 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
compat<61>vel com a licen<65>a BSD mencionada acima.
1.15) Como eu posso ajudar financeiramente o projeto PostgreSQL?
PostgreSQL teve sua primeira infra-estrutura em 1996 quando iniciamos.
Somos todos gratos ao Marc Fournier, que criou e gerenciou esta
infra-estrutura ao longo dos anos.
Infra-estrutura de qualidade <20> muito importante em um projeto de
c<>digo aberto. Ela previne descontinuidades que podem facilmente
descontinuar o andamento do projeto.
<20> claro, que a infra-estrutura n<>o <20> barata. H<> v<>rios custos iniciais
e mensais que s<>o necess<73>rios para mant<6E>-la. Se voc<6F> ou sua empresa
tem dinheiro que pode ser doado para ajudar a financiar esse esfor<6F>o,
acesse http://store.pgsql.com/shopping/ e fa<66>a uma doa<6F><61>o.
Embora a p<>gina mencione PostgreSQL, Inc, a "contribui<75><69>o" <20> somente
para apoiar o projeto PostgreSQL e n<>o financia nenhuma empresa
espec<65>fica. Se voc<6F> preferir, voc<6F> pode enviar um cheque para o
endere<72>o de contato.
Se voc<6F> tiver uma hist<73>ria de sucesso sobre o PostgreSQL, envie-a para
nossa lista advocacy em pgsql-advocacy@postgresql.org.
_________________________________________________________________
Perguntas sobre Clientes
2.1) H<> drivers ODBC para PostgreSQL?
H<> dois drivers ODBC dispon<6F>veis, PsqlODBC e o OpenLink ODBC.
Voc<6F> pode fazer o download do PsqlODBC em
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
OpenLink ODBC pode ser conseguido em http://www.openlinksw.com. Ele
trabalha com cliente ODBC padr<64>o, ent<6E>o voc<6F> poder<65> ter o ODBC para
PostgreSQL dispon<6F>vel em toda plataforma que eles suportam (Win, Mac,
Unix, VMS).
Eles provavelmente vender<65>o seu produto para pessoas que precisam de
um suporte de qualidade, mas uma vers<72>o gratuita estar<61> sempre
dispon<6F>vel. Por favor envie perguntas para postgres95@openlink.co.uk.
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 <20> uma excelente interface. Ele est<73> em
http://www.php.net.
Para casos complexos, muitos usam a Interface Perl e CGI.pm ou
mod_perl.
2.3) O PostgreSQL tem interfaces gr<67>ficas para iteragir com o usu<73>rio?
Sim, h<> v<>rias interfaces gr<67>ficas para PostgreSQL dispon<6F>veis. Entre
elas o PgAccess http://www.pgaccess.org), pgAdmin III
(http://www.pgadmin.org, RHDB Admin (http://sources.redhat.com/rhdb/
), TORA (http://www.globecom.net/tora/, parcialmente comercial) e o
Rekall ( http://www.thekompany.com/products/rekall/, propriet<65>ria). H<>
tamb<6D>m o PhpPgAdmin ( http://phppgadmin.sourceforge.net/ ), uma
interface web para PostgreSQL.
Veja http://techdocs.postgresql.org/guides/GUITools para uma lista
mais detalhada.
2.4) Quais linguagens est<73>o dispon<6F>veis para comunicar-se com PostgreSQL?
Muitas linguagens de programa<6D><61>o populares cont<6E>m uma interface para
PostgreSQL. Verifique a lista de extens<6E>es (m<>dulos) da sua linguagem
de programa<6D><61>o.
As seguintes interfaces est<73>o inclu<6C>das na distribui<75><69>o do PostgreSQL:
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Interfaces adicionais est<73>o dispon<6F>veis em http://gborg.postgresql.org
na se<73><65>o de Drivers/Interfaces.
_________________________________________________________________
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) Quando eu inicio o postmaster, eu recebo a mensagem Bad System Call ou
uma descarga de mem<65>ria (core dump). Por que?
Isto pode ser v<>rios problemas, mas primeiro verifique se voc<6F> tem
extens<6E>es do System V instaladas no seu kernel. PostgreSQL requer
suporte no kernel a mem<65>ria compartilhada e sem<65>foros.
3.3) Quando eu tento iniciar o postmaster, eu recebo erros IpcMemoryCreate.
Por que?
Voc<6F> n<>o configurou a mem<65>ria compartilhada corretamente no seu kernel
ou voc<6F> precisa aumentar a mem<65>ria compartilhada dispon<6F>vel no seu
kernel. A quantidade exata que voc<6F> precisa vai depender da
arquitetura e de quantos buffers e processos do servidor voc<6F>
configurou para o postmaster. Muitos sistemas, com o n<>mero padr<64>o de
buffers e processos, precisam de aproximadamente 1 MB. Veja a se<73><65>o
PostgreSQL Administrator's Guide/Server Run-time Environment/Managing
Kernel Resources para mais informa<6D><61>o sobre mem<65>ria compartilhada e
sem<65>foros.
3.4) Quando eu tento iniciar o postmaster, eu recebo erros
IpcSemaphoreCreate. Por que?
Se a mensagem de erro <20> IpcSemaphoreCreate: semget failed (No space
left on device) ent<6E>o o seu kernel n<>o est<73> configurado com o n<>mero
de sem<65>foros suficientes. O Postgres precisa de um sem<65>foro por
processo do servidor. Uma solu<6C><75>o tempor<6F>ria <20> iniciar o postmaster
com um limite pequeno de processos do servidor. Utilize -N com o
par<61>metro menor do que o padr<64>o (32). Uma solu<6C><75>o permanente seria
aumentar os par<61>metros do kernel SEMMNS e SEMMNI.
Sem<65>foros inoperantes podem tamb<6D>m causar danos durante intenso acesso
ao banco de dados.
Se a mensagem <20> outra coisa, voc<6F> possivelmente n<>o tem suporte a
sem<65>foro configurado no seu kernel. Veja o Guia do Administrador para
mais informa<6D><61>o sobre mem<65>ria compartilhada e sem<65>foros.
3.5) 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, e habilite a autentica<63><61>o por
m<>quina modificando o arquivo $PGDATA/pg_hba.conf.
3.6) Como eu ajusto o servidor de banco de dados para obter uma performance
melhor?
Certamente, <20>ndices podem acelerar consultas. O comando EXPLAIN
ANALYZE permite que voc<6F> veja como o PostgreSQL est<73> interpretando a
consulta, e quais os <20>ndices s<>o utilizados.
Se voc<6F> est<73> fazendo muitos INSERTs, considere faz<61>-los em lote
utilizando o comando COPY. Isso <20> mais r<>pido do que INSERTs
individuais. Segundo, senten<65>as que n<>o est<73>o em um bloco de transa<73><61>o
BEGIN WORK/COMMIT s<>o consideradas com se estivessem em sua pr<70>pria
transa<73><61>o. Considere executar v<>rias senten<65>as em um mesmo bloco de
transa<73><61>o. Isso reduz a quantidade de transa<73><61>es. Tamb<6D>m, considere
remover e criar <20>ndices novamente quando estiver fazendo muitas
mudan<61>as nos dados.
H<> v<>rias op<6F><70>es de ajuste em Administration Guide/Server Run-time
Environment/Run-time Configuration. Voc<6F> pode desabilitar o fsync()
utilizando a op<6F><70>o fsync. Isso ir<69> impedir que fsync()s enviem os
dados para disco ap<61>s cada transa<73><61>o.
Voc<6F> pode utilizar a op<6F><70>o shared_buffers para aumentar o n<>mero de
buffers de mem<65>ria compartilhada utilizados pelos processos do
servidor. Se voc<6F> definiu este par<61>metro com um valor muito alto, o
postmaster pode n<>o iniciar porque voc<6F> excedeu o limite de espa<70>o de
mem<65>ria compartilhada do kernel. Cada buffer <20> de 8K e o padr<64>o <20> de
1000 buffers.
Voc<6F> tamb<6D>m pode utilizar a op<6F><70>o sort_mem (no PostgreSQL 8.0:
work_mem) para aumentar a m<>xima quantidade de mem<65>ria utilizada pelo
processo servidor para cada ordena<6E><61>o tempor<6F>ria. O valor padr<64>o <20>
1024 (ou seja 1MB).
Voc<6F> tamb<6D>m pode utilizar o comando CLUSTER para agrupar dados em
tabelas para combinar um <20>ndice. Veja o manual sobre CLUSTER para mais
informa<6D><61>o.
3.7) Quais caracter<65>sticas de depura<72><61>o est<73>o dispon<6F>veis?
PostgreSQL tem v<>rias caracter<65>sticas que relatam informa<6D><61>es que
podem ser valiosas para fins de depura<72><61>o.
Primeiro, execute o configure com a op<6F><70>o --enable-cassert, muitos
assert()s monitoram o progresso do n<>cleo (backend) e finalizam o
programa quando alguma coisa inesperada acontece.
O postmaster e o postgres tem v<>rias op<6F><70>es de depura<72><61>o dispon<6F>veis.
Primeiro, quando iniciar o postmaster, tenha certeza que voc<6F> enviou a
saida padr<64>o e a sa<73>da de erro padr<64>o para um arquivo de log, como em:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Isso ir<69> criar um arquivo server.log no diret<65>rio raiz do PostgreSQL.
Este arquivo conter<65> informa<6D><61>es <20>teis sobre problemas ou erros
encontrados pelo servidor. O Postmaster tem uma op<6F><70>o -d que permite
que informa<6D><61>es mais detalhadas sejam relatadas. A op<6F><70>o -d <20>
acompanhada por um n<>mero que indica o n<>vel de depura<72><61>o. Esteja
alerta de que alto n<>vel de depura<72><61>o gera grandes arquivos de log.
Se o postmaster n<>o est<73> sendo executado, voc<6F> pode executar o n<>cleo
do postgres a partir da linha de comando, e digitar a sua senten<65>a SQL
diretamente. Isso <20> recomendado somente para fins de depura<72><61>o. Note
que uma nova linha termina a consulta, e n<>o um ponto-e-v<>rgula. Se
voc<6F> compilou com s<>mbolos de depura<72><61>o, voc<6F> pode utilizar um
depurador para ver o que est<73> acontecendo. Como o n<>cleo (backend) n<>o
foi iniciado a partir do postmaster, ele n<>o est<73> executando em um
ambiente id<69>ntico e problemas de itera<72><61>o com o n<>cleo/travamento n<>o
podem ser reproduzidos.
Se o postmaster est<73> sendo executado, inicie o psql em uma janela, e
ent<6E>o encontre o PID do processo postgres utilizado pelo psql
utilizando SELECT pg_backend_pid(). Utilize um depurador para anexar
ao PID do postgres. Voc<6F> pode definir pontos de parada (breakpoints)
no depurador e digitar consultas no psql. Se voc<6F> est<73> depurando a
inicializa<7A><61>o do postgres, voc<6F> pode definir PGOPTIONS="-W n" e ent<6E>o
iniciar o psql. Isto retardar<61> a inicializa<7A><61>o por n segundos ent<6E>o
voc<6F> pode anexar o depurador ao processo, definir quaisquer pontos de
parada e continuar pela sequ<71>ncia de inicializa<7A><61>o.
H<> v<>rias vari<72>veis de configura<72><61>o do servidor log_* que habilitam a
exibi<62><69>o de estat<61>sticas que podem ser muito <20>teis para depura<72><61>o e
medidas de performance.
Voc<6F> tamb<6D>m pode compilar com perfil para ver que fun<75><6E>es est<73>o
demandando tempo de execu<63><75>o. Os arquivo de perfil do n<>cleo (backend)
ser<65>o colocados no diret<65>rio pgsql/data/base/dbname. O arquivo de
perfil do cliente ser<65> colocado no diret<65>rio atual do cliente. O Linux
requer uma compila<6C><61>o com -DLINUX_PROFILE para cria<69><61>o dos perfis.
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
Voc<6F> precisa aumentar o limite do postmaster de quantos processos do
servidor concorrentes ele pode iniciar.
O limite padr<64>o <20> de 32 processos. Voc<6F> pode aument<6E>-lo reiniciando o
postmaster com o valor conveniente de -N ou modificar o
postgresql.conf.
Note que se voc<6F> definir o -N com um valor maior do que 32, voc<6F>
tamb<6D>m deve aumentar -B cujo padr<64>o <20> 64; -B deve ser pelo menos duas
vezes -N, e provavelmente deve ser mais do que isso para uma melhor
performance. Para um grande n<>mero de processos do servidor, voc<6F>
tamb<6D>m precisa aumentar v<>rios par<61>metros de configura<72><61>o do kernel do
Unix. Coisas para serem observadas incluem o tamanho m<>ximo de blocos
de mem<65>ria compartilhada, SHMMAX; o n<>mero m<>ximo de sem<65>foros, SEMMNS
e SEMMNI; o n<>mero m<>ximo de processos, NPROC; o n<>mero m<>ximo de
processos por usu<73>rio, MAXUPRC; e o n<>mero m<>ximo de arquivos abertos,
NFILE e NINODE. A raz<61>o na qual o PostgreSQL tem um limite de n<>mero
de processos do servidor permitidos <20> para que o seu sistema n<>o fique
sem recursos dispon<6F>veis.
3.9) O que est<73> no diret<65>rio pgsql_tmp?
Este diret<65>rio cont<6E>m arquivos tempor<6F>rios gerados pelo executor de
uma consulta. Por exemplo, se uma ordena<6E><61>o <20> necess<73>ria para
satisfazer um ORDER BY e a ordena<6E><61>o requer mais espa<70>o do que o
par<61>metro -S do servidor permite, ent<6E>o arquivos tempor<6F>rios s<>o
criados para abrigar os dados extras.
Os arquivos tempor<6F>rios geralmente s<>o apagados automaticamente, mas
podem persistir caso o servidor termine anormalmente durante a
ordena<6E><61>o. Uma parada e um rein<69>cio do postmaster remover<65> os arquivos
destes diret<65>rios.
3.10) O que eu preciso fazer para exportar e importar durante a atualiza<7A><61>o
entre vers<72>es do PostgreSQL?
O time do PostgreSQL faz somente pequenas mudan<61>as entre vers<72>es
menores, ent<6E>o atualizar da vers<72>o 7.2 para 7.2.1 n<>o requer uma
exporta<74><61>o e uma importa<74><61>o. Contudo, vers<72>es maiores (i.e. da 7.2
para 7.3) 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 em um formato gen<65>rico que pode ser importada utilizando o
novo formato interno.
Em vers<72>es onde o formato em disco n<>o muda, o script pg_upgrade pode
ser utilizado para atualizar sem precisar de um dump/restore. As notas
da vers<72>o mencionam se pg_upgrade est<73> dispon<6F>vel para a vers<72>o.
3.11) 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 satilde;o de mesma
qualidade. Natilde;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) Qual <20> a diferen<65>a entre cursores bin<69>rios e normais?
Veja o comando DECLARE no manual para uma descri<72><69>o.
4.2) Como eu fa<66>o um SELECT somente dos primeiros registros de uma
consulta? Um registro rand<6E>mico?
Veja o manual do FETCH, ou utilize SELECT ... LIMIT....
Toda a consulta tem que ser avaliada, mesmo se voc<6F> s<> quer os
primeiros registros. Considere utilizar uma consulta que tenha um
ORDER BY. Se h<> um <20>ndice que combina com o ORDER BY, o PostgreSQL
pode ser capaz de avaliar somente os primeiros registros requisitados,
ou toda consulta tem que ser avaliada at<61> que os registros desejados
tenham sido gerados.
Para obter um registro rand<6E>mico, utilize:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.3) Como eu obtenho a lista de tabelas ou outras coisas que eu posso ver
no psql?
Utilize o comando \dt para ver tabelas no psql. Para obter uma lista
completa de 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 comandos SQL que geram a
sa<73>da para os comandos do psql. Voc<6F> tamb<6D>m pode iniciar o psql com a
op<6F><70>o -E ent<6E>o ser<65>o mostradas as consultas utilizadas para executar
os comandos que voc<6F> digitou. PostgreSQL tamb<6D>m fornece uma interface
para o INFORMATION SCHEMA SQLi na qual voc<6F> pode consultar informa<6D><61>es
sobre o banco de dados.
4.4) Como eu removo uma coluna de uma tabela ou mudo o seu tipo de dados?
A funcionalidade DROP COLUMN foi adicionada a vers<72>o 7.3 com comando
ALTER TABLE DROP COLUMN. Em vers<72>es anteriores, voc<6F> pode fazer isto:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- selecione todas colunas mas n<>o aquela que voc<6F> quer remover
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
Para alterar o tipo de dados de uma coluna, fa<66>a isto:
BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
Voc<6F> pode querer executar o comando VACUUM FULL tab para recuperar o
espa<70>o em disco utilizado pelos registros expirados.
4.5) 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? 1.6TB
Tamanho m<>ximo de um campo? 1 GB
N<EFBFBD>mero m<>ximo de registros em uma tabela? ilimitado
N<EFBFBD>mero m<>ximo de colunas em uma tabela? 250-1600 dependendo dos tipos das colunas
N<EFBFBD>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 e o n<>mero m<>ximo de colunas pode ser
quadruplicadas aumentando-se o tamanho dos blocos para 32k.
4.6) 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 6.4 MB:
32 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
-------------------------------------------
60 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
------------------------ = 136 registros por p<>gina do banco de dados (arredondado para baixo)
60 bytes por registro
100000 registros de dados
---------------------------- = 735 p<>ginas do banco de dados (arredondadopara cima)
128 registros por p<>gina
735 p<>ginas do banco de dados * 8192 bytes por p<>gina = 6,021,120 bytes (6 MB)
<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.7) Como eu descrubo quais tabelas, <20>ndices, bancos de dados e usu<73>rios
est<73>o definidos?
psql tem uma variadade de comandos com barra invertida que mostram
tais informa<6D><61>es. Utilize \? para v<>-los. H<> tamb<6D>m tabelas do sistema
que come<6D>am com pg_ e que os descrevem tamb<6D>m. Tamb<6D>m, psql -l listar<61>
todos os bancos de dados.
Veja tamb<6D>m o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
muitos SELECTs necess<73>rios para obter informa<6D><61>o das tabelas do
sistema de banco de dados.
4.8) Minhas consultas est<73>o lentas ou n<>o est<73>o utilizando <20>ndices. Por
que?
<20>ndices n<>o s<>o automaticamente utilizados por toda consulta. <20>ndices
s<> s<>o utilizados se uma tabela <20> maior do que o tamanho m<>nimo e uma
consulta seleciona somente uma porcentagem pequena de registros de uma
tabela. Isto porque o acesso rand<6E>mico ao disco causado por uma busca
por <20>ndice pode ser mais lento do que uma leitura ao longo da tabela
ou uma busca sequencial.
Para determinar se um <20>ndice pode ser utilizado, o PostgreSQL deve ter
estat<61>sticas sobre a tabela. Estas estat<61>sticas s<>o coletadas
utilizando VACUUM ANALYZE ou simplesmente ANALYZE. Utilizando
estat<61>sticas, o otimizador saber quantos registros h<> na tabela e pode
determinar melhor se um <20>ndice deve ser utilizado. 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 deve ser feita 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 seguida por uma ordena<6E><61>o expl<70>cita <20>
usualmente mais r<>pida do que uma busca por <20>ndice em uma tabela
grande.
Contudo, LIMIT combinado com ORDER BY frequentemente utilizar<61> um
<20>ndice porque somente uma pequena por<6F><72>o da tabela <20> retornada. De
fato, embora MAX() e MIN() n<>o utilizem <20>ndices, <20> poss<73>vel obter tais
valores utilizando um <20>ndice com ORDER BY e LIMIT:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Se voc<6F> acredita que o otimizador est<73> incorreto ao escolher uma busca
sequencial, utilize SET enable_seqscan TO 'off' e execute testes para
ver se uma busca por <20>ndice <20> de fato <20> mais r<>pida.
Quando <20> utilizado operadores com curingas tais como LIKE ou ~,
<20>ndices s<> podem ser utilizados em certas circunst<73>ncias:
* O <20>n<EFBFBD>cio de uma string de busca deve ser o in<69>cio da string, i.e.
+ modelos no LIKE n<>o devem come<6D>ar com %.
+ modelos no ~ (express<73>o regular) n<>o devem come<6D>ar com ^.
* A string de busca n<>o pode iniciar com uma classe de caracteres,
i.e. [a-e].
* Buscas que n<>o diferenciam mai<61>sculas de min<69>sculas tais como
ILIKE e ~* n<>o utilizam <20>ndices. Ao inv<6E>s, utilize <20>ndices
funcionais, que s<>o descritos na se<73><65>o 4.12.
* A localidade padr<64>o C deve ser utilizada durante o initdb porque
n<>o <20> poss<73>vel saber o pr<70>ximo/maior caracter em uma localidade
que n<>o seja a C. Voc<6F> pode criar um <20>ndice especial
text_pattern_ops para tais casos que funcionam somente para
indexa<78><61>o utilizando LIKE.
Em vers<72>es anteriores a 8.0, <20>ndices frequentemente n<>o podiam ser
usados a menos que os tipos de dados correspodessem aos tipos da
coluna do <20>ndice. Isto <20> particularmente verdadeiro para <20>ndices de
coluna int2, int8 e numeric.
4.9) Como eu vejo como o otimizador de consulta est<73> avaliando a minha
consulta?
Veja o comando EXPLAIN no manual.
4.10) O que <20> um <20>ndice de <20>rvore R?
Um <20>ndice de <20>rvore B <20> utilizado para indexa<78><61>o de dados espaciais.
Um <20>ndice do tipo hash n<>o pode manipular buscas em intervalos. Um
<20>ndice de <20>rvore B manipula somente buscas em intervalos em uma
dimens<6E>o. Um <20>ndice de <20>rvore R pode manipular dados
multidimensionais. Por exemplo, se um <20>ndice de <20>rvore R pode ser
contruido em um atributo do tipo point, o sistema pode responder mais
eficientemente consultas tais como "busque todos os pontos dentro dos
limites do ret<65>ngulo."
A pesquisa can<61>nica que descreve o modelo original da <20>rvore R est<73>
em:
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of
Data, 45-57.
Voc<6F> tamb<6D>m pode encontrar esse documento em "Readings in Database
Systems" do Stonebraker
<20>rvores R podem manipular pol<6F>gonos e caixas. Na teoria, <20>rvores R
podem ser extendidos para manipular um grande n<>mero de dimens<6E>es. Na
pr<70>tica, extendendo <20>rvores R requer um pouco de trabalho e n<>s n<>o
temos atualmente nenhuma documenta<74><61>o de como faz<61>-lo.
4.11) O que <20> um Otimizador Gen<65>tico de Consultas?
O m<>dulo GEQO acelera a otimiza<7A><61>o de consultas quando se faz uma
jun<75><6E>o de v<>rias tabelas utilizando o conceito de Algoritmo Gen<65>tico
(AG). Isso permite a manipula<6C><61>o de consultas com muitas jun<75><6E>es
utilizando buscas n<>o exaustivas.
4.12) 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 funcional, ele ser<65> utilizado:
CREATE INDEX tabindex ON tab (lower(col));
4.13) Em uma consulta, como eu detecto se um campo <20> NULL?
Voc<6F> pode testar a coluna com IS NULL e IS NOT NULL.
4.14) Qual <20> a difenren<65>a entre os v<>rios tipos de dados de caracteres?
Tipo Nome Interno Notas
--------------------------------------------------
VARCHAR(n) varchar tamanho especifica o comprimento 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 (null-byte safe)
"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, esses tipos de dados tamb<6D>m s<>o
sujeitos a compress<73>o ou a serem armazenados fora do padr<64>o utilizando
o TOAST, 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) 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.15.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 mais informa<6D><61>o
sobre sequ<71>ncias. Voc<6F> tamb<6D>m pode utilizar o campo OID para cada
registro como um valor <20>nico. Contudo, se voc<6F> precisar exportar e
importar o banco de dados, voc<6F> precisa utilizar a op<6F><70>o -o do pg_dump
ou a op<6F><70>o COPY WITH OIDS para preservar os OIDs.
4.15.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.15.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')");
Finalmente, voc<6F> poderia utilizar o OID retornado da senten<65>a INSERT
para obter o valor padr<64>o, embora este seja a abordagem menos
port<72>vel, pois o valor do oid n<>o ultrapassa 4 bilh<6C>es. Em Perl,
utilizando DBI com o m<>dulo DBD::Pg, o valor do oid est<73> dispon<6F>vel
via $sth->{pg_oid_status} depois de $sth->execute().
4.15.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 pelo seu n<>cleo
(backend), e n<>o por todos os usu<73>rios.
4.15.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 TID?
OIDs s<>o a resposta do PostgreSQL a ids <20>nicos de registros. Cada
registro que <20> criado no PostgreSQL recebe um OID <20>nico. Todos OIDs
produzidos durante o initdb s<>o menores do que 16384 (de
include/access/transam.h). Todos os OIDs criados pelo usu<73>rio s<>o
iguais ou maiores do que este valor. Por padr<64>o, todos estes OIDs s<>o
<20>nicos n<>o somente na tabela ou no banco de dados, mas na instala<6C><61>o
do PostgreSQL.
PostgreSQL utiliza OIDs nas tabelas internas do sistema para ligar
registros entre tabelas. Estes OIDs podem ser utilizados para
identificar registros de usu<73>rios espec<65>ficos e podem ser utilizados
em jun<75><6E>es. <20> recomendado que voc<6F> utilize o tipo de coluna OID para
armazenar valores OID. Voc<6F> pode criar um <20>ndice no campo OID para
acesso r<>pido.
OIDs s<>o atribu<62>dos para todas os registros novos de uma <20>rea central
que <20> utilizada por todos os bancos de dados. Se voc<6F> quer mudar o OID
de alguma coisa, ou se voc<6F> quer fazer uma c<>pia da tabela, com os
OIDs, n<>o h<> raz<61>o para que voc<6F> n<>o possa faz<61>-la:
CREATE TABLE nova_tabela(minha_coluna int);
SELECT oid as oid_antigo, minha_coluna INTO tabela_tmp FROM tabela_antiga;
COPY tabela_tmp TO '/tmp/pgtable';
DROP TABLE tabela_tmp;
COPY nova_tabela WITH OIDS FROM '/tmp/pgtable';
OIDs s<>o armazenados como inteiros de 4 bytes, e n<>o ultrapassam 4
bilh<6C>es. Ningu<67>m nunca reportou que isso tenha ocorrido, e n<>s
planejamos remover o limite antes que alg<6C>em o alcan<61>e.
TIDs s<>o utilizados para identificar registros f<>sicos espec<65>ficos com
valores de bloco e deslocamento. TIDs mudam ap<61>s registros serem
modificados ou recarregados. Eles s<>o utilizados por <20>ndices para
apontar para registros f<>sicos.
4.17) Qual <20> o significado de alguns termos utilizados no PostgreSQL?
O c<>digo-fonte e documenta<74><61>o antiga utiliza termos de uso comum. Aqui
est<73>o alguns deles:
* tabela, rela<6C><61>o, classe
* linha, registro, tupla
* coluna, campo, atributo
* recupera, seleciona
* altera, atualiza
* incrementa, insere
* OID, valor serial
* portal, cursor
* intervalo vari<72>vel, nome da tabela, alias de tabela
Uma lista de termos gerais de bancos de dados pode ser encontrada em:
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
/glossary.html
4.18) Por que eu recebo o erro "ERROR: Memory exhausted in
AllocSetAlloc()"?
Voc<6F> provavelmente est<73> sem mem<65>ria virtual no 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 n<>cleo
(backend) retornou muitos dados, tente-o antes de iniciar o cliente.
4.19) Como eu informo qual vers<72>o do PostgreSQL eu estou utilizando?
No psql, digite SELECT version();
4.20) Por que minhas opera<72><61>es com objetos grandes retorna "invalid large
obj descriptor"?
Voc<6F> precisa colocar BEGIN WORK e COMMIT ao redor de qualquer uso de
opera<72><61>es com objetos grandes, isto <20>, ao redor de lo_open ...
lo_close.
Atualmente PostgreSQL obriga o fechamento de manipula<6C><61>o de um objeto
grande quando uma transa<73><61>o <20> submetida (commit). Ent<6E>o a primeira
tentativa de fazer qualquer coisa com o manipulador ir<69> retornar
invalid large obj descriptor. Ent<6E>o o c<>digo que funcionava (ao menos
a algum tempo atr<74>s) agora ir<69> retornar uma mensagem de erro se voc<6F>
n<>o utilizar uma transa<73><61>o.
4.21) 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.22) Por que as minhas subconsultas que utilizam IN est<73>o t<>o lentas?
Em vers<72>es anteriores a 7.4, subconsultas eram agrupadas em consultas
externas utilizando uma busca sequencial no resultado da subconsulta
de cada registro da consulta externa. Se uma subconsulta retorna
somente alguns registros e a consulta externa retorna muitos
registros, IN <20> mais r<>pido. Para acelerar consultas externas,
substitua IN por EXISTS:
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
por:
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
Para isto ser r<>pido, subcol deve ser uma coluna indexada.
A partir da vers<72>o 7.4, IN utiliza a mesma t<>cnica de agrupamento do
que consultas normais, e <20> recomendado utilizar EXISTS.
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).
Em vers<72>es anteriores, jun<75><6E>es externas podiam ser simuladas
utilizando UNION e NOT IN. Por exemplo, quando juntar tab1 e tab2, a
consulta a seguir faz uma jun<75><6E>o externa de duas tabelas:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) 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.25) Como eu retorno m<>ltiplos registros ou colunas de uma fun<75><6E>o?
No 7.3, voc<6F> pode facilmente retornar m<>ltiplos registros ou colunas
de uma fun<75><6E>o,
http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.26) Por que eu n<>o posso confiar na cria<69><61>o/remo<6D><6F>o de 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.27) Que op<6F><70>es para encripta<74><61>o est<73>o dispon<6F>veis?
* No contrib/pgcrypto cont<6E>m muitas fun<75><6E>es de encripta<74><61>o para
serem utilizados em consultas SQL.
* Para encriptar a transmiss<73>o do cliente ao servidor, o servidor
deve ter a op<6F><70>o ssl definida como true no postgresql.conf, e um
registro host ou hostssl deve existir no pg_hba.conf, e o sslmode
no cliente n<>o deve estar disable. (Note que tamb<6D>m <20> poss<73>vel
utilizar outros esquemas de transporte encriptado, tais como
stunnel ou ssh, ao inv<6E>s da conex<65>o SSL nativa do PostgreSQL.)
* Senhas dos usu<73>rios do banco de dados s<>o automaticamente
encriptadas quando armazenadas na vers<72>o 7.3. Em vers<72>es
anteriores, voc<6F> deve habilitar a op<6F><70>o PASSWORD_ENCRYPTION no
postgresql.conf.
* O servidor pode executar utilizando um sistema de arquivos
encriptado.
_________________________________________________________________
Extendendo o PostgreSQL
5.1) Eu escrevi uma fun<75><6E>o. Quando eu executo-a no psql, por que ela
finaliza o programa com descarga de mem<65>ria (core dump)?
O problema pode ser v<>rias coisas. Tente testar sua fun<75><6E>o em um
programa independente.
5.2) Como eu posso contribuir com alguns tipos e fun<75><6E>es novas para o
PostgreSQL?
Envie as suas extens<6E>es para a lista de discuss<73>o pgsql-hackers, e
elas eventualmente ser<65>o colocadas no subdiret<65>rio contrib/.
5.3) Como eu escrevo uma fun<75><6E>o em C que retorna uma tupla?
Em vers<72>es do PostgreSQL a partir da 7.3, fun<75><6E>es que retornam tuplas
s<>o suportadas em C, PL/PgSQL e SQL. Veja o Guia do Programador para
mais informa<6D><61>o. Um exemplo de uma fun<75><6E>o escrita em C e que retorna
tuplas pode ser encontrada em contrib/tablefunc.
5.4) Eu alterei um arquivo do c<>digo-fonte. Por que a recompila<6C><61>o n<>o
surtiu efeito?
Os arquivos Makefiles n<>o tem as depend<6E>ncias corretas para incluir
arquivos. Voc<6F> deve executar um make clean e ent<6E>o o make. Se voc<6F>
est<73> utilizando o GCC voc<6F> pode utilizar a op<6F><70>o --enable-depend do
configure para o compilador computar as depend<6E>ncias automaticamente.