|
|
|
|
|
|
|
|
|
Perguntas Frequentes (FAQ) sobre PostgreSQL
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ltima atualiza<EFBFBD><EFBFBD>o: Sex Jun 4 00:09:16 EDT 2004
|
|
|
|
|
|
|
|
|
|
Mantenedor atual: Bruce Momjian (pgman@candle.pha.pa.us)
|
|
|
|
|
|
|
|
|
|
Traduzido por: Euler Taveira de Oliveira (euler@ufgnet.ufg.br)
|
|
|
|
|
|
|
|
|
|
A vers<EFBFBD>o mais recente desse documento pode ser vista em
|
|
|
|
|
http://www.PostgreSQL.org/docs/faqs/FAQ.html (EN).
|
|
|
|
|
http://www.PostgreSQL.org/docs/faqs/FAQ_brazilian.html (pt_BR).
|
|
|
|
|
|
|
|
|
|
Perguntas sobre plataformas espec<EFBFBD>ficas s<EFBFBD>o respondidas em
|
|
|
|
|
http://www.PostgreSQL.org/docs/index.html.
|
|
|
|
|
_________________________________________________________________
|
|
|
|
|
|
|
|
|
|
Perguntas Gerais
|
|
|
|
|
|
|
|
|
|
1.1) O que <EFBFBD> PostgreSQL? Como ele <EFBFBD> pronunciado?
|
|
|
|
|
1.2) Qual <EFBFBD> a licen<EFBFBD>a do PostgreSQL?
|
|
|
|
|
1.3) Quais plataformas Unix o PostgreSQL pode ser executado?
|
|
|
|
|
1.4) Quais portabilidades n<EFBFBD>o-Unix est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
1.5) Onde eu posso conseguir o PostgreSQL?
|
|
|
|
|
1.6) Onde eu posso conseguir suporte?
|
|
|
|
|
1.7) Qual <EFBFBD> a <EFBFBD>ltima vers<EFBFBD>o?
|
|
|
|
|
1.8) Que documenta<EFBFBD><EFBFBD>o est<EFBFBD> dispon<EFBFBD>vel?
|
|
|
|
|
1.9) Como eu posso saber quais s<EFBFBD>o os bugs conhecidos ou
|
|
|
|
|
caracter<EFBFBD>sticas ausentes?
|
|
|
|
|
1.10) Como eu posso aprender SQL?
|
|
|
|
|
1.11) O PostgreSQL est<EFBFBD> livre do Bug do Mil<EFBFBD>nio?
|
|
|
|
|
1.12) Como posso me juntar a equipe de desenvolvimento?
|
|
|
|
|
1.13) Como eu informo a exist<EFBFBD>ncia de um bug?
|
|
|
|
|
1.14) Como <EFBFBD> o PostgreSQL comparado a outros SGBDs?
|
|
|
|
|
1.15) Como eu posso ajudar financeiramente o projeto PostgreSQL?
|
|
|
|
|
|
|
|
|
|
Perguntas sobre Clientes
|
|
|
|
|
|
|
|
|
|
2.1) H<EFBFBD> drivers ODBC para PostgreSQL?
|
|
|
|
|
2.2) Quais ferramentas est<EFBFBD>o dispon<EFBFBD>veis para utilizar o PostgreSQL
|
|
|
|
|
com p<EFBFBD>ginas Web?
|
|
|
|
|
2.3) O PostgreSQL tem interfaces gr<EFBFBD>ficas para interagir com usu<EFBFBD>rio?
|
|
|
|
|
2.4) Quais linguagens est<EFBFBD>o dispon<EFBFBD>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<EFBFBD>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<EFBFBD>es de outras m<EFBFBD>quinas?
|
|
|
|
|
3.6) Como eu ajusto o servidor de banco de dados para obter uma
|
|
|
|
|
performance melhor?
|
|
|
|
|
3.7) Quais caracter<EFBFBD>sticas de depura<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento
|
|
|
|
|
conectar?
|
|
|
|
|
3.9) O que est<EFBFBD> no diret<EFBFBD>rio pgsql_tmp?
|
|
|
|
|
3.10) O que eu preciso fazer para exportar e importar durante a
|
|
|
|
|
atualiza<EFBFBD><EFBFBD>o de vers<EFBFBD>es do PostgreSQL?
|
|
|
|
|
|
|
|
|
|
Perguntas Operacionais
|
|
|
|
|
|
|
|
|
|
4.1) Qual <EFBFBD> a diferen<EFBFBD>a entre cursores bin<EFBFBD>rios e normais?
|
|
|
|
|
4.2) Como eu fa<EFBFBD>o um SELECT somente dos primeiros registros de uma
|
|
|
|
|
consulta? Um registro rand<EFBFBD>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 <EFBFBD> o tamanho m<EFBFBD>ximo de um registro, uma tabela e um banco de
|
|
|
|
|
dados?
|
|
|
|
|
4.6) Quanto espa<EFBFBD>o em disco <EFBFBD> necess<EFBFBD>rio para armazenar dados de um
|
|
|
|
|
arquivo texto?
|
|
|
|
|
4.7) Como eu descubro quais tabelas, <EFBFBD>ndices, bancos de dados e
|
|
|
|
|
usu<EFBFBD>rios est<EFBFBD>o definidos?
|
|
|
|
|
4.8) Minhas consultas est<EFBFBD>o lentas ou n<EFBFBD>o est<EFBFBD>o utilizando <EFBFBD>ndices.
|
|
|
|
|
Por que?
|
|
|
|
|
4.9) Como eu vejo como o otimizador de consultas est<EFBFBD> avaliando minha
|
|
|
|
|
consulta?
|
|
|
|
|
4.10) O que <EFBFBD> um <EFBFBD>ndice de <EFBFBD>rvore R (R-tree)?
|
|
|
|
|
4.11) O que <EFBFBD> um Otimizador Gen<EFBFBD>tico de Consultas?
|
|
|
|
|
4.12) Como eu fa<EFBFBD>o buscas com express<EFBFBD>es regulares e buscas com
|
|
|
|
|
express<EFBFBD>es regulares sem diferenciar mai<EFBFBD>sculas de min<EFBFBD>sculas? Como eu
|
|
|
|
|
utilizo um <EFBFBD>ndice para buscas que n<EFBFBD>o diferenciam mai<EFBFBD>sculas de
|
|
|
|
|
min<EFBFBD>sculas?
|
|
|
|
|
4.13) Em uma consulta, como eu detecto se um campo <EFBFBD> NULL?
|
|
|
|
|
4.14) Qual <EFBFBD> a diferen<EFBFBD>a entre os v<EFBFBD>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() e nextval() n<EFBFBD>o lidam com condi<EFBFBD><EFBFBD>o de corrida com
|
|
|
|
|
outros usu<EFBFBD>rios?
|
|
|
|
|
4.15.4) Por que os n<EFBFBD>meros da minha sequ<EFBFBD>ncia n<EFBFBD>o s<EFBFBD>o reutilizados
|
|
|
|
|
quando uma transa<EFBFBD><EFBFBD>o <EFBFBD> abortada? Por que h<EFBFBD> intervalos nos n<EFBFBD>meros da
|
|
|
|
|
minha sequ<EFBFBD>ncia/coluna SERIAL?
|
|
|
|
|
4.16) O que <EFBFBD> um OID? O que <EFBFBD> um TID?
|
|
|
|
|
4.17) Qual <EFBFBD> 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<EFBFBD>o do PostgreSQL eu estou utilizando?
|
|
|
|
|
4.20) Por que minhas opera<EFBFBD><EFBFBD>es com objetos grandes retorna "invalid
|
|
|
|
|
large obj descriptor"?
|
|
|
|
|
4.21) Como eu crio uma coluna que conter<EFBFBD> por padr<EFBFBD>o a hora atual?
|
|
|
|
|
4.22) Por que as minhas subconsultas que utilizam IN est<EFBFBD>o t<EFBFBD>o lentas?
|
|
|
|
|
4.23) Como eu fa<EFBFBD>o uma jun<EFBFBD><EFBFBD>o externa (outer join)?
|
|
|
|
|
4.24) Como eu fa<EFBFBD>o consultas utilizando m<EFBFBD>ltiplos bancos de dados?
|
|
|
|
|
4.25) Como eu retorno m<EFBFBD>ltiplos registros ou colunas de uma fun<EFBFBD><EFBFBD>o?
|
|
|
|
|
4.26) Por que eu n<EFBFBD>o posso confiar na cria<EFBFBD><EFBFBD>o/remo<EFBFBD><EFBFBD>o de tabelas
|
|
|
|
|
tempor<EFBFBD>rias em fun<EFBFBD><EFBFBD>es PL/PgSQL?
|
|
|
|
|
4.27) Que op<EFBFBD><EFBFBD>es para replica<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
4.28) Que op<EFBFBD><EFBFBD>es para encripta<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
|
|
|
|
|
Extendendo o PostgreSQL
|
|
|
|
|
|
|
|
|
|
5.1) Eu escrevi uma fun<EFBFBD><EFBFBD>o. Quando eu executo-a no psql, por que ela
|
|
|
|
|
finaliza o programa com descarga de mem<EFBFBD>ria (core dump)?
|
|
|
|
|
5.2) Como eu posso contribuir com alguns tipos e fun<EFBFBD><EFBFBD>es novas para o
|
|
|
|
|
PostgreSQL?
|
|
|
|
|
5.3) Como eu escrevo uma fun<EFBFBD><EFBFBD>o em C que retorna uma tupla?
|
|
|
|
|
5.4) Eu alterei um arquivo do c<EFBFBD>digo-fonte. Por que a recompila<EFBFBD><EFBFBD>o n<EFBFBD>o
|
|
|
|
|
surtiu efeito?
|
|
|
|
|
_________________________________________________________________
|
|
|
|
|
|
|
|
|
|
Perguntas Gerais
|
|
|
|
|
|
|
|
|
|
1.1) O que <EFBFBD> PostgreSQL? Como ele <EFBFBD> pronunciado?
|
|
|
|
|
|
|
|
|
|
PostgreSQL <EFBFBD> pronunciado Post-Gres-Qui-El. Um arquivo de <EFBFBD>udio est<EFBFBD>
|
|
|
|
|
dispon<EFBFBD>vel em http://www.postgresql.org/postgresql.mp3 para aqueles
|
|
|
|
|
que gostariam de ouvir a pron<EFBFBD>ncia.
|
|
|
|
|
|
|
|
|
|
PostgreSQL <EFBFBD> um melhoramento do sistema de ger<EFBFBD>ncia de banco de dados
|
|
|
|
|
POSTGRES (e tamb<EFBFBD>m <EFBFBD>, <EFBFBD>s vezes, chamado simplesmente de "Postgres"),
|
|
|
|
|
um prot<EFBFBD>tipo de pesquisa de um SGBD de <EFBFBD>ltima gera<EFBFBD><EFBFBD>o. Enquanto o
|
|
|
|
|
PostgreSQL ret<EFBFBD>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 <EFBFBD> livre e o
|
|
|
|
|
c<EFBFBD>digo-fonte completo est<EFBFBD> dispon<EFBFBD>vel.
|
|
|
|
|
|
|
|
|
|
O desenvolvimento do PostgreSQL <EFBFBD> feito por um grupo de
|
|
|
|
|
desenvolvedores que est<EFBFBD>o inscritos na lista de e-mails de
|
|
|
|
|
desenvolvimento do PostgreSQL. O coordenador atual <EFBFBD> Marc G. Fournier
|
|
|
|
|
(scrappy@PostgreSQL.org). (Veja a se<EFBFBD><EFBFBD>o 1.6 para saber como se juntar
|
|
|
|
|
ao grupo). O grupo <EFBFBD> respons<EFBFBD>vel por todo o desenvolvimento do
|
|
|
|
|
PostgreSQL. <EFBFBD> um projeto da comunidade e n<EFBFBD>o <EFBFBD> controlado por nenhuma
|
|
|
|
|
empresa. Para se juntar ao grupo, veja a FAQ do desenvolvedor em
|
|
|
|
|
http://www.PostgreSQL.org/docs/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<EFBFBD>digo.
|
|
|
|
|
O c<EFBFBD>digo original do Postgres, do qual o PostgreSQL foi derivado, foi
|
|
|
|
|
um esfor<EFBFBD>o de muitos estudantes de gradua<EFBFBD><EFBFBD>o e p<EFBFBD>s-gradua<EFBFBD><EFBFBD>o e uma
|
|
|
|
|
equipe de programadores trabalhando sobre a dire<EFBFBD><EFBFBD>o do Professor
|
|
|
|
|
Michael Stonebraker na Universidade da Calif<EFBFBD>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 <EFBFBD> a licen<EFBFBD>a do PostgreSQL?
|
|
|
|
|
|
|
|
|
|
PostgreSQL est<EFBFBD> sujeito a seguinte licen<EFBFBD>a:
|
|
|
|
|
|
|
|
|
|
PostgreSQL Sistema de Ger<EFBFBD>ncia de Banco de Dados
|
|
|
|
|
|
|
|
|
|
Portions copyright (c) 1996-2004, PostgreSQL Global Development Group
|
|
|
|
|
Portions Copyright (c) 1994-6 Regents of the University of California
|
|
|
|
|
|
|
|
|
|
Permiss<EFBFBD>o de uso, c<EFBFBD>pia, modifica<EFBFBD><EFBFBD>o e distribui<EFBFBD><EFBFBD>o desse software e
|
|
|
|
|
sua documenta<EFBFBD><EFBFBD>o para qualquer prop<EFBFBD>sito, sem taxa, e sem um acordo
|
|
|
|
|
escrito est<EFBFBD> concedida por esse meio, contanto que a nota da licen<EFBFBD>a
|
|
|
|
|
acima, esse par<EFBFBD>grafo e os dois par<EFBFBD>grafos seguintes apare<EFBFBD>am em todas
|
|
|
|
|
as c<EFBFBD>pias.
|
|
|
|
|
|
|
|
|
|
EM NENHUM EVENTO A UNIVERSIDADE DA CALIF<EFBFBD>RNIA SER<EFBFBD> RESPONS<EFBFBD>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<EFBFBD><EFBFBD>O, MESMO SE A UNIVERSIDADE DA
|
|
|
|
|
CALIF<EFBFBD>RNIA ESTIVER SIDO AVISADA DA POSSIBILIDADE DE TAL DANO.
|
|
|
|
|
|
|
|
|
|
A UNIVERSIDADE DA CALIF<EFBFBD>RNIA ESPECIFICADAMENTE N<EFBFBD>O D<EFBFBD> NENHUMA
|
|
|
|
|
GARANTIA, INCLUINDO, MAS N<EFBFBD>O LIMITADO A, GARANTIAS IMPL<EFBFBD>CITAS DE
|
|
|
|
|
COMERCIALIZA<EFBFBD><EFBFBD>O E ATENDIMENTO DE PROP<EFBFBD>SITO PARTICULAR. O SOFTWARE <EFBFBD>
|
|
|
|
|
FORNECIDO ABAIXO "COMO <EFBFBD>", E A UNIVERSIDADE DA CALIF<EFBFBD>RNIA N<EFBFBD>O TEM
|
|
|
|
|
OBRIGA<EFBFBD><EFBFBD>O DE FORNECER MANUTEN<EFBFBD><EFBFBD>O, SUPORTE, ATUALIZA<EFBFBD><EFBFBD>ES, MELHORIAS OU
|
|
|
|
|
MODIFICA<EFBFBD><EFBFBD>ES.
|
|
|
|
|
|
|
|
|
|
O que est<EFBFBD> descrito acima <EFBFBD> a licen<EFBFBD>a BSD, uma licen<EFBFBD>a de c<EFBFBD>digo
|
|
|
|
|
aberto cl<EFBFBD>ssica. Ela n<EFBFBD>o tem restri<EFBFBD><EFBFBD>es de como o c<EFBFBD>digo pode ser
|
|
|
|
|
utilizado. N<EFBFBD>s gostamos dela e n<EFBFBD>o temos inten<EFBFBD><EFBFBD>es de mud<EFBFBD>-la.
|
|
|
|
|
|
|
|
|
|
1.3) Quais plataformas Unix o PostgreSQL pode ser executado?
|
|
|
|
|
|
|
|
|
|
Em geral, qualquer plataforma moderna compat<EFBFBD>vel com Unix deve ser
|
|
|
|
|
capaz de executar o PostgreSQL. As plataformas que foram testadas
|
|
|
|
|
antes do lan<EFBFBD>amento de uma vers<EFBFBD>o s<EFBFBD>o listadas nas instru<EFBFBD><EFBFBD>es de
|
|
|
|
|
instala<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
1.4) Quais portabilidades n<EFBFBD>o-Unix est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
|
|
|
|
|
Cliente
|
|
|
|
|
|
|
|
|
|
<EFBFBD> poss<EFBFBD>vel compilar a biblioteca libpq, o psql e outras interfaces e
|
|
|
|
|
aplica<EFBFBD><EFBFBD>es clientes para executar em plataformas MS Windows. Neste
|
|
|
|
|
caso, o cliente est<EFBFBD> sendo executado no MS Windows e comunica via
|
|
|
|
|
TCP/IP com um servidor executando em uma das plataformas Unix
|
|
|
|
|
suportadas. O arquivo win32.mak est<EFBFBD> presente na distribui<EFBFBD><EFBFBD>o para que
|
|
|
|
|
seja poss<EFBFBD>vel compilar a biblioteca libpq e o psql para Win32. O
|
|
|
|
|
PostgreSQL tamb<EFBFBD>m se comunica com clientes ODBC.
|
|
|
|
|
|
|
|
|
|
Servidor
|
|
|
|
|
|
|
|
|
|
O Servidor de banco de dados pode ser executado em Windows NT e Win2k
|
|
|
|
|
utilizando o Cygwin, uma biblioteca de portabilidade Unix/NT da
|
|
|
|
|
Cygnus. Veja pgsql/doc/FAQ_MSWIN na distribui<EFBFBD><EFBFBD>o ou a FAQ do MS
|
|
|
|
|
Windows em http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN.
|
|
|
|
|
|
|
|
|
|
Um porte nativo para MS Win NT/2000/XP est<EFBFBD> sendo desenvolvido. Para
|
|
|
|
|
maiores detalhes sobre o status do PostgreSQL no Windows veja
|
|
|
|
|
http://techdocs.postgresql.org/guides/Windows e
|
|
|
|
|
http://momjian.postgresql.org/main/writings/pgsql/win32.html.
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> tamb<EFBFBD>m um porte para Novell Netware 6 em http://forge.novell.com.
|
|
|
|
|
|
|
|
|
|
1.5) Onde eu posso conseguir o PostgreSQL?
|
|
|
|
|
|
|
|
|
|
O servidor ftp principal do PostgreSQL <EFBFBD> ftp://ftp.PostgreSQL.org/pub.
|
|
|
|
|
Para rela<EFBFBD><EFBFBD>o de servidores espelhos (mirrors), consulte nosso website.
|
|
|
|
|
|
|
|
|
|
1.6) Onde eu posso conseguir suporte?
|
|
|
|
|
|
|
|
|
|
A lista de discuss<EFBFBD>o principal <EFBFBD>: pgsql-general@PostgreSQL.org. Ela
|
|
|
|
|
est<EFBFBD> dispon<EFBFBD>vel para discuss<EFBFBD>es relacionadas ao PostgreSQL. Para se
|
|
|
|
|
inscrever, envie um e-mail com as seguintes linhas no corpo (n<EFBFBD>o envie
|
|
|
|
|
no assunto):
|
|
|
|
|
subscribe
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
para pgsql-general-request@PostgreSQL.org.
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> tamb<EFBFBD>m uma lista s<EFBFBD>ntese (digest) dispon<EFBFBD>vel. Para se inscrever,
|
|
|
|
|
envie um e-mail para: pgsql-general-digest-request@PostgreSQL.org com
|
|
|
|
|
o seguinte corpo:
|
|
|
|
|
subscribe
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
S<EFBFBD>nteses (Digests) s<EFBFBD>o enviadas aos membros dessa lista quando a lista
|
|
|
|
|
receber cerca de 30k em mensagens.
|
|
|
|
|
|
|
|
|
|
A lista de discuss<EFBFBD>o sobre bugs est<EFBFBD> dispon<EFBFBD>vel. Para se inscrever,
|
|
|
|
|
envie um e-mail para pgsql-bugs-request@PostgreSQL.org com o seguinte
|
|
|
|
|
corpo:
|
|
|
|
|
subscribe
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> tamb<EFBFBD>m uma lista de discuss<EFBFBD>o dos desenvolvedores dispon<EFBFBD>vel. Para
|
|
|
|
|
se inscrever, envie um e-mail para
|
|
|
|
|
pgsql-hackers-request@PostgreSQL.org com o seguinte corpo:
|
|
|
|
|
subscribe
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Outras listas de discuss<EFBFBD>es e informa<EFBFBD><EFBFBD>es sobre o PostgreSQL podem ser
|
|
|
|
|
encontradas na homepage do PostgreSQL em:
|
|
|
|
|
|
|
|
|
|
http://www.PostgreSQL.org
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> tamb<EFBFBD>m um canal de IRC na Freenode e EFNet, canal PostgreSQL. Voc<EFBFBD>
|
|
|
|
|
pode utilizar o comando Unix irc -c '#PostgreSQL' "$USER"
|
|
|
|
|
irc.phoenix.net. ou irc -c '#PostgreSQL' "$USER" irc.freenode.net.
|
|
|
|
|
|
|
|
|
|
Uma lista de empresas que prestam suporte comercial est<EFBFBD> dispon<EFBFBD>vel em
|
|
|
|
|
http://techdocs.postgresql.org/companies.php.
|
|
|
|
|
|
|
|
|
|
1.7) Qual <EFBFBD> a <EFBFBD>ltima vers<EFBFBD>o?
|
|
|
|
|
|
|
|
|
|
A <EFBFBD>ltima vers<EFBFBD>o do PostgreSQL <EFBFBD> a vers<EFBFBD>o 7.4.2.
|
|
|
|
|
|
|
|
|
|
N<EFBFBD>s planejamos lan<EFBFBD>ar vers<EFBFBD>es novas a cada seis ou oito meses.
|
|
|
|
|
|
|
|
|
|
1.8) Que documenta<EFBFBD><EFBFBD>o est<EFBFBD> dispon<EFBFBD>vel?
|
|
|
|
|
|
|
|
|
|
V<EFBFBD>rios manuais, p<EFBFBD>ginas de manuais (man pages) e alguns exemplos para
|
|
|
|
|
teste est<EFBFBD>o inclu<EFBFBD>dos na distribui<EFBFBD><EFBFBD>o. Veja o diret<EFBFBD>rio /doc. Voc<EFBFBD>
|
|
|
|
|
pode acessar os manuais online em http://www.PostgreSQL.org/docs.
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> dois livros sobre PostgreSQL dispon<EFBFBD>veis online em
|
|
|
|
|
http://www.PostgreSQL.org/docs/awbook.html e
|
|
|
|
|
http://www.commandprompt.com/ppbook/. H<EFBFBD> uma lista de livros sobre
|
|
|
|
|
PostgreSQL dispon<EFBFBD>veis para compra em
|
|
|
|
|
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. H<EFBFBD> tamb<EFBFBD>m uma
|
|
|
|
|
cole<EFBFBD><EFBFBD>o de artigos t<EFBFBD>cnicos sobre PostgreSQL em
|
|
|
|
|
http://techdocs.PostgreSQL.org/.
|
|
|
|
|
|
|
|
|
|
psql tem alguns comandos \d para mostrar informa<EFBFBD><EFBFBD>o sobre tipos,
|
|
|
|
|
operadores, fun<EFBFBD><EFBFBD>es, agrega<EFBFBD><EFBFBD>es, etc.
|
|
|
|
|
|
|
|
|
|
Nosso web site cont<EFBFBD>m ainda mais documenta<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
1.9) Como eu posso saber quais s<EFBFBD>o os bugs conhecidos ou caracter<EFBFBD>sticas
|
|
|
|
|
ausentes?
|
|
|
|
|
|
|
|
|
|
PostgreSQL suporta um subconjunto extendido do SQL-92. Veja a nossa
|
|
|
|
|
lista de afazeres (TODO) para saber sobre bugs conhecidos,
|
|
|
|
|
caracter<EFBFBD>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<EFBFBD> outro livro
|
|
|
|
|
sobre PostgreSQL em http://www.commandprompt.com/ppbook. H<EFBFBD> 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 <EFBFBD> o "Teach Yourself SQL in 21 Days, Second Edition" em
|
|
|
|
|
http://members.tripod.com/er4ebus/sql/index.htm
|
|
|
|
|
|
|
|
|
|
Muitos dos nossos usu<EFBFBD>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<EFBFBD> livre do Bug do Mil<EFBFBD>nio?
|
|
|
|
|
|
|
|
|
|
Sim, n<EFBFBD>s podemos manipular datas ap<EFBFBD>s o ano 2000 AD e antes do ano
|
|
|
|
|
2000 BC.
|
|
|
|
|
|
|
|
|
|
1.12) Como posso me juntar a equipe de desenvolvimento?
|
|
|
|
|
|
|
|
|
|
Primeiramente, fa<EFBFBD>a o download do c<EFBFBD>digo-fonte e leia a documenta<EFBFBD><EFBFBD>o
|
|
|
|
|
para Desenvolvedores do PostgreSQL no nosso website ou na
|
|
|
|
|
distribui<EFBFBD><EFBFBD>o. Depois, se inscreva nas lista de discuss<EFBFBD>o pgsql-hackers
|
|
|
|
|
e pgsql-patches. Ent<EFBFBD>o submeta patches de alta qualidade para
|
|
|
|
|
pgsql-patches.
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> algumas pessoas que tem privil<EFBFBD>gios para fazer mudan<EFBFBD>as (commit) na
|
|
|
|
|
<EFBFBD>rvore CVS do PostgreSQL. Cada um deles submeteram tantos patches de
|
|
|
|
|
alta qualidade que foi imposs<EFBFBD>vel para os committers continuarem a
|
|
|
|
|
fazerem as mudan<EFBFBD>as, e ent<EFBFBD>o n<EFBFBD>s confiamos que os patches que eles
|
|
|
|
|
submetem s<EFBFBD>o de alta qualidade.
|
|
|
|
|
|
|
|
|
|
1.13) Como eu informo a exist<EFBFBD>ncia de um bug?
|
|
|
|
|
|
|
|
|
|
Por favor visite a p<EFBFBD>gina da ferramenta que reporta bugs em
|
|
|
|
|
http://www.PostgreSQL.org/bugs/bugs.php, que ir<EFBFBD> lher dar as
|
|
|
|
|
instru<EFBFBD><EFBFBD>es e dire<EFBFBD><EFBFBD>es de como submeter um bug.
|
|
|
|
|
|
|
|
|
|
Verifique tamb<EFBFBD>m o nosso ftp ftp://ftp.PostgreSQL.org/pub para ver se
|
|
|
|
|
h<EFBFBD> uma vers<EFBFBD>o mais recente do PostgreSQL ou patches.
|
|
|
|
|
|
|
|
|
|
1.14) Como <EFBFBD> o PostgreSQL comparado a outros SGBDs?
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> v<EFBFBD>rias maneiras de se medir um software: caracter<EFBFBD>sticas,
|
|
|
|
|
performance, confiabilidade, suporte e pre<EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
Caracter<EFBFBD>sticas
|
|
|
|
|
PostgreSQL tem muitas caracter<EFBFBD>sticas presentes em muitos SGBDs
|
|
|
|
|
comerciais como transa<EFBFBD><EFBFBD>es, subconsultas, gatilhos, vis<EFBFBD>es,
|
|
|
|
|
integridade referencial de chave estrangeira e travamento
|
|
|
|
|
(lock) sofisticado. N<EFBFBD>s temos algumas caracter<EFBFBD>sticas que eles
|
|
|
|
|
n<EFBFBD>o tem, como tipos definidos pelo usu<EFBFBD>rio, heran<EFBFBD>a, regras e
|
|
|
|
|
controle de concorr<EFBFBD>ncia de m<EFBFBD>ltiplas vers<EFBFBD>es para reduzir
|
|
|
|
|
travamentos (locks).
|
|
|
|
|
|
|
|
|
|
Performance
|
|
|
|
|
PostgreSQL tem a performance similar a outros bancos de dados
|
|
|
|
|
comerciais e de c<EFBFBD>digo livre. Ele <EFBFBD> mais r<EFBFBD>pido em algumas
|
|
|
|
|
coisas, mais lento em outras. Comparado ao MySQL ou sistemas de
|
|
|
|
|
bancos de dados "leves", n<EFBFBD>s somos mais r<EFBFBD>pidos com m<EFBFBD>ltiplos
|
|
|
|
|
usu<EFBFBD>rios, consultas complexas e carga de consultas de
|
|
|
|
|
leitura/escrita. MySQL <EFBFBD> mais r<EFBFBD>pido para consultas simples com
|
|
|
|
|
SELECT feitas por poucos usu<EFBFBD>rios. <EFBFBD> claro que o MySQL n<EFBFBD>o tem
|
|
|
|
|
muitas das caracter<EFBFBD>sticas mencionadas na se<EFBFBD><EFBFBD>o Caracter<EFBFBD>sticas
|
|
|
|
|
acima. N<EFBFBD>s desenvolvemos buscando confiabilidade e
|
|
|
|
|
caracter<EFBFBD>sticas, e n<EFBFBD>s continuamos a melhorar a performance a
|
|
|
|
|
cada vers<EFBFBD>o. H<EFBFBD> uma p<EFBFBD>gina interessante comparando o PostgreSQL
|
|
|
|
|
com o MySQL em
|
|
|
|
|
http://openacs.org/philosophy/why-not-mysql.html. MySQL <EFBFBD> uma
|
|
|
|
|
empresa que distribui seu produto via c<EFBFBD>digo livre, e requer
|
|
|
|
|
uma licen<EFBFBD>a comercial para software de c<EFBFBD>digo fechado, e n<EFBFBD>o
|
|
|
|
|
uma comunidade de desenvolvimento de c<EFBFBD>digo livre como o
|
|
|
|
|
PostgreSQL.
|
|
|
|
|
|
|
|
|
|
Confiabilidade
|
|
|
|
|
N<EFBFBD>s sabemos que um SGBD deve ser confi<EFBFBD>vel ou ele <EFBFBD> in<EFBFBD>til. N<EFBFBD>s
|
|
|
|
|
empenhamos em lan<EFBFBD>ar vers<EFBFBD>es bem testadas, de c<EFBFBD>digo est<EFBFBD>vel e
|
|
|
|
|
que tenha o m<EFBFBD>nimo de bugs. Cada vers<EFBFBD>o tem no m<EFBFBD>nimo um m<EFBFBD>s de
|
|
|
|
|
teste em vers<EFBFBD>o beta, e nosso hist<EFBFBD>rico de vers<EFBFBD>es mostra que
|
|
|
|
|
n<EFBFBD>s podemos fornecer vers<EFBFBD>es est<EFBFBD>veis e s<EFBFBD>lidas que est<EFBFBD>o
|
|
|
|
|
prontas para uso em produ<EFBFBD><EFBFBD>o. N<EFBFBD>s acreditamos que somos
|
|
|
|
|
comparados a nosso favor com outros sistemas de bancos de dados
|
|
|
|
|
nessa <EFBFBD>rea.
|
|
|
|
|
|
|
|
|
|
Suporte
|
|
|
|
|
Nossas listas de discuss<EFBFBD>o fornecem contato com um grupo de
|
|
|
|
|
desenvolvedores e usu<EFBFBD>rios para ajudar a resolver muitos
|
|
|
|
|
problemas encontrados. Enquanto n<EFBFBD>s n<EFBFBD>o podemos garantir o
|
|
|
|
|
conserto, SGBDs comerciais nem sempre fornecem tamb<EFBFBD>m. Com
|
|
|
|
|
acesso direto aos desenvolvedores, a comunidade de usu<EFBFBD>rios,
|
|
|
|
|
manuais e o c<EFBFBD>digo fonte faz com que o suporte do PostgreSQL
|
|
|
|
|
seja superior ao de outros SGBDs. H<EFBFBD> suporte comercial por
|
|
|
|
|
incidente dispon<EFBFBD>veis para aqueles que precisam de um. (Veja
|
|
|
|
|
se<EFBFBD><EFBFBD>o 1.6 da FAQ.)
|
|
|
|
|
|
|
|
|
|
Pre<EFBFBD>o
|
|
|
|
|
N<EFBFBD>s somos livres para uso dele tanto comercial quanto n<EFBFBD>o
|
|
|
|
|
comercial. Voc<EFBFBD> pode adicionar nosso c<EFBFBD>digo ao seu produto sem
|
|
|
|
|
limita<EFBFBD><EFBFBD>es, exceto aquelas descritas na nossa licen<EFBFBD>a
|
|
|
|
|
compat<EFBFBD>vel com a licen<EFBFBD>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 <EFBFBD> muito importante em um projeto de
|
|
|
|
|
c<EFBFBD>digo aberto. Ela previne descontinuidades que podem facilmente
|
|
|
|
|
descontinuar o andamento do projeto.
|
|
|
|
|
|
|
|
|
|
<EFBFBD> claro, que a infra-estrutura n<EFBFBD>o <EFBFBD> barata. H<EFBFBD> v<EFBFBD>rios custos iniciais
|
|
|
|
|
e mensais que s<EFBFBD>o necess<EFBFBD>rios para mant<EFBFBD>-la. Se voc<EFBFBD> ou sua empresa
|
|
|
|
|
tem dinheiro que pode ser doado para ajudar a financiar esse esfor<EFBFBD>o,
|
|
|
|
|
acesse http://store.pgsql.com/shopping/ e fa<EFBFBD>a uma doa<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
Embora a p<EFBFBD>gina mencione PostgreSQL, Inc, a "contribui<EFBFBD><EFBFBD>o" <EFBFBD> somente
|
|
|
|
|
para apoiar o projeto PostgreSQL e n<EFBFBD>o financia nenhuma empresa
|
|
|
|
|
espec<EFBFBD>fica. Se voc<EFBFBD> preferir, voc<EFBFBD> pode enviar um cheque para o
|
|
|
|
|
endere<EFBFBD>o de contato.
|
|
|
|
|
_________________________________________________________________
|
|
|
|
|
|
|
|
|
|
Se voc<EFBFBD> tiver uma hist<EFBFBD>ria de sucesso sobre o PostgreSQL, envie-a para
|
|
|
|
|
nosso website em http://advocacy.postgresql.org.
|
|
|
|
|
|
|
|
|
|
Perguntas sobre Clientes
|
|
|
|
|
|
|
|
|
|
2.1) H<EFBFBD> drivers ODBC para PostgreSQL?
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> dois drivers ODBC dispon<EFBFBD>veis, PsqlODBC e o OpenLink ODBC.
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> 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<EFBFBD>o, ent<EFBFBD>o voc<EFBFBD> poder<EFBFBD> ter o ODBC para
|
|
|
|
|
PostgreSQL dispon<EFBFBD>vel em toda plataforma que eles suportam (Win, Mac,
|
|
|
|
|
Unix, VMS).
|
|
|
|
|
|
|
|
|
|
Eles provavelmente vender<EFBFBD>o seu produto para pessoas que precisam de
|
|
|
|
|
um suporte de qualidade, mas uma vers<EFBFBD>o gratuita estar<EFBFBD> sempre
|
|
|
|
|
dispon<EFBFBD>vel. Por favor envie perguntas para postgres95@openlink.co.uk.
|
|
|
|
|
|
|
|
|
|
2.2) Quais ferramentas est<EFBFBD>o dispon<EFBFBD>veis para utilizar o PostgreSQL com
|
|
|
|
|
p<EFBFBD>ginas Web?
|
|
|
|
|
|
|
|
|
|
Uma boa introdu<EFBFBD><EFBFBD>o para p<EFBFBD>ginas web que utilizam bancos de dados pode
|
|
|
|
|
ser vista em: http://www.webreview.com
|
|
|
|
|
|
|
|
|
|
Para integra<EFBFBD><EFBFBD>o na Web, PHP <EFBFBD> uma excelente interface. Ele est<EFBFBD> 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<EFBFBD>ficas para iteragir com o usu<EFBFBD>rio?
|
|
|
|
|
|
|
|
|
|
Sim, h<EFBFBD> v<EFBFBD>rias interfaces gr<EFBFBD>ficas para PostgreSQL dispon<EFBFBD>veis. Entre
|
|
|
|
|
elas o PgAccess http://www.pgaccess.org), PgAdmin III
|
|
|
|
|
(http://www.pgadmin.org, RHDB Admin (http://sources.redhat.com/rhdb/ )
|
|
|
|
|
e o Rekall ( http://www.thekompany.com/products/rekall/,
|
|
|
|
|
propriet<EFBFBD>ria). H<EFBFBD> tamb<EFBFBD>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<EFBFBD>o dispon<EFBFBD>veis para comunicar-se com PostgreSQL?
|
|
|
|
|
|
|
|
|
|
Muitas linguagens de programa<EFBFBD><EFBFBD>o populares cont<EFBFBD>m uma interface para
|
|
|
|
|
PostgreSQL. Verifique a lista de extens<EFBFBD>es (m<EFBFBD>dulos) da sua linguagem
|
|
|
|
|
de programa<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
As seguintes interfaces est<EFBFBD>o inclu<EFBFBD>das na distribui<EFBFBD><EFBFBD>o do PostgreSQL:
|
|
|
|
|
* C (libpq)
|
|
|
|
|
* Embedded C (ecpg)
|
|
|
|
|
* Java (jdbc)
|
|
|
|
|
* Python (PyGreSQL)
|
|
|
|
|
* TCL (libpgtcl)
|
|
|
|
|
|
|
|
|
|
Interfaces adicionais est<EFBFBD>o dispon<EFBFBD>veis em http://gborg.postgresql.org
|
|
|
|
|
na se<EFBFBD><EFBFBD>o de Drivers/Interfaces.
|
|
|
|
|
_________________________________________________________________
|
|
|
|
|
|
|
|
|
|
Perguntas Administrativas
|
|
|
|
|
|
|
|
|
|
3.1) Como eu instalo o PostgreSQL em um local diferente de
|
|
|
|
|
/usr/local/pgsql?
|
|
|
|
|
|
|
|
|
|
Especifique a op<EFBFBD><EFBFBD>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<EFBFBD>ria (core dump). Por que?
|
|
|
|
|
|
|
|
|
|
Isto pode ser v<EFBFBD>rios problemas, mas primeiro verifique se voc<EFBFBD> tem
|
|
|
|
|
extens<EFBFBD>es do System V instaladas no seu kernel. PostgreSQL requer
|
|
|
|
|
suporte no kernel a mem<EFBFBD>ria compartilhada e sem<EFBFBD>foros.
|
|
|
|
|
|
|
|
|
|
3.3) Quando eu tento iniciar o postmaster, eu recebo erros IpcMemoryCreate.
|
|
|
|
|
Por que?
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> n<EFBFBD>o configurou a mem<EFBFBD>ria compartilhada corretamente no seu kernel
|
|
|
|
|
ou voc<EFBFBD> precisa aumentar a mem<EFBFBD>ria compartilhada dispon<EFBFBD>vel no seu
|
|
|
|
|
kernel. A quantidade exata que voc<EFBFBD> precisa vai depender da
|
|
|
|
|
arquitetura e de quantos buffers e processos do servidor voc<EFBFBD>
|
|
|
|
|
configurou para o postmaster. Muitos sistemas, com o n<EFBFBD>mero padr<EFBFBD>o de
|
|
|
|
|
buffers e processos, precisam de aproximadamente 1 MB. Veja o Guia do
|
|
|
|
|
Administrador do PostgreSQL para mais informa<EFBFBD><EFBFBD>o sobre mem<EFBFBD>ria
|
|
|
|
|
compartilhada e sem<EFBFBD>foros.
|
|
|
|
|
|
|
|
|
|
3.4) Quando eu tento iniciar o postmaster, eu recebo erros
|
|
|
|
|
IpcSemaphoreCreate. Por que?
|
|
|
|
|
|
|
|
|
|
Se a mensagem de erro <EFBFBD> IpcSemaphoreCreate: semget failed (No space
|
|
|
|
|
left on device) ent<EFBFBD>o o seu kernel n<EFBFBD>o est<EFBFBD> configurado com o n<EFBFBD>mero
|
|
|
|
|
de sem<EFBFBD>foros suficientes. O Postgres precisa de um sem<EFBFBD>foro por
|
|
|
|
|
processo do servidor. Uma solu<EFBFBD><EFBFBD>o tempor<EFBFBD>ria <EFBFBD> iniciar o postmaster
|
|
|
|
|
com um limite pequeno de processos do servidor. Utilize -N com o
|
|
|
|
|
par<EFBFBD>metro menor do que o padr<EFBFBD>o (32). Uma solu<EFBFBD><EFBFBD>o permanente seria
|
|
|
|
|
aumentar os par<EFBFBD>metros do kernel SEMMNS e SEMMNI.
|
|
|
|
|
|
|
|
|
|
Sem<EFBFBD>foros inoperantes podem tamb<EFBFBD>m causar danos durante intenso acesso
|
|
|
|
|
ao banco de dados.
|
|
|
|
|
|
|
|
|
|
Se a mensagem <EFBFBD> outra coisa, voc<EFBFBD> possivelmente n<EFBFBD>o tem suporte a
|
|
|
|
|
sem<EFBFBD>foro configurado no seu kernel. Veja o Guia do Administrador para
|
|
|
|
|
mais informa<EFBFBD><EFBFBD>o sobre mem<EFBFBD>ria compartilhada e sem<EFBFBD>foros.
|
|
|
|
|
|
|
|
|
|
3.5) Como eu controlo conex<EFBFBD>es de outras m<EFBFBD>quinas?
|
|
|
|
|
|
|
|
|
|
Por padr<EFBFBD>o, o PostgreSQL s<EFBFBD> permite conex<EFBFBD>es da m<EFBFBD>quina local
|
|
|
|
|
utilizando soquetes de dom<EFBFBD>nio Unix. Outras m<EFBFBD>quinas n<EFBFBD>o poder<EFBFBD>o
|
|
|
|
|
conectar-se a menos que voc<EFBFBD> habilite tcpip_sockets no
|
|
|
|
|
postgresql.conf, e habilite a autentica<EFBFBD><EFBFBD>o por m<EFBFBD>quina modificando o
|
|
|
|
|
arquivo $PGDATA/pg_hba.conf. Isso ir<EFBFBD> permitir conex<EFBFBD>es TCP/IP.
|
|
|
|
|
|
|
|
|
|
3.6) Como eu ajusto o servidor de banco de dados para obter uma performance
|
|
|
|
|
melhor?
|
|
|
|
|
|
|
|
|
|
Certamente, <EFBFBD>ndices podem acelerar consultas. O comando EXPLAIN
|
|
|
|
|
ANALYZE permite que voc<EFBFBD> veja como o PostgreSQL est<EFBFBD> interpretando a
|
|
|
|
|
consulta, e quais os <EFBFBD>ndices s<EFBFBD>o utilizados.
|
|
|
|
|
|
|
|
|
|
Se voc<EFBFBD> est<EFBFBD> fazendo muitos INSERTs, considere faz<EFBFBD>-los em lote
|
|
|
|
|
utilizando o comando COPY. Isso <EFBFBD> mais r<EFBFBD>pido do que INSERTs
|
|
|
|
|
individuais. Segundo, senten<EFBFBD>as que n<EFBFBD>o est<EFBFBD>o em um bloco de transa<EFBFBD><EFBFBD>o
|
|
|
|
|
BEGIN WORK/COMMIT s<EFBFBD>o consideradas com se estivessem em sua pr<EFBFBD>pria
|
|
|
|
|
transa<EFBFBD><EFBFBD>o. Considere executar v<EFBFBD>rias senten<EFBFBD>as em um mesmo bloco de
|
|
|
|
|
transa<EFBFBD><EFBFBD>o. Isso reduz a quantidade de transa<EFBFBD><EFBFBD>es. Tamb<EFBFBD>m, considere
|
|
|
|
|
remover e criar <EFBFBD>ndices novamente quando estiver fazendo muitas
|
|
|
|
|
mudan<EFBFBD>as nos dados.
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> v<EFBFBD>rias op<EFBFBD><EFBFBD>es de ajuste. Voc<EFBFBD> pode desabilitar o fsync() iniciando
|
|
|
|
|
o postmaster com a op<EFBFBD><EFBFBD>o -o -F. Isso ir<EFBFBD> impedir que fsync()s enviem
|
|
|
|
|
os dados para disco ap<EFBFBD>s cada transa<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> tamb<EFBFBD>m pode utilizar a op<EFBFBD><EFBFBD>o -B do postmaster para aumentar o
|
|
|
|
|
n<EFBFBD>mero de buffers de mem<EFBFBD>ria compartilhada utilizados pelos processos
|
|
|
|
|
do servidor. Se voc<EFBFBD> definiu este par<EFBFBD>metro com um valor muito alto, o
|
|
|
|
|
postmaster pode n<EFBFBD>o iniciar porque voc<EFBFBD> excedeu o limite de espa<EFBFBD>o de
|
|
|
|
|
mem<EFBFBD>ria compartilhada do kernel. Cada buffer <EFBFBD> de 8K e o padr<EFBFBD>o <EFBFBD> de
|
|
|
|
|
64 buffers.
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> tamb<EFBFBD>m pode utilizar a op<EFBFBD><EFBFBD>o -S do backend para aumentar a m<EFBFBD>xima
|
|
|
|
|
quantidade de mem<EFBFBD>ria utilizada pelo processo servidor para ordena<EFBFBD><EFBFBD>es
|
|
|
|
|
tempor<EFBFBD>rias. O valor de -S <EFBFBD> medido em kilobytes e o padr<EFBFBD>o <EFBFBD> de 512
|
|
|
|
|
(ou seja 512K).
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> tamb<EFBFBD>m pode utilizar o comando CLUSTER para agrupar dados em
|
|
|
|
|
tabelas para combinar um <EFBFBD>ndice. Veja o manual sobre CLUSTER para mais
|
|
|
|
|
informa<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
3.7) Quais caracter<EFBFBD>sticas de depura<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
|
|
|
|
|
PostgreSQL tem v<EFBFBD>rias caracter<EFBFBD>sticas que relatam informa<EFBFBD><EFBFBD>es que
|
|
|
|
|
podem ser valiosas para fins de depura<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
Primeiro, execute o configure com a op<EFBFBD><EFBFBD>o --enable-cassert, muitos
|
|
|
|
|
assert()s monitoram o progresso do n<EFBFBD>cleo (backend) e finalizam o
|
|
|
|
|
programa quando alguma coisa inesperada acontece.
|
|
|
|
|
|
|
|
|
|
O postmaster e o postgres tem v<EFBFBD>rias op<EFBFBD><EFBFBD>es de depura<EFBFBD><EFBFBD>o dispon<EFBFBD>veis.
|
|
|
|
|
Primeiro, quando iniciar o postmaster, tenha certeza que voc<EFBFBD> enviou a
|
|
|
|
|
saida padr<EFBFBD>o e a sa<EFBFBD>da de erro padr<EFBFBD>o para um arquivo de log, como em:
|
|
|
|
|
cd /usr/local/pgsql
|
|
|
|
|
./bin/postmaster >server.log 2>&1 &
|
|
|
|
|
|
|
|
|
|
Isso ir<EFBFBD> criar um arquivo server.log no diret<EFBFBD>rio raiz do PostgreSQL.
|
|
|
|
|
Este arquivo conter<EFBFBD> informa<EFBFBD><EFBFBD>es <EFBFBD>teis sobre problemas ou erros
|
|
|
|
|
encontrados pelo servidor. O Postmaster tem uma op<EFBFBD><EFBFBD>o -d que permite
|
|
|
|
|
que informa<EFBFBD><EFBFBD>es mais detalhadas sejam relatadas. A op<EFBFBD><EFBFBD>o -d <EFBFBD>
|
|
|
|
|
acompanhada por um n<EFBFBD>mero que indica o n<EFBFBD>vel de depura<EFBFBD><EFBFBD>o. Esteja
|
|
|
|
|
alerta de que alto n<EFBFBD>vel de depura<EFBFBD><EFBFBD>o gera grandes arquivos de log.
|
|
|
|
|
|
|
|
|
|
Se o postmaster n<EFBFBD>o est<EFBFBD> sendo executado, voc<EFBFBD> pode executar o n<EFBFBD>cleo
|
|
|
|
|
do postgres a partir da linha de comando, e digitar a sua senten<EFBFBD>a SQL
|
|
|
|
|
diretamente. Isso <EFBFBD> recomendado somente para fins de depura<EFBFBD><EFBFBD>o. Note
|
|
|
|
|
que uma nova linha termina a consulta, e n<EFBFBD>o um ponto-e-v<EFBFBD>rgula. Se
|
|
|
|
|
voc<EFBFBD> compilou com s<EFBFBD>mbolos de depura<EFBFBD><EFBFBD>o, voc<EFBFBD> pode utilizar um
|
|
|
|
|
depurador para ver o que est<EFBFBD> acontecendo. Como o n<EFBFBD>cleo (backend) n<EFBFBD>o
|
|
|
|
|
foi iniciado a partir do postmaster, ele n<EFBFBD>o est<EFBFBD> executando em um
|
|
|
|
|
ambiente id<EFBFBD>ntico e problemas de itera<EFBFBD><EFBFBD>o com o n<EFBFBD>cleo/travamento n<EFBFBD>o
|
|
|
|
|
podem ser reproduzidos.
|
|
|
|
|
|
|
|
|
|
O programa postgres possue as op<EFBFBD><EFBFBD>es -s, -A, e -t que podem ser muito
|
|
|
|
|
<EFBFBD>teis para depura<EFBFBD><EFBFBD>o e medidas de performance.
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> tamb<EFBFBD>m pode compilar com perfil para ver que fun<EFBFBD><EFBFBD>es est<EFBFBD>o
|
|
|
|
|
demandando tempo de execu<EFBFBD><EFBFBD>o. Os arquivo de perfil do n<EFBFBD>cleo (backend)
|
|
|
|
|
ser<EFBFBD>o colocados no diret<EFBFBD>rio pgsql/data/base/dbname. O arquivo de
|
|
|
|
|
perfil do cliente ser<EFBFBD> colocado no diret<EFBFBD>rio atual do cliente. O Linux
|
|
|
|
|
requer uma compila<EFBFBD><EFBFBD>o com -DLINUX_PROFILE para cria<EFBFBD><EFBFBD>o dos perfis.
|
|
|
|
|
|
|
|
|
|
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> precisa aumentar o limite do postmaster de quantos processos do
|
|
|
|
|
servidor concorrentes ele pode iniciar.
|
|
|
|
|
|
|
|
|
|
O limite padr<EFBFBD>o <EFBFBD> de 32 processos. Voc<EFBFBD> pode aument<EFBFBD>-lo reiniciando o
|
|
|
|
|
postmaster com o valor conveniente de -N ou modificar o
|
|
|
|
|
postgresql.conf.
|
|
|
|
|
|
|
|
|
|
Note que se voc<EFBFBD> definir o -N com um valor maior do que 32, voc<EFBFBD>
|
|
|
|
|
tamb<EFBFBD>m deve aumentar -B cujo padr<EFBFBD>o <EFBFBD> 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<EFBFBD>mero de processos do servidor, voc<EFBFBD>
|
|
|
|
|
tamb<EFBFBD>m precisa aumentar v<EFBFBD>rios par<EFBFBD>metros de configura<EFBFBD><EFBFBD>o do kernel do
|
|
|
|
|
Unix. Coisas para serem observadas incluem o tamanho m<EFBFBD>ximo de blocos
|
|
|
|
|
de mem<EFBFBD>ria compartilhada, SHMMAX; o n<EFBFBD>mero m<EFBFBD>ximo de sem<EFBFBD>foros, SEMMNS
|
|
|
|
|
e SEMMNI; o n<EFBFBD>mero m<EFBFBD>ximo de processos, NPROC; o n<EFBFBD>mero m<EFBFBD>ximo de
|
|
|
|
|
processos por usu<EFBFBD>rio, MAXUPRC; e o n<EFBFBD>mero m<EFBFBD>ximo de arquivos abertos,
|
|
|
|
|
NFILE e NINODE. A raz<EFBFBD>o na qual o PostgreSQL tem um limite de n<EFBFBD>mero
|
|
|
|
|
de processos do servidor permitidos <EFBFBD> para que o seu sistema n<EFBFBD>o fique
|
|
|
|
|
sem recursos dispon<EFBFBD>veis.
|
|
|
|
|
|
|
|
|
|
3.9) O que est<EFBFBD> no diret<EFBFBD>rio pgsql_tmp?
|
|
|
|
|
|
|
|
|
|
Este diret<EFBFBD>rio cont<EFBFBD>m arquivos tempor<EFBFBD>rios gerados pelo executor de
|
|
|
|
|
uma consulta. Por exemplo, se uma ordena<EFBFBD><EFBFBD>o <EFBFBD> necess<EFBFBD>ria para
|
|
|
|
|
satisfazer um ORDER BY e a ordena<EFBFBD><EFBFBD>o requer mais espa<EFBFBD>o do que o
|
|
|
|
|
par<EFBFBD>metro -S do servidor permite, ent<EFBFBD>o arquivos tempor<EFBFBD>rios s<EFBFBD>o
|
|
|
|
|
criados para abrigar os dados extras.
|
|
|
|
|
|
|
|
|
|
Os arquivos tempor<EFBFBD>rios geralmente s<EFBFBD>o apagados automaticamente, mas
|
|
|
|
|
podem persistir caso o servidor termine anormalmente durante a
|
|
|
|
|
ordena<EFBFBD><EFBFBD>o. Uma parada e um rein<EFBFBD>cio do postmaster remover<EFBFBD> os arquivos
|
|
|
|
|
destes diret<EFBFBD>rios.
|
|
|
|
|
|
|
|
|
|
3.10) O que eu preciso fazer para exportar e importar durante a atualiza<EFBFBD><EFBFBD>o
|
|
|
|
|
entre vers<EFBFBD>es do PostgreSQL?
|
|
|
|
|
|
|
|
|
|
O time do PostgreSQL faz somente pequenas mudan<EFBFBD>as entre vers<EFBFBD>es
|
|
|
|
|
menores, ent<EFBFBD>o atualizar da vers<EFBFBD>o 7.2 para 7.2.1 n<EFBFBD>o requer uma
|
|
|
|
|
exporta<EFBFBD><EFBFBD>o e uma importa<EFBFBD><EFBFBD>o. Contudo, vers<EFBFBD>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<EFBFBD>as geralmente s<EFBFBD>o complexas, ent<EFBFBD>o
|
|
|
|
|
n<EFBFBD>s n<EFBFBD>o mantemos compatibilidade para os arquivos de dados. Uma
|
|
|
|
|
exporta<EFBFBD><EFBFBD>o em um formato gen<EFBFBD>rico que pode ser importada utilizando o
|
|
|
|
|
novo formato interno.
|
|
|
|
|
|
|
|
|
|
Em vers<EFBFBD>es onde o formato em disco n<EFBFBD>o muda, o script pg_upgrade pode
|
|
|
|
|
ser utilizado para atualizar sem precisar de um dump/restore. As notas
|
|
|
|
|
da vers<EFBFBD>o mencionam se pg_upgrade est<EFBFBD> dispon<EFBFBD>vel para a vers<EFBFBD>o.
|
|
|
|
|
_________________________________________________________________
|
|
|
|
|
|
|
|
|
|
Perguntas Operacionais
|
|
|
|
|
|
|
|
|
|
4.1) Qual <EFBFBD> a diferen<EFBFBD>a entre cursores bin<EFBFBD>rios e normais?
|
|
|
|
|
|
|
|
|
|
Veja o comando DECLARE no manual para uma descri<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
4.2) Como eu fa<EFBFBD>o um SELECT somente dos primeiros registros de uma
|
|
|
|
|
consulta? Um registro rand<EFBFBD>mico?
|
|
|
|
|
|
|
|
|
|
Veja o manual do FETCH, ou utilize SELECT ... LIMIT....
|
|
|
|
|
|
|
|
|
|
Toda a consulta tem que ser avaliada, mesmo se voc<EFBFBD> s<EFBFBD> quer os
|
|
|
|
|
primeiros registros. Considere utilizar uma consulta que tenha um
|
|
|
|
|
ORDER BY. Se h<EFBFBD> um <EFBFBD>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<EFBFBD> que os registros desejados
|
|
|
|
|
tenham sido gerados.
|
|
|
|
|
|
|
|
|
|
Para obter um registro rand<EFBFBD>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<EFBFBD> pode utilizar \?. Alternativamente
|
|
|
|
|
voc<EFBFBD> pode ler o c<EFBFBD>digo-fonte do psql no arquivo
|
|
|
|
|
pgsql/src/bin/psql/describe.c. Ele cont<EFBFBD>m comandos SQL que geram a
|
|
|
|
|
sa<EFBFBD>da para os comandos do psql. Voc<EFBFBD> tamb<EFBFBD>m pode iniciar o psql com a
|
|
|
|
|
op<EFBFBD><EFBFBD>o -E ent<EFBFBD>o ser<EFBFBD>o mostradas as consultas utilizadas para executar
|
|
|
|
|
os comandos que voc<EFBFBD> digitou. PostgreSQL tamb<EFBFBD>m fornece uma interface
|
|
|
|
|
para o INFORMATION SCHEMA SQLi na qual voc<EFBFBD> pode consultar informa<EFBFBD><EFBFBD>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<EFBFBD>o 7.3 com comando
|
|
|
|
|
ALTER TABLE DROP COLUMN. Em vers<EFBFBD>es anteriores, voc<EFBFBD> pode fazer isto:
|
|
|
|
|
BEGIN;
|
|
|
|
|
LOCK TABLE old_table;
|
|
|
|
|
SELECT ... -- selecione todas colunas mas n<EFBFBD>o aquela que voc<EFBFBD> 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<EFBFBD>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<EFBFBD> pode querer executar o comando VACUUM FULL tab para recuperar o
|
|
|
|
|
espa<EFBFBD>o em disco utilizado pelos registros expirados.
|
|
|
|
|
|
|
|
|
|
4.5) Qual <EFBFBD> o tamanho m<EFBFBD>ximo de um registro, uma tabela e um banco de
|
|
|
|
|
dados?
|
|
|
|
|
|
|
|
|
|
Estes s<EFBFBD>o os limites:
|
|
|
|
|
Tamanho m<EFBFBD>ximo de um banco de dados? ilimitado (existem bancos de dad
|
|
|
|
|
os de 32 TB)
|
|
|
|
|
Tamanho m<EFBFBD>ximo de uma tabela? 32 TB
|
|
|
|
|
Tamanho m<EFBFBD>ximo de um registro? 1.6TB
|
|
|
|
|
Tamanho m<EFBFBD>ximo de um campo? 1 GB
|
|
|
|
|
N<EFBFBD>mero m<EFBFBD>ximo de registros em uma tabela? ilimitado
|
|
|
|
|
N<EFBFBD>mero m<EFBFBD>ximo de colunas em uma tabela? 250-1600 dependendo dos tipos da
|
|
|
|
|
s colunas
|
|
|
|
|
N<EFBFBD>mero m<EFBFBD>ximo de <EFBFBD>ndices em uma tabela? ilimitado
|
|
|
|
|
|
|
|
|
|
<EFBFBD> claro, que eles n<EFBFBD>o s<EFBFBD>o ilimitados, mas limitados ao espa<EFBFBD>o em disco
|
|
|
|
|
dispon<EFBFBD>vel e espa<EFBFBD>o em mem<EFBFBD>ria/swap. A Performance ser<EFBFBD> penalizada
|
|
|
|
|
quando estes valores se tornarem grandes.
|
|
|
|
|
|
|
|
|
|
O tamanho m<EFBFBD>ximo de uma tabela com 32 TB n<EFBFBD>o requer suporte a arquivos
|
|
|
|
|
grandes do sistema operacional. Tabelas grandes s<EFBFBD>o armazenadas como
|
|
|
|
|
m<EFBFBD>ltiplos arquivos de 1 GB ent<EFBFBD>o o limite do sistema de arquivos n<EFBFBD>o <EFBFBD>
|
|
|
|
|
importante.
|
|
|
|
|
|
|
|
|
|
O tamanho m<EFBFBD>ximo de uma tabela e o n<EFBFBD>mero m<EFBFBD>ximo de colunas pode ser
|
|
|
|
|
quadruplicadas aumentando-se o tamanho dos blocos para 32k.
|
|
|
|
|
|
|
|
|
|
4.6) Quanto espa<EFBFBD>o em disco <EFBFBD> necess<EFBFBD>rio para armazenar dados de um arquivo
|
|
|
|
|
texto?
|
|
|
|
|
|
|
|
|
|
Um banco de dados PostgreSQL ir<EFBFBD> requerer at<EFBFBD> cinco vezes a quantidade
|
|
|
|
|
de espa<EFBFBD>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<EFBFBD><EFBFBD>o em cada linha. Suponha que o tamanho m<EFBFBD>dio da
|
|
|
|
|
descri<EFBFBD><EFBFBD>o <EFBFBD> de vinte bytes. O arquivo ter<EFBFBD> 2.8 MB. O tamanho do
|
|
|
|
|
arquivo do banco de dados PostgreSQL que cont<EFBFBD>m esses dados pode ser
|
|
|
|
|
estimado em 6.4 MB:
|
|
|
|
|
36 bytes: cada cabe<EFBFBD>alho de registro (aproximadamente)
|
|
|
|
|
24 bytes: um campo int e um campo texto
|
|
|
|
|
+ 4 bytes: ponteiro na p<EFBFBD>gina para a tupla
|
|
|
|
|
-------------------------------------------
|
|
|
|
|
64 bytes por registro
|
|
|
|
|
|
|
|
|
|
O tamanho de uma p<EFBFBD>gina de dados no PostgreSQL <EFBFBD> 8192 bytes (8 KB), ent<EFBFBD>o:
|
|
|
|
|
|
|
|
|
|
8192 bytes por p<EFBFBD>gina
|
|
|
|
|
------------------------ = 128 registros por p<EFBFBD>gina do banco de dados (ar
|
|
|
|
|
redondado para baixo)
|
|
|
|
|
64 bytes por registro
|
|
|
|
|
|
|
|
|
|
100000 registros de dados
|
|
|
|
|
---------------------------- = 782 p<EFBFBD>ginas do banco de dados (arredondado
|
|
|
|
|
para cima)
|
|
|
|
|
128 registros por p<EFBFBD>gina
|
|
|
|
|
|
|
|
|
|
782 p<EFBFBD>ginas do banco de dados * 8192 bytes por p<EFBFBD>gina = 6,406,144 bytes (6.4
|
|
|
|
|
MB)
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ndices n<EFBFBD>o requerem muito espa<EFBFBD>o, mas cont<EFBFBD>m dados que foram
|
|
|
|
|
indexados, ent<EFBFBD>o eles podem ocupar algum espa<EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
NULLs s<EFBFBD>o armazenados como bitmaps, ent<EFBFBD>o eles utilizam muito pouco
|
|
|
|
|
espa<EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
4.7) Como eu descrubo quais tabelas, <EFBFBD>ndices, bancos de dados e usu<EFBFBD>rios
|
|
|
|
|
est<EFBFBD>o definidos?
|
|
|
|
|
|
|
|
|
|
psql tem uma variadade de comandos com barra invertida que mostram
|
|
|
|
|
tais informa<EFBFBD><EFBFBD>es. Utilize \? para v<EFBFBD>-los. H<EFBFBD> tamb<EFBFBD>m tabelas do sistema
|
|
|
|
|
que come<EFBFBD>am com pg_ e que os descrevem tamb<EFBFBD>m. Tamb<EFBFBD>m, psql -l listar<EFBFBD>
|
|
|
|
|
todos os bancos de dados.
|
|
|
|
|
|
|
|
|
|
Veja tamb<EFBFBD>m o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
|
|
|
|
|
muitos SELECTs necess<EFBFBD>rios para obter informa<EFBFBD><EFBFBD>o das tabelas do
|
|
|
|
|
sistema de banco de dados.
|
|
|
|
|
|
|
|
|
|
4.8) Minhas consultas est<EFBFBD>o lentas ou n<EFBFBD>o est<EFBFBD>o utilizando <EFBFBD>ndices. Por
|
|
|
|
|
que?
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ndices n<EFBFBD>o s<EFBFBD>o automaticamente utilizados por toda consulta. <EFBFBD>ndices
|
|
|
|
|
s<EFBFBD> s<EFBFBD>o utilizados se uma tabela <EFBFBD> maior do que o tamanho m<EFBFBD>nimo e uma
|
|
|
|
|
consulta seleciona somente uma porcentagem pequena de registros de uma
|
|
|
|
|
tabela. Isto porque o acesso rand<EFBFBD>mico ao disco causado por uma busca
|
|
|
|
|
por <EFBFBD>ndice pode ser mais lento do que uma leitura ao longo da tabela
|
|
|
|
|
ou uma busca sequencial.
|
|
|
|
|
|
|
|
|
|
Para determinar se um <EFBFBD>ndice pode ser utilizado, o PostgreSQL deve ter
|
|
|
|
|
estat<EFBFBD>sticas sobre a tabela. Estas estat<EFBFBD>sticas s<EFBFBD>o coletadas
|
|
|
|
|
utilizando VACUUM ANALYZE ou simplesmente ANALYZE. Utilizando
|
|
|
|
|
estat<EFBFBD>sticas, o otimizador saber quantos registros h<EFBFBD> na tabela e pode
|
|
|
|
|
determinar melhor se um <EFBFBD>ndice deve ser utilizado. Estat<EFBFBD>sticas tamb<EFBFBD>m
|
|
|
|
|
s<EFBFBD>o <EFBFBD>teis para determinar a ordem de jun<EFBFBD><EFBFBD>o <EFBFBD>tima e m<EFBFBD>todos de jun<EFBFBD><EFBFBD>o.
|
|
|
|
|
Cole<EFBFBD><EFBFBD>o de estat<EFBFBD>sticas deve ser feita periodicamente a medida que o
|
|
|
|
|
conte<EFBFBD>do da tabela muda.
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ndices n<EFBFBD>o s<EFBFBD>o normalmente utilizados para ORDER BY ou para fazer
|
|
|
|
|
jun<EFBFBD><EFBFBD>es. Uma busca sequencial seguida por uma ordena<EFBFBD><EFBFBD>o expl<EFBFBD>cita <EFBFBD>
|
|
|
|
|
usualmente mais r<EFBFBD>pida do que uma busca por <EFBFBD>ndice em uma tabela
|
|
|
|
|
grande.
|
|
|
|
|
Contudo, LIMIT combinado com ORDER BY frequentemente utilizar<EFBFBD> um
|
|
|
|
|
<EFBFBD>ndice porque somente uma pequena por<EFBFBD><EFBFBD>o da tabela <EFBFBD> retornada. De
|
|
|
|
|
fato, embora MAX() e MIN() n<EFBFBD>o utilizem <EFBFBD>ndices, <EFBFBD> poss<EFBFBD>vel obter tais
|
|
|
|
|
valores utilizando um <EFBFBD>ndice com ORDER BY e LIMIT:
|
|
|
|
|
SELECT col
|
|
|
|
|
FROM tab
|
|
|
|
|
ORDER BY col [ DESC ]
|
|
|
|
|
LIMIT 1;
|
|
|
|
|
|
|
|
|
|
Se voc<EFBFBD> acredita que o otimizador est<EFBFBD> incorreto ao escolher uma busca
|
|
|
|
|
sequencial, utilize SET enable_seqscan TO 'off' e execute testes para
|
|
|
|
|
ver se uma busca por <EFBFBD>ndice <EFBFBD> de fato <EFBFBD> mais r<EFBFBD>pida.
|
|
|
|
|
|
|
|
|
|
Quando <EFBFBD> utilizado operadores com curingas tais como LIKE ou ~,
|
|
|
|
|
<EFBFBD>ndices s<EFBFBD> podem ser utilizados em certas circunst<EFBFBD>ncias:
|
|
|
|
|
* O <EFBFBD>n<EFBFBD>cio de uma string de busca deve ser o in<EFBFBD>cio da string, i.e.
|
|
|
|
|
+ modelos no LIKE n<EFBFBD>o devem come<EFBFBD>ar com %.
|
|
|
|
|
+ modelos no ~ (express<EFBFBD>o regular) n<EFBFBD>o devem come<EFBFBD>ar com ^.
|
|
|
|
|
* A string de busca n<EFBFBD>o pode iniciar com uma classe de caracteres,
|
|
|
|
|
i.e. [a-e].
|
|
|
|
|
* Buscas que n<EFBFBD>o diferenciam mai<EFBFBD>sculas de min<EFBFBD>sculas tais como
|
|
|
|
|
ILIKE e ~* n<EFBFBD>o utilizam <EFBFBD>ndices. Ao inv<EFBFBD>s, utilize <EFBFBD>ndices
|
|
|
|
|
funcionais, que s<EFBFBD>o descritos na se<EFBFBD><EFBFBD>o 4.12.
|
|
|
|
|
* A localidade padr<EFBFBD>o C deve ser utilizada durante o initdb.
|
|
|
|
|
|
|
|
|
|
4.9) Como eu vejo como o otimizador de consulta est<EFBFBD> avaliando a minha
|
|
|
|
|
consulta?
|
|
|
|
|
|
|
|
|
|
Veja o comando EXPLAIN no manual.
|
|
|
|
|
|
|
|
|
|
4.10) O que <EFBFBD> um <EFBFBD>ndice de <EFBFBD>rvore R?
|
|
|
|
|
|
|
|
|
|
Um <EFBFBD>ndice de <EFBFBD>rvore B <EFBFBD> utilizado para indexa<EFBFBD><EFBFBD>o de dados espaciais.
|
|
|
|
|
Um <EFBFBD>ndice do tipo hash n<EFBFBD>o pode manipular buscas em intervalos. Um
|
|
|
|
|
<EFBFBD>ndice de <EFBFBD>rvore B manipula somente buscas em intervalos em uma
|
|
|
|
|
dimens<EFBFBD>o. Um <EFBFBD>ndice de <EFBFBD>rvore R pode manipular dados
|
|
|
|
|
multidimensionais. Por exemplo, se um <EFBFBD>ndice de <EFBFBD>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<EFBFBD>ngulo."
|
|
|
|
|
|
|
|
|
|
A pesquisa can<EFBFBD>nica que descreve o modelo original da <EFBFBD>rvore R est<EFBFBD>
|
|
|
|
|
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<EFBFBD> tamb<EFBFBD>m pode encontrar esse documento em "Readings in Database
|
|
|
|
|
Systems" do Stonebraker
|
|
|
|
|
|
|
|
|
|
<EFBFBD>rvores R podem manipular pol<EFBFBD>gonos e caixas. Na teoria, <EFBFBD>rvores R
|
|
|
|
|
podem ser extendidos para manipular um grande n<EFBFBD>mero de dimens<EFBFBD>es. Na
|
|
|
|
|
pr<EFBFBD>tica, extendendo <EFBFBD>rvores R requer um pouco de trabalho e n<EFBFBD>s n<EFBFBD>o
|
|
|
|
|
temos atualmente nenhuma documenta<EFBFBD><EFBFBD>o de como faz<EFBFBD>-lo.
|
|
|
|
|
|
|
|
|
|
4.11) O que <EFBFBD> um Otimizador Gen<EFBFBD>tico de Consultas?
|
|
|
|
|
|
|
|
|
|
O m<EFBFBD>dulo GEQO acelera a otimiza<EFBFBD><EFBFBD>o de consultas quando se faz uma
|
|
|
|
|
jun<EFBFBD><EFBFBD>o de v<EFBFBD>rias tabelas utilizando o conceito de Algoritmo Gen<EFBFBD>tico
|
|
|
|
|
(AG). Isso permite a manipula<EFBFBD><EFBFBD>o de consultas com muitas jun<EFBFBD><EFBFBD>es
|
|
|
|
|
utilizando buscas n<EFBFBD>o exaustivas.
|
|
|
|
|
|
|
|
|
|
4.12) Como eu fa<EFBFBD>o buscas com express<EFBFBD>es regulares e buscas com express<EFBFBD>es
|
|
|
|
|
regulares sem diferenciar mai<EFBFBD>sculas de min<EFBFBD>sculas? Como eu utilizo um
|
|
|
|
|
<EFBFBD>ndice para buscas que n<EFBFBD>o diferenciam mai<EFBFBD>sculas de min<EFBFBD>sculas?
|
|
|
|
|
|
|
|
|
|
O operador ~ faz avalia<EFBFBD><EFBFBD>o de express<EFBFBD>es regulares, e ~* faz avalia<EFBFBD><EFBFBD>o
|
|
|
|
|
n<EFBFBD>o sens<EFBFBD>vel a mai<EFBFBD>sculas de express<EFBFBD>es regulares. A variante n<EFBFBD>o
|
|
|
|
|
sens<EFBFBD>vel a mai<EFBFBD>sculas do LIKE <EFBFBD> chamada de ILIKE.
|
|
|
|
|
|
|
|
|
|
Compara<EFBFBD><EFBFBD>es de igualdade n<EFBFBD>o sens<EFBFBD>veis a mai<EFBFBD>sculas s<EFBFBD>o normalmente
|
|
|
|
|
expressadas como:
|
|
|
|
|
SELECT *
|
|
|
|
|
FROM tab
|
|
|
|
|
WHERE lower(col) = 'abc';
|
|
|
|
|
|
|
|
|
|
Isso n<EFBFBD>o ir<EFBFBD> utilizar o <EFBFBD>ndice padr<EFBFBD>o. Contudo, se voc<EFBFBD> criar um
|
|
|
|
|
<EFBFBD>ndice funcional, ele ser<EFBFBD> utilizado:
|
|
|
|
|
CREATE INDEX tabindex ON tab (lower(col));
|
|
|
|
|
|
|
|
|
|
4.13) Em uma consulta, como eu detecto se um campo <EFBFBD> NULL?
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> pode testar a coluna com IS NULL e IS NOT NULL.
|
|
|
|
|
|
|
|
|
|
4.14) Qual <EFBFBD> a difenren<EFBFBD>a entre os v<EFBFBD>rios tipos de dados de caracteres?
|
|
|
|
|
|
|
|
|
|
Tipo Nome Interno Notas
|
|
|
|
|
--------------------------------------------------
|
|
|
|
|
VARCHAR(n) varchar tamanho especifica o comprimento m<EFBFBD>ximo, sem pr
|
|
|
|
|
eenchimento
|
|
|
|
|
CHAR(n) bpchar preenchimento em branco para comprimento fixo e
|
|
|
|
|
spec<EFBFBD>fico
|
|
|
|
|
TEXT text nenhum limite superior espec<EFBFBD>fico no compriment
|
|
|
|
|
o
|
|
|
|
|
BYTEA bytea vetor de bytes de comprimento vari<EFBFBD>vel (null-by
|
|
|
|
|
te safe)
|
|
|
|
|
"char" char um caracter
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> ver<EFBFBD> o nome interno quando examinar o cat<EFBFBD>logo do sistema e em
|
|
|
|
|
algumas mensagens de erro.
|
|
|
|
|
|
|
|
|
|
Os primeiros quatro tipos acima s<EFBFBD>o do tipo "varlena" (i.e., os
|
|
|
|
|
primeiros quatro bytes no disco s<EFBFBD>o o comprimento seguido pelos
|
|
|
|
|
dados). Consequentemente o espa<EFBFBD>o atual utilizado <EFBFBD> ligeiramente maior
|
|
|
|
|
do que o tamanho declarado. Contudo, esses tipos de dados tamb<EFBFBD>m s<EFBFBD>o
|
|
|
|
|
sujeitos a compress<EFBFBD>o ou a serem armazenados fora do padr<EFBFBD>o utilizando
|
|
|
|
|
o TOAST, ent<EFBFBD>o o espa<EFBFBD>o em disco pode tamb<EFBFBD>m ser bem menor do que o
|
|
|
|
|
esperado.
|
|
|
|
|
VARCHAR(n) <EFBFBD> melhor quando est<EFBFBD> armazenando cadeias de caracteres de
|
|
|
|
|
comprimento vari<EFBFBD>vel e h<EFBFBD> um limite de tamanho desta cadeia. TEXT <EFBFBD>
|
|
|
|
|
para cadeias de caracteres de comprimento ilimitado, com o m<EFBFBD>ximo de
|
|
|
|
|
um gigabyte.
|
|
|
|
|
|
|
|
|
|
CHAR(n) preenche com espa<EFBFBD>os em branco at<EFBFBD> o tamanho especificado,
|
|
|
|
|
enquanto o VARCHAR(n) armazena somente os caracteres fornecidos. BYTEA
|
|
|
|
|
<EFBFBD> para armazenar dados bin<EFBFBD>rios, particularmente valores que incluem
|
|
|
|
|
bytes NULL. Todos os tipos descritos aqui tem caracter<EFBFBD>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<EFBFBD>ncia. Por exemplo:
|
|
|
|
|
CREATE TABLE pessoa (
|
|
|
|
|
id SERIAL,
|
|
|
|
|
nome TEXT
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
<EFBFBD> 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<EFBFBD>gina sobre create_sequence no manual para mais informa<EFBFBD><EFBFBD>o
|
|
|
|
|
sobre sequ<EFBFBD>ncias. Voc<EFBFBD> tamb<EFBFBD>m pode utilizar o campo OID para cada
|
|
|
|
|
registro como um valor <EFBFBD>nico. Contudo, se voc<EFBFBD> precisar exportar e
|
|
|
|
|
importar o banco de dados, voc<EFBFBD> precisa utilizar a op<EFBFBD><EFBFBD>o -o do pg_dump
|
|
|
|
|
ou a op<EFBFBD><EFBFBD>o COPY WITH OIDS para preservar os OIDs.
|
|
|
|
|
|
|
|
|
|
4.15.2) Como eu consigo o valor de um campo SERIAL?
|
|
|
|
|
|
|
|
|
|
Uma abordagem <EFBFBD> obter o pr<EFBFBD>ximo valor SERIAL de uma sequ<EFBFBD>ncia com a
|
|
|
|
|
fun<EFBFBD><EFBFBD>o nextval() antes de inserir e ent<EFBFBD>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<EFBFBD> poderia ent<EFBFBD>o ter tamb<EFBFBD>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<EFBFBD> <tabela>_<coluna>_seq, onde tabela e coluna s<EFBFBD>o os nomes da
|
|
|
|
|
tabela e da coluna SERIAL, respectivamente.
|
|
|
|
|
|
|
|
|
|
Alternativamente, voc<EFBFBD> poderia obter o valor SERIAL atribu<EFBFBD>do com a
|
|
|
|
|
fun<EFBFBD><EFBFBD>o currval() depois de t<EFBFBD>-lo inserido por padr<EFBFBD>o, i.e.,
|
|
|
|
|
execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
|
|
|
|
|
novo_id = execute("SELECT currval('pessoa_id_seq')");
|
|
|
|
|
|
|
|
|
|
Finalmente, voc<EFBFBD> poderia utilizar o OID retornado da senten<EFBFBD>a INSERT
|
|
|
|
|
para obter o valor padr<EFBFBD>o, embora este seja a abordagem menos
|
|
|
|
|
port<EFBFBD>vel, pois o valor do oid n<EFBFBD>o ultrapassa 4 bilh<EFBFBD>es. Em Perl,
|
|
|
|
|
utilizando DBI com o m<EFBFBD>dulo DBD::Pg de Edmund Mergl, o valor do oid
|
|
|
|
|
est<EFBFBD> dispon<EFBFBD>vel via $sth->{pg_oid_status} depois de $sth->execute().
|
|
|
|
|
|
|
|
|
|
4.15.3) currval() e nextval() n<EFBFBD>o lidam com condi<EFBFBD><EFBFBD>o de corrida com outros
|
|
|
|
|
usu<EFBFBD>rios?
|
|
|
|
|
|
|
|
|
|
N<EFBFBD>o. currval() retorna o valor atual atribuido pelo seu n<EFBFBD>cleo
|
|
|
|
|
(backend), e n<EFBFBD>o por todos os usu<EFBFBD>rios.
|
|
|
|
|
|
|
|
|
|
4.15.4) Por que os n<EFBFBD>meros da minha sequ<EFBFBD>ncia n<EFBFBD>o s<EFBFBD>o reutilizados quando
|
|
|
|
|
uma transa<EFBFBD><EFBFBD>o <EFBFBD> abortada? Por que h<EFBFBD> intervalos nos n<EFBFBD>meros da minha
|
|
|
|
|
sequ<EFBFBD>ncia/coluna SERIAL?
|
|
|
|
|
|
|
|
|
|
Para melhorar a concorr<EFBFBD>ncia, valores da sequ<EFBFBD>ncia s<EFBFBD>o atribu<EFBFBD>dos a
|
|
|
|
|
transa<EFBFBD><EFBFBD>es correntes e n<EFBFBD>o s<EFBFBD>o travados at<EFBFBD> que a transa<EFBFBD><EFBFBD>o seja
|
|
|
|
|
finalizada. Isso causa intervalos na numera<EFBFBD><EFBFBD>o por causa de transa<EFBFBD><EFBFBD>es
|
|
|
|
|
abortadas.
|
|
|
|
|
|
|
|
|
|
4.16) O que <EFBFBD> um OID? O que <EFBFBD> um TID?
|
|
|
|
|
|
|
|
|
|
OIDs s<EFBFBD>o a resposta do PostgreSQL a ids <EFBFBD>nicos de registros. Cada
|
|
|
|
|
registro que <EFBFBD> criado no PostgreSQL recebe um OID <EFBFBD>nico. Todos OIDs
|
|
|
|
|
produzidos durante o initdb s<EFBFBD>o menores do que 16384 (de
|
|
|
|
|
include/access/transam.h). Todos os OIDs criados pelo usu<EFBFBD>rio s<EFBFBD>o
|
|
|
|
|
iguais ou maiores do que este valor. Por padr<EFBFBD>o, todos estes OIDs s<EFBFBD>o
|
|
|
|
|
<EFBFBD>nicos n<EFBFBD>o somente na tabela ou no banco de dados, mas na instala<EFBFBD><EFBFBD>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<EFBFBD>rios espec<EFBFBD>ficos e podem ser utilizados
|
|
|
|
|
em jun<EFBFBD><EFBFBD>es. <EFBFBD> recomendado que voc<EFBFBD> utilize o tipo de coluna OID para
|
|
|
|
|
armazenar valores OID. Voc<EFBFBD> pode criar um <EFBFBD>ndice no campo OID para
|
|
|
|
|
acesso r<EFBFBD>pido.
|
|
|
|
|
|
|
|
|
|
OIDs s<EFBFBD>o atribu<EFBFBD>dos para todas os registros novos de uma <EFBFBD>rea central
|
|
|
|
|
que <EFBFBD> utilizada por todos os bancos de dados. Se voc<EFBFBD> quer mudar o OID
|
|
|
|
|
de alguma coisa, ou se voc<EFBFBD> quer fazer uma c<EFBFBD>pia da tabela, com os
|
|
|
|
|
OIDs, n<EFBFBD>o h<EFBFBD> raz<EFBFBD>o para que voc<EFBFBD> n<EFBFBD>o possa faz<EFBFBD>-la:
|
|
|
|
|
CREATE TABLE nova_tabela(minha_coluna int);
|
|
|
|
|
SELECT oid as oid_antigo, minha_coluna INTO tabela_tmp FROM tabela_anti
|
|
|
|
|
ga;
|
|
|
|
|
COPY tabela_tmp TO '/tmp/pgtable';
|
|
|
|
|
DROP TABLE tabela_tmp;
|
|
|
|
|
COPY nova_tabela WITH OIDS FROM '/tmp/pgtable';
|
|
|
|
|
|
|
|
|
|
OIDs s<EFBFBD>o armazenados como inteiros de 4 bytes, e n<EFBFBD>o ultrapassam 4
|
|
|
|
|
bilh<EFBFBD>es. Ningu<EFBFBD>m nunca reportou que isso tenha ocorrido, e n<EFBFBD>s
|
|
|
|
|
planejamos remover o limite antes que alg<EFBFBD>em o alcan<EFBFBD>e.
|
|
|
|
|
|
|
|
|
|
TIDs s<EFBFBD>o utilizados para identificar registros f<EFBFBD>sicos espec<EFBFBD>ficos com
|
|
|
|
|
valores de bloco e deslocamento. TIDs mudam ap<EFBFBD>s registros serem
|
|
|
|
|
modificados ou recarregados. Eles s<EFBFBD>o utilizados por <EFBFBD>ndices para
|
|
|
|
|
apontar para registros f<EFBFBD>sicos.
|
|
|
|
|
|
|
|
|
|
4.17) Qual <EFBFBD> o significado de alguns termos utilizados no PostgreSQL?
|
|
|
|
|
|
|
|
|
|
O c<EFBFBD>digo-fonte e documenta<EFBFBD><EFBFBD>o antiga utiliza termos de uso comum. Aqui
|
|
|
|
|
est<EFBFBD>o alguns deles:
|
|
|
|
|
* tabela, rela<EFBFBD><EFBFBD>o, classe
|
|
|
|
|
* linha, registro, tupla
|
|
|
|
|
* coluna, campo, atributo
|
|
|
|
|
* recupera, seleciona
|
|
|
|
|
* altera, atualiza
|
|
|
|
|
* incrementa, insere
|
|
|
|
|
* OID, valor serial
|
|
|
|
|
* portal, cursor
|
|
|
|
|
* intervalo vari<EFBFBD>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<EFBFBD> provavelmente est<EFBFBD> sem mem<EFBFBD>ria virtual no sistema, ou o seu
|
|
|
|
|
n<EFBFBD>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<EFBFBD> sucesso, mas
|
|
|
|
|
ele definir<EFBFBD> o segmento de dados do seu processo com um limite maior e
|
|
|
|
|
talvez permita que a consulta seja feita. Este comando <EFBFBD> aplicado ao
|
|
|
|
|
processo atual e todos os subprocessos criados depois do comando ser
|
|
|
|
|
executado. Se voc<EFBFBD> tiver problemas com o cliente SQL porque o n<EFBFBD>cleo
|
|
|
|
|
(backend) retornou muitos dados, tente-o antes de iniciar o cliente.
|
|
|
|
|
|
|
|
|
|
4.19) Como eu informo qual vers<EFBFBD>o do PostgreSQL eu estou utilizando?
|
|
|
|
|
|
|
|
|
|
No psql, digite SELECT version();
|
|
|
|
|
|
|
|
|
|
4.20) Por que minhas opera<EFBFBD><EFBFBD>es com objetos grandes retorna "invalid large
|
|
|
|
|
obj descriptor"?
|
|
|
|
|
|
|
|
|
|
Voc<EFBFBD> precisa colocar BEGIN WORK e COMMIT ao redor de qualquer uso de
|
|
|
|
|
opera<EFBFBD><EFBFBD>es com objetos grandes, isto <EFBFBD>, ao redor de lo_open ...
|
|
|
|
|
lo_close.
|
|
|
|
|
|
|
|
|
|
Atualmente PostgreSQL obriga o fechamento de manipula<EFBFBD><EFBFBD>o de um objeto
|
|
|
|
|
grande quando uma transa<EFBFBD><EFBFBD>o <EFBFBD> submetida (commit). Ent<EFBFBD>o a primeira
|
|
|
|
|
tentativa de fazer qualquer coisa com o manipulador ir<EFBFBD> retornar
|
|
|
|
|
invalid large obj descriptor. Ent<EFBFBD>o o c<EFBFBD>digo que funcionava (ao menos
|
|
|
|
|
a algum tempo atr<EFBFBD>s) agora ir<EFBFBD> retornar uma mensagem de erro se voc<EFBFBD>
|
|
|
|
|
n<EFBFBD>o utilizar uma transa<EFBFBD><EFBFBD>o.
|
|
|
|
|
|
|
|
|
|
4.21) Como eu crio uma coluna que conter<EFBFBD> por padr<EFBFBD>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<EFBFBD>o t<EFBFBD>o lentas?
|
|
|
|
|
|
|
|
|
|
Em vers<EFBFBD>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 <EFBFBD> mais r<EFBFBD>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<EFBFBD>pido, subcol deve ser uma coluna indexada.
|
|
|
|
|
|
|
|
|
|
A partir da vers<EFBFBD>o 7.4, IN utiliza a mesma t<EFBFBD>cnica de agrupamento do
|
|
|
|
|
que consultas normais, e <EFBFBD> recomendado utilizar EXISTS.
|
|
|
|
|
|
|
|
|
|
4.23) Como eu fa<EFBFBD>o uma jun<EFBFBD><EFBFBD>o externa (outer join)?
|
|
|
|
|
|
|
|
|
|
PostgreSQL suporta jun<EFBFBD><EFBFBD>es externas utilizando a sintaxe padr<EFBFBD>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<EFBFBD>nticas juntam t1.col com t2.col, e tamb<EFBFBD>m
|
|
|
|
|
retornam qualquer registro que n<EFBFBD>o foi juntado em t1 (aqueles que n<EFBFBD>o
|
|
|
|
|
combinaram com t2). Uma jun<EFBFBD><EFBFBD>o a direita RIGHT adicionaria registros
|
|
|
|
|
que n<EFBFBD>o foram juntados da tabela t2. Uma jun<EFBFBD><EFBFBD>o completa (FULL)
|
|
|
|
|
retornaria os registros combinados mais todos os registros n<EFBFBD>o
|
|
|
|
|
combinados de t1 e t2. A palavra OUTER <EFBFBD> opcional e <EFBFBD> assumida nas
|
|
|
|
|
jun<EFBFBD><EFBFBD>es LEFT, RIGHT e FULL. Jun<EFBFBD><EFBFBD>es ordin<EFBFBD>rias s<EFBFBD>o chamadas jun<EFBFBD><EFBFBD>es
|
|
|
|
|
naturais (INNER).
|
|
|
|
|
|
|
|
|
|
Em vers<EFBFBD>es anteriores, jun<EFBFBD><EFBFBD>es externas podiam ser simuladas
|
|
|
|
|
utilizando UNION e NOT IN. Por exemplo, quando juntar tab1 e tab2, a
|
|
|
|
|
consulta a seguir faz uma jun<EFBFBD><EFBFBD>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<EFBFBD>o consultas utilizando m<EFBFBD>ltiplos bancos de dados?
|
|
|
|
|
|
|
|
|
|
N<EFBFBD>o h<EFBFBD> outra maneira de consultar um banco de dados caso ele n<EFBFBD>o seja
|
|
|
|
|
o atual. Porque o PostgreSQL carrega cat<EFBFBD>logos do sistema espec<EFBFBD>ficos
|
|
|
|
|
do banco de dados, <EFBFBD> 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<EFBFBD><EFBFBD>es. <EFBFBD> claro, que um cliente pode fazer
|
|
|
|
|
conex<EFBFBD>es simult<EFBFBD>neas em bancos de dados diferentes e juntar os
|
|
|
|
|
resultados no cliente.
|
|
|
|
|
|
|
|
|
|
4.25) Como eu retorno m<EFBFBD>ltiplos registros ou colunas de uma fun<EFBFBD><EFBFBD>o?
|
|
|
|
|
|
|
|
|
|
No 7.3, voc<EFBFBD> pode facilmente retornar m<EFBFBD>ltiplos registros ou colunas
|
|
|
|
|
de uma fun<EFBFBD><EFBFBD>o,
|
|
|
|
|
http://techdocs.postgresql.org/guides/SetReturningFunctions.
|
|
|
|
|
|
|
|
|
|
4.26) Por que eu n<EFBFBD>o posso confiar na cria<EFBFBD><EFBFBD>o/remo<EFBFBD><EFBFBD>o de tabelas
|
|
|
|
|
tempor<EFBFBD>rias em fun<EFBFBD><EFBFBD>es PL/PgSQL?
|
|
|
|
|
|
|
|
|
|
PL/PgSQL armazena o conte<EFBFBD>do da fun<EFBFBD><EFBFBD>o, e o efeito indesejado <EFBFBD> que se
|
|
|
|
|
uma fun<EFBFBD><EFBFBD>o PL/PgSQL acessa uma tabela tempor<EFBFBD>ria, e aquela tabela <EFBFBD>
|
|
|
|
|
removida e criada novamente, e a fun<EFBFBD><EFBFBD>o <EFBFBD> chamada novamente, a fun<EFBFBD><EFBFBD>o
|
|
|
|
|
ir<EFBFBD> falhar porque o conte<EFBFBD>do armazenado da fun<EFBFBD><EFBFBD>o ainda apontar<EFBFBD> para
|
|
|
|
|
a tabela tempor<EFBFBD>ria antiga. A solu<EFBFBD><EFBFBD>o <EFBFBD> utilizar o EXECUTE para acesso
|
|
|
|
|
a tabelas tempor<EFBFBD>rias no PL/PgSQL. Isto ir<EFBFBD> fazer com que a consulta
|
|
|
|
|
seja avaliada toda vez.
|
|
|
|
|
|
|
|
|
|
4.27) Que op<EFBFBD><EFBFBD>es para replica<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
|
|
|
|
|
H<EFBFBD> v<EFBFBD>rias op<EFBFBD><EFBFBD>es de replica<EFBFBD><EFBFBD>o mestre/escravo dispon<EFBFBD>veis. Isto
|
|
|
|
|
permite somente que o mestre fa<EFBFBD>a mudan<EFBFBD>as no banco de dados e o
|
|
|
|
|
escravo s<EFBFBD> pode ler o banco de dados. Abaixo em
|
|
|
|
|
http://gborg.PostgreSQL.org/genpage?replication_research lista-os. Uma
|
|
|
|
|
solu<EFBFBD><EFBFBD>o de replica<EFBFBD><EFBFBD>o de m<EFBFBD>ltiplos mestres est<EFBFBD> sendo desenvolvida em
|
|
|
|
|
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
|
|
|
|
|
|
|
|
|
|
4.28) Que op<EFBFBD><EFBFBD>es para encripta<EFBFBD><EFBFBD>o est<EFBFBD>o dispon<EFBFBD>veis?
|
|
|
|
|
|
|
|
|
|
* No contrib/pgcrypto cont<EFBFBD>m muitas fun<EFBFBD><EFBFBD>es de encripta<EFBFBD><EFBFBD>o para
|
|
|
|
|
serem utilizados em consultas SQL.
|
|
|
|
|
* Para encriptar a transmiss<EFBFBD>o do cliente ao servidor, o servidor
|
|
|
|
|
deve ter a op<EFBFBD><EFBFBD>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<EFBFBD>o deve estar disable. (Note que tamb<EFBFBD>m <EFBFBD> poss<EFBFBD>vel
|
|
|
|
|
utilizar outros esquemas de transporte encriptado, tais como
|
|
|
|
|
stunnel ou ssh, ao inv<EFBFBD>s da conex<EFBFBD>o SSL nativa do PostgreSQL.)
|
|
|
|
|
* Senhas dos usu<EFBFBD>rios do banco de dados s<EFBFBD>o automaticamente
|
|
|
|
|
encriptadas quando armazenadas na vers<EFBFBD>o 7.3. Em vers<EFBFBD>es
|
|
|
|
|
anteriores, voc<EFBFBD> deve habilitar a op<EFBFBD><EFBFBD>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<EFBFBD><EFBFBD>o. Quando eu executo-a no psql, por que ela
|
|
|
|
|
finaliza o programa com descarga de mem<EFBFBD>ria (core dump)?
|
|
|
|
|
|
|
|
|
|
O problema pode ser v<EFBFBD>rias coisas. Tente testar sua fun<EFBFBD><EFBFBD>o em um
|
|
|
|
|
programa independente.
|
|
|
|
|
|
|
|
|
|
5.2) Como eu posso contribuir com alguns tipos e fun<EFBFBD><EFBFBD>es novas para o
|
|
|
|
|
PostgreSQL?
|
|
|
|
|
|
|
|
|
|
Envie as suas extens<EFBFBD>es para a lista de discuss<EFBFBD>o pgsql-hackers, e
|
|
|
|
|
elas eventualmente ser<EFBFBD>o colocadas no subdiret<EFBFBD>rio contrib/.
|
|
|
|
|
|
|
|
|
|
5.3) Como eu escrevo uma fun<EFBFBD><EFBFBD>o em C que retorna uma tupla?
|
|
|
|
|
|
|
|
|
|
Em vers<EFBFBD>es do PostgreSQL a partir da 7.3, fun<EFBFBD><EFBFBD>es que retornam tuplas
|
|
|
|
|
s<EFBFBD>o suportadas em C, PL/PgSQL e SQL. Veja o Guia do Programador para
|
|
|
|
|
mais informa<EFBFBD><EFBFBD>o. Um exemplo de uma fun<EFBFBD><EFBFBD>o escrita em C e que retorna
|
|
|
|
|
tuplas pode ser encontrada em contrib/tablefunc.
|
|
|
|
|
|
|
|
|
|
5.4) Eu alterei um arquivo do c<EFBFBD>digo-fonte. Por que a recompila<EFBFBD><EFBFBD>o n<EFBFBD>o
|
|
|
|
|
surtiu efeito?
|
|
|
|
|
|
|
|
|
|
Os arquivos Makefiles n<EFBFBD>o tem as depend<EFBFBD>ncias corretas para incluir
|
|
|
|
|
arquivos. Voc<EFBFBD> deve executar um make clean e ent<EFBFBD>o o make. Se voc<EFBFBD>
|
|
|
|
|
est<EFBFBD> utilizando o GCC voc<EFBFBD> pode utilizar a op<EFBFBD><EFBFBD>o --enable-depend do
|
|
|
|
|
configure para o compilador computar as depend<EFBFBD>ncias automaticamente.
|