mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-27 07:21:09 +08:00
1251 lines
56 KiB
Plaintext
1251 lines
56 KiB
Plaintext
|
|
Perguntas Frequentes (FAQ) sobre PostgreSQL
|
|
|
|
Última atualização: Dom Jan 9 14:44:04 EDT 2005
|
|
|
|
Mantenedor atual: Bruce Momjian (pgman@candle.pha.pa.us)
|
|
|
|
Traduzido por: Euler Taveira de Oliveira (eulerto@yahoo.com.br)
|
|
|
|
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_brazilian.html
|
|
(pt_BR).
|
|
|
|
Perguntas sobre plataformas específicas são respondidas em
|
|
http://www.postgresql.org/docs/faq/.
|
|
_________________________________________________________________
|
|
|
|
Perguntas Gerais
|
|
|
|
1.1) O que é PostgreSQL? Como ele é pronunciado?
|
|
1.2) Qual é a licença do PostgreSQL?
|
|
1.3) Quais plataformas Unix o PostgreSQL pode ser executado?
|
|
1.4) Quais portabilidades não-Unix estão disponíveis?
|
|
1.5) Onde eu posso conseguir o PostgreSQL?
|
|
1.6) Onde eu posso conseguir suporte?
|
|
1.7) Qual é a última versão?
|
|
1.8) Que documentação está disponível?
|
|
1.9) Como eu posso saber quais são os bugs conhecidos ou
|
|
características ausentes?
|
|
1.10) Como eu posso aprender SQL?
|
|
1.11) O PostgreSQL está livre do Bug do Milênio?
|
|
1.12) Como posso me juntar a equipe de desenvolvimento?
|
|
1.13) Como eu informo a existência de um bug?
|
|
1.14) Como é o PostgreSQL comparado a outros SGBDs?
|
|
1.15) Como eu posso ajudar financeiramente o projeto PostgreSQL?
|
|
|
|
Perguntas sobre Clientes
|
|
|
|
2.1) Há drivers ODBC para PostgreSQL?
|
|
2.2) Quais ferramentas estão disponíveis para utilizar o PostgreSQL
|
|
com páginas Web?
|
|
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
|
|
|
|
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ó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ões de outras máquinas?
|
|
3.6) Como eu ajusto o servidor de banco de dados para obter uma
|
|
performance melhor?
|
|
3.7) Quais características de depuração estão disponíveis?
|
|
3.8) Por que eu recebo "Sorry, too many clients" quando eu tento
|
|
conectar?
|
|
3.9) O que está no diretório pgsql_tmp?
|
|
3.10) O que eu preciso fazer para exportar e importar durante a
|
|
atualização de versões do PostgreSQL?
|
|
3.11) Que tipo de hardware eu devo usar?
|
|
|
|
Perguntas Operacionais
|
|
|
|
4.1) Qual é a diferença entre cursores binários e normais?
|
|
4.2) Como eu faço um SELECT somente dos primeiros registros de uma
|
|
consulta? Um registro randô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 é o tamanho máximo de um registro, uma tabela e um banco de
|
|
dados?
|
|
4.6) Quanto espaço em disco é necessário para armazenar dados de um
|
|
arquivo texto?
|
|
4.7) Como eu descubro quais tabelas, índices, bancos de dados e
|
|
usuários estão definidos?
|
|
4.8) Minhas consultas estão lentas ou não estão utilizando índices.
|
|
Por que?
|
|
4.9) Como eu vejo como o otimizador de consultas está avaliando minha
|
|
consulta?
|
|
4.10) O que é um índice de árvore R (R-tree)?
|
|
4.11) O que é um Otimizador Genético de Consultas?
|
|
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?
|
|
4.13) Em uma consulta, como eu detecto se um campo é NULL?
|
|
4.14) Qual é a diferença entre os vários tipos de dados de caracteres?
|
|
4.15.1) Como eu crio um campo serial/auto incremento?
|
|
4.15.2) Como eu consigo o valor de um campo SERIAL?
|
|
4.15.3) currval() não lida com condição de corrida com outros
|
|
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?
|
|
4.16) O que é um OID? O que é um TID?
|
|
4.17) Qual é 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ão do PostgreSQL eu estou utilizando?
|
|
4.20) Por que minhas operações com objetos grandes retorna "invalid
|
|
large obj descriptor"?
|
|
4.21) Como eu crio uma coluna que conterá por padrão a hora atual?
|
|
4.22) Por que as minhas subconsultas que utilizam IN estão tão lentas?
|
|
4.23) Como eu faço uma junção externa (outer join)?
|
|
4.24) Como eu faço consultas utilizando múltiplos bancos de dados?
|
|
4.25) Como eu retorno múltiplos registros ou colunas de uma função?
|
|
4.26) Por que eu não posso confiar na criação/remoção de tabelas
|
|
temporárias em funções PL/PgSQL?
|
|
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
|
|
|
|
1.1) O que é PostgreSQL? Como ele é pronunciado?
|
|
|
|
PostgreSQL é pronunciado Post-Gres-Q-L.
|
|
|
|
PostgreSQL é um melhoramento do sistema de gerência de banco de dados
|
|
POSTGRES (e também é, às vezes, chamado simplesmente de "Postgres"),
|
|
um protótipo de pesquisa de um SGBD de última geração. Enquanto o
|
|
PostgreSQL reté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 é livre e o
|
|
código-fonte completo está disponível.
|
|
|
|
O desenvolvimento do PostgreSQL é feito por um grupo de
|
|
desenvolvedores que estão inscritos na lista de e-mails de
|
|
desenvolvimento do PostgreSQL. O coordenador atual é Marc G. Fournier
|
|
(scrappy@PostgreSQL.org). (Veja a seção 1.6 para saber como se juntar
|
|
ao grupo). O grupo é responsável por todo o desenvolvimento do
|
|
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
|
|
|
|
Os autores do PostgreSQL 1.01 foram Andrew Yu e Jolly Chen. Muitos
|
|
outros contribuiram para portar, testar, depurar e melhorar o código.
|
|
O código original do Postgres, do qual o PostgreSQL foi derivado, foi
|
|
um esforço de muitos estudantes de graduação e pós-graduação e uma
|
|
equipe de programadores trabalhando sobre a direção do Professor
|
|
Michael Stonebraker na Universidade da Califó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 é a licença do PostgreSQL?
|
|
|
|
PostgreSQL está sujeito a seguinte licença:
|
|
|
|
PostgreSQL Sistema de Gerência de Banco de Dados
|
|
|
|
Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
|
Portions Copyright (c) 1994-6 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
|
|
escrito está concedida por esse meio, contanto que a nota da licença
|
|
acima, esse parágrafo e os dois parágrafos seguintes apareçam em todas
|
|
as cópias.
|
|
|
|
EM NENHUM EVENTO A UNIVERSIDADE DA CALIFÓRNIA SERÁ RESPONSÁ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ÇÃO, MESMO SE A UNIVERSIDADE DA
|
|
CALIFÓRNIA ESTIVER SIDO AVISADA DA POSSIBILIDADE DE TAL DANO.
|
|
|
|
A UNIVERSIDADE DA CALIFÓRNIA ESPECIFICADAMENTE NÃO DÁ NENHUMA
|
|
GARANTIA, INCLUINDO, MAS NÃO LIMITADO A, GARANTIAS IMPLÍCITAS DE
|
|
COMERCIALIZAÇÃO E ATENDIMENTO DE PROPÓSITO PARTICULAR. O SOFTWARE É
|
|
FORNECIDO ABAIXO "COMO É", E A UNIVERSIDADE DA CALIFÓRNIA NÃO TEM
|
|
OBRIGAÇÃO DE FORNECER MANUTENÇÃO, SUPORTE, ATUALIZAÇÕES, MELHORIAS OU
|
|
MODIFICAÇÕES.
|
|
|
|
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
|
|
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
|
|
capaz de executar o PostgreSQL. As plataformas que foram testadas
|
|
antes do lançamento de uma versão são listadas nas instruções de
|
|
instalação.
|
|
|
|
1.4) Quais portabilidades não-Unix estão disponíveis?
|
|
|
|
Iniciando com a versão 8.0, o PostgreSQL agora pode ser executado
|
|
nativamente nos sistemas operacionais Microsoft Windows baseados no NT
|
|
tais como Win2000, WinXP e Win2003. Um instalador está disponível em
|
|
http://pgfoundry.org/projects/pginstaller Versões do Windows baseados
|
|
no MSDOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
|
|
o Cygwin.
|
|
|
|
Há também um porte para Novell Netware 6 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
|
|
SQL&stype=all&sort=type&dir=%2F.
|
|
|
|
1.5) Onde eu posso conseguir o PostgreSQL?
|
|
|
|
O servidor ftp principal do PostgreSQL é ftp://ftp.PostgreSQL.org/pub.
|
|
Para obter a relação de servidores espelhos (mirrors), consulte nosso
|
|
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,
|
|
envie um e-mail para: pgsql-general-digest-request@PostgreSQL.org com
|
|
o seguinte corpo:
|
|
subscribe
|
|
end
|
|
|
|
Sínteses (Digests) são enviadas aos membros dessa lista quando a lista
|
|
receber cerca de 30k em mensagens.
|
|
|
|
A lista de discussão sobre bugs está disponível. Para se inscrever,
|
|
envie um e-mail para pgsql-bugs-request@PostgreSQL.org com o seguinte
|
|
corpo:
|
|
subscribe
|
|
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
|
|
(irc.freenode.net). Para se conectar você pode utilizar o comando Unix
|
|
irc -c '#postgresql' "$USER" irc.freenode.net ou utilizar qualquer
|
|
outro cliente de IRC. Um canal hispânico (#postgresql-es) e um francês
|
|
(#postgresqlfr) também existem na mesma rede. Há também um canal
|
|
PostgreSQL na EFNet.
|
|
|
|
Uma lista de empresas que prestam suporte comercial está disponível em
|
|
http://techdocs.postgresql.org/companies.php.
|
|
|
|
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) Que documentação está disponível?
|
|
|
|
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ê
|
|
pode acessar os manuais online em http://www.PostgreSQL.org/docs.
|
|
|
|
Há dois livros sobre PostgreSQL disponíveis online em
|
|
http://www.PostgreSQL.org/docs/awbook.html e
|
|
http://www.commandprompt.com/ppbook/. Há uma lista de livros sobre
|
|
PostgreSQL disponíveis para compra em
|
|
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Há também uma
|
|
coleção de artigos técnicos sobre PostgreSQL em
|
|
http://techdocs.PostgreSQL.org/.
|
|
|
|
O programa cliente de linha de comando psql tem alguns comandos \d
|
|
para mostrar informação sobre tipos, operadores, funções, agregações,
|
|
etc. Use \? para mostrar os comandos disponíveis.
|
|
|
|
Nosso web site contém ainda mais documentação.
|
|
|
|
1.9) Como eu posso saber quais são os bugs conhecidos ou características
|
|
ausentes?
|
|
|
|
PostgreSQL suporta um subconjunto extendido do SQL-92. Veja a nossa
|
|
lista de afazeres (TODO) para saber sobre bugs conhecidos,
|
|
características ausentes e planos futuros.
|
|
|
|
1.10) Como eu posso aprender SQL?
|
|
|
|
O livro "The PostgreSQL book" em
|
|
http://www.PostgreSQL.org/docs/awbook.html ensina SQL. Há outro livro
|
|
sobre PostgreSQL em http://www.commandprompt.com/ppbook. Há bons
|
|
tutoriais em http://www.intermedia.net/support/sql/sqltut.shtm, ,
|
|
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
|
|
e em http://sqlcourse.com.
|
|
|
|
Outro é o "Teach Yourself SQL in 21 Days, Second Edition" em
|
|
http://members.tripod.com/er4ebus/sql/index.htm
|
|
|
|
Muitos dos nossos usuá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á 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.
|
|
|
|
Características
|
|
PostgreSQL tem muitas características presentes em muitos SGBDs
|
|
comerciais como transações, subconsultas, gatilhos, visões,
|
|
integridade referencial de chave estrangeira e travamento
|
|
(lock) sofisticado. Nós temos algumas características que eles
|
|
não tem, como tipos definidos pelo usuário, herança, regras e
|
|
controle de concorrência de múltiplas versões para reduzir
|
|
travamentos (locks).
|
|
|
|
Performance
|
|
A performance do PostgreSQL é comparável a outros bancos de
|
|
dados comerciais e de código livre. Ele é mais rápido em
|
|
algumas coisas, mais lento em outras. Comparado ao MySQL ou
|
|
sistemas de bancos de dados "leves", nós somos mais rápidos com
|
|
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
|
|
Nós sabemos que um SGBD deve ser confiável ou ele é inútil. Nós
|
|
empenhamos em lançar versões bem testadas, de código estável e
|
|
que tenha o mínimo de bugs. Cada versão tem no mínimo um mês de
|
|
teste em versão beta, e nosso histórico de versões mostra que
|
|
nós podemos fornecer versões estáveis e sólidas que estão
|
|
prontas para uso em produção. Nós acreditamos que somos
|
|
comparados a nosso favor com outros sistemas de bancos de dados
|
|
nessa área.
|
|
|
|
Suporte
|
|
Nossas listas de discussão fornecem contato com um grupo de
|
|
desenvolvedores e usuários para ajudar a resolver muitos
|
|
problemas encontrados. Enquanto nós não podemos garantir o
|
|
conserto, SGBDs comerciais nem sempre fornecem também. Com
|
|
acesso direto aos desenvolvedores, a comunidade de usuários,
|
|
manuais e o código fonte faz com que o suporte do PostgreSQL
|
|
seja superior ao de outros SGBDs. Há suporte comercial por
|
|
incidente disponíveis para aqueles que precisam de um. (Veja
|
|
seção 1.6 da FAQ.)
|
|
|
|
Preço
|
|
Nós somos livres para uso dele tanto comercial quanto não
|
|
comercial. Você pode adicionar nosso código ao seu produto sem
|
|
limitações, exceto aquelas descritas na nossa licença
|
|
compatível com a licenç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 é 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
|
|
|
|
2.1) Há drivers ODBC para PostgreSQL?
|
|
|
|
Há dois drivers ODBC disponíveis, PsqlODBC e o OpenLink ODBC.
|
|
|
|
Você 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ão, então você poderá ter o ODBC para
|
|
PostgreSQL disponível em toda plataforma que eles suportam (Win, Mac,
|
|
Unix, VMS).
|
|
|
|
Eles provavelmente venderão seu produto para pessoas que precisam de
|
|
um suporte de qualidade, mas uma versão gratuita estará sempre
|
|
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
|
|
ser vista em: http://www.webreview.com
|
|
|
|
Para integração na Web, PHP é uma excelente interface. Ele está 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áficas para iteragir com o usuário?
|
|
|
|
Sim, há várias interfaces gráficas para PostgreSQL disponíveis. Entre
|
|
elas o PgAccess http://www.pgaccess.org), pgAdmin III
|
|
(http://www.pgadmin.org, RHDB Admin (http://sources.redhat.com/rhdb/
|
|
), TORA (http://www.globecom.net/tora/, parcialmente comercial) e o
|
|
Rekall ( http://www.thekompany.com/products/rekall/, proprietá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
|
|
|
|
3.1) Como eu instalo o PostgreSQL em um local diferente de
|
|
/usr/local/pgsql?
|
|
|
|
Especifique a opçã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ó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
|
|
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
|
|
listen_addresses no postgresql.conf, e habilite a autenticação por
|
|
máquina modificando o arquivo $PGDATA/pg_hba.conf.
|
|
|
|
3.6) Como eu ajusto o servidor de banco de dados para obter uma performance
|
|
melhor?
|
|
|
|
Certamente, índices podem acelerar consultas. O comando EXPLAIN
|
|
ANALYZE permite que você veja como o PostgreSQL está interpretando a
|
|
consulta, e quais os índices são utilizados.
|
|
|
|
Se você está fazendo muitos INSERTs, considere fazê-los em lote
|
|
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
|
|
BEGIN WORK/COMMIT são consideradas com se estivessem em sua própria
|
|
transação. Considere executar várias sentenças em um mesmo bloco de
|
|
transação. Isso reduz a quantidade de transações. Também, considere
|
|
remover e criar índices novamente quando estiver fazendo muitas
|
|
mudanças nos dados.
|
|
|
|
Há várias opções de ajuste em Administration Guide/Server Run-time
|
|
Environment/Run-time Configuration. Você pode desabilitar o fsync()
|
|
utilizando a opção fsync. Isso irá impedir que fsync()s enviem os
|
|
dados para disco após cada transação.
|
|
|
|
Você pode utilizar a opção shared_buffers para aumentar o número de
|
|
buffers de memória compartilhada utilizados pelos processos do
|
|
servidor. Se você definiu este parâmetro com um valor muito alto, o
|
|
postmaster pode não iniciar porque você excedeu o limite de espaço de
|
|
memória compartilhada do kernel. Cada buffer é de 8K e o padrão é de
|
|
1000 buffers.
|
|
|
|
Você também pode utilizar a opção sort_mem (no PostgreSQL 8.0:
|
|
work_mem) para aumentar a máxima quantidade de memória utilizada pelo
|
|
processo servidor para cada ordenação temporária. O valor padrão é
|
|
1024 (ou seja 1MB).
|
|
|
|
Você também pode utilizar o comando CLUSTER para agrupar dados em
|
|
tabelas para combinar um índice. Veja o manual sobre CLUSTER para mais
|
|
informação.
|
|
|
|
3.7) 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.
|
|
|
|
Primeiro, execute o configure com a opção --enable-cassert, muitos
|
|
assert()s monitoram o progresso do núcleo (backend) e finalizam o
|
|
programa quando alguma coisa inesperada acontece.
|
|
|
|
O postmaster e o postgres tem várias opções de depuração disponíveis.
|
|
Primeiro, quando iniciar o postmaster, tenha certeza que você enviou a
|
|
saida padrão e a saída de erro padrão para um arquivo de log, como em:
|
|
cd /usr/local/pgsql
|
|
./bin/postmaster >server.log 2>&1 &
|
|
|
|
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
|
|
menores, então atualizar da versão 7.2 para 7.2.1 não requer uma
|
|
exportação e uma importação. Contudo, versõ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ças geralmente são complexas, então
|
|
nós não mantemos compatibilidade para os arquivos de dados. Uma
|
|
exportação em um formato genérico que pode ser importada utilizando o
|
|
novo formato interno.
|
|
|
|
Em versões onde o formato em disco não muda, o script pg_upgrade pode
|
|
ser utilizado para atualizar sem precisar de um dump/restore. As notas
|
|
da versão mencionam se pg_upgrade está disponível para a versão.
|
|
|
|
3.11) Que tipo de hardware eu devo usar?
|
|
|
|
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
|
|
qualidade. Natilde;o é verdade. ECC RAM, SCSI e placas mãe de
|
|
qualidade são mais confiáveis e têm uma melhor performance do que
|
|
hardwares mais baratos. O PostgreSQL executará em quase todo hardware,
|
|
mas se a confiabilidade e a performance forem importantes é prudente
|
|
pesquisar sobre as opções de hardware. Nossas listas de discussão
|
|
podem ser usadas para discutir opções de hardware e dilemas.
|
|
_________________________________________________________________
|
|
|
|
Perguntas Operacionais
|
|
|
|
4.1) Qual é a diferença entre cursores binários e normais?
|
|
|
|
Veja o comando DECLARE no manual para uma descrição.
|
|
|
|
4.2) Como eu faço um SELECT somente dos primeiros registros de uma
|
|
consulta? Um registro randômico?
|
|
|
|
Veja o manual do FETCH, ou utilize SELECT ... LIMIT....
|
|
|
|
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:
|
|
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ê pode utilizar \?. Alternativamente
|
|
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
|
|
saída para os comandos do psql. Você também pode iniciar o psql com a
|
|
opção -E então serão mostradas as consultas utilizadas para executar
|
|
os comandos que você digitou. PostgreSQL também fornece uma interface
|
|
para o INFORMATION SCHEMA SQLi na qual você pode consultar informaçõ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ão 7.3 com comando
|
|
ALTER TABLE DROP COLUMN. Em versões anteriores, você pode fazer isto:
|
|
BEGIN;
|
|
LOCK TABLE old_table;
|
|
SELECT ... -- selecione todas colunas mas não aquela que você 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ç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ê pode querer executar o comando VACUUM FULL tab para recuperar o
|
|
espaço em disco utilizado pelos registros expirados.
|
|
|
|
4.5) Qual é o tamanho máximo de um registro, uma tabela e um banco de
|
|
dados?
|
|
|
|
Estes são os limites:
|
|
Tamanho máximo de um banco de dados? ilimitado (existem bancos de dados de 32 TB)
|
|
Tamanho máximo de uma tabela? 32 TB
|
|
Tamanho máximo de um registro? 1.6TB
|
|
Tamanho máximo de um campo? 1 GB
|
|
Nú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
|
|
disponível e espaço em memória/swap. A Performance será penalizada
|
|
quando estes valores se tornarem grandes.
|
|
|
|
O tamanho máximo de uma tabela com 32 TB não requer suporte a arquivos
|
|
grandes do sistema operacional. Tabelas grandes são armazenadas como
|
|
múltiplos arquivos de 1 GB então o limite do sistema de arquivos não é
|
|
importante.
|
|
|
|
O tamanho máximo de uma tabela e o número máximo de colunas pode ser
|
|
quadruplicadas aumentando-se o tamanho dos blocos para 32k.
|
|
|
|
4.6) Quanto espaço em disco é necessário para armazenar dados de um arquivo
|
|
texto?
|
|
|
|
Um banco de dados PostgreSQL irá requerer até cinco vezes a quantidade
|
|
de espaç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ção em cada linha. Suponha que o tamanho médio da
|
|
descrição é de vinte bytes. O arquivo terá 2.8 MB. O tamanho do
|
|
arquivo do banco de dados PostgreSQL que contém esses dados pode ser
|
|
estimado em 6.4 MB:
|
|
32 bytes: cada cabeçalho de registro (aproximadamente)
|
|
24 bytes: um campo int e um campo texto
|
|
+ 4 bytes: ponteiro na página para a tupla
|
|
-------------------------------------------
|
|
60 bytes por registro
|
|
|
|
O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
|
|
|
|
8192 bytes por página
|
|
------------------------ = 136 registros por página do banco de dados (arredondado para baixo)
|
|
60 bytes por registro
|
|
|
|
100000 registros de dados
|
|
---------------------------- = 735 páginas do banco de dados (arredondadopara cima)
|
|
128 registros por página
|
|
|
|
735 páginas do banco de dados * 8192 bytes por página = 6,021,120 bytes (6 MB)
|
|
|
|
Índices não requerem muito espaço, mas contém dados que foram
|
|
indexados, então eles podem ocupar algum espaço.
|
|
|
|
NULLs são armazenados como bitmaps, então eles utilizam muito pouco
|
|
espaço.
|
|
|
|
4.7) Como eu descrubo quais tabelas, índices, bancos de dados e usuários
|
|
estão definidos?
|
|
|
|
psql tem uma variadade de comandos com barra invertida que mostram
|
|
tais informações. Utilize \? para vê-los. Há também tabelas do sistema
|
|
que começam com pg_ e que os descrevem também. Também, psql -l listará
|
|
todos os bancos de dados.
|
|
|
|
Veja também o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
|
|
muitos SELECTs necessários para obter informação das tabelas do
|
|
sistema de banco de dados.
|
|
|
|
4.8) Minhas consultas estão lentas ou não estão utilizando índices. Por
|
|
que?
|
|
|
|
Índices não são automaticamente utilizados por toda consulta. Índices
|
|
só são utilizados se uma tabela é maior do que o tamanho mínimo e uma
|
|
consulta seleciona somente uma porcentagem pequena de registros de uma
|
|
tabela. Isto porque o acesso randô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
|
|
junções. Uma busca sequencial seguida por uma ordenação explícita é
|
|
usualmente mais rápida do que uma busca por índice em uma tabela
|
|
grande.
|
|
Contudo, LIMIT combinado com ORDER BY frequentemente utilizará um
|
|
í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
|
|
sequencial, utilize SET enable_seqscan TO 'off' e execute testes para
|
|
ver se uma busca por índice é de fato é mais rápida.
|
|
|
|
Quando é utilizado operadores com curingas tais como LIKE ou ~,
|
|
índices só podem ser utilizados em certas circunstâncias:
|
|
* O ínício de uma string de busca deve ser o início da string, i.e.
|
|
+ modelos no LIKE não devem começar com %.
|
|
+ modelos no ~ (expressão regular) não devem começar com ^.
|
|
* A string de busca não pode iniciar com uma classe de caracteres,
|
|
i.e. [a-e].
|
|
* Buscas que não diferenciam maiúsculas de minúsculas tais como
|
|
ILIKE e ~* não utilizam índices. Ao invés, utilize índices
|
|
funcionais, que são descritos na seção 4.12.
|
|
* A localidade padrão C deve ser utilizada durante o initdb porque
|
|
não é possível saber o próximo/maior caracter em uma localidade
|
|
que não seja a C. Você pode criar um índice especial
|
|
text_pattern_ops para tais casos que funcionam somente para
|
|
indexação utilizando LIKE.
|
|
|
|
Em versões anteriores a 8.0, índices frequentemente não podiam ser
|
|
usados a menos que os tipos de dados correspodessem aos tipos da
|
|
coluna do índice. Isto é particularmente verdadeiro para índices de
|
|
coluna int2, int8 e numeric.
|
|
|
|
4.9) Como eu vejo como o otimizador de consulta está avaliando a minha
|
|
consulta?
|
|
|
|
Veja o comando EXPLAIN no manual.
|
|
|
|
4.10) O que é um índice de árvore R?
|
|
|
|
Um índice de árvore B é utilizado para indexação de dados espaciais.
|
|
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
|
|
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.
|
|
|
|
Comparações de igualdade não sensíveis a maiúsculas são normalmente
|
|
expressadas como:
|
|
SELECT *
|
|
FROM tab
|
|
WHERE lower(col) = 'abc';
|
|
|
|
Isso não irá utilizar o índice padrão. Contudo, se você criar um
|
|
índice funcional, ele será utilizado:
|
|
CREATE INDEX tabindex ON tab (lower(col));
|
|
|
|
4.13) Em uma consulta, como eu detecto se um campo é NULL?
|
|
|
|
Você pode testar a coluna com IS NULL e IS NOT NULL.
|
|
|
|
4.14) Qual é a difenrença entre os vários tipos de dados de caracteres?
|
|
|
|
Tipo Nome Interno Notas
|
|
--------------------------------------------------
|
|
VARCHAR(n) varchar tamanho especifica o comprimento máximo, sem preenchimento
|
|
CHAR(n) bpchar preenchimento em branco para comprimento fixo específico
|
|
TEXT text nenhum limite superior específico no comprimento
|
|
BYTEA bytea vetor de bytes de comprimento variável (null-byte safe)
|
|
"char" char um caracter
|
|
|
|
Você verá o nome interno quando examinar o catálogo do sistema e em
|
|
algumas mensagens de erro.
|
|
|
|
Os primeiros quatro tipos acima são do tipo "varlena" (i.e., os
|
|
primeiros quatro bytes no disco são o comprimento seguido pelos
|
|
dados). Consequentemente o espaço atual utilizado é ligeiramente maior
|
|
do que o tamanho declarado. Contudo, esses tipos de dados também são
|
|
sujeitos a compressão ou a serem armazenados fora do padrão utilizando
|
|
o TOAST, então o espaço em disco pode também ser bem menor do que o
|
|
esperado.
|
|
VARCHAR(n) é melhor quando está armazenando cadeias de caracteres de
|
|
comprimento variável e há um limite de tamanho desta cadeia. TEXT é
|
|
para cadeias de caracteres de comprimento ilimitado, com o máximo de
|
|
um gigabyte.
|
|
|
|
CHAR(n) preenche com espaços em branco até o tamanho especificado,
|
|
enquanto o VARCHAR(n) armazena somente os caracteres fornecidos. BYTEA
|
|
é para armazenar dados binários, particularmente 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?
|
|
|
|
PostgreSQL suporta o tipo de dados SERIAL. Ele cria automaticamente
|
|
uma sequência. Por exemplo:
|
|
CREATE TABLE pessoa (
|
|
id SERIAL,
|
|
nome TEXT
|
|
);
|
|
|
|
é automaticamente traduzido em:
|
|
CREATE SEQUENCE pessoa_id_seq;
|
|
CREATE TABLE pessoa (
|
|
id INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
|
|
nome TEXT
|
|
);
|
|
|
|
Veja a página sobre create_sequence no manual para mais informação
|
|
sobre sequências. Você também pode utilizar o campo OID para cada
|
|
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
|
|
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
|
|
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
|
|
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ê poderia então ter també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á <tabela>_<coluna>_seq, onde tabela e coluna são os nomes da
|
|
tabela e da coluna SERIAL, respectivamente.
|
|
|
|
Alternativamente, você poderia obter o valor SERIAL atribuído com a
|
|
função currval() depois de tê-lo inserido por padrão, i.e.,
|
|
execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
|
|
novo_id = execute("SELECT currval('pessoa_id_seq')");
|
|
|
|
Finalmente, você poderia utilizar o OID retornado da sentença INSERT
|
|
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,
|
|
utilizando DBI com o módulo DBD::Pg, o valor do oid está disponível
|
|
via $sth->{pg_oid_status} depois de $sth->execute().
|
|
|
|
4.15.3) currval() não lida com condição de corrida com outros usuários?
|
|
|
|
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
|
|
transações correntes e não são travados até que a transação seja
|
|
finalizada. Isso causa intervalos na numeração por causa de transações
|
|
abortadas.
|
|
|
|
4.16) O que é um OID? O que é um TID?
|
|
|
|
OIDs são a resposta do PostgreSQL a ids únicos de registros. Cada
|
|
registro que é criado no PostgreSQL recebe um OID único. Todos OIDs
|
|
produzidos durante o initdb são menores do que 16384 (de
|
|
include/access/transam.h). Todos os OIDs criados pelo usuário são
|
|
iguais ou maiores do que este valor. Por padrão, todos estes OIDs são
|
|
únicos não somente na tabela ou no banco de dados, mas na instalaçã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ários específicos e podem ser utilizados
|
|
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
|
|
acesso rápido.
|
|
|
|
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
|
|
apontar para registros físicos.
|
|
|
|
4.17) Qual é o significado de alguns termos utilizados no PostgreSQL?
|
|
|
|
O código-fonte e documentação antiga utiliza termos de uso comum. Aqui
|
|
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
|
|
antes de iniciar o postmaster:
|
|
ulimit -d 262144
|
|
limit datasize 256m
|
|
|
|
|
|
Dependendo da sua shell, somente um desses comando terá sucesso, mas
|
|
ele definirá o segmento de dados do seu processo com um limite maior e
|
|
talvez permita que a consulta seja feita. Este comando é aplicado ao
|
|
processo atual e todos os subprocessos criados depois do comando ser
|
|
executado. Se você tiver problemas com o cliente SQL porque o núcleo
|
|
(backend) retornou muitos dados, tente-o antes de iniciar o cliente.
|
|
|
|
4.19) Como eu informo qual versão do PostgreSQL eu estou utilizando?
|
|
|
|
No psql, digite SELECT version();
|
|
|
|
4.20) Por que minhas operações com objetos grandes retorna "invalid large
|
|
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:
|
|
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:
|
|
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
|
|
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ênticas juntam t1.col com t2.col, e também
|
|
retornam qualquer registro que não foi juntado em t1 (aqueles que não
|
|
combinaram com t2). Uma junção a direita RIGHT adicionaria registros
|
|
que não foram juntados da tabela t2. Uma junção completa (FULL)
|
|
retornaria os registros combinados mais todos os registros não
|
|
combinados de t1 e t2. A palavra OUTER é opcional e é assumida nas
|
|
junções LEFT, RIGHT e FULL. Junções ordinárias são chamadas junções
|
|
naturais (INNER).
|
|
|
|
Em versões anteriores, junções externas podiam ser simuladas
|
|
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
|
|
o atual. Porque o PostgreSQL carrega catálogos do sistema específicos
|
|
do banco de dados, é incerto como uma consulta em banco de dados
|
|
distintos pode se comportar.
|
|
|
|
contrib/dblink permite consultas em bancos de dados distintos
|
|
utilizando chamadas de funções. É claro, que um cliente pode fazer
|
|
conexões simultâneas em bancos de dados diferentes e juntar os
|
|
resultados no cliente.
|
|
|
|
4.25) Como eu retorno múltiplos registros ou colunas de uma função?
|
|
|
|
No 7.3, você pode facilmente retornar múltiplos registros ou colunas
|
|
de uma função,
|
|
http://techdocs.postgresql.org/guides/SetReturningFunctions.
|
|
|
|
4.26) Por que eu não posso confiar na criação/remoção de tabelas
|
|
temporárias em funções PL/PgSQL?
|
|
|
|
PL/PgSQL armazena o conteúdo da função, e o efeito indesejado é que se
|
|
uma função PL/PgSQL acessa uma tabela temporária, e aquela tabela é
|
|
removida e criada novamente, e a função é chamada novamente, a função
|
|
irá falhar porque o conteúdo armazenado da função ainda apontará para
|
|
a tabela temporária antiga. A solução é utilizar o EXECUTE para acesso
|
|
a tabelas temporárias no PL/PgSQL. Isto irá fazer com que a consulta
|
|
seja avaliada toda vez.
|
|
|
|
4.27) Que opções para encriptação estão disponíveis?
|
|
|
|
* No contrib/pgcrypto contém muitas funções de encriptação para
|
|
serem utilizados em consultas SQL.
|
|
* 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
|
|
registro host ou hostssl deve existir no pg_hba.conf, e o sslmode
|
|
no cliente não deve estar disable. (Note que também é possível
|
|
utilizar outros esquemas de transporte encriptado, tais como
|
|
stunnel ou ssh, ao invés da conexão SSL nativa do PostgreSQL.)
|
|
* Senhas dos usuários do banco de dados são automaticamente
|
|
encriptadas quando armazenadas na versão 7.3. Em versões
|
|
anteriores, você deve habilitar a opçã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ção. Quando eu executo-a no psql, por que ela
|
|
finaliza o programa com descarga de memória (core dump)?
|
|
|
|
O problema pode ser várias coisas. Tente testar sua função em um
|
|
programa independente.
|
|
|
|
5.2) Como eu posso contribuir com alguns tipos e funções novas para o
|
|
PostgreSQL?
|
|
|
|
Envie as suas extensões para a lista de discussão pgsql-hackers, e
|
|
elas eventualmente serão colocadas no subdiretório contrib/.
|
|
|
|
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.
|