Commit fb261985 authored by Bruce Momjian's avatar Bruce Momjian

Update Brazilian FAQ.

 Euler Taveira de Oliveira
parent 016e0b41
Perguntas Frequentes (FAQ) sobre PostgreSQL Perguntas Frequentes (FAQ) sobre PostgreSQL
Última atualização: Dom Jan 9 14:44:04 EDT 2005 Última atualização: Sáb Out 14 19:08:19 EDT 2006
Mantenedor atual: Bruce Momjian (pgman@candle.pha.pa.us) Mantenedor atual: Bruce Momjian (bruce@momjian.us)
Traduzido por: Euler Taveira de Oliveira (eulerto@yahoo.com.br) Traduzido por: Euler Taveira de Oliveira (euler@timbira.com)
A versão mais recente desse documento pode ser vista em A versão mais recente desse documento pode ser vista em
http://www.postgresql.org/files/documentation/faqs/FAQ.html (EN). http://www.postgresql.org/files/documentation/faqs/FAQ.html (EN).
...@@ -19,242 +19,192 @@ ...@@ -19,242 +19,192 @@
Perguntas Gerais Perguntas Gerais
1.1) O que é PostgreSQL? Como ele é pronunciado? 1.1) O que é PostgreSQL? Como ele é pronunciado?
1.2) Qual é a licença do PostgreSQL? 1.2) Quem controla o PostgreSQL?
1.3) Quais plataformas Unix o PostgreSQL pode ser executado? 1.3) Qual é a licença do PostgreSQL?
1.4) Quais portabilidades não-Unix estão disponíveis? 1.4) Quais plataformas o PostgreSQL pode ser executado?
1.5) Onde eu posso conseguir o PostgreSQL? 1.5) Onde eu posso conseguir o PostgreSQL?
1.6) Onde eu posso conseguir suporte? 1.6) Qual é a última versão?
1.7) Qual é a última versão? 1.7) Onde eu posso conseguir suporte?
1.8) Que documentação está disponível? 1.8) Como eu posso submeter um relato de um bug?
1.9) Como eu posso saber quais são os bugs conhecidos ou 1.9) Como eu posso saber quais são os bugs conhecidos ou
características ausentes? características ausentes?
1.10) Como eu posso aprender SQL? 1.10) Que documentação está disponível?
1.11) O PostgreSQL está livre do Bug do Milênio? 1.11) Como eu posso aprender SQL?
1.12) Como posso me juntar a equipe de desenvolvimento? 1.12) Como posso submeter uma correção (patch) ou me juntar a equipe
1.13) Como eu informo a existência de um bug? de desenvolvimento?
1.14) Como é o PostgreSQL comparado a outros SGBDs? 1.13) Como é o PostgreSQL comparado a outros SGBDs?
1.15) Como eu posso ajudar financeiramente o projeto PostgreSQL?
Perguntas sobre Clientes Perguntas sobre Clientes
2.1) Há drivers ODBC para PostgreSQL? 2.1) Quais interfaces estão disponíveis para PostgreSQL?
2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL 2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL
com páginas Web? com páginas Web?
2.3) O PostgreSQL tem interfaces gráficas para interagir com usuário? 2.3) O PostgreSQL tem interfaces gráficas para interagir com usuário?
2.4) Quais linguagens estão disponíveis para comunicar-se com o
PostgreSQL?
Perguntas Administrativas Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de 3.1) Como eu instalo o PostgreSQL em um local diferente de
/usr/local/pgsql? /usr/local/pgsql?
3.2) Quando eu inicio o postmaster, eu recebo a mensagem Bad System 3.2) Como eu controlo conexões de outras máquinas?
Call ou uma descarga de memória (core dump). Por que? 3.3) Como eu ajusto o servidor de banco de dados para obter uma
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ões de outras máquinas?
3.6) Como eu ajusto o servidor de banco de dados para obter uma
performance melhor? performance melhor?
3.7) Quais características de depuração estão disponíveis? 3.4) Quais características de depuração estão disponíveis?
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento 3.5) Por que eu recebo "Sorry, too many clients" quando eu tento
conectar? conectar?
3.9) O que está no diretório pgsql_tmp? 3.6) Qual é o processo de atualização do PostgreSQL? 3.7) Que tipo de
3.10) O que eu preciso fazer para exportar e importar durante a hardware eu devo usar?
atualização de versões do PostgreSQL?
3.11) Que tipo de hardware eu devo usar?
Perguntas Operacionais Perguntas Operacionais
4.1) Qual é a diferença entre cursores binários e normais? 4.1) Como eu faço um SELECT somente dos primeiros registros de uma
4.2) Como eu faço um SELECT somente dos primeiros registros de uma
consulta? Um registro randômico? consulta? Um registro randômico?
4.3) Como eu obtenho a lista de tabelas ou outras coisas que eu posso 4.2) Como eu descubro quais tabelas, índices, bancos de dados e
ver no psql? usuários estão definidos? Como eu vejo as consultas utilizadas pelo
4.4) Como eu removo uma coluna de uma tabela ou mudo o seu tipo de psql para mostrá-los?
4.3) Como você muda o tipo de dado de uma coluna?
4.4) Qual é o tamanho máximo de um registro, uma tabela e um banco de
dados? dados?
4.5) Qual é o tamanho máximo de um registro, uma tabela e um banco de 4.5) Quanto espaço em disco é necessário para armazenar dados de um
dados?
4.6) Quanto espaço em disco é necessário para armazenar dados de um
arquivo texto? arquivo texto?
4.7) Como eu descubro quais tabelas, índices, bancos de dados e 4.6) Por que minhas consultas estão lentas? Por que elas não estão
usuários estão definidos? utilizando meus índices?
4.8) Minhas consultas estão lentas ou não estão utilizando índices. 4.7) Como eu vejo como o otimizador de consultas está avaliando minha
Por que?
4.9) Como eu vejo como o otimizador de consultas está avaliando minha
consulta? consulta?
4.10) O que é um índice de árvore R (R-tree)? 4.8) Como eu faço buscas com expressões regulares e buscas com
4.11) O que é um Otimizador Genético de Consultas? expressões regulares sem diferenciar mauúsculas de minúsculas? Como eu
4.12) Como eu faço buscas com expressões regulares e buscas com utilizo um índice para buscas sem distinguir maiúsculas de minúsculas?
expressões regulares sem diferenciar maiúsculas de minúsculas? Como eu 4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu
utilizo um índice para buscas que não diferenciam maiúsculas de posso ordenar por um campo que é NULL ou não?
minúsculas? 4.10) Qual é a diferença entre os vários tipos de dado de caracteres?
4.13) Em uma consulta, como eu detecto se um campo é NULL? 4.11.1) Como eu crio um campo serial/auto incremento?
4.14) Qual é a diferença entre os vários tipos de dados de caracteres? 4.11.2) Como eu consigo o valor de um campo SERIAL?
4.15.1) Como eu crio um campo serial/auto incremento? 4.11.3) currval() não lida com condição de corrida com outros
4.15.2) Como eu consigo o valor de um campo SERIAL?
4.15.3) currval() não lida com condição de corrida com outros
usuários? usuários?
4.15.4) Por que os números da minha sequência não são reutilizados 4.11.4) Por que os números da minha sequência não são reutilizados
quando uma transação é abortada? Por que há intervalos nos números da quando uma transação é abortada? Por que há intervalos nos números da
minha sequência/coluna SERIAL? minha sequência/coluna SERIAL?
4.16) O que é um OID? O que é um TID? 4.12) O que é um OID? O que é um CTID?
4.17) Qual é o significado de alguns termos utilizados no PostgreSQL? 4.13) Por que eu recebo o erro "ERROR: Memory exhausted in
4.18) Por que eu recebo o erro "ERROR: Memory exhausted in
AllocSetAlloc()"? AllocSetAlloc()"?
4.19) Como eu informo qual versão do PostgreSQL eu estou utilizando? 4.14) Como eu informo qual versão do PostgreSQL eu estou utilizando?
4.20) Por que minhas operações com objetos grandes retorna "invalid 4.15) Como eu crio uma coluna que conterá por padrão a hora atual?
large obj descriptor"? 4.16) Como eu faço uma junção externa (outer join)?
4.21) Como eu crio uma coluna que conterá por padrão a hora atual? 4.17) Como eu faço consultas utilizando múltiplos bancos de dados?
4.22) Por que as minhas subconsultas que utilizam IN estão tão lentas? 4.18) Como eu retorno múltiplos registros ou colunas de uma função?
4.23) Como eu faço uma junção externa (outer join)? 4.19) Por que eu obtenho erros "relation with OID ###### does not
4.24) Como eu faço consultas utilizando múltiplos bancos de dados? exist" ao acessar tabelas temporárias em funções PL/PgSQL?
4.25) Como eu retorno múltiplos registros ou colunas de uma função? 4.20) Quais soluções de replicação estão disponíveis?
4.26) Por que eu não posso confiar na criação/remoção de tabelas 4.21) Por que os nomes de minhas tabelas e colunas não são
temporárias em funções PL/PgSQL? reconhecidos em minha consulta?
4.27) Que opções para encriptação estão disponíveis?
Extendendo o PostgreSQL
5.1) Eu escrevi uma função. Quando eu executo-a no psql, por que ela
finaliza o programa com descarga de memória (core dump)?
5.2) Como eu posso contribuir com alguns tipos e funções novas para o
PostgreSQL?
5.3) Como eu escrevo uma função em C que retorna uma tupla?
5.4) Eu alterei um arquivo do código-fonte. Por que a recompilação não
surtiu efeito?
_________________________________________________________________ _________________________________________________________________
Perguntas Gerais Perguntas Gerais
1.1) O que é PostgreSQL? Como ele é pronunciado? 1.1) O que é PostgreSQL? Como ele é pronunciado?
PostgreSQL é pronunciado Post-Gres-Q-L. PostgreSQL é pronunciado Post-Gres-Q-L, e é, às vezes, referido apenas
como Postgres. Um arquivo de áudio está disponível em formato MP3 para
PostgreSQL é um melhoramento do sistema de gerência de banco de dados aqueles que gostariam de ouvir a pronúncia.
POSTGRES (e também é, às vezes, chamado simplesmente de "Postgres"),
um protótipo de pesquisa de um SGBD de última geração. Enquanto o O PostgreSQL é um sistema de banco de dados objeto-relacional que tem
PostgreSQL retém a modelagem de dados poderosa e a grande quantidade as características de sistemas de bancos de dados comerciais
de tipos de dados do POSTGRES, ele substituiu a linguagem de consulta tradicionais com melhoramentos encontrados nos sistemas SGBDs de
PostQuel com um subconjunto extendido do SQL. PostgreSQL é livre e o próxima geração. PostgreSQL é livre e o código-fonte completo está
código-fonte completo está disponível. disponível.
O desenvolvimento do PostgreSQL é feito por um grupo de O desenvolvimento do PostgreSQL é feito por um grupo de
desenvolvedores que estão inscritos na lista de e-mails de desenvolvedores voluntários (na sua maioria) espalhados pelo mundo e
desenvolvimento do PostgreSQL. O coordenador atual é Marc G. Fournier que se comunicam via Internet. É um projeto da comunidade e não é
(scrappy@PostgreSQL.org). (Veja a seção 1.6 para saber como se juntar controlado por nenhuma empresa. Para se envolver, veja a FAQ do
ao grupo). O grupo é responsável por todo o desenvolvimento do desenvolvedor em
PostgreSQL. É um projeto da comunidade e não é 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 http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
Os autores do PostgreSQL 1.01 foram Andrew Yu e Jolly Chen. Muitos 1.2) Quem controla o PostgreSQL?
outros contribuiram para portar, testar, depurar e melhorar o código.
O código original do Postgres, do qual o PostgreSQL foi derivado, foi Se você está procurando por um mantenedor, comitê central ou empresa
um esforço de muitos estudantes de graduação e pós-graduação e uma controladora do PostgreSQL, desista --- não há um(a). Nós temos um
equipe de programadores trabalhando sobre a direção do Professor comitê core e committers CVS, mas estes grupos são mais para questões
Michael Stonebraker na Universidade da Califónia em Berkeley. administrativas do que controle. O projeto é direcionado pela
comunidade de desenvolvedores e usuários, que qualquer um pode se
O nome original do software em Berkeley era Postgres. Quando o SQL foi juntar. Tudo o que você precisa é se inscrever nas listas de discussão
adicionado em 1995, seu nome foi mudado para Postgres95. O nome foi e participar das discussões. Veja a FAQ do desenvolvedor para obter
mudado no fim de 1996 para PostgreSQL. informações como se envolver com o desenvolvimento do PostgreSQL.
1.3) Qual é a licença do PostgreSQL?
O PostgreSQL é distribuído sob a licença BSD clássica. Basicamente,
ela permite que usuários façam qualquer coisa com o código, incluindo
revender os binários sem o código-fonte. A única restrição é que você
não nos responsabilize legalmente por problemas com o programa de
computador. Há também a exigência de que esta licença apareça em todas
as cópias do programa de computador. Aqui está a licença BSD que
usamos atualmente:
1.2) Qual é a licença do PostgreSQL?
PostgreSQL está sujeito a seguinte licença: PostgreSQL está sujeito a seguinte licença:
PostgreSQL Sistema de Gerência de Banco de Dados PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of California Portions Copyright (c) 1994-1996 Regents of the University of
California
Permissão de uso, cópia, modificação e distribuição desse software e
sua documentação para qualquer propósito, sem taxa, e sem um acordo Permission to use, copy, modify, and distribute this software and its
escrito está concedida por esse meio, contanto que a nota da licença documentation for any purpose, without fee, and without a written
acima, esse parágrafo e os dois parágrafos seguintes apareçam em todas agreement is hereby granted, provided that the above copyright notice
as cópias. and this paragraph and the following two paragraphs appear in all
copies.
EM NENHUM EVENTO A UNIVERSIDADE DA CALIFÓRNIA SERÁ RESPONSÁVEL POR
QUALQUER PARTIDO EM DANOS DIRETOS, INDIRETOS, ESPECIAIS, INCIDENTAIS IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
OU CONSEQUENTES, INCLUINDO PERDA DE LUCROS, SURGIDOS A PARTIR DO USO FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
DO SOFTWARE E DE SUA DOCUMENTAÇÃO, MESMO SE A UNIVERSIDADE DA INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
CALIFÓRNIA ESTIVER SIDO AVISADA DA POSSIBILIDADE DE TAL DANO. ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
A UNIVERSIDADE DA CALIFÓRNIA ESPECIFICADAMENTE NÃO DÁ NENHUMA
GARANTIA, INCLUINDO, MAS NÃO LIMITADO A, GARANTIAS IMPLÍCITAS DE THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
COMERCIALIZAÇÃO E ATENDIMENTO DE PROPÓSITO PARTICULAR. O SOFTWARE É INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
FORNECIDO ABAIXO "COMO É", E A UNIVERSIDADE DA CALIFÓRNIA NÃO TEM MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
OBRIGAÇÃO DE FORNECER MANUTENÇÃO, SUPORTE, ATUALIZAÇÕES, MELHORIAS OU PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
MODIFICAÇÕES. CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
O que está descrito acima é a licença BSD, uma licença de código
aberto clássica. Ela não tem restrições de como o código pode ser 1.4) Quais plataformas o PostgreSQL pode ser executado?
utilizado. Nós gostamos dela e não temos intenções de mudá-la.
1.3) Quais plataformas Unix o PostgreSQL pode ser executado?
Em geral, qualquer plataforma moderna compatível com Unix deve ser Em geral, qualquer plataforma moderna compatível com Unix deve ser
capaz de executar o PostgreSQL. As plataformas que foram testadas capaz de executar o PostgreSQL. As plataformas que foram testadas
antes do lançamento de uma versão são listadas nas instruções de antes do lançamento de uma versão são listadas nas instruções de
instalação. instalação.
1.4) Quais portabilidades não-Unix estão disponíveis? O PostgreSQL também executa nativamente nos sistemas operacionais
Microsoft Windows baseados no NT tais como Win200 SP4, WinXP e
Iniciando com a versão 8.0, o PostgreSQL agora pode ser executado Win2003. Um instalador pré-empacotado está disponível em
nativamente nos sistemas operacionais Microsoft Windows baseados no NT http://pgfoundry.org/projects/pginstaller. Versões do Windows baseadas
tais como Win2000, WinXP e Win2003. Um instalador está disponível em no MS-DOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
http://pgfoundry.org/projects/pginstaller Versões do Windows baseados
no MSDOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
o Cygwin. o Cygwin.
Há também um porte para Novell Netware 6 em http://forge.novell.com e Há também uma versão para o Novell Netware 6 em
uma versão para OS/2 (eComStation) em http://forge.novell.com e uma versão para OS/2 (eComStation) em
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F. SQL&stype=all&sort=type&dir=%2F.
1.5) Onde eu posso conseguir o PostgreSQL? 1.5) Onde eu posso conseguir o PostgreSQL?
O servidor ftp principal do PostgreSQL é ftp://ftp.PostgreSQL.org/pub. Via navegador web, utilize http://www.postgresql.org/ftp/ e via ftp,
Para obter a relação de servidores espelhos (mirrors), consulte nosso utilize ftp://ftp.PostgreSQL.org/pub/.
website.
1.6) Onde eu posso conseguir suporte?
A lista de discussão principal é: pgsql-general@PostgreSQL.org. Ela
está disponível para discussõ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ém uma lista síntese (digest) disponível. Para se inscrever, 1.6) Qual é a última versão?
envie um e-mail para: pgsql-general-digest-request@PostgreSQL.org com
o seguinte corpo: A última versão do PostgreSQL é a versão 8.1.5.
subscribe
end Nós planejamos lançar versões novas a cada ano com versões corretivas
em alguns meses.
Sínteses (Digests) são enviadas aos membros dessa lista quando a lista
receber cerca de 30k em mensagens. 1.7) Onde eu posso conseguir suporte?
A lista de discussão sobre bugs está disponível. Para se inscrever, A comunidade do PostgreSQL fornece assistência a muitos de seus
envie um e-mail para pgsql-bugs-request@PostgreSQL.org com o seguinte usuários via e-mail. O principal sítio web para inscrição nas listas
corpo: de e-mail é http://www.postgresql.org/community/lists/. As listas
subscribe general e bugs são um bom lugar para início.
end
Há também uma lista de discussão dos desenvolvedores disponível. Para
se inscrever, envie um e-mail para
pgsql-hackers-request@PostgreSQL.org com o seguinte corpo:
subscribe
end
Outras listas de discussões e informações sobre o PostgreSQL podem ser
encontradas na homepage do PostgreSQL em:
http://www.PostgreSQL.org
O principal canal de IRC é o #postgresql na Freenode O principal canal de IRC é o #postgresql na Freenode
(irc.freenode.net). Para se conectar você pode utilizar o comando Unix (irc.freenode.net). Para se conectar você pode utilizar o comando Unix
irc -c '#postgresql' "$USER" irc.freenode.net ou utilizar qualquer irc -c '#postgresql' "$USER" irc.freenode.net ou utilizar qualquer
...@@ -263,110 +213,120 @@ ...@@ -263,110 +213,120 @@
PostgreSQL na EFNet. PostgreSQL na EFNet.
Uma lista de empresas que prestam suporte comercial está disponível em Uma lista de empresas que prestam suporte comercial está disponível em
http://techdocs.postgresql.org/companies.php. http://www.postgresql.org/support/professional_support.
1.7) Qual é a última versão?
A última versão do PostgreSQL é a versão 7.4.6.
Nós planejamos lançar versões novas a cada seis ou oito meses. 1.8) Como eu informo a existência de um bug?
Visite o formulário que reporta bugs do PostgreSQL em
http://www.postgresql.org/support/submitbug.
1.8) Que documentação está disponível? Verifique também o nosso ftp ftp://ftp.PostgreSQL.org/pub para ver se
há uma versão mais recente do PostgreSQL.
Vários manuais, páginas de manuais (man pages) e alguns exemplos para
teste estão incluídos na distribuição. Veja o diretório /doc. Você Bugs submetidos utilizando o formulário ou informado a qualquer lista
pode acessar os manuais online em http://www.PostgreSQL.org/docs. de discussão do PostgreSQL tipicamente gera uma das seguintes
respostas:
* Não é um bug e o porquê
* É um bug conhecido e já está na lista de AFAZERES (TODO)
* O bug foi corrigido na versão atual
* O bug foi corrigido mas não foi empacotado em um versão oficial
* Um pedido foi feito para obter informações detalhadas:
+ Sistema Operacional
+ Versão do PostgreSQL
+ Exemplo de teste que reproduz o bug
+ Informações sobre depuração
+ Saída reconstituidora de vestígios (backtrace) do depurador
* O bug é novo. O seguinte pode ocorrer:
+ Uma correção é criada e será incluída na próxima versão
+ O bug não pode ser corrigido imediatamente e é adicionado a
lista de AFAZERES (TODO)
1.9) Como eu posso saber quais são os bugs conhecidos ou funcionalidades
ausentes?
O PostgreSQL suporta um subconjunto extendido do SQL:2003. Veja nossa
lista de AFAZERES (TODO) que contém bugs conhecidos, funcionalidades
ausentes e planos futuros.
Uma solicitação de funcionalidade geralmente resulta em uma das
seguintes respostas:
* A funcionalidade já está na lista de AFAZERES (TODO)
* A funcionalidade não é desejável porque:
+ Ela duplica uma funcionalidade existente que já segue o
padrão SQL
+ A funcionalidade aumentará a complexidade do código mas
adicionará pouco benefício
+ A funcionalidade será insegura ou não-confiável
* A nova funcionalidade é adicionada a lista de AFAZERES (TODO)
O PostgreSQL não utiliza sistema de acompanhamento de bugs porque nós
achamos mais eficiente responder diretamente o e-mail e manter a lista
de AFAZERES (TODO) atualizada. Na prática, bugs não duram muito no
programa; e bugs que afetam uma grande quantidade de usuários são
corrigidos rapidamente. O único lugar para encontrar todas as
mudanças, melhorias e correções em uma versão do PostgreSQL é ler as
mensagens de log do CVS. Até mesmo as notas de lançamento não listam
todas as mudanças feitas no programa.
1.10) Que documentação está disponível?
O PostgreSQL inclui vasta documentação, incluindo um manual extenso,
páginas de manuais (man pages) e alguns exemplos teste. Veja o
diretório /doc. Você também pode pesquisar os manuais online em
http://www.PostgreSQL.org/docs.
Há dois livros sobre PostgreSQL disponíveis online em Há dois livros sobre PostgreSQL disponíveis online em
http://www.PostgreSQL.org/docs/awbook.html e http://www.postgresql.org/docs/books/awbook.html e
http://www.commandprompt.com/ppbook/. Há uma lista de livros sobre http://www.commandprompt.com/ppbook/. Há uma lista de livros sobre
PostgreSQL disponíveis para compra em PostgreSQL disponíveis para compra. Um dos mais populares é o do Korry
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Há também uma Douglas. Uma lista de análise sobre os livros pode ser encontrada em
coleção de artigos técnicos sobre PostgreSQL em http://techdocs.PostgreSQL.org/techdocs/bookreviews.php.
http://techdocs.PostgreSQL.org/.
O programa cliente de linha de comando psql tem alguns comandos \d O programa cliente de linha de comando psql tem alguns comandos \d
para mostrar informação sobre tipos, operadores, funções, agregações, para mostrar informações sobre tipos, operadores, funções, agregações,
etc. Use \? para mostrar os comandos disponíveis. etc. - utilize \? para mostrar os comandos disponíveis.
Nosso web site contém ainda mais documentação. Nosso sítio web contém ainda mais documentação.
1.9) Como eu posso saber quais são os bugs conhecidos ou características 1.11) Como eu posso aprender SQL?
ausentes?
Primeiro, considere os livros específicos sobre PostgreSQL mencionados
PostgreSQL suporta um subconjunto extendido do SQL-92. Veja a nossa acima. Outro é o "Teach Yourself SQL in 21 Days, Second Edition" e
lista de afazeres (TODO) para saber sobre bugs conhecidos, http://members.tripod.com/er4ebus/sql/index.htm. Muitos de nossos
características ausentes e planos futuros. usuários gostam do The Practical SQL Handbook, Bowman, Judith S., et
al., Addison-Wesley. Outros do The Complete Reference SQL, Groff et
1.10) Como eu posso aprender SQL? al., McGraw-Hill.
O livro "The PostgreSQL book" em Há também bons tutoriais disponíveis online:
http://www.PostgreSQL.org/docs/awbook.html ensina SQL. Há outro livro * http://www.intermedia.net/support/sql/sqltut.shtm
sobre PostgreSQL em http://www.commandprompt.com/ppbook. Há bons * http://sqlcourse.com
tutoriais em http://www.intermedia.net/support/sql/sqltut.shtm, , * http://www.w3schools.com/sql/default.asp
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM, * http://mysite.verizon.net/Graeme_Birchall/id1.html
e em http://sqlcourse.com.
1.12) Como posso submeter uma correção (patch) ou me juntar a equipe de
Outro é o "Teach Yourself SQL in 21 Days, Second Edition" em desenvolvimento?
http://members.tripod.com/er4ebus/sql/index.htm
Veja a FAQ do Desenvolvedor.
Muitos dos nossos usuários gostam do The Practical SQL Handbook,
Bowman, Judith S., et al., Addison-Wesley. Outros gostam do The 1.13) Como é o PostgreSQL comparado a outros SGBDs?
Complete Reference SQL, Groff et al., McGraw-Hill.
Há várias maneiras de se medir um software: funcionalidades,
1.11) O PostgreSQL está livre do Bug do Milênio?
Sim, nós podemos manipular datas após o ano 2000 AD e antes do ano
2000 BC.
1.12) Como posso me juntar a equipe de desenvolvimento?
Primeiramente, faça o download do código-fonte e leia a documentação
para Desenvolvedores do PostgreSQL no nosso website ou na
distribuição. Depois, se inscreva nas lista de discussão pgsql-hackers
e pgsql-patches. Então submeta patches de alta qualidade para
pgsql-patches.
Há algumas pessoas que tem privilégios para fazer mudanças (commit) na
árvore CVS do PostgreSQL. Cada um deles submeteram tantos patches de
alta qualidade que foi impossível para os committers continuarem a
fazerem as mudanças, e então nós confiamos que os patches que eles
submetem são de alta qualidade.
1.13) Como eu informo a existência de um bug?
Visite o formulário que reporta bugs do PostgreSQL em
http://www.postgresql.org/support/submitbug.
Verifique também o nosso ftp ftp://ftp.PostgreSQL.org/pub para ver se
há uma versão mais recente do PostgreSQL ou patches.
1.14) Como é o PostgreSQL comparado a outros SGBDs?
Há várias maneiras de se medir um software: características,
performance, confiabilidade, suporte e preço. performance, confiabilidade, suporte e preço.
Características Funcionalidades
PostgreSQL tem muitas características presentes em muitos SGBDs PostgreSQL tem muitas características presentes em muitos SGBDs
comerciais como transações, subconsultas, gatilhos, visões, comerciais como transações, subconsultas, gatilhos, visões,
integridade referencial de chave estrangeira e travamento integridade referencial de chave estrangeira e bloqueio (lock)
(lock) sofisticado. Nós temos algumas características que eles sofisticado. Nós temos algumas funcionalidades que eles não
não tem, como tipos definidos pelo usuário, herança, regras e tem, como tipos definidos pelo usuário, herança, regras e
controle de concorrência de múltiplas versões para reduzir controle de concorrência de múltiplas versões para reduzir
travamentos (locks). bloqueios (locks).
Performance Performance
A performance do PostgreSQL é comparável a outros bancos de A performance do PostgreSQL é comparável a outros bancos de
dados comerciais e de código livre. Ele é mais rápido em dados comerciais e de código livre. Ele é mais rápido em
algumas coisas, mais lento em outras. Comparado ao MySQL ou algumas coisas, mais lento em outras. Nossa performance é
sistemas de bancos de dados "leves", nós somos mais rápidos com geralmente +/- 10% comparada a de outros bancos de dados.
múltiplos usuários, consultas complexas e carga de consultas de
leitura/escrita. MySQL é mais rápido para consultas simples com
SELECT feitas por poucos usuários. É claro que o MySQL não tem
muitas das características mencionadas na seção Características
acima. Nós desenvolvemos buscando confiabilidade e
características, e nós continuamos a melhorar a performance a
cada versão.
Confiabilidade Confiabilidade
Nós sabemos que um SGBD deve ser confiável ou ele é inútil. Nós Nós sabemos que um SGBD deve ser confiável ou ele é inútil. Nós
...@@ -387,320 +347,155 @@ ...@@ -387,320 +347,155 @@
manuais e o código fonte faz com que o suporte do PostgreSQL manuais e o código fonte faz com que o suporte do PostgreSQL
seja superior ao de outros SGBDs. Há suporte comercial por seja superior ao de outros SGBDs. Há suporte comercial por
incidente disponíveis para aqueles que precisam de um. (Veja incidente disponíveis para aqueles que precisam de um. (Veja
seção 1.6 da FAQ.) seção 1.7 da FAQ.)
Preço Preço
Nós somos livres para uso dele tanto comercial quanto não Nós somos livres para uso dele tanto comercial quanto não
comercial. Você pode adicionar nosso código ao seu produto sem comercial. Você pode adicionar nosso código ao seu produto sem
limitações, exceto aquelas descritas na nossa licença limitações, exceto aquelas descritas na nossa licença BSD
compatível com a licença BSD mencionada acima. 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 é muito importante em um projeto de
código aberto. Ela previne descontinuidades que podem facilmente
descontinuar o andamento do projeto.
É claro, que a infra-estrutura não é barata. Há vários custos iniciais
e mensais que são necessários para manté-la. Se você ou sua empresa
tem dinheiro que pode ser doado para ajudar a financiar esse esforço,
acesse http://store.pgsql.com/shopping/ e faça uma doação.
Embora a página mencione PostgreSQL, Inc, a "contribuição" é somente
para apoiar o projeto PostgreSQL e não financia nenhuma empresa
específica. Se você preferir, você pode enviar um cheque para o
endereço de contato.
Se você tiver uma história de sucesso sobre o PostgreSQL, envie-a para
nossa lista advocacy em pgsql-advocacy@postgresql.org.
_________________________________________________________________ _________________________________________________________________
Perguntas sobre Clientes Perguntas sobre Clientes
2.1) Há drivers ODBC para PostgreSQL? 2.1) Quais interfaces estão disponíveis para PostgreSQL?
Há dois drivers ODBC disponíveis, PsqlODBC e o OpenLink ODBC. A instalação do PostgreSQL inclui somente as interfaces C e C
embutida. Todas as outras interfaces são projetos independentes que
Você pode fazer o download do PsqlODBC em podem ser obtidos separadamente; sendo separados permitem que eles
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php. tenham suas próprias datas de lançamento e time de desenvolvedores.
OpenLink ODBC pode ser conseguido em http://www.openlinksw.com. Ele Algumas linguagens de programação como PHP incluem uma interface para
trabalha com cliente ODBC padrão, então você poderá ter o ODBC para PostgreSQL. Interfaces para linguagens como Perl, TCL, Python e muitas
PostgreSQL disponível em toda plataforma que eles suportam (Win, Mac, outras estão disponíveis em http://gborg.postgresql.org na seção de
Unix, VMS). Drivers/Interfaces ou via busca na Internet.
Eles provavelmente venderão seu produto para pessoas que precisam de 2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL com
um suporte de qualidade, mas uma versão gratuita estará sempre páginas Web?
disponível. Por favor envie perguntas para postgres95@openlink.co.uk.
2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL com
páginas Web?
Uma boa introdução para páginas web que utilizam bancos de dados pode Uma boa introdução para páginas web que utilizam bancos de dados pode
ser vista em: http://www.webreview.com ser vista em: http://www.webreview.com
Para integração na Web, PHP é uma excelente interface. Ele está em Para integração na Web, PHP (http://www.php.net) é uma excelente
http://www.php.net. interface.
Para casos complexos, muitos usam a Interface Perl e CGI.pm ou Para casos complexos, muitos usam a Interface Perl e DBD::Pg com
mod_perl. CGI.pm ou mod_perl.
2.3) O PostgreSQL tem interfaces gráficas para iteragir com o usuário? 2.3) O PostgreSQL tem interfaces gráficas para iteragir com o usuário?
Sim, há várias interfaces gráficas para PostgreSQL disponíveis. Entre Há um vasto número de Ferramentas Gráficas (GUI), que estão
elas o PgAccess http://www.pgaccess.org), pgAdmin III disponíveis para o PostgreSQL, comerciais e de desenvolvedores de
(http://www.pgadmin.org, RHDB Admin (http://sources.redhat.com/rhdb/ código aberto. Uma lista detalhada pode ser encontrada em Documentação
), TORA (http://www.globecom.net/tora/, parcialmente comercial) e o da Comunidade PostgreSQL
Rekall ( http://www.thekompany.com/products/rekall/, proprietária). Há
també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ão disponíveis para comunicar-se com PostgreSQL?
Muitas linguagens de programação populares contém uma interface para
PostgreSQL. Verifique a lista de extensões (módulos) da sua linguagem
de programação.
As seguintes interfaces estão incluídas na distribuição do PostgreSQL:
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Interfaces adicionais estão disponíveis em http://gborg.postgresql.org
na seção de Drivers/Interfaces.
_________________________________________________________________ _________________________________________________________________
Perguntas Administrativas Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de 3.1) Como eu instalo o PostgreSQL em um local diferente de /usr/local/pgsql?
/usr/local/pgsql?
Especifique a opção --prefix quando executar o configure. Especifique a opção --prefix quando executar o configure.
3.2) Quando eu inicio o postmaster, eu recebo a mensagem Bad System Call ou 3.2) Como eu controlo conexões de outras máquinas?
uma descarga de memória (core dump). Por que?
Isto pode ser vários problemas, mas primeiro verifique se você tem
extensões do System V instaladas no seu kernel. PostgreSQL requer
suporte no kernel a memória compartilhada e semáforos.
3.3) Quando eu tento iniciar o postmaster, eu recebo erros IpcMemoryCreate.
Por que?
Você não configurou a memória compartilhada corretamente no seu kernel
ou você precisa aumentar a memória compartilhada disponível no seu
kernel. A quantidade exata que você precisa vai depender da
arquitetura e de quantos buffers e processos do servidor você
configurou para o postmaster. Muitos sistemas, com o número padrão de
buffers e processos, precisam de aproximadamente 1 MB. Veja a seção
PostgreSQL Administrator's Guide/Server Run-time Environment/Managing
Kernel Resources para mais informação sobre memória compartilhada e
semáforos.
3.4) Quando eu tento iniciar o postmaster, eu recebo erros
IpcSemaphoreCreate. Por que?
Se a mensagem de erro é IpcSemaphoreCreate: semget failed (No space
left on device) então o seu kernel não está configurado com o número
de semáforos suficientes. O Postgres precisa de um semáforo por
processo do servidor. Uma solução temporária é iniciar o postmaster
com um limite pequeno de processos do servidor. Utilize -N com o
parâmetro menor do que o padrão (32). Uma solução permanente seria
aumentar os parâmetros do kernel SEMMNS e SEMMNI.
Semáforos inoperantes podem também causar danos durante intenso acesso
ao banco de dados.
Se a mensagem é outra coisa, você possivelmente não tem suporte a
semáforo configurado no seu kernel. Veja o Guia do Administrador para
mais informação sobre memória compartilhada e semáforos.
3.5) Como eu controlo conexões de outras máquinas?
Por padrão, o PostgreSQL só permite conexões da máquina local Por padrão, o PostgreSQL só permite conexões da máquina local
utilizando soquetes de domínio Unix ou conexões TCP/IP. Outras utilizando soquetes de domínio Unix ou conexões TCP/IP. Outras
máquinas não poderão conectar-se a menos que você modifique máquinas não poderão conectar-se a menos que você modifique
listen_addresses no postgresql.conf, e habilite a autenticação por listen_addresses no postgresql.conf, habilite a autenticação por
máquina modificando o arquivo $PGDATA/pg_hba.conf. máquina modificando o arquivo $PGDATA/pg_hba.conf e reinicie o
servidor PostgreSQL.
3.6) Como eu ajusto o servidor de banco de dados para obter uma performance
melhor? 3.3) Como eu ajusto o servidor de banco de dados para obter uma performance
melhor?
Certamente, índices podem acelerar consultas. O comando EXPLAIN
ANALYZE permite que você veja como o PostgreSQL está interpretando a Há três grandes áreas para melhorar a performance em potencial:
consulta, e quais os índices são utilizados.
Mudança de Consultas
Se você está fazendo muitos INSERTs, considere fazê-los em lote Isto involve modificar consultas para obter melhor performance:
utilizando o comando COPY. Isso é mais rápido do que INSERTs
individuais. Segundo, sentenças que não estão em um bloco de transação + Criação de índices, incluir expressões e índices parciais
BEGIN WORK/COMMIT são consideradas com se estivessem em sua própria + Utilização o COPY ao invés de múltiplos comandos INSERTs
transação. Considere executar várias sentenças em um mesmo bloco de + Agrupamento de múltiplos comandos em uma única transação para
transação. Isso reduz a quantidade de transações. Também, considere diminuir a despesa com efetivações (commit)
remover e criar índices novamente quando estiver fazendo muitas + Utilização do CLUSTER quando recuperar vários registros de um
mudanças nos dados. índice
+ Utilização do LIMIT para retornar um subconjunto da saída da
Há várias opções de ajuste em Administration Guide/Server Run-time consulta
Environment/Run-time Configuration. Você pode desabilitar o fsync() + Utilização de Consultas preparadas
utilizando a opção fsync. Isso irá impedir que fsync()s enviem os + Utilização de ANALYZE para manter as estatísticas do
dados para disco após cada transação. otimizador corretas
+ Utilização regular do VACUUM ou pg_autovacuum
Você pode utilizar a opção shared_buffers para aumentar o número de + Remoção de índices durante grande mudança de dados
buffers de memória compartilhada utilizados pelos processos do
servidor. Se você definiu este parâmetro com um valor muito alto, o Configuração do Servidor
postmaster pode não iniciar porque você excedeu o limite de espaço de Um grande número de configurações que afetam a performance.
memória compartilhada do kernel. Cada buffer é de 8K e o padrão é de Para obter detalhes adicionais, veja Administration
1000 buffers. Guide/Server Run-time Environment/Run-time Configuration para
listagem completa, e para comentários veja
Você também pode utilizar a opção sort_mem (no PostgreSQL 8.0: http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
work_mem) para aumentar a máxima quantidade de memória utilizada pelo nf_e.html e
processo servidor para cada ordenação temporária. O valor padrão é http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
1024 (ou seja 1MB).
Seleção do Hardware
Você também pode utilizar o comando CLUSTER para agrupar dados em O efeito do hardware na performance é detalhado em
tabelas para combinar um índice. Veja o manual sobre CLUSTER para mais http://www.powerpostgresql.com/PerfList/ e
informação. http://momjian.us/main/writings/pgsql/hw_performance/index.html
.
3.7) Quais características de depuração estão disponíveis?
3.4) Quais características de depuração estão disponíveis?
PostgreSQL tem várias características que relatam informações que
podem ser valiosas para fins de depuração. Há muitas variáveis de configuração do servidor log_* que habilitam a
exibição de consultas e estatísticas que podem ser muito úteis para
Primeiro, execute o configure com a opção --enable-cassert, muitos depuração e medidas de performance.
assert()s monitoram o progresso do núcleo (backend) e finalizam o
programa quando alguma coisa inesperada acontece. 3.5) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
O postmaster e o postgres tem várias opções de depuração disponíveis. Você atingiu o limite padrão que é de 100 sessões. Você precisa
Primeiro, quando iniciar o postmaster, tenha certeza que você enviou a aumentar o limite do postmaster, que diz quantos processos servidor
saida padrão e a saída de erro padrão para um arquivo de log, como em: concorrentes ele pode iniciar, alterando o valor max_connections no
cd /usr/local/pgsql postgresql.conf e reiniciando o postmaster.
./bin/postmaster >server.log 2>&1 &
3.6) Qual é o processo de atualização do PostgreSQL?
Isso irá criar um arquivo server.log no diretório raiz do PostgreSQL.
Este arquivo conterá informações úteis sobre problemas ou erros
encontrados pelo servidor. O Postmaster tem uma opção -d que permite
que informações mais detalhadas sejam relatadas. A opção -d é
acompanhada por um número que indica o nível de depuração. Esteja
alerta de que alto nível de depuração gera grandes arquivos de log.
Se o postmaster não está sendo executado, você pode executar o núcleo
do postgres a partir da linha de comando, e digitar a sua sentença SQL
diretamente. Isso é recomendado somente para fins de depuração. Note
que uma nova linha termina a consulta, e não um ponto-e-vírgula. Se
você compilou com símbolos de depuração, você pode utilizar um
depurador para ver o que está acontecendo. Como o núcleo (backend) não
foi iniciado a partir do postmaster, ele não está executando em um
ambiente idêntico e problemas de iteração com o núcleo/travamento não
podem ser reproduzidos.
Se o postmaster está sendo executado, inicie o psql em uma janela, e
entã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ê pode definir pontos de parada (breakpoints)
no depurador e digitar consultas no psql. Se você está depurando a
inicialização do postgres, você pode definir PGOPTIONS="-W n" e então
iniciar o psql. Isto retardará a inicialização por n segundos então
você pode anexar o depurador ao processo, definir quaisquer pontos de
parada e continuar pela sequência de inicialização.
Há várias variáveis de configuração do servidor log_* que habilitam a
exibição de estatísticas que podem ser muito úteis para depuração e
medidas de performance.
Você também pode compilar com perfil para ver que funções estão
demandando tempo de execução. Os arquivo de perfil do núcleo (backend)
serão colocados no diretório pgsql/data/base/dbname. O arquivo de
perfil do cliente será colocado no diretório atual do cliente. O Linux
requer uma compilação com -DLINUX_PROFILE para criação dos perfis.
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
Você precisa aumentar o limite do postmaster de quantos processos do
servidor concorrentes ele pode iniciar.
O limite padrão é de 32 processos. Você pode aumentá-lo reiniciando o
postmaster com o valor conveniente de -N ou modificar o
postgresql.conf.
Note que se você definir o -N com um valor maior do que 32, você
também deve aumentar -B cujo padrão é 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ê
também precisa aumentar vários parâmetros de configuração do kernel do
Unix. Coisas para serem observadas incluem o tamanho máximo de blocos
de memória compartilhada, SHMMAX; o número máximo de semáforos, SEMMNS
e SEMMNI; o número máximo de processos, NPROC; o número máximo de
processos por usuário, MAXUPRC; e o número máximo de arquivos abertos,
NFILE e NINODE. A razão na qual o PostgreSQL tem um limite de número
de processos do servidor permitidos é para que o seu sistema não fique
sem recursos disponíveis.
3.9) O que está no diretório pgsql_tmp?
Este diretório contém arquivos temporários gerados pelo executor de
uma consulta. Por exemplo, se uma ordenação é necessária para
satisfazer um ORDER BY e a ordenação requer mais espaço do que o
parâmetro -S do servidor permite, então arquivos temporários são
criados para abrigar os dados extras.
Os arquivos temporários geralmente são apagados automaticamente, mas
podem persistir caso o servidor termine anormalmente durante a
ordenação. Uma parada e um reinício do postmaster removerá os arquivos
destes diretórios.
3.10) O que eu preciso fazer para exportar e importar durante a atualização
entre versões do PostgreSQL?
O time do PostgreSQL faz somente pequenas mudanças entre versões O time do PostgreSQL faz somente pequenas mudanças entre versões
menores, então atualizar da versão 7.2 para 7.2.1 não requer uma corretivas, então atualizar da versão 7.4.8 para 7.4.9 não requer uma
exportação e uma importação. Contudo, versões maiores (i.e. da 7.2 exportação e uma importação; basta para o servidor de banco de dados,
para 7.3) geralmente muda-se o formato interno das tabelas de sistema instalar os binários atualizados e reiniciar o servidor.
e dos arquivo de dados. Essas mudanças geralmente são complexas, então
nós não mantemos compatibilidade para os arquivos de dados. Uma Todos os usuários devem atualizar para as versões corretivas mais
exportação em um formato genérico que pode ser importada utilizando o recentes assim que elas estiverem disponíveis. Enquanto cada
novo formato interno. atualização tem algum risco, versões corretivas do PostgreSQL são
projetadas para corrigir somente bugs comuns com um risco mínimo. A
Em versões onde o formato em disco não muda, o script pg_upgrade pode comunidade considera não atualizar mais perigoso do que atualizar.
ser utilizado para atualizar sem precisar de um dump/restore. As notas
da versão mencionam se pg_upgrade está disponível para a versão. Versões novas (i.e. da 7.3 para 7.4) geralmente muda-se o formato
interno das tabelas de sistema e dos arquivo de dados. Essas mudanças
3.11) Que tipo de hardware eu devo usar? geralmente são complexas, então nós não mantemos compatibilidade para
os arquivos de dados. Uma exportação/importação de um banco de dados é
necessária para atualizações entre versões.
3.7) Que tipo de hardware eu devo usar?
Por causa do hardware de PC ser em sua maioria compatível, pessoas Por causa do hardware de PC ser em sua maioria compatível, pessoas
tendem a acreditar que todos os hardwares de PC satilde;o de mesma tendem a acreditar que todos os hardwares de PC são de mesma
qualidade. Natilde;o é verdade. ECC RAM, SCSI e placas mãe de qualidade. Não é verdade. ECC RAM, SCSI e placas mãe de qualidade são
qualidade são mais confiáveis e têm uma melhor performance do que mais confiáveis e têm uma melhor performance do que hardwares mais
hardwares mais baratos. O PostgreSQL executará em quase todo hardware, baratos. O PostgreSQL executará em quase todo hardware, mas se a
mas se a confiabilidade e a performance forem importantes é prudente confiabilidade e a performance forem importantes é prudente pesquisar
pesquisar sobre as opções de hardware. Nossas listas de discussão sobre as opções de hardware. Nossas listas de discussão podem ser
podem ser usadas para discutir opções de hardware e dilemas. usadas para discutir opções de hardware e dilemas.
_________________________________________________________________ _________________________________________________________________
Perguntas Operacionais Perguntas Operacionais
4.1) Qual é a diferença entre cursores binários e normais? 4.1) Como eu faço um SELECT somente dos primeiros registros de uma consulta?
Um registro randômico?
Veja o comando DECLARE no manual para uma descrição.
Para obter somente alguns registros, se você sabe o número de
4.2) Como eu faço um SELECT somente dos primeiros registros de uma registros necessários ao executar o SELECT utilize o LIMIT. Se um
consulta? Um registro randômico? índice corresponde no ORDER BY é possível que a consulta toda não
tenha que ser executada. Se você não sabe o número de registros ao
Veja o manual do FETCH, ou utilize SELECT ... LIMIT.... executar o SELECT, utilize um cursor e o FETCH.
Toda a consulta tem que ser avaliada, mesmo se você só quer os
primeiros registros. Considere utilizar uma consulta que tenha um
ORDER BY. Se há um í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é que os registros desejados
tenham sido gerados.
Para obter um registro randômico, utilize: Para obter um registro randômico, utilize:
SELECT col SELECT col
...@@ -708,54 +503,58 @@ ...@@ -708,54 +503,58 @@
ORDER BY random() ORDER BY random()
LIMIT 1; LIMIT 1;
4.3) Como eu obtenho a lista de tabelas ou outras coisas que eu posso ver 4.2) Como eu descubro quais tabelas, índices, bancos de dados e usuários
no psql? estão definidos? Como eu vejo as consultas utilizadas pelo psql para
mostrá-los?
Utilize o comando \dt para ver tabelas no psql. Para obter uma lista Utilize o comando \dt para ver tabelas no psql. Para obter uma lista
completa de comandos no psql você pode utilizar \?. Alternativamente completa dos comandos no psql você pode utilizar \?. Alternativamente,
você pode ler o código-fonte do psql no arquivo você pode ler o código-fonte do psql no arquivo
pgsql/src/bin/psql/describe.c. Ele contém comandos SQL que geram a pgsql/src/bin/psql/describe.c, ele contém os comandos SQL que geram a
saída para os comandos do psql. Você também pode iniciar o psql com a saída para os comandos de contrabarra do psql. Você também pode
opção -E então serão mostradas as consultas utilizadas para executar iniciar o psql com a opção -E para que as consultas utilizadas para
os comandos que você digitou. PostgreSQL também fornece uma interface executar os comandos que você informou seja exibida. O PostgreSQL
para o INFORMATION SCHEMA SQLi na qual você pode consultar informações também fornece uma inteface compatível com SQL do INFORMATION SCHEMA
sobre o banco de dados. que você pode consultar para obter informação sobre o banco de dados.
4.4) Como eu removo uma coluna de uma tabela ou mudo o seu tipo de dados? Há também tabelas do sistema que começam com pg_ que os descrevem
também.
A funcionalidade DROP COLUMN foi adicionada a versão 7.3 com comando
ALTER TABLE DROP COLUMN. Em versões anteriores, você pode fazer isto: Utilizando o psql -l listará todos os bancos de dados.
BEGIN;
LOCK TABLE old_table; Veja também o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
SELECT ... -- selecione todas colunas mas não aquela que você quer remover muitos dos comandos SELECTs necessários para obter informação das
INTO TABLE new_table tabelas de sistema do banco de dados.
FROM old_table;
DROP TABLE old_table; 4.3) Como você muda o tipo de dado de uma coluna?
ALTER TABLE new_table RENAME TO old_table;
COMMIT; Mudar o tipo de dado de uma coluna pode ser feito facilmente na versão
8.0 ou superior com ALTER TABLE ALTER COLUMN TYPE.
Para alterar o tipo de dados de uma coluna, faça isto:
Em versões anteriores, faça isso:
BEGIN; BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type; ALTER TABLE tab ADD COLUMN col_nova novo_tipo_dado;
UPDATE tab SET new_col = CAST(old_col AS new_data_type); UPDATE tab SET col_nova = CAST(col_antiga AS novo_tipo_dado);
ALTER TABLE tab DROP COLUMN old_col; ALTER TABLE tab DROP COLUMN col_antiga;
COMMIT; COMMIT;
Você pode querer executar o comando VACUUM FULL tab para recuperar o Você pode então querer fazer um VACUUM FULL tab para recuperar o
espaço em disco utilizado pelos registros expirados. espaço em disco utilizado pelos registros expirados.
4.5) Qual é o tamanho máximo de um registro, uma tabela e um banco de 4.4) Qual é o tamanho máximo de um registro, uma tabela e um banco de dados?
dados?
Estes são os limites: 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 banco de dados? ilimitado (existem bancos de
Tamanho máximo de um registro? 1.6TB dados de 32 TB)
Tamanho máximo de um campo? 1 GB Tamanho máximo de uma tabela? 32 TB
Número máximo de registros em uma tabela? ilimitado Tamanho máximo de um registro? 400 GB
Número máximo de colunas em uma tabela? 250-1600 dependendo dos tipos das colunas Tamanho máximo de um campo? 1 GB
Número máximo de índices em uma tabela? ilimitado Número máximo de registros em uma tabela? ilimitado
Número máximo de colunas em uma tabela? 250-1600 dependendo dos tipos
das colunas
Número máximo de índices em uma tabela? ilimitado
É claro, que eles não são ilimitados, mas limitados ao espaço em disco É claro, que eles não são ilimitados, mas limitados ao espaço em disco
disponível e espaço em memória/swap. A Performance será penalizada disponível e espaço em memória/swap. A Performance será penalizada
quando estes valores se tornarem grandes. quando estes valores se tornarem grandes.
...@@ -765,37 +564,45 @@ N ...@@ -765,37 +564,45 @@ N
múltiplos arquivos de 1 GB então o limite do sistema de arquivos não é múltiplos arquivos de 1 GB então o limite do sistema de arquivos não é
importante. importante.
O tamanho máximo de uma tabela e o número máximo de colunas pode ser O tamanho máximo de uma tabela, o tamanho de um registro e o número
quadruplicadas aumentando-se o tamanho dos blocos para 32k. máximo de colunas podem ser quadruplicados aumentando-se o tamanho
padrão do bloco para 32k. O tamanho máximo de uma tabela pode também
ser aumentado utilizando particionamento de tabela.
Uma limitação é que índices não podem ser criados em colunas maiores
do que 2.000 caracteres. Felizmente, tais índices são raramente
necessários. Unicidade é melhor garantida por um índice de uma função
de um hash MD5 de uma coluna longa, e indexação de texto longo permite
a busca de palavras dentro da coluna.
4.6) Quanto espaço em disco é necessário para armazenar dados de um arquivo 4.5) Quanto espaço em disco é necessário para armazenar dados de um arquivo
texto? texto?
Um banco de dados PostgreSQL irá requerer até cinco vezes a quantidade Um banco de dados PostgreSQL irá requerer até cinco vezes a quantidade
de espaço requerida para armazenar dados em um arquivo texto. de espaço requerida para armazenar dados em um arquivo texto.
Como um exemplo, considere um arquivo com 100.000 linhas contendo um Como um exemplo, considere um arquivo com 100.000 linhas contendo um
inteiro e uma descrição em cada linha. Suponha que o tamanho médio da inteiro e uma descrição em cada linha. Suponha que o tamanho médio da
descrição é de vinte bytes. O arquivo terá 2.8 MB. O tamanho do descrição é de vinte bytes. O arquivo terá 2,8 MB. O tamanho do
arquivo do banco de dados PostgreSQL que contém esses dados pode ser arquivo do banco de dados PostgreSQL que contém esses dados pode ser
estimado em 6.4 MB: estimado em 5,6 MB:
32 bytes: cada cabeçalho de registro (aproximadamente) 28 bytes: cada cabeçalho de registro (aproximadamente)
24 bytes: um campo int e um campo texto 24 bytes: um campo int e um campo texto
+ 4 bytes: ponteiro na página para a tupla + 4 bytes: ponteiro na página para a tupla
------------------------------------------- -------------------------------------------
60 bytes por registro 56 bytes por registro
O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então: O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
8192 bytes por página 8192 bytes por página
------------------------ = 136 registros por página do banco de dados (arredondado para baixo) ------------------------ = 146 registros por página do banco de dados (arredondado para baixo)
60 bytes por registro 56 bytes por registro
100000 registros de dados 100000 registros de dados
---------------------------- = 735 páginas do banco de dados (arredondadopara cima) ---------------------------- = 685 páginas do banco de dados (arredondadopara cima)
128 registros por página 146 registros por página
735 páginas do banco de dados * 8192 bytes por página = 6,021,120 bytes (6 MB) 685 páginas do banco de dados * 8192 bytes por página = 5.611.520 bytes (5,6MB)
Índices não requerem muito espaço, mas contém dados que foram Índices não requerem muito espaço, mas contém dados que foram
indexados, então eles podem ocupar algum espaço. indexados, então eles podem ocupar algum espaço.
...@@ -803,117 +610,65 @@ N ...@@ -803,117 +610,65 @@ N
NULLs são armazenados como bitmaps, então eles utilizam muito pouco NULLs são armazenados como bitmaps, então eles utilizam muito pouco
espaço. espaço.
4.7) Como eu descrubo quais tabelas, índices, bancos de dados e usuários 4.6) Por que minhas consultas estão lentas? Por que elas não estão utilizando
estão definidos? meus índices?
psql tem uma variadade de comandos com barra invertida que mostram Índices não são utilizados por toda consulta. Índices são utilizados
tais informações. Utilize \? para vê-los. Há também tabelas do sistema somente se a tabela é maior do que um tamanho mínimo, e a consulta
que começam com pg_ e que os descrevem também. Também, psql -l listará seleciona somente uma pequena porcentagem dos registros da tabela.
todos os bancos de dados. Isto porque o acesso randômico ao disco causado pela busca indexada
pode ser mais lento do que uma leitura ao longo da tabela ou busca
Veja também o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra sequencial.
muitos SELECTs necessários para obter informação das tabelas do
sistema de banco de dados. Para determinar se um índice deveria ser utilizado, o PostgreSQL deve
ter estatísticas sobre a tabela. Estas estatísticas são coletadas
4.8) Minhas consultas estão lentas ou não estão utilizando índices. Por utilizando o VACUUM ANALYZE ou simplesmente o ANALYZE. Utilizando
que? estatísticas, o otimizador sbae quantos registros estão na tabela, e
pode melhor determinar se índices deveriam ser utilizados.
Índices não são automaticamente utilizados por toda consulta. Índices Estatísticas também são úteis para determinar a ordem de junção ótima
só são utilizados se uma tabela é maior do que o tamanho mínimo e uma e métodos de junção. Coleção de estatísticas deveriam ser feitas
consulta seleciona somente uma porcentagem pequena de registros de uma periodicamente a medida que o conteúdo da tabela muda.
tabela. Isto porque o acesso randômico ao disco causado por uma busca
por índice pode ser mais lento do que uma leitura ao longo da tabela
ou uma busca sequencial.
Para determinar se um índice pode ser utilizado, o PostgreSQL deve ter
estatísticas sobre a tabela. Estas estatísticas são coletadas
utilizando VACUUM ANALYZE ou simplesmente ANALYZE. Utilizando
estatísticas, o otimizador saber quantos registros há na tabela e pode
determinar melhor se um índice deve ser utilizado. Estatísticas também
são úteis para determinar a ordem de junção ótima e métodos de junção.
Coleção de estatísticas deve ser feita periodicamente a medida que o
conteúdo da tabela muda.
Índices não são normalmente utilizados para ORDER BY ou para fazer Índices não são normalmente utilizados para ORDER BY ou para fazer
junções. Uma busca sequencial seguida por uma ordenação explícita é junções. Uma busca sequencial seguido por uma ordenação explícita é
usualmente mais rápida do que uma busca por índice em uma tabela geralmente mais rápida do que uma busca indexada em uma tabela grande.
grande. Contudo, LIMIT combinado com ORDER BY frequentemente utilizará índice
Contudo, LIMIT combinado com ORDER BY frequentemente utilizará um porque somente uma pequena porção da tabela será retornada.
índice porque somente uma pequena porção da tabela é retornada. De
fato, embora MAX() e MIN() não utilizem índices, é possível obter tais
valores utilizando um índice com ORDER BY e LIMIT:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Se você acredita que o otimizador está incorreto ao escolher uma busca Se você acredita que o otimizador está incorreto ao escolher uma busca
sequencial, utilize SET enable_seqscan TO 'off' e execute testes para sequencial, utilize SET enable_seqscan TO 'off' e execute a consulta
ver se uma busca por índice é de fato é mais rápida. novamente para ver se uma busca indexada é realmente mais rápida.
Quando é utilizado operadores com curingas tais como LIKE ou ~, Ao utilizar operadores curinga tais como LIKE ou ~, índices podem ser
índices só podem ser utilizados em certas circunstâncias: utilizados somente em algumas condições:
* O ínício de uma string de busca deve ser o início da string, i.e. * O início da cadeia de caracteres da busca deve ser iniciar com uma
+ modelos no LIKE não devem começar com %. cadeia de caracteres, i.e.
+ modelos no ~ (expressão regular) não devem começar com ^. + modelos LIKE não devem iniciar com %.
* A string de busca não pode iniciar com uma classe de caracteres, + modelos ~ (expressões regulares) devem iniciar com ^.
i.e. [a-e]. * A cadeia de caracteres utilizada na busca não pode iniciar com a
* Buscas que não diferenciam maiúsculas de minúsculas tais como classe de caracteres e.g. [a-e].
ILIKE e ~* não utilizam índices. Ao invés, utilize índices * Busca que não diferenciam maiúsculas de minúsculas tais como ILIKE
funcionais, que são descritos na seção 4.12. e ~* não utilizam índices. Em vez disso, utilize índice de
* A localidade padrão C deve ser utilizada durante o initdb porque expressão, que é descrito na seção 4.8.
não é possível saber o próximo/maior caracter em uma localidade * O idioma padrção C deve ser usando durante o initdb porque não é
que não seja a C. Você pode criar um índice especial possível saber o próximo caracter em idiomas que não sejam o C.
text_pattern_ops para tais casos que funcionam somente para Você pode criar um índice especial text_pattern_ops para tais
indexação utilizando LIKE. casos que funcionam somente para indexação com LIKE.
Em versões anteriores a 8.0, índices frequentemente não podiam ser Em versões anteriores a 8.0, índices frequentemente não podem ser
usados a menos que os tipos de dados correspodessem aos tipos da utilizados a menos que os tipos de dados correspondam aos tipos de
coluna do índice. Isto é particularmente verdadeiro para índices de coluna do índice. Isto era particularmente verdadeiro para índices de
coluna int2, int8 e numeric. coluna int2, int8 e numeric.
4.9) Como eu vejo como o otimizador de consulta está avaliando a minha 4.7) Como eu vejo como o otimizador de consulta está avaliando a minha
consulta? consulta?
Veja o comando EXPLAIN no manual. Veja o comando EXPLAIN no manual.
4.10) O que é um índice de árvore R? 4.8) Como eu faço buscas com expressões regulares e buscas com expressões
regulares sem diferenciar maiúsculas de minúsculas? Como eu utilizo um índice
Um índice de árvore B é utilizado para indexação de dados espaciais. para buscas que não diferenciam maiúsculas de minúsculas?
Um índice do tipo hash não pode manipular buscas em intervalos. Um
índice de árvore B manipula somente buscas em intervalos em uma
dimensão. Um índice de árvore R pode manipular dados
multidimensionais. Por exemplo, se um índice de á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ângulo."
A pesquisa canônica que descreve o modelo original da árvore R está
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ê também pode encontrar esse documento em "Readings in Database
Systems" do Stonebraker
Árvores R podem manipular polígonos e caixas. Na teoria, árvores R
podem ser extendidos para manipular um grande número de dimensões. Na
prática, extendendo árvores R requer um pouco de trabalho e nós não
temos atualmente nenhuma documentação de como fazé-lo.
4.11) O que é um Otimizador Genético de Consultas?
O módulo GEQO acelera a otimização de consultas quando se faz uma
junção de várias tabelas utilizando o conceito de Algoritmo Genético
(AG). Isso permite a manipulação de consultas com muitas junções
utilizando buscas não exaustivas.
4.12) Como eu faço buscas com expressões regulares e buscas com expressões
regulares sem diferenciar maiúsculas de minúsculas? Como eu utilizo um
índice para buscas que não diferenciam maiúsculas de minúsculas?
O operador ~ faz avaliação de expressões regulares, e ~* faz avaliação O operador ~ faz avaliação de expressões regulares, e ~* faz avaliação
não sensível a maiúsculas de expressões regulares. A variante não não sensível a maiúsculas de expressões regulares. A variante não
sensível a maiúsculas do LIKE é chamada de ILIKE. sensível a maiúsculas do LIKE é chamada de ILIKE.
...@@ -925,46 +680,66 @@ N ...@@ -925,46 +680,66 @@ N
WHERE lower(col) = 'abc'; WHERE lower(col) = 'abc';
Isso não irá utilizar o índice padrão. Contudo, se você criar um Isso não irá utilizar o índice padrão. Contudo, se você criar um
índice funcional, ele será utilizado: índice de expressão, ele será utilizado:
CREATE INDEX tabindex ON tab (lower(col)); CREATE INDEX tabindex ON tab (lower(col));
4.13) Em uma consulta, como eu detecto se um campo é NULL? Se o índice acima é criado como UNIQUE, embora a coluna possa
armazenar caracteres maiúsculos e minúsculos, ele não pode ter valores
Você pode testar a coluna com IS NULL e IS NOT NULL. idênticos que diferem apenas em letras maiúsculas e minúsculas. Para
forçar uma letra maiúscula ou minúscula a ser armazenada na coluna,
4.14) Qual é a difenrença entre os vários tipos de dados de caracteres? utilize uma restrição CHECK ou um gatilho.
Tipo Nome Interno Notas 4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu posso
-------------------------------------------------- ordenar por um campo que é NULL ou não?
VARCHAR(n) varchar tamanho especifica o comprimento máximo, sem preenchimento
CHAR(n) bpchar preenchimento em branco para comprimento fixo específico Você testa a coluna com IS NULL e IS NOT NULL, como a seguir:
TEXT text nenhum limite superior específico no comprimento SELECT *
BYTEA bytea vetor de bytes de comprimento variável (null-byte safe) FROM tab
"char" char um caracter WHERE col IS NULL;
Para ordenar pelo status NULL, utilize os modificadores IS NULL e IS
NOT NULL na sua cláusula ORDER BY. Coisas que são verdadeiro serão
ordenadas acima das coisas que são falso, então a consulta a seguir
irá colocar entradas NULL no início da lista de resultados:
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
4.10) Qual é a diferença entre os vários tipos de dado de caracteres?
Tipo Nome Interno Observação
VARCHAR(n) varchar tamanho especifica o tamanho máximo, sem
preenchimento
CHAR(n) bpchar preenchimento em branco para comprimento fixo
específico
TEXT text nenhum limite superior específico no comprimento
BYTEA bytea vetor de bytes de comprimento variável (seguro a byte
nulo)
"char" char um caracter
Você verá o nome interno quando examinar o catálogo do sistema e em Você verá o nome interno quando examinar o catálogo do sistema e em
algumas mensagens de erro. algumas mensagens de erro.
Os primeiros quatro tipos acima são do tipo "varlena" (i.e., os Os primeiros quatro tipos acima são do tipo "varlena" (i.e., os
primeiros quatro bytes no disco são o comprimento seguido pelos primeiros quatro bytes no disco são o comprimento seguido pelos
dados). Consequentemente o espaço atual utilizado é ligeiramente maior dados). Consequentemente o espaço atual utilizado é ligeiramente maior
do que o tamanho declarado. Contudo, esses tipos de dados também são do que o tamanho declarado. Contudo, valores longos são também
sujeitos a compressão ou a serem armazenados fora do padrão utilizando sujeitos a compressão, então o espaço em disco pode também ser bem
o TOAST, então o espaço em disco pode também ser bem menor do que o menor do que o esperado.
esperado.
VARCHAR(n) é melhor quando está armazenando cadeias de caracteres de VARCHAR(n) é melhor quando está armazenando cadeias de caracteres de
comprimento variável e há um limite de tamanho desta cadeia. TEXT é comprimento variável e há um limite de tamanho desta cadeia. TEXT é
para cadeias de caracteres de comprimento ilimitado, com o máximo de para cadeias de caracteres de comprimento ilimitado, com o máximo de
um gigabyte. um gigabyte.
CHAR(n) preenche com espaços em branco até o tamanho especificado, CHAR(n) é para armazenar cadeias de caracteres que são todas do mesmo
enquanto o VARCHAR(n) armazena somente os caracteres fornecidos. BYTEA tamanho. CHAR(n) preenche com espaços em branco até o tamanho
é para armazenar dados binários, particularmente valores que incluem especificado, enquanto o VARCHAR(n) armazena somente os caracteres
bytes NULL. Todos os tipos descritos aqui tem características de fornecidos. BYTEA é para armazenar dados binários, particularmente
performance similares. valores que incluem bytes NULL. Todos os tipos descritos aqui tem
características de performance similares.
4.15.1) Como eu crio um campo serial/auto incremento? 4.11.1) Como eu crio um campo serial/auto incremento?
PostgreSQL suporta o tipo de dados SERIAL. Ele cria automaticamente PostgreSQL suporta o tipo de dados SERIAL. Ele cria automaticamente
uma sequência. Por exemplo: uma sequência. Por exemplo:
CREATE TABLE pessoa ( CREATE TABLE pessoa (
...@@ -979,17 +754,14 @@ BYTEA bytea vetor de bytes de comprimento vari ...@@ -979,17 +754,14 @@ BYTEA bytea vetor de bytes de comprimento vari
nome TEXT nome TEXT
); );
Veja a página sobre create_sequence no manual para mais informação Veja a página sobre create_sequence no manual para obter informações
sobre sequências. Você também pode utilizar o campo OID para cada adicionais sobre sequências.
registro como um valor único. Contudo, se você precisar exportar e
importar o banco de dados, você precisa utilizar a opção -o do pg_dump 4.11.2) Como eu consigo o valor de um campo SERIAL?
ou a opção COPY WITH OIDS para preservar os OIDs.
4.15.2) Como eu consigo o valor de um campo SERIAL?
Uma abordagem é obter o próximo valor SERIAL de uma sequência com a Uma abordagem é obter o próximo valor SERIAL de uma sequência com a
função nextval() antes de inserir e então inserir com o valor função nextval() antes de inserir e então inserir com o valor
explicitamente. Utilizando o exemplo da tabela em 4.15.1, um exemplo explicitamente. Utilizando o exemplo da tabela em 4.11.1, um exemplo
em pseudo-linguagem se pareceria com isto: em pseudo-linguagem se pareceria com isto:
novo_id = execute("SELECT nextval('pessoa_id_seq')"); novo_id = execute("SELECT nextval('pessoa_id_seq')");
execute("INSERT INTO pessoa (id, nome) VALUES (novo_id, 'Blaise Pascal')"); execute("INSERT INTO pessoa (id, nome) VALUES (novo_id, 'Blaise Pascal')");
...@@ -1005,144 +777,65 @@ BYTEA bytea vetor de bytes de comprimento vari ...@@ -1005,144 +777,65 @@ BYTEA bytea vetor de bytes de comprimento vari
execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')"); execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
novo_id = execute("SELECT currval('pessoa_id_seq')"); novo_id = execute("SELECT currval('pessoa_id_seq')");
Finalmente, você poderia utilizar o OID retornado da sentença INSERT 4.11.3) currval() não lida com condição de corrida com outros usuários?
para obter o valor padrão, embora este seja a abordagem menos
portável, pois o valor do oid não ultrapassa 4 bilhões. Em Perl, Não. currval() retorna o valor atual atribuido pela sua sessão, e não
utilizando DBI com o módulo DBD::Pg, o valor do oid está disponível por todas as sessões.
via $sth->{pg_oid_status} depois de $sth->execute().
4.11.4) Por que os números da minha sequência não são reutilizados quando uma
4.15.3) currval() não lida com condição de corrida com outros usuários? transação é abortada? Por que há intervalos nos números da minha
sequência/coluna SERIAL?
Não. currval() retorna o valor atual atribuido pelo seu núcleo
(backend), e não por todos os usuários.
4.15.4) Por que os números da minha sequência não são reutilizados quando
uma transação é abortada? Por que há intervalos nos números da minha
sequência/coluna SERIAL?
Para melhorar a concorrência, valores da sequência são atribuídos a Para melhorar a concorrência, valores da sequência são atribuídos a
transações correntes e não são travados até que a transação seja transações correntes e não são travados até que a transação seja
finalizada. Isso causa intervalos na numeração por causa de transações finalizada. Isso causa intervalos na numeração por causa de transações
abortadas. abortadas.
4.16) O que é um OID? O que é um TID? 4.16) O que é um OID? O que é um CTID?
OIDs são a resposta do PostgreSQL a ids únicos de registros. Cada Cada registro que é criado no PostgreSQL recebe um OID único a menos
registro que é criado no PostgreSQL recebe um OID único. Todos OIDs que seja criado com WITHOUT OIDS. OIDs são automaticamente atribuídos
produzidos durante o initdb são menores do que 16384 (de como inteiros de 4 bytes que são únicos ao longo de toda instalação.
include/access/transam.h). Todos os OIDs criados pelo usuário são Contudo, eles são limitados em 4 bilhões, e então os OIDs começam a
iguais ou maiores do que este valor. Por padrão, todos estes OIDs são ser duplicados. O PostgreSQL utiliza OIDs para ligar as tabelas do
únicos não somente na tabela ou no banco de dados, mas na instalação sistema.
do PostgreSQL.
Para numerar registros nas tabelas do usuários, é melhor utilizar
PostgreSQL utiliza OIDs nas tabelas internas do sistema para ligar SERIAL ao invés de OIDs porque sequências SERIAL são únicas somente em
registros entre tabelas. Estes OIDs podem ser utilizados para uma tabela; e são menos propícias a atingir o limite. SERIAL8 está
identificar registros de usuários específicos e podem ser utilizados disponível para armazenar valores de sequências com oito bytes.
em junções. É recomendado que você utilize o tipo de coluna OID para
armazenar valores OID. Você pode criar um índice no campo OID para CTIDs são utilizados para identificar registros físicos específicos
acesso rápido. com valores de block e deslocamento. CTIDs mudam após registros serem
OIDs são atribuídos para todas os registros novos de uma área central
que é utilizada por todos os bancos de dados. Se você quer mudar o OID
de alguma coisa, ou se você quer fazer uma cópia da tabela, com os
OIDs, não há razão para que você não possa fazê-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ões. Ninguém nunca reportou que isso tenha ocorrido, e nós
planejamos remover o limite antes que algúem o alcançe.
TIDs são utilizados para identificar registros físicos específicos com
valores de bloco e deslocamento. TIDs mudam após registros serem
modificados ou recarregados. Eles são utilizados por índices para modificados ou recarregados. Eles são utilizados por índices para
apontar para registros físicos. apontar registros físicos.
4.17) Qual é o significado de alguns termos utilizados no PostgreSQL? 4.13) Por que eu recebo o erro "ERROR: Memory exhausted in AllocSetAlloc()"?
O código-fonte e documentação antiga utiliza termos de uso comum. Aqui Você provavelmente está sem memória virtual no seu sistema, ou o seu
estão alguns deles:
* tabela, relação, classe
* linha, registro, tupla
* coluna, campo, atributo
* recupera, seleciona
* altera, atualiza
* incrementa, insere
* OID, valor serial
* portal, cursor
* intervalo variá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ê provavelmente está sem memória virtual no sistema, ou o seu
núcleo (kernel) tem um limite baixo para certos recursos. Tente isto núcleo (kernel) tem um limite baixo para certos recursos. Tente isto
antes de iniciar o postmaster: antes de iniciar o postmaster:
ulimit -d 262144 ulimit -d 262144
limit datasize 256m limit datasize 256m
Dependendo da sua shell, somente um desses comando terá sucesso, mas Dependendo da sua shell, somente um desses comando terá sucesso, mas
ele definirá o segmento de dados do seu processo com um limite maior e ele definirá o segmento de dados do seu processo com um limite maior e
talvez permita que a consulta seja feita. Este comando é aplicado ao talvez permita que a consulta seja feita. Este comando é aplicado ao
processo atual e todos os subprocessos criados depois do comando ser processo atual e todos os subprocessos criados depois do comando ser
executado. Se você tiver problemas com o cliente SQL porque o núcleo executado. Se você tiver problemas com o cliente SQL porque o processo
(backend) retornou muitos dados, tente-o antes de iniciar o cliente. servidor retornou muitos dados, tente-o antes de iniciar o cliente.
4.19) Como eu informo qual versão do PostgreSQL eu estou utilizando? 4.14) Como eu informo qual versão do PostgreSQL eu estou utilizando?
No psql, digite SELECT version(); No psql, digite SELECT version();
4.20) Por que minhas operações com objetos grandes retorna "invalid large 4.15) Como eu crio uma coluna que conterá por padrão a hora atual?
obj descriptor"?
Você precisa colocar BEGIN WORK e COMMIT ao redor de qualquer uso de
operações com objetos grandes, isto é, ao redor de lo_open ...
lo_close.
Atualmente PostgreSQL obriga o fechamento de manipulação de um objeto
grande quando uma transação é submetida (commit). Então a primeira
tentativa de fazer qualquer coisa com o manipulador irá retornar
invalid large obj descriptor. Então o código que funcionava (ao menos
a algum tempo atrás) agora irá retornar uma mensagem de erro se você
não utilizar uma transação.
4.21) Como eu crio uma coluna que conterá por padrão a hora atual?
Utilize CURRENT_TIMESTAMP: Utilize CURRENT_TIMESTAMP:
CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP);
4.22) Por que as minhas subconsultas que utilizam IN estão tão lentas?
Em versõ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 é mais rápido. Para acelerar consultas externas,
substitua IN por EXISTS:
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
por: 4.23) Como eu faço uma junção externa (outer join)?
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ão 7.4, IN utiliza a mesma técnica de agrupamento do
que consultas normais, e é recomendado utilizar EXISTS.
4.23) Como eu faço uma junção externa (outer join)?
PostgreSQL suporta junções externas utilizando a sintaxe padrão do PostgreSQL suporta junções externas utilizando a sintaxe padrão do
SQL. Aqui temos dois exemplos: SQL. Aqui temos dois exemplos:
SELECT * SELECT *
...@@ -1161,20 +854,8 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP ); ...@@ -1161,20 +854,8 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
junções LEFT, RIGHT e FULL. Junções ordinárias são chamadas junções junções LEFT, RIGHT e FULL. Junções ordinárias são chamadas junções
naturais (INNER). naturais (INNER).
Em versões anteriores, junções externas podiam ser simuladas 4.17) Como eu faço consultas utilizando múltiplos bancos de dados?
utilizando UNION e NOT IN. Por exemplo, quando juntar tab1 e tab2, a
consulta a seguir faz uma junçã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ço consultas utilizando múltiplos bancos de dados?
Não há outra maneira de consultar um banco de dados caso ele não seja Não há outra maneira de consultar um banco de dados caso ele não seja
o atual. Porque o PostgreSQL carrega catálogos do sistema específicos o atual. Porque o PostgreSQL carrega catálogos do sistema específicos
do banco de dados, é incerto como uma consulta em banco de dados do banco de dados, é incerto como uma consulta em banco de dados
...@@ -1185,15 +866,14 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP ); ...@@ -1185,15 +866,14 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
conexões simultâneas em bancos de dados diferentes e juntar os conexões simultâneas em bancos de dados diferentes e juntar os
resultados no cliente. resultados no cliente.
4.25) Como eu retorno múltiplos registros ou colunas de uma função? 4.18) Como eu retorno múltiplos registros ou colunas de uma função?
No 7.3, você pode facilmente retornar múltiplos registros ou colunas É fácil utilizando funções que retornam conjunto,
de uma função,
http://techdocs.postgresql.org/guides/SetReturningFunctions. http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.26) Por que eu não posso confiar na criação/remoção de tabelas 4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
temporárias em funções PL/PgSQL? acessar tabelas temporárias em funções PL/PgSQL?
PL/PgSQL armazena o conteúdo da função, e o efeito indesejado é que se PL/PgSQL armazena o conteúdo da função, e o efeito indesejado é que se
uma função PL/PgSQL acessa uma tabela temporária, e aquela tabela é uma função PL/PgSQL acessa uma tabela temporária, e aquela tabela é
removida e criada novamente, e a função é chamada novamente, a função removida e criada novamente, e a função é chamada novamente, a função
...@@ -1202,49 +882,35 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP ); ...@@ -1202,49 +882,35 @@ CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
a tabelas temporárias no PL/PgSQL. Isto irá fazer com que a consulta a tabelas temporárias no PL/PgSQL. Isto irá fazer com que a consulta
seja avaliada toda vez. seja avaliada toda vez.
4.27) Que opções para encriptação estão disponíveis? 4.20) Quais soluções de replicação estão disponíveis?
* No contrib/pgcrypto contém muitas funções de encriptação para Embora "replicação" seja um termo simples, há várias tecnologias para
serem utilizados em consultas SQL. fazer replicação, com vantagens e desvantagens para cada um.
* Para encriptar a transmissão do cliente ao servidor, o servidor
deve ter a opção ssl definida como true no postgresql.conf, e um Replicação mestre/escravo permite que um mestre receba consultas de
registro host ou hostssl deve existir no pg_hba.conf, e o sslmode leitura e escrita, enquanto os escravos só podem aceitar
no cliente não deve estar disable. (Note que também é possível leitura/consultas SELECT. A solução mais popular de replicação
utilizar outros esquemas de transporte encriptado, tais como mestre-escravo para PostgreSQL disponível livremente é Slony-I.
stunnel ou ssh, ao invés da conexão SSL nativa do PostgreSQL.)
* Senhas dos usuários do banco de dados são automaticamente Replicação com múltiplos mestres permite que consultas leitura/escrita
encriptadas quando armazenadas na versão 7.3. Em versões sejam enviadas para múltiplos computadores replicadores. Esta
anteriores, você deve habilitar a opção PASSWORD_ENCRYPTION no capacidade também tem um sério impacto na performance por causa da
postgresql.conf. necessidade de sincronizar as mudanças entre os servidores. Pgcluster
* O servidor pode executar utilizando um sistema de arquivos é a solução mais popular disponível livremente para PostgreSQL.
encriptado.
_________________________________________________________________ Há também soluções de replicação comerciais e baseadas em hardware
disponíveis que suportam uma variedade de modelos de replicação.
Extendendo o PostgreSQL
4.21) Por que os nomes de minhas tabelas e colunas não são reconhecidos em
5.1) Eu escrevi uma função. Quando eu executo-a no psql, por que ela minha consulta?
finaliza o programa com descarga de memória (core dump)?
O caso mais comum é o uso de aspas ao redor dos nomes da tabela ou
O problema pode ser várias coisas. Tente testar sua função em um coluna durante a criação da tabela. Ao utilizar aspas, nomes de tabela
programa independente. e coluna (chamados de identificadores) são armazenados como
especificado, significando que você deve utilizar aspas quando se
5.2) Como eu posso contribuir com alguns tipos e funções novas para o referir aos nomes na consulta. Algumas interfaces, como pgAdmin,
PostgreSQL? automaticamente coloca aspas nos identificadores durante a criação da
tabela. Então, para identificadores serem reconhecidos, você deve:
Envie as suas extensões para a lista de discussão pgsql-hackers, e * Evitar colocar aspas no identificador ao criar tabelas
elas eventualmente serão colocadas no subdiretório contrib/. * Utilizar somente caracteres minúsculos em identificadores
* Colocar aspas em identificadores ao referenciá-los nas consultas
5.3) Como eu escrevo uma função em C que retorna uma tupla?
Em versões do PostgreSQL a partir da 7.3, funções que retornam tuplas
são suportadas em C, PL/PgSQL e SQL. Veja o Guia do Programador para
mais informação. Um exemplo de uma funçã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ção não
surtiu efeito?
Os arquivos Makefiles não tem as dependências corretas para incluir
arquivos. Você deve executar um make clean e então o make. Se você
está utilizando o GCC você pode utilizar a opção --enable-depend do
configure para o compilador computar as dependências automaticamente.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment