Remove translated FAQs

The English FAQ has been moved to the wiki, so the translated versions should
have been removed at that point as well.

The FAQ_MINGW.html should have been removed when the platform FAQs were
integrated into the documentation (or earlier).

applied to both 8.4 and 8.5
This commit is contained in:
Peter Eisentraut 2009-07-21 19:20:33 +00:00
parent f7ad9cab30
commit f3f45c87d2
26 changed files with 0 additions and 27315 deletions

View File

@ -1,922 +0,0 @@
Perguntas Frequentes (FAQ) sobre PostgreSQL
Última atualização: Sex Nov 16 10:53:50 EST 2007
Mantenedor atual: Bruce Momjian (bruce@momjian.us)
Traduzido por: Euler Taveira de Oliveira (euler@timbira.com)
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? O que é Postgres?
1.2) Quem controla o PostgreSQL?
1.3) Qual é a licença do PostgreSQL?
1.4) Quais plataformas o PostgreSQL pode ser executado?
1.5) Onde eu posso conseguir o PostgreSQL?
1.6) Qual é a última versão?
1.7) Onde eu posso conseguir suporte?
1.8) Como eu posso submeter um relato de um bug?
1.9) Como eu posso saber quais são os bugs conhecidos ou
características ausentes?
1.10) Que documentação está disponível?
1.11) Como eu posso aprender SQL?
1.12) Como posso submeter uma correção (patch) ou me juntar a equipe
de desenvolvimento?
1.13) Como é o PostgreSQL comparado a outros SGBDs?
1.14) O PostgreSQL gerenciará as mudanças de horário devido ao horário
de verão em vários países?
Perguntas sobre Clientes
2.1) Quais interfaces estão disponíveis 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?
Perguntas Administrativas
3.1) Como eu instalo o PostgreSQL em um local diferente de
/usr/local/pgsql?
3.2) Como eu controlo conexões de outras máquinas?
3.3) Como eu ajusto o servidor de banco de dados para obter uma
performance melhor?
3.4) Quais características de depuração estão disponíveis?
3.5) Por que eu recebo "Sorry, too many clients" quando eu tento
conectar?
3.6) Qual é o processo de atualização do PostgreSQL?
3.7) Que tipo de hardware eu devo usar?
Perguntas Operacionais
4.1) Como eu faço um SELECT somente dos primeiros registros de uma
consulta? Um registro randômico?
4.2) Como eu descubro quais tabelas, índices, bancos de dados e
usuários estão definidos? Como eu vejo as consultas utilizadas pelo
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?
4.5) Quanto espaço em disco é necessário para armazenar dados de um
arquivo texto?
4.6) Por que minhas consultas estão lentas? Por que elas não estão
utilizando meus índices?
4.7) Como eu vejo como o otimizador de consultas está avaliando minha
consulta?
4.8) Como eu faço buscas com expressões regulares e buscas com
expressões regulares sem diferenciar mauúsculas de minúsculas? Como eu
utilizo um índice para buscas sem distinguir maiúsculas de minúsculas?
4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu
posso concatenar possíveis NULLs? Como eu posso ordenar por um campo
que é NULL ou não?
4.10) Qual é a diferença entre os vários tipos de dado de caracteres?
4.11.1) Como eu crio um campo serial/auto incremento?
4.11.2) Como eu consigo o valor de um campo SERIAL?
4.11.3) currval() não lida com condição de corrida com outros
usuários?
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
minha sequência/coluna SERIAL?
4.12) O que é um OID? O que é um CTID?
4.13) Por que eu recebo o erro "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.14) Como eu informo qual versão do PostgreSQL eu estou utilizando?
4.15) Como eu crio uma coluna que conterá por padrão a hora atual?
4.16) Como eu faço uma junção externa (outer join)?
4.17) Como eu faço consultas utilizando múltiplos bancos de dados?
4.18) Como eu retorno múltiplos registros ou colunas de uma função?
4.19) Por que eu obtenho erros "relation with OID ###### does not
exist" ao acessar tabelas temporárias em funções PL/PgSQL?
4.20) Quais soluções de replicação estão disponíveis?
4.21) Por que os nomes de minhas tabelas e colunas não são
reconhecidos em minha consulta? Por que as maiúsculas não são
preservadas?
_________________________________________________________________
Perguntas Gerais
1.1) O que é PostgreSQL? Como ele é pronunciado? O que é Postgres?
PostgreSQL é pronunciado Post-Gres-Q-L. (Para os curiosos que querem
saber como se diz "PostgreSQL", um arquivo de áudio está disponível).
O PostgreSQL é um sistema de banco de dados objeto-relacional que tem
as características de sistemas de bancos de dados comerciais
tradicionais com melhoramentos encontrados nos sistemas SGBDs de
próxima geração. PostgreSQL é livre e o código-fonte completo está
disponível.
O desenvolvimento do PostgreSQL é feito por um grupo de
desenvolvedores voluntários (na sua maioria) espalhados pelo mundo e
que se comunicam via Internet. É um projeto da comunidade e não é
controlado por nenhuma empresa. Para se envolver, veja a FAQ do
desenvolvedor em http://www.postgresql.org/docs/faqs.FAQ_DEV.html
Postgres é um apelido para o PostgreSQL amplamente utilizado. Era o
nome original do projeto em Berkeley e dentre os outros apelidos é o
preferido. Se você acha 'PostgreSQL' difícil de pronunciar, diga
apenas 'Postgres'.
1.2) Quem controla o PostgreSQL?
Se você está procurando por um mantenedor, comitê central ou empresa
controladora do PostgreSQL, desista --- não há um(a). Nós temos um
comitê core e committers CVS, mas estes grupos são mais para questões
administrativas do que controle. O projeto é direcionado pela
comunidade de desenvolvedores e usuários, que qualquer um pode se
juntar. Tudo o que você precisa é se inscrever nas listas de discussão
e participar das discussões. Veja a FAQ do desenvolvedor para obter
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:
PostgreSQL está sujeito a seguinte licença:
PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-1996 Regents of the University of
California
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all
copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1.4) Quais plataformas o PostgreSQL pode ser executado?
Em geral, qualquer plataforma moderna compatí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.
O PostgreSQL também executa nativamente nos sistemas operacionais
Microsoft Windows baseados no NT tais como Win200 SP4, WinXP e
Win2003. Um instalador pré-empacotado está disponível em
http://pgfoundry.org/projects/pginstaller. Versões do Windows baseadas
no MS-DOS (Win95, Win98, WinMe) podem executar o PostgreSQL utilizando
o Cygwin.
Há também uma versão para o 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?
Via navegador web, utilize http://www.postgresql.org/ftp/ e via ftp,
utilize ftp://ftp.postgresql.org/pub/.
1.6) Qual é a última versão?
A última versão do PostgreSQL é a versão 8.2.5.
Nós planejamos lançar versões novas a cada ano com versões corretivas
em alguns meses.
1.7) Onde eu posso conseguir suporte?
A comunidade do PostgreSQL fornece assistência a muitos de seus
usuários via e-mail. O principal sítio web para inscrição nas listas
de e-mail é http://www.postgresql.org/community/lists/. As listas
general e bugs são um bom lugar para início.
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://www.postgresql.org/support/professional_support.
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.
Verifique também o nosso ftp ftp://ftp.postgresql.org/pub para ver se
há uma versão mais recente do PostgreSQL.
Bugs submetidos utilizando o formulário ou informado a qualquer lista
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
* 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
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 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
* 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
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 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
http://www.postgresql.org/docs/books/awbook.html e
http://www.commandprompt.com/ppbook/. Há uma lista de livros sobre
PostgreSQL disponíveis para compra. Um dos mais populares é o do Korry
Douglas. Uma lista de análise sobre os livros pode ser encontrada em
http://www.postgresql.org/docs/books/. Há também uma coleção de
artigos técnicos sbore PostgreSQL em
http://www.postgresql.org/docs/techdocs/.
O programa cliente de linha de comando psql tem alguns comandos \d
para mostrar informações sobre tipos, operadores, funções, agregações,
etc. - utilize \? para mostrar os comandos disponíveis.
Nosso sítio web contém ainda mais documentação.
1.11) Como eu posso aprender SQL?
Primeiro, considere os livros específicos sobre PostgreSQL mencionados
acima. Muitos de nossos usuários gostam do The Practical SQL Handbook,
Bowman, Judith S., et al., Addison-Wesley. Outros do The Complete
Reference SQL, Groff et al., McGraw-Hill.
Há também bons tutoriais disponíveis online:
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12) Como posso submeter uma correção (patch) ou me juntar a equipe de
desenvolvimento?
Veja a FAQ do Desenvolvedor.
1.13) Como é o PostgreSQL comparado a outros SGBDs?
Há várias maneiras de se medir um software: funcionalidades,
performance, confiabilidade, suporte e preço.
Funcionalidades
PostgreSQL tem muitas características presentes em muitos SGBDs
comerciais como transações, subconsultas, gatilhos, visões,
integridade referencial de chave estrangeira e bloqueio (lock)
sofisticado. Nós temos algumas funcionalidades que eles não
tem, como tipos definidos pelo usuário, herança, regras e
controle de concorrência de múltiplas versões para reduzir
bloqueios (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. Nossa performance é
geralmente +/- 10% comparada a de outros bancos de dados.
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.7 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 BSD
mencionada acima.
1.14) O PostgreSQL gerenciará mudanças no horário devido ao horário de verão
em vários países?
Mudanças no horário de verão dos USA foram incluídas nas versões 8.0
.[4+] do PostgreSQL e em todas as versões grandes, i.e. 8.1. Mudanças
no Canadá e Austrália Oeste foram incluídas na 8.0.[10+], 8.1.[6+] e
em todas as versões grandes subsequentes. Versões do PostgreSQL
anteriores a 8.0 utilizam o banco de dados de zona horária do sistema
operacional para informações sobre horário de verão.
_________________________________________________________________
Perguntas sobre Clientes
2.1) Quais interfaces estão disponíveis para PostgreSQL?
A instalação do PostgreSQL inclui somente as interfaces C e C
embutida. Todas as outras interfaces são projetos independentes que
podem ser obtidos separadamente; sendo separados permitem que eles
tenham suas próprias datas de lançamento e time de desenvolvedores.
Algumas linguagens de programação como PHP incluem uma interface para
PostgreSQL. Interfaces para linguagens como Perl, TCL, Python e muitas
outras estão disponíveis em http://www.pgfoundry.org.
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 (http://www.php.net) é uma excelente
interface.
Para casos complexos, muitos usam a Interface Perl e DBD::Pg com
CGI.pm ou mod_perl.
2.3) O PostgreSQL tem interfaces gráficas para iteragir com o usuário?
Há um vasto número de Ferramentas Gráficas (GUI), que estão
disponíveis para o PostgreSQL, comerciais e de desenvolvedores de
código aberto. Uma lista detalhada pode ser encontrada em Documentação
da Comunidade PostgreSQL
_________________________________________________________________
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) 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, habilite a autenticação por
máquina modificando o arquivo $PGDATA/pg_hba.conf e reinicie o
servidor PostgreSQL.
3.3) Como eu ajusto o servidor de banco de dados para obter uma performance
melhor?
Há três grandes áreas para melhorar a performance em potencial:
Mudança de Consultas
Isto involve modificar consultas para obter melhor performance:
+ Criação de índices, incluir expressões e índices parciais
+ Utilização o COPY ao invés de múltiplos comandos INSERTs
+ Agrupamento de múltiplos comandos em uma única transação para
diminuir a despesa com efetivações (commit)
+ Utilização do CLUSTER quando recuperar vários registros de um
índice
+ Utilização do LIMIT para retornar um subconjunto da saída da
consulta
+ Utilização de Consultas preparadas
+ Utilização de ANALYZE para manter as estatísticas do
otimizador corretas
+ Utilização regular do VACUUM ou pg_autovacuum
+ Remoção de índices durante grande mudança de dados
Configuração do Servidor
Um grande número de configurações que afetam a performance.
Para obter detalhes adicionais, veja Administration
Guide/Server Run-time Environment/Run-time Configuration para
listagem completa, e para comentários veja
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
nf_e.html e
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Seleção do Hardware
O efeito do hardware na performance é detalhado em
http://www.powerpostgresql.com/PerfList/ e
http://momjian.us/main/writings/pgsql/hw_performance/index.html
.
3.4) Quais características de depuração estão disponíveis?
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
depuração e medidas de performance.
3.5) Por que eu recebo "Sorry, too many clients" quando eu tento conectar?
Você atingiu o limite padrão de 100 sessões. Você precisa aumentar o
limite do servidor PostgreSQL, que diz quantos processos servidor
concorrentes ele pode iniciar, alterando o valor max_connections no
postgresql.conf e reiniciando o postmaster.
3.6) Qual é o processo de atualização do PostgreSQL?
Veja http://www.postgresql.org/support/versioning para discussão geral
sobre atualizações e
http://www.postgresql.org/docs/current/static/install-upgrading.html
para instruções específicas.
3.7) 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 são de mesma
qualidade. Nã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) Como eu faço um SELECT somente dos primeiros registros de uma consulta?
Um registro randômico?
Para obter somente alguns registros, se você sabe o número de
registros necessários ao executar o SELECT utilize o LIMIT. Se um
í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
executar o SELECT, utilize um cursor e o FETCH.
Para obter um registro randômico, utilize:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) Como eu descubro quais tabelas, índices, bancos de dados e usuários
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
completa dos 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 os comandos SQL que geram a
saída para os comandos de contrabarra do psql. Você também pode
iniciar o psql com a opção -E para que as consultas utilizadas para
executar os comandos que você informou seja exibida. O PostgreSQL
também fornece uma inteface compatível com SQL do INFORMATION SCHEMA
que você pode consultar para obter informação sobre o banco de dados.
Há também tabelas do sistema que começam com pg_ que os descrevem
também.
Utilizando o psql -l listará todos os bancos de dados.
Veja também o arquivo pgsql/src/tutorial/syscat.source. Ele ilustra
muitos dos comandos SELECTs necessários para obter informação das
tabelas de sistema do banco de dados.
4.3) Como você muda o tipo de dado de uma coluna?
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.
Em versões anteriores, faça isso:
BEGIN;
ALTER TABLE tab ADD COLUMN col_nova novo_tipo_dado;
UPDATE tab SET col_nova = CAST(col_antiga AS novo_tipo_dado);
ALTER TABLE tab DROP COLUMN col_antiga;
COMMIT;
Você pode então querer fazer um VACUUM FULL tab para recuperar o
espaço em disco utilizado pelos registros expirados.
4.4) 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? 400 GB
Tamanho máximo de um campo? 1 GB
Número máximo de registros em uma tabela? ilimitado
Número máximo de colunas em uma tabela? 250-1600 dependendo dos tipos
das colunas
Número máximo de í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, o tamanho de um registro e o número
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.5) 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 5,2 MB:
24 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
-------------------------------------------
52 bytes por registro
O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
8192 bytes por página
------------------------ = 158 registros por página do banco de dados (arredondado para baixo)
52 bytes por registro
100000 registros de dados
---------------------------- = 633 páginas do banco de dados (arredondadopara cima)
158 registros por página
633 páginas do banco de dados * 8192 bytes por página = 5.185.536 bytes (5,2MB)
Í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.6) Por que minhas consultas estão lentas? Por que elas não estão utilizando
meus índices?
Índices não são utilizados por toda consulta. Índices são utilizados
somente se a tabela é maior do que um tamanho mínimo, e a consulta
seleciona somente uma pequena porcentagem dos registros da tabela.
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
sequencial.
Para determinar se um índice deveria ser utilizado, o PostgreSQL deve
ter estatísticas sobre a tabela. Estas estatísticas são coletadas
utilizando o VACUUM ANALYZE ou simplesmente o ANALYZE. Utilizando
estatísticas, o otimizador sbae quantos registros estão na tabela, e
pode melhor determinar se índices deveriam ser utilizados.
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 deveriam ser feitas
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 seguido por uma ordenação explícita é
geralmente mais rápida do que uma busca indexada em uma tabela grande.
Contudo, LIMIT combinado com ORDER BY frequentemente utilizará índice
porque somente uma pequena porção da tabela será retornada.
Se você acredita que o otimizador está incorreto ao escolher uma busca
sequencial, utilize SET enable_seqscan TO 'off' e execute a consulta
novamente para ver se uma busca indexada é realmente mais rápida.
Ao utilizar operadores curinga tais como LIKE ou ~, índices podem ser
utilizados somente em algumas condições:
* O início da cadeia de caracteres da busca deve ser iniciar com uma
cadeia de caracteres, i.e.
+ modelos LIKE não devem iniciar com %.
+ modelos ~ (expressões regulares) devem iniciar com ^.
* A cadeia de caracteres utilizada na busca não pode iniciar com a
classe de caracteres e.g. [a-e].
* Busca que não diferenciam maiúsculas de minúsculas tais como ILIKE
e ~* não utilizam índices. Em vez disso, utilize índice de
expressão, que é descrito na seção 4.8.
* O idioma padrão C deve ser usando durante o initdb porque não é
possível saber o próximo caracter em idiomas que não sejam o C.
Você pode criar um índice especial text_pattern_ops para tais
casos que funcionam somente para indexação com LIKE. Também é
possível utilizar indexação de busca textual para buscas por
palavras.
Em versões anteriores a 8.0, índices frequentemente não podem ser
utilizados a menos que os tipos de dados correspondam aos tipos de
coluna do índice. Isto era particularmente verdadeiro para índices de
coluna int2, int8 e numeric.
4.7) Como eu vejo como o otimizador de consulta está avaliando a minha
consulta?
Veja o comando EXPLAIN no manual.
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
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 de expressão, ele será utilizado:
CREATE INDEX tabindex ON tab (lower(col));
Se o índice acima é criado como UNIQUE, embora a coluna possa
armazenar caracteres maiúsculos e minúsculos, ele não pode ter valores
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,
utilize uma restrição CHECK ou um gatilho.
4.9) Em uma consulta, como eu detecto se um campo é NULL? Como eu posso
concatenar possíveis NULLs? Como eu posso ordenar por um campo que é NULL ou
não?
Você testa a coluna com IS NULL e IS NOT NULL, como a seguir:
SELECT *
FROM tab
WHERE col IS NULL;
Para concatenar com possíveis NULLs, utilize COALESCE(), assim:
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
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
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, valores longos são também
sujeitos a compressão, 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) é para armazenar cadeias de caracteres que são todas do mesmo
tamanho. 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.11.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
);
Sequências automaticamente criadas são nomeadas como
<tabela>_<colunaserial>_seq, onde tabela e colunaserial são os nomes
da tabela e da coluna serial, respectivamente. Veja a página sobre
create_sequence no manual para obter informações adicionais sobre
sequências.
4.11.2) Como eu consigo o valor de um campo SERIAL?
A maneira mais simples de obter o próximo valor SERIAL de uma
sequência é com RETURNING. Utilizando o exemplo da tabela em 4.11.1,
ele ficaria assim:
INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;
Você também pode chamar nextval() e utilizar o valor no INSERT ou
chamar currval() após o INSERT.
4.11.3) currval() não lida com condição de corrida com outros usuários?
Não. currval() retorna o valor atual atribuido pela sua sessão, e não
por todas as sessões.
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 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.12) O que é um OID? O que é um CTID?
Se uma tabela é criada com WITH OIDS, cada registro recebe um OID
único. OIDs são automaticamente atribuídos como inteiros de 4 bytes
que são únicos ao longo de toda instalação. Contudo, eles são
limitados em 4 bilhões e, então, os OIDs começam a ser duplicados. O
PostgreSQL utiliza OIDs para ligar as tabelas do sistema.
Para numerar registros nas tabelas do usuários, é melhor utilizar
SERIAL ao invés de OIDs porque sequências SERIAL são únicas somente em
uma tabela; e são menos propícias a atingir o limite. SERIAL8 está
disponível para armazenar valores de sequências com oito bytes.
CTIDs são utilizados para identificar registros físicos específicos
com valores de block e deslocamento. CTIDs mudam após registros serem
modificados ou recarregados. Eles são utilizados por índices para
apontar registros físicos.
4.13) Por que eu recebo o erro "ERROR: Memory exhausted in AllocSetAlloc()"?
Você provavelmente está sem memória virtual no seu sistema, ou o seu
núcleo (kernel) tem um limite baixo para certos recursos. Tente isto
antes de iniciar o servidor PostgreSQL:
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 processo
servidor retornou muitos dados, tente-o antes de iniciar o cliente.
4.14) Como eu informo qual versão do PostgreSQL eu estou utilizando?
No psql, digite SELECT version();
4.15) 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.16) 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
internas (INNER).
4.17) 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.18) Como eu retorno múltiplos registros ou colunas de uma função?
É fácil utilizando funções que retornam conjunto,
http://www.postgresql.org/docs/techdocs.17.
4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
acessar tabelas temporárias em funções PL/PgSQL?
Em versões do PostgreSQL < 8.3, 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.
Este problema não ocorre no PostgreSQL 8.3 ou superior.
4.20) Quais soluções de replicação estão disponíveis?
Embora "replicação" seja um termo simples, há várias tecnologias para
fazer replicação, com vantagens e desvantagens para cada um.
Replicação mestre/escravo permite que um mestre receba consultas de
leitura e escrita, enquanto os escravos só podem aceitar
leitura/consultas SELECT. A solução mais popular de replicação
mestre-escravo para PostgreSQL disponível livremente é Slony-I.
Replicação com múltiplos mestres permite que consultas leitura/escrita
sejam enviadas para múltiplos computadores replicadores. Esta
capacidade também tem um sério impacto na performance por causa da
necessidade de sincronizar as mudanças entre os servidores. PGCluster
é a solução mais popular disponível livremente para PostgreSQL.
Há também soluções de replicação comerciais e baseadas em hardware
disponíveis que suportam uma variedade de modelos de replicação.
4.21) Por que os nomes de minhas tabelas e colunas não são reconhecidos em
minha consulta? Por que as maiúsculas não são preservadas?
A causa mais comum de nomes desconhecidos é o uso de aspas ao redor
dos nomes da tabela ou coluna durante a criação da tabela. Ao utilizar
aspas, nomes de tabela e coluna (chamados de identificadores) são
armazenados como especificado, significando que você deve utilizar
aspas quando se referir aos nomes na consulta. Algumas interfaces,
como pgAdmin, automaticamente colocam aspas nos identificadores
durante a criação da tabela. Então, para identificadores serem
reconhecidos, você deve:
* Evitar colocar aspas no identificador ao criar tabelas
* Utilizar somente caracteres minúsculos em identificadores
* Colocar aspas em identificadores ao referenciá-los nas consultas

View File

@ -1,801 +0,0 @@
PostgreSQL 常è§é®é¢ï¼FAQï¼
æè¿æ´æ°ï¼2007 å¹´ 1 æ 30 æ¥ ææäº 17:37:01 EST
䏿çæè¿æ´æ°ï¼2007 å¹´ 2 æ 1 æ¥ ææå 12:55:04 CST
ç®åç»´æ¤äººåï¼Bruce Momjian (pgman@candle.pha.pa.us)
䏿çç»´æ¤äººåï¼Daojing.Zhouï¼doudou586@gmail.comï¼
æ¬ææ¡£çææ°çæ¬å¯ä»¥å¨
http://www.postgresql.org/files/documentation/faqs/FAQ.htmlæ¥çã
䏿ä½ç³»ç»å¹³å°ç¸å³çé®é¢å¯å¨http://www.postgresql.org/docs/faq/éæ¾å°ç­
æ¡ã
_________________________________________________________________
常è§é®é¢
1.1)PostgreSQL æ¯ä»ä¹ï¼è¯¥æä¹åé³ï¼
1.2)è°æ§å¶å管çPostgreSQL ï¼
1.3)PostgreSQLççææ¯ä»ä¹ï¼
1.4)PostgreSQLå¯ä»¥è¿è¡å¨åªäºæä½ç³»ç»å¹³å°ä¸ï¼
1.5)æä»åªéè½å¾å°PostgreSQLï¼
1.6)ææ°ççPostgreSQL æ¯ä»ä¹ï¼
1.7)æä»åªéè½å¾å°å¯¹PostgreSQL çæ¯æï¼
1.8)æå¦ä½æäº¤ä¸ä¸ªBUGæ¥åï¼
1.9)æå¦ä½äºè§£å·²ç¥ç BUG ææç¼ºçåè½ï¼
1.10)è½å¤è·åçææ°ææ¡£æåªäºï¼
1.11)æåºè¯¥ææ ·å¦ä¹ SQL ï¼
1.12)å¦ä½æäº¤è¡¥ä¸ææ¯å å¥å¼åéä¼ï¼
1.13)PostgreSQL åå¶ä»æ°æ®åºç³»ç»æ¯èµ·æ¥å¦ä½ï¼
1.14)PostgreSQL å¯ä»¥å¤çæè¿å个å½å®¶å¤æ¶å¶çåååï¼
ç¨æ·å®¢æ·ç«¯é®é¢
2.1)æä»¬å¯ä»¥ç¨ä»ä¹è¯è¨åPostgreSQL æäº¤éï¼
2.2)æä»ä¹å·¥å·å¯ä»¥æPostgreSQL ç¨äº Web 页é¢ï¼
2.3)PostgreSQL æ¥æå¾å½¢ç¨æ·çé¢åï¼
ç³»ç»ç®¡çé®é¢
3.1)æææ ·æè½æPostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼
3.2)æå¦ä½æ§å¶æ¥èªå¶ä»çµèçè¿æ¥ï¼
3.3)æææ ·è°æ´æ°æ®åºæå¡å¨ä»¥è·å¾æ´å¥½çæ§è½ï¼
3.4)PostgreSQL éå¯ä»¥è·å¾ä»ä¹æ ·çè°è¯ç¹æ§ï¼
3.5)为ä»ä¹å¨è¯å¾è¿æ¥ç»å½æ¶æ¶å°âSorry, too many clientsâ æ¶æ¯ï¼
3.6)PostgreSQLçå级è¿ç¨æåªäºå容ï¼
3.7)(使ç¨PostgreSQL)æéè¦ä½¿ç¨ä»ä¹è®¡ç®æºç¡¬ä»¶ ï¼
æä½é®é¢
4.1) å¦ä½åªéæ©ä¸ä¸ªæ¥è¯¢ç»æç头å è¡ï¼ææ¯éæºçä¸è¡ï¼
4.2)
å¦ä½æ¥ç表ãç´¢å¼ãæ°æ®åºä»¥åç¨æ·çå®ä¹ï¼å¦ä½æ¥çpsqléç¨å°çæ¥è¯¢æä»¤å¹¶æ¾ç
¤ºå®ä»¬ï¼
4.3) å¦ä½æ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åï¼
4.4) åæ¡è®°å½ï¼å个表ï¼ä¸ä¸ªæ°æ®åºçæå¤§éå¶æ¯å¤å°ï¼
4.5) åå¨ä¸ä¸ªå¸åçææ¬æä»¶éçæ°æ®éè¦å¤å°ç£ç空é´ï¼
4.6) 为ä»ä¹æçæ¥è¯¢å¾æ¢ï¼ä¸ºä»ä¹è¿äºæ¥è¯¢æ²¡æå©ç¨ç´¢å¼ï¼
4.7) æå¦ä½æè½çå°æ¥è¯¢ä¼å卿¯ææ ·è¯ä¼°å¤çæçæ¥è¯¢çï¼
4.8) æææ ·åæ£åè¡¨è¾¾å¼æç´¢å大å°åæ å³çæ­
£åè¡¨è¾¾å¼æ¥æ¾ï¼ææ ·å©ç¨ç´¢å¼è¿è¡å¤§å°åæ 峿¥æ¾ï¼
4.9) å¨ä¸ä¸ªæ¥è¯¢éï¼æææ ·æ£æµä¸ä¸ªå段æ¯å¦ä¸º
NULLï¼æå¦ä½æè½åç¡®æåºèä¸è®ºæå段æ¯å¦å«NULLå¼ï¼
4.10) åç§å符类åä¹é´æä»ä¹ä¸åï¼
4.11.1) æææ ·å建ä¸ä¸ªåºåå·åææ¯èªå¨éå¢çåæ®µï¼
4.11.2) æå¦ä½è·å¾ä¸ä¸ªæå¥çåºåå·çå¼ï¼
4.11.3) åæ¶ä½¿ç¨ currval() ä¼å¯¼è´åå¶ä»ç¨æ·çå²çªæåµåï¼
4.11.4) 为ä»ä¹ä¸å¨äºå¡å¼å¸¸ä¸æ¢åéç¨åºåå·å¢ï¼ä¸ºä»ä¹å¨åºåå·å段çåå¼ä¸­
åå¨é´æå¢ï¼
4.12) ä»ä¹æ¯ OIDï¼ä»ä¹æ¯ CTID ï¼
4.13) 为ä»ä¹ææ¶å°é误信æ¯âERROR: Memory exhausted in
AllocSetAlloc()âï¼
4.14) æå¦ä½æè½ç¥éæè¿è¡ç PostgreSQL ççæ¬ï¼
4.15) æå¦ä½å建ä¸ä¸ªç¼ºç弿¯å½åæ¶é´çåæ®µï¼
4.16) å¦ä½æ§è¡å¤è¿æ¥ï¼outer joinï¼æ¥è¯¢ï¼
4.17) å¦ä½æ§è¡æ¶åå¤ä¸ªæ°æ®åºçæ¥è¯¢ï¼
4.18) å¦ä½è®©å½æ°è¿åå¤è¡æå¤åæ°æ®ï¼
4.19) 为ä»ä¹æå¨ä½¿ç¨PL/PgSQL彿°åå临æ¶è¡¨æ¶ä¼æ¶å°é误信æ¯ârelation
with OID ##### does not existâï¼
4.20) ç®åæåªäºæ°æ®å¤å¶æ¹æ¡å¯ç¨ï¼
4.21) ä¸ºä½æ¥è¯¢ç»ææ¾ç¤ºç表åæååä¸æçæ¥è¯¢è¯å¥ä¸­
çä¸åï¼ä¸ºä½å¤§åç¶æä¸è½ä¿çï¼
_________________________________________________________________
常è§é®é¢
1.1)PostgreSQL æ¯ä»ä¹ï¼è¯¥æä¹åé³ï¼
PostgreSQL è¯»ä½ Post-Gres-Q-Lï¼ææ¶åä¹ç®ç§°ä¸ºPostgres
ãæ³å¬ä¸ä¸å¶åé³ç人åå¯ä»è¿éä¸è½½å£°é³æä»¶ï¼ MP3 æ ¼å¼ ã
PostgreSQL
æ¯é¢åç®æ çå³ç³»æ°æ®åºç³»ç»ï¼å®å·æä¼ ç»å䏿°æ®åºç³»ç»çææåè½ï¼åæ¶å嫿å°å
¨ä¸ä¸ä»£ DBMS ç³»ç»ç使ç¨çå¢å¼ºç¹æ§ãPostgreSQL
æ¯èªç±åè´¹çï¼å¹¶ä¸æææºä»£ç é½å¯ä»¥è·å¾ã
PostgreSQL
çå¼åéä¼ä¸»è¦ä¸ºå¿æ¿èï¼ä»ä»¬éå¸ä¸çåå°å¹¶éè¿äºèç½è¿è¡èç³»ï¼è¿æ¯ä¸ä¸ªç¤¾å
ºå¼å项ç®ï¼å®ä¸è¢«ä»»ä½å¬å¸æ§å¶ã
妿³å å¥å¼åéä¼ï¼è¯·åè§å¼å人å常è§é®é¢ï¼FAQï¼
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
1.2) è°æ§å¶PostgreSQL ï¼
å¦æä½ å¨å¯»æ¾PostgreSQLçæé¨äººï¼ææ¯ä»ä¹ä¸­
央å§åä¼ï¼ææ¯ä»ä¹æå±å¬å¸ï¼ä½ åªè½æ¾å¼äº---å 为ä¸ä¸ªä¹ä¸å­
å¨ï¼ä½æä»¬çç¡®æä¸ä¸ª
æ ¸å¿å§åä¼åCVS管çç»ï¼ä½è¿äºå·¥ä½ç»ç设ç«ä¸»è¦æ¯ä¸ºäºè¿è¡ç®¡çå·¥ä½è䏿
¯å¯¹PostgreSQLè¿è¡ç¬å 弿§å¶ï¼PostgreSQLé¡¹ç®æ¯ç±ä»»ä½äººå
å¯åå çå¼å人å社åºåææç¨æ·æ§å¶çï¼ä½ æéè¦åçå°±æ¯è®¢éé®ä»¶å表ï¼åä¸è®¨è®º
å³å¯ï¼è¦åä¸PostgreSQLçå¼åè¯¦è§ å¼å人å常é®é¢ (Developer's FAQ)
è·åä¿¡æ¯ï¼ã
1.3)PostgreSQLççææ¯ä»ä¹?
PostgreSQLçåå¸éµä»ç»å¸çBSDçæãå®åè®¸ç¨æ·ä¸éç®çå°ä½¿ç¨PostgreSQLï¼çè³ä½
å¯ä»¥éå®PostgreSQLèä¸å«æºä»£ç ä¹å¯ä»¥ï¼å¯ä¸çéå¶å°±æ¯ä½ ä¸è½å 软件èªè
º«é®é¢èåæä»¬è¿½è¯æ³å¾è´£ä»»ï¼å¦å¤å°±æ¯è¦æ±ææç软件æ·è´ä¸­
须忬以ä¸çæå£°æãä¸é¢å°±æ¯æä»¬æä½¿ç¨çBSDçæå£°æå容ï¼
PostgreSQLæ°æ®åºç®¡çç³»ç»
é¨åçæï¼cï¼1996-2005ï¼PostgreSQL å¨çå¼åå°ç»ï¼é¨åçæï¼cï¼1994-1996
å å·å¤§å¦è£äº
ï¼Portions copyright (c) 1996-2005,PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of
Californiaï¼
å许为任ä½ç®ç使ç¨ï¼æ·è´ï¼ä¿®æ¹åååè¿ä¸ªè½¯ä»¶åå®çææ¡£è䏿¶åä»»ä½è´¹ç
¨ï¼ 并䏿 é¡»ç¾ç½²å æ­
¤è产ççè¯æï¼åææ¯ä¸é¢ççæå£°æåæ¬æ®µä»¥åä¸é¢ä¸¤æ®µæååºç°å¨æææ·è´ä¸ã
ï¼Permission to use, copy, modify, and distribute this software and
its documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all
copies.ï¼
å¨ä»»ä½æåµä¸ï¼å å·å¤§å¦é½ä¸æ¿æå ä½¿ç¨æ­
¤è½¯ä»¶åå¶ææ¡£è导è´ç对任ä½å½äºäººçç´æ¥çï¼
é´æ¥çï¼ç¹æ®çï¼éå çæèç¸ä¼´èççæåï¼åæ¬å©çæå¤±ç责任ï¼å³ä½¿å å·å¤§å­
¦å·²ç»å»ºè®®äºè¿äºæå¤±çå¯è½æ§æ¶ä¹æ¯å¦æ¤ã
ï¼IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA
HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.ï¼
å å·å¤§å¦æç¡®æ¾å¼ä»»ä½ä¿è¯ï¼åæ¬ä½ä¸å±éäºæä¸ç¹å®ç¨éçåä¸åå©ççéå«ä¿è¯ã
è¿éæä¾çè¿ä»½è½¯ä»¶æ¯åºäºâå½ä½æ¯âçåºç¡çï¼å èå å·å¤§å­
¦æ²¡æè´£ä»»æä¾ç»´æ¤ï¼æ¯æï¼æ´æ°ï¼å¢å¼ºæèä¿®æ¹çæå¡ã
ï¼THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.ï¼
1.4)PostgreSQL å¯ä»¥è¿è¡å¨åªäºæä½ç³»ç»å¹³å°ä¸ï¼
ä¸è¬è¯´æ¥ï¼ä»»ä½ç°å¨å¯¹ UNIX å¼å®¹çæä½ç³»ç»ä¹ä¸é½è½è¿è¡PostgreSQL
ãå¨å®è£æåéååºäºå叿¶ç»è¿æç¡®æµè¯çå¹³å°ã
PostgreSQlä¹å¯ä»¥ç´æ¥è¿è¡å¨åºäºå¾®è½¯Windows-NTçæä½ç³»ç»ï¼å¦Win2000
SP4ï¼WinXP å Win2003ï¼å·²å¶ä½å®æçå®è£åå¯ä»
http://pgfoundry.org/projects/pginstallerä¸è½½ï¼åºäºMSDOSçWindowsæä½ç³
»ç» ï¼Win95ï¼Win98ï¼WinMeï¼éè¦éè¿Cygwin模æç¯å¢è¿è¡PostgreSQLã
忶乿ä¸ä¸ªä¸ºNovell Netware 6å¼åççæ¬å¯ä»
http://forge.novell.comè·åï¼ä¸ºOS/2(eComStation)å¼åççæ¬å¯ä»
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F ä¸è½½ã
1.5) æä»åªéè½å¾å°PostgreSQLï¼
éè¿æµè§å¨å¯ä»http://www.postgresql.org/ftp/ä¸è½½ï¼ä¹å¯éè¿FTPï¼ä»
ftp://ftp.PostgreSQL.org/pub/ç«ç¹ä¸è½½ã
1.6) ææ°ççPostgreSQLæ¯ä»ä¹ï¼
PostgreSQL ææ°ççæ¬æ¯çæ¬ 8.2.1 ã
æä»¬è®¡åæ¯å¹´åå¸ä¸ä¸ªä¸»è¦åçº§çæ¬ï¼æ¯å 个æåå¸ä¸ä¸ªå°çæ¬ã
1.7) æä»åªéè½å¾å°å¯¹PostgreSQLçæ¯æï¼
PostgreSQL社åºéè¿é®ä»¶å表为å¶å¤§å¤æ°ç¨æ·æä¾å¸®å©ï¼è®¢éé®ä»¶å表ç主
ç«ç¹æ¯
http://www.postgresql.org/community/lists/ï¼ä¸è¬æåµä¸ï¼åå å¥General æ
Bugé®ä»¶å表æ¯ä¸ä¸ªè¾å¥½çå¼å§ã
主è¦çIRCé¢éæ¯å¨FreeNode(irc.freenode.net)ç#postgresqlï¼ä¸ºäºè¿ä¸æ­
¤é¢éï¼å¯ä»¥ä½¿ç¨UNIXç¨åºircï¼å¶æä»¤æ ¼å¼ï¼ irc -c '#postgresql'
"$USER" irc.freenode.net ï¼æè使ç¨å¶ä»IRC客æ·ç«¯ç¨åºã卿¤ç½ç»ä¸è¿å­
å¨ä¸ä¸ªPostgreSQLç西ççé¢é(#postgersql-es)åæ³è¯é¢é
(#postgresql-fr)ãåæ ·å°ï¼å¨EFNETä¸ä¹æä¸ä¸ªPostgreSQLç交æµé¢éã
坿ä¾å䏿¯æçå¬å¸å表å¯å¨http://techdocs.postgresql.org/companies.phpæµ
è§ã
1.8) æå¦ä½æäº¤ä¸ä¸ªBUGæ¥åï¼
å¯è®¿é®
http://www.postgresql.org/support/submitbugï¼å¡«åBug䏿¥è¡¨æ ¼å³å¯ï¼åæ
·ä¹å¯è®¿é®ftpç«ç¹ftp://ftp.PostgreSQL.org/pub/
æ£æ¥ææ æ´æ°çPostgreSQLçæ¬æè¡¥ä¸ã
éè¿ä½¿ç¨Bugæäº¤è¡¨æ ¼ææ¯åå¾PostgreSQLé®ä»¶å表çBugé叏伿以ä¸ä¹ä¸åå¤ï
¼
* ææäº¤å容䏿¯ä¸ä¸ªBugåå¶ä¸æ¯Bugçåå ã
* ææäº¤å容æ¯ä¸ä¸ªå·²ç¥çBugå¹¶ä¸å·²ç»å å¥TODOå¾å¤çä»»å¡å表ã
* ææäº¤çBugå·²å¨å½åçæ¬ä¸è¢«ä¿®æ£ã
* ææäº¤çBug已修æ£ä½å°æªå°è¡¥ä¸å å¥ç°å¨çåå¸è½¯ä»¶åã
* è¯·æ±æäº¤èæä¾æ´è¯¦ç»çä¿¡æ¯ï¼
+ æä½ç³»ç»
+ PostgreSQLçæ¬
+ å¯éç°Bugçæµè¯æ¡ä¾
+ è°è¯ä¿¡æ¯
+ è°è¯è·è¸ªè¾åº
* ææäº¤å容æ¯ä¸ä¸ªæ°Bugï¼å°æ§è¡ä»¥ä¸å·¥ä½ï¼
+ å建ä¸ä¸ªæ°è¡¥ä¸å¹¶å°å¶å å¥ä¸ä¸ä¸ªä¸»è¦çæ¬ææ¯å°çæ¹è¿çæ¬ä¸ã
+ æ¤Bugææ¶ä¸è½ä¿®æ£ï¼å°è¢«å è³TODOå¾å¤çä»»å¡å表ã
1.9) æå¦ä½äºè§£å·²ç¥ç BUG ææç¼ºçåè½ï¼
PostgreSQL æ¯æä¸ä¸ªæ©å±ç SQL:2003 çåéãåéæä»¬çTODO
å表ï¼äºè§£å·²ç¥Bugå表ãæç¼ºçåè½åå°æ¥çå¼å计åã
è¦æ±å¢å æ°åè½çç³è¯·é叏伿¶å°ä»¥ä¸ä¹ä¸çåå¤ï¼
* 该åè½å·²å å¥TODOå¾å¤çä»»å¡å表ã
* 该åè½ä¸æ¯å¿é¡»çï¼å 为ï¼
+ 宿¯ç°æçä¸ç¬¦åSQLæ åçæåè½çéå¤ã
+ 该åè½æ§ä¼å¤§å¤§å¢å 代ç ç夿ç¨åºï¼è带æ¥ç好夿¯å¾®ä¸è¶³éçã
+ 该åè½æ¯ä¸å®å¨ææ¯ä¸å¯é çã
* 该åè½å°è¢«å å¥TODOå¾å¤çä»»å¡å表ã
PostgreSQLä¸ä½¿ç¨Bugè·è¸ªç³»ç»ï¼å 为æä»¬åç°å¨é®ä»¶å表中
ç´æ¥åå¤ä»¥åä¿è¯TODOä»»å¡åè¡¨æ»æ¯å¤äºææ°ç¶æçæ¹å¼å·¥ä½æç伿´é«ä¸äºãäºå®ä
¸ï¼Bugä¸ä¼å¨æä»¬ç软件ä¸åå¨å¾é¿æ¶é´ï¼
对影åå¾å¤ç¨æ·çBug乿»æ¯å¾å¿«ä¼è¢«ä¿®æ£ãå¯ä¸è½æ¾å°æææ¹è¿ãæé«åä¿®æ­
£çå°æ¹æ¯CVSçæ¥å¿ä¿¡æ¯ï¼å³ä½¿æ¯å¨è½¯ä»¶æ°çæ¬çåå¸ä¿¡æ¯ä¸­
ä¹ä¸ä¼ååºæ¯ä¸å¤çè½¯ä»¶æ´æ°ã
1.10) è½å¤è·åçææ°ææ¡£æåªäºï¼
PostgreSQLåå«å¤§éçææ¡£ï¼ä¸»è¦æè¯¦ç»çåèæåï¼æå页åä¸äºçæµè¯ä¾åãåè§ /doc
ç®å½ï¼è¯æ³¨ï¼åºä¸º $PGHOME/docï¼ã
ä½ è¿å¯ä»¥å¨çº¿æµè§PostgreSQLçæåï¼å¶ç½åæ¯ï¼http://www.PostgreSQL.org/d
ocsã
æä¸¤æ¬å³äºPostgreSQLç书å¨çº¿æä¾ï¼å¨
http://www.PostgreSQL.org/docs/awbook.html å
http://www.commandprompt.com/ppbook/ ã 乿大éçPostgreSQL书ç±å¯ä¾è´­
ä¹°ï¼å¶ä¸æä¸ºæµè¡ç䏿¬æ¯ç±Korry Douglasç¼åçãå¨
http://techdocs.PostgreSQL.org/techdocs/bookreviews.phpä¸
䏿大éæå³PostgreSQL书ç±çç®ä»ã å¨
http://techdocs.PostgreSQL.org/䏿¶éäºæå³PostgreSQLç大鿿¯æç« ã
客æ·ç«¯çå½ä»¤è¡ç¨åºpsqlæä¸äºä»¥ \d
å¼å¤´çå½ä»¤ï¼å¯æ¾ç¤ºå³äºç±»åï¼æä½ç¬¦ï¼å½æ°ï¼èåçä¿¡æ¯ï¼ä½¿ç¨ \?
å¯ä»¥æ¾ç¤ºææå¯ç¨çå½ä»¤ã
æä»¬ç web ç«ç¹å嫿´å¤çææ¡£ã
1.11) æåºè¯¥ææ ·å¦ä¹ SQL ï¼
é¦åèèä¸è¿°æå°çä¸PostgreSQLç¸å³ç书ç±ï¼å¦å¤ä¸æ¬æ¯Teach Yourself SQL in
21 Days, Second Editionï¼å¶è¯¦ç»ä»ç»çç½åæ¯
http://members.tripod.com/er4ebus/sql/index.htmï¼
æä»¬ç许å¤ç¨æ·å欢The Practical SQL Handbookï¼ Bowman, Judith S.
ç¼åï¼Addison-Wesleyå¬å¸åºçï¼å¶ä»çå忬¢ The Complete Reference SQL,
Groff ç¼åï¼McGraw-Hillå¬å¸åºçã
å¨ä¸åç½åä¸ä¹æå¾å¥½çæç¨ï¼ä»ä»¬æ¯
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com.
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12)å¦ä½æäº¤è¡¥ä¸ææ¯å å¥å¼åéä¼ï¼
è¯¦è§ å¼å人å常è§é®é¢ (Developer's FAQ) ã
1.13)PostgreSQLåå¶ä»æ°æ®åºç³»ç»æ¯èµ·æ¥å¦ä½ï¼
è¯ä»·è½¯ä»¶æå¥½å ç§æ¹æ³ï¼åè½ï¼æ§è½ï¼å¯é æ§ï¼æ¯æåä»·æ ¼ã
åè½
PostgreSQL æ¥æå¤§ååç¨æ°æ®åºæå¤çåè½ï¼ä¾å¦ï¼äºå¡ï¼å­
æ¥è¯¢ï¼è§¦åå¨ï¼è§å¾ï¼å¤é®åè宿´æ§å夿çéå®çã
æä»¬è¿æä¸äºå®ä»¬æ²¡æçç¹æ§ï¼å¦ç¨æ·å®ä¹ç±»åï¼ç»§æ¿ï¼è§ååå¤çæ¬å¹¶è
¡æ§å¶ä»¥åå°éçäºç¨çã
æ§è½
PostgreSQLåå¶ä»åç¨å弿ºçæ°æ®åºå·æç±»ä¼¼çæ§è½ã对æäºå¤ç宿¯è¾å¿«
ï¼å¯¹å¶ä»ä¸äºå¤ç宿¯è¾æ¢ã ä¸å¶ä»æ°æ®åºç¸æ¯ï¼æä»¬çæ§è½ä¼å£é常å¨
+/- 10%ä¹é´ã
å¯é æ§
æä»¬é½ç¥éæ°æ®åºå¿é¡»æ¯å¯é çï¼å¦åå®å°±ä¸ç¹ç¨é½æ²¡æãæä»¬åªååå°åå¸
ç»è¿è®¤çæµè¯çï¼ç¼ºé·æå°ç稳å®ä»£ç ãæ¯ä¸ªçæ¬è³å°æä¸ä¸ªæç beta
æµè¯æ¶é´ï¼å¹¶ä¸æä»¬çåå¸å岿¾ç¤ºæä»¬å¯ä»¥æä¾ç¨³å®çï¼ç¢åºçï¼å¯ç¨ä
ºç产使ç¨ççæ¬ãæä»¬ç¸ä¿¡å¨è¿æ¹é¢æä»¬ä¸å¶ä»çæ°æ®åºè½¯ä»¶æ¯ç¸å½çã
æ¯æ
æä»¬çé®ä»¶å表æä¾ä¸ä¸ªé常大çå¼å人ååç¨æ·çç»ä»¥å¸®å©è§£å³æç¢°å
°çä»»ä½é®é¢ãæä»¬ä¸è½ä¿è¯æ»æ¯è½è§£å³é®é¢ï¼ç¸æ¯ä¹ä¸ï¼åç¨æ°æ®åºè½¯
ä»¶ä¹å¹¶ä¸æ¯æ»è½å¤æä¾è§£å³æ¹æ³ã
ç´æ¥ä¸å¼å人åï¼ç¨æ·ç¾¤ï¼æååæºç¨åºæ¥è§¦ä½¿PostgreSQLçæ¯ææ¯å¶ä»æ°
æ®åºè¿è¦å¥½ãè¿æä¸äºå䏿§çå¨é¢ææ¯æ¯æï¼å¯ä»¥ç»æä¾ç»é£äºéè¦ç人ãï¼
åé1.7 å°èï¼
ä»·æ ¼
æä»¬å¯¹ä»»ä½ç¨éé½åè´¹ï¼åæ¬åç¨åéåç¨ç®çã
ä½ å¯ä»¥ä¸å éå¶å°åä½ ç产åéå 奿们ç代ç ï¼é¤äºé£äºæä»¬å¨ä¸é¢çç
æå£°æé声æç BSDçæä¹å¤çå容ã
1.14) PostgreSQLå¯ä»¥å¤çæè¿å个å½å®¶å¤æ¶å¶çååå?
PostgreSQL 8.0ä¹åççæ¬æ¯ä½¿ç¨æä½ç³»ç»ä¸­
çæ¶åºæ°æ®åºæ¥å¤ç夿¶å¶çä¿¡æ¯ï¼èª8.0çå以åççæ¬PostgreSQLä¼èªèº«å«æææ°çæ
¶åºä¿¡æ¯ã
_________________________________________________________________
ç¨æ·å®¢æ·ç«¯é®é¢
2.1) æä»¬å¯ä»¥ç¨ä»ä¹è¯è¨åPostgreSQLæäº¤éï¼
PostgreSQL(缺çæåµ)åªå®è£æCåååµå¼Cçæ¥å£ï¼å¶ä»çæ¥å£é½æ¯ç¬ç«ç项ç®ï¼è½å¤
åå«ä¸è½½ï¼è¿äºæ¥å£é¡¹ç®ç¬ç«ç好å¤
æ¯ä»ä»¬å¯ä»¥æåèªçåå¸è®¡åååèªç¬ç«çå¼åç»ã
ä¸äºç¼ç¨è¯­
è¨å¦PHPé½æè®¿é®PostgreSQLçæ¥å£ï¼PerlãTCLãPython以åå¾å¤å¶ä»è¯è¨çæ¥å£å¨
http://gborg.postgresql.orgç½ç«ä¸çDrivers/Interfaceså°è坿¾å°ï¼
å¹¶ä¸éè¿Internetå¾å®¹ææç´¢å°ã
2.2) æä»ä¹å·¥å·å¯ä»¥æPostgreSQLç¨äº Web 页é¢ï¼
ä¸ä¸ªä»ç»ä»¥æ°æ®åºä¸ºåå°çæºä¸éçç«ç¹æ¯ï¼http://www.webreview.comã
å¯¹äº Web éæï¼PHP æ¯ä¸ä¸ªæå¥½çæ¥å£ãå®å¨http://www.php.net/ã
对äºå¤æçä»»å¡ï¼å¾å¤äººéç¨ Perl æ¥å£å 使ç¨CGI.pmçDBD::Pg æ mod_perl ã
2.3)PostgreSQLæ¥æå¾å½¢ç¨æ·çé¢åï¼
åä¸ç¨æ·ææ¯å¼æºå¼å人åè½æ¾å°å¾å¤çæå³PostgreSQLçGUIå¾å½¢å·¥å·è½¯ä»¶ï¼å¨
PostgreSQLç¤¾åºææ¡£æä¸ä¸ªè¯¦ç»çå表ã
_________________________________________________________________
ç³»ç»ç®¡çé®é¢
3.1)æææ ·è½æPostgreSQLè£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼
å¨è¿è¡ configure æ¶å ä¸ --prefix é项ã
3.2) æå¦ä½æ§å¶æ¥èªå¶ä»çµèçè¿æ¥ï¼
缺çæåµä¸ï¼PostgreSQLåªå许æ¥èªæ¬æºä¸éè¿ unix å奿¥åæTCP/IPæ¹å¼çè¿æ¥ã
ä½ åªæå¨ä¿®æ¹äºéç½®æä»¶postgresql.conf中
çlisten_addressesï¼ä¸ä¹å¨éç½®æä»¶$PGDATA/pg_hba.conf䏿å¼äº
åºäºè¿ç¨çµèï¼ host-based
ï¼ç身份认è¯ï¼å¹¶éæ°å¯å¨PostgreSQLï¼å¦åå¶ä»çµèæ¯ä¸è½ä¸ä½ çPostgreSQL
æå¡å¨è¿è¡è¿æ¥çã
3.3) æææ ·è°æ´æ°æ®åºå¼æä»¥è·å¾æ´å¥½çæ§è½ï¼
æä¸ä¸ªä¸»è¦æ¹é¢å¯ä»¥æåPostgreSQLçæ½è½ã
æ¥è¯¢æ¹å¼çåå
è¿ä¸»è¦æ¶åä¿®æ¹æ¥è¯¢æ¹å¼ä»¥è·åæ´å¥½çæ§è½:
+ å建索å¼ï¼åæ¬è¡¨è¾¾å¼åé¨åç´¢å¼ï¼
+ 使ç¨COPYè¯å¥ä»£æ¿å¤ä¸ªInsertè¯å¥ï¼
+ å°å¤ä¸ªSQLè¯å¥ç»æä¸ä¸ªäºå¡ä»¥åå°æäº¤äºå¡çå¼éï¼
+ ä»ä¸ä¸ªç´¢å¼ä¸æå夿¡è®°å½æ¶ä½¿ç¨CLUSTERï¼
+ ä»ä¸ä¸ªæ¥è¯¢ç»æä¸ååºé¨åè®°å½æ¶ä½¿ç¨LIMITï¼
+ 使ç¨é¢ç¼è¯å¼æ¥è¯¢ï¼Prepared Query)ï¼
+ 使ç¨ANALYZEä»¥ä¿æç²¾ç¡®çä¼åç»è®¡ï¼
+ å®æä½¿ç¨ VACUUM æ pg_autovacuum
+ è¿è¡å¤§éæ°æ®æ´æ¹æ¶åå é¤ç´¢å¼ï¼ç¶åé建索å¼ï¼
æå¡å¨çéç½®
éç½®æä»¶postgres.conf中
çå¾å¤è®¾ç½®é½ä¼å½±åæ§è½ï¼ææåæ°çå表å¯è§ï¼
管çåæå/æ°æ®åºæå¡å¨è¿è¡ç¯å¢/æ°æ®åºæå¡å¨è¿è¡éç½®ï¼
æå³åæ°çè§£éå¯è§ï¼http://www.varlena.com/varlena/GeneralBits/Tid
bits/annotated_conf_e.html å
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.htmlã
硬件çéæ©
è®¡ç®æºç¡¬ä»¶å¯¹æ§è½çå½±å坿µè§
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde
x.html å http://www.powerpostgresql.com/PerfList/ã
3.4)PostgreSQLéå¯ä»¥è·å¾ä»ä¹æ ·çè°è¯ç¹æ§ï¼
PostgreSQL æå¾å¤ç±»ä¼¼ log_*
çæå¡å¨éç½®åéå¯ç¨äºæ¥è¯¢çæå°åè¿ç¨ç»è®¡ï¼èè¿äºå·¥ä½å¯¹è°è¯åæ§è½æµè¯å¾æå¸
®å©ã
3.5) 为ä»ä¹å¨è¯å¾è¿æ¥æ¶æ¶å°âSorry, too many
clientsï¼å·²æå¤ªå¤ç¨æ·è¿æ¥ï¼âæ¶æ¯ï¼
è¿è¡¨ç¤ºä½ 已达å°ç¼ºç100个并ååå°è¿ç¨æ°çéå¶ï¼ä½ éè¦éè¿ä¿®æ¹postgres
ql.confæä»¶ä¸çmax_connections弿¥
å¢å postmasterçåå°å¹¶åå¤çæ°ï¼ä¿®æ¹åééæ°å¯å¨postmasterã
3.6)PostgreSQLçå级è¿ç¨æåªäºå容 ï¼
PostgreSQL å¼åç»å¯¹æ¯æ¬¡å°çæ¬çå级主è¦åªåäºä¸äºBugä¿®æ£å·¥ä½ï¼å æ¤ä»
7.4.8 åçº§å° 7.4.9 ä¸éè¦ dump å restoreï¼ä»éè¦åæ­
¢æ°æ®åºæå¡å¨ï¼å®è£æ´æ°åç软件åï¼ç¶åé坿å¡å¨å³å¯ã
ææPostgreSQLçç¨æ·åºè¯¥å¨ææ¥è¿ï¼ä½ æä½¿ç¨çä¸»çæ¬ï¼çå°æ¹è¿çæ¬åå¸å°½å¿«åç
º§ãå°½ç®¡æ¯æ¬¡å级å¯è½é½æä¸ç¹é£é©ï¼PostgreSQLçå°æ¹è¿çä»ä»æ¯è®¾è®¡ç¨æ¥ä
¿®æ­
£ä¸äºBugçï¼ä»£ç æ¹å¨è¾å°ï¼æä»¥é£é©è¿æ¯å¾å°çãPostgreSQL社åºè®¤ä¸ºä¸è¬æ
åµä¸ä¸å级çé£é©è¿æ¯å¤äºå级çã
ä¸»çæ¬çå级ï¼ä¾å¦ä» 7.3 å° 7.4ï¼é常ä¼ä¿®æ¹ç³»ç»è¡¨åæ°æ®è¡¨çå鍿 ¼å¼ã
è¿äºæ¹åä¸è¬æ¯è¾å¤æï¼å æ¤æä»¬ä¸ç»´ææ°æ®æä»¶çååå¼å®¹æ§ãå æ¤ä»èçæ¬ä¸­
è¿è¡æ°æ®å¯¼åºï¼dumpï¼/ç¶å卿°çæ¬ä¸­
è¿è¡æ°æ®å¯¼å¥ï¼reloadï¼å¯¹ä¸»çæ¬çå级æ¯å¿é¡»çã
3.7)(使ç¨PostgreSQL)æéè¦ä½¿ç¨ä»ä¹è®¡ç®æºç¡¬ä»¶ ï¼
ç±äºè®¡ç®æºç¡¬ä»¶å¤§å¤æ°æ¯å¼å®¹çï¼äººä»¬æ»æ¯å¾åäºç¸ä¿¡ææè®¡ç®æºç¡¬ä»¶è
´¨é乿¯ç¸åçãäºå®ä¸ä¸æ¯ï¼ ECC RAMï¼å¸¦å¥å¶æ ¡éªçååï¼ï¼SCSI
ï¼ç¡¬çï¼åä¼è´¨çä¸»æ¿æ¯ä¸äºä¾¿å®è´§è¦æ´å å¯é ä¸å·ææ´å¥½çæ§è½ãPostgreSQL
å ä¹å¯ä»¥è¿è¡å¨ä»»ä½ç¡¬ä»¶ä¸ï¼
ä½å¦æå¯é æ§åæ§è½å¯¹ä½ çç³»ç»å¾éè¦ï¼ä½ å°±éè¦å¨é¢çç ç©¶ä¸ä¸ä½ ç硬件éç
½®äºã卿们çé®ä»¶å表ä¸ä¹æå³äº 硬件éç½®åæ§ä»·æ¯ç讨论ã
_________________________________________________________________
æä½é®é¢
4.1) å¦ä½åªéæ©ä¸ä¸ªæ¥è¯¢ç»æç头å è¡ï¼ææ¯éæºçä¸è¡ï¼
å¦æä½ åªæ¯è¦æåå è¡æ°æ®ï¼å¹¶ä¸ä½ 卿§è¡æ¥è¯¢ä¸­
ç¥éç¡®åçè¡æ°ï¼ä½ å¯ä»¥ä½¿ç¨LIMITåè½ã 妿æä¸ä¸ªç´¢å¼ä¸ ORDER BY中
çæ¡ä»¶å¹éï¼PostgreSQL å¯è½å°±åªå¤çè¦æ±çå¤´å æ¡è®°å½ï¼
ï¼å¦åå°å¯¹æ´ä¸ªæ¥è¯¢è¿è¡å¤çç´å°çæéè¦çè¡ï¼ã妿卿§è¡æ¥è¯¢åè½æ¶ä¸ç¥éç¡®å
çè®°å½æ°ï¼ å¯ä½¿ç¨æ¸¸æ (cursor)åFETCHåè½ã
å¯ä½¿ç¨ä»¥ä¸æ¹æ³æåä¸è¡éæºè®°å½çï¼
SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;
4.2)
å¦ä½æ¥ç表ãç´¢å¼ãæ°æ®åºä»¥åç¨æ·çå®ä¹ï¼å¦ä½æ¥çpsqléç¨å°çæ¥è¯¢æä»¤å¹¶æ¾ç¤ºå®ä»¬
ï¼
å¨psqlä¸ä½¿ç¨ \dt å½ä»¤æ¥æ¾ç¤ºæ°æ®è¡¨çå®ä¹ï¼è¦äºè§£psql中
ç宿´å½ä»¤å表å¯ä½¿ç¨\? ï¼å¦å¤ï¼ä½ ä¹å¯ä»¥é读 psql çæºä»£ç
æä»¶pgsql/src/bin/psql/describe.cï¼å®åæ¬ä¸ºçæpsqlåææ å½ä»¤çè¾åºçææ SQL
å½ä»¤ãä½ è¿å¯ä»¥å¸¦ -E é项å¯å¨ psqlï¼ è¿æ ·å®å°æå°åºä½ å¨psql中
æç»åºçå½ä»¤æ§è¡æ¶çåé¨å®é使ç¨çSQLæ¥è¯¢è¯­
å¥ãPostgreSQL乿ä¾äºä¸ä¸ªå¼å®¹SQLçINFORMATION SCHEMAæ¥å£ï¼
ä½ å¯ä»¥ä»è¿éè·åå³äºæ°æ®åºçä¿¡æ¯ã
å¨ç³»ç»ä¸ä¹æä¸äºä»¥pg_ æå¤´çç³»ç»è¡¨ä¹æè¿°äºè¡¨çå®ä¹ã
ä½¿ç¨ psql -l æä»¤å¯ä»¥ååºææçæ°æ®åºã
ä¹å¯ä»¥æµè§ä¸ä¸
pgsql/src/tutorial/syscat.sourceæä»¶ï¼å®å举äºå¾å¤å¯ä»æ°æ®åºç³»ç»è¡¨ä¸
è·åä¿¡æ¯çSELECTè¯æ³ã
4.3) å¦ä½æ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åï¼
å¨8.0çæ¬éæ´æ¹ä¸ä¸ªåæ®µçæ°æ®ç±»åå¾å®¹æï¼å¯ä½¿ç¨ ALTER TABLE ALTER
COLUMN TYPE ã
å¨ä»¥åççæ¬ä¸ï¼å¯ä»¥è¿æ ·åï¼
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;
ä½ ç¶åå¯ä»¥ä½¿ç¨VACUUM FULL tab æä»¤æ¥ä½¿ç³»ç»æ¶åæ ææ°æ®æå ç¨ç空é´ã
4.4) åæ¡è®°å½ï¼å个表ï¼åä¸ªæ°æ®åºçæå¤§éå¶æ¯å¤å°ï¼
ä¸é¢æ¯ä¸äºéå¶ï¼
åä¸ªæ°æ®åºæå¤§å°ºå¯¸ï¼ æ éå¶ï¼å·²å卿 32TB çæ°æ®åºï¼
å个表çæå¤§å°ºå¯¸ï¼ 32 TB
ä¸è¡è®°å½çæå¤§å°ºå¯¸ï¼ 1.6 TB
ä¸ä¸ªå段çæå¤§å°ºå¯¸? 1 GB
ä¸ä¸ªè¡¨éæå¤§è¡æ°ï¼ æ éå¶
ä¸ä¸ªè¡¨éæå¤§åæ°ï¼ 250-1600 ï¼ä¸åç±»åæå³ï¼
ä¸ä¸ªè¡¨éçæå¤§ç´¢å¼æ°éï¼ æ éå¶
å½ç¶ï¼å®é䏿²¡æçæ£çæ éå¶ï¼è¿æ¯è¦åå¯ç¨ç£ç空é´ãå¯ç¨åå/交æ¢åºçå¶çº¦ã
äºå®ä¸ï¼å½ä¸è¿°è¿äºæ°å¼åå¾å¼å¸¸å°å¤§æ¶ï¼ç³»ç»æ§è½ä¹ä¼åå¾å¤§å½±åã
å表çæå¤§å¤§å° 32 TB
ä¸éè¦æä½ç³»ç»å¯¹å个æä»¶ä¹éè¿ä¹å¤§çæ¯æã大表ç¨å¤ä¸ª 1 GB çæä»¶å­
å¨ï¼å æ¤æä»¶ç³»ç»å¤§å°çéå¶æ¯ä¸éè¦çã
å¦æç¼ºççå大å°å¢é¿å° 32K ï¼æå¤§çå表大å°åæå¤§åæ°è¿å¯ä»¥å¢å å°ååã
æä¸ä¸ªéå¶å°±æ¯ä¸è½å¯¹å¤§å°å¤äº2000å­
èçåå建索å¼ã幸è¿å°æ¯è¿æ ·çç´¢å¼å¾å°ç¨å°ãéè¿å¯¹å¤å­
èåçå容è¿è¡MD5åç¨è¿ç®ç»æè¿è¡å½æ°ç´¢å¼å¯å¯¹åçå¯ä¸æ§å¾å°ä¿è¯ï¼
å¹¶ä¸å¨ææ£ç´¢å许对åä¸çåè¯è¿è¡æç´¢ã
4.5) åå¨ä¸ä¸ªå¸åçææ¬æä»¶éçæ°æ®éè¦å¤å°ç£ç空é´ï¼
ä¸ä¸ª Postgres æ°æ®åºï¼å­
å¨ä¸ä¸ªææ¬æä»¶ï¼æå ç¨çç©ºé´æå¤å¯è½éè¦ç¸å½äºè¿ä¸ªææ¬æä»¶èªèº«å¤§å°5åçç£
ç空é´ã
ä¾å¦ï¼å设æä¸ä¸ª 100,000 è¡çæä»¶ï¼æ¯è¡æä¸ä¸ªæ´æ°åä¸ä¸ªææ¬æè¿°ã
åè®¾ææ¬ä¸²çå¹³åé¿åº¦ä¸º20åèãææ¬æä»¶å ç¨ 2.8 MBãå­
æ¾è¿äºæ°æ®çPostgreSQLæ°æ®åºæä»¶å¤§çº¦æ¯ 6.4 MB:
28 åè: æ¯è¡ç头ï¼å¤§çº¦å¼ï¼
24 åè: ä¸ä¸ªæ´æ°ååæ®µåä¸ä¸ªææ¬ååæ®µ
+ 4 åè: 页é¢åæååç»çæé
----------------------------------------
56 åèæ¯è¡
PostgreSQL æ°æ®é¡µç大尿¯ 8192 åè (8 KB)ï¼åï¼
8192 åèæ¯é¡µ
------------------- = 146 è¡/æ°æ®é¡µï¼åä¸åæ´ï¼
56 åèæ¯è¡
100000 æ°æ®è¡
-------------------- = 685 æ°æ®é¡µï¼åä¸åæ´ï¼
146 è¡/æ°æ®é¡µ
685 æ°æ®é¡µ * 8192 åè/页 = 5,611,520 åèï¼5.6 MBï¼
ç´¢å¼ä¸éè¦è¿ä¹å¤çé¢å¤æ¶èï¼ä½ä¹ç¡®å®åæ¬è¢«ç´¢å¼çæ°æ®ï¼å æ­
¤å®ä»¬ä¹å¯è½å¾å¤§ã
空å¼NULLåæ¾å¨ä½å¾ä¸ï¼å æ¤å ç¨å¾å°ç空é´ã
4.6) 为ä»ä¹æçæ¥è¯¢å¾æ¢ï¼ä¸ºä»ä¹è¿äºæ¥è¯¢æ²¡æå©ç¨ç´¢å¼ï¼
å¹¶éæ¯ä¸ªæ¥è¯¢é½ä¼èªå¨ä½¿ç¨ç´¢å¼ãåªæå¨è¡¨ç大å°è¶è¿ä¸ä¸ªæå°å¼ï¼å¹¶ä¸æ¥
询åªä¼éä¸è¡¨ä¸è¾å°æ¯ä¾çè®°å½æ¶æä¼éç¨ç´¢å¼ã
è¿æ¯å ä¸ºç´¢å¼æ«æå¼èµ·çéå³ç£çååå¯è½æ¯ç´æ¥å°è¯»å表ï¼é¡ºåºæ«æï¼æ´æ¢ã
为äºå¤æ­
æ¯å¦ä½¿ç¨ç´¢å¼ï¼PostgreSQLå¿é¡»è·å¾æå³è¡¨çç»è®¡å¼ãè¿äºç»è®¡å¼å¯ä»¥ä½¿ç
¨ VACUUM ANALYZEï¼æ ANALYZE è·å¾ã 使ç¨ç»è®¡å¼ï¼ä¼åå¨ç¥é表中
æå¤å°è¡ï¼å°±è½å¤æ´å¥½å°å¤ææ¯å¦å©ç¨ç´¢å¼ã
ç»è®¡å¼å¯¹ç¡®å®ä¼åçè¿æ¥é¡ºåºåè¿æ¥æ¹æ³ä¹å¾æç¨ãå¨è¡¨çå容åçååæ¶ï¼åºå®æè¿
è¡ç»è®¡å¼çæ´æ°æ¶éã
ç´¢å¼é常ä¸ç¨äº ORDER BY
ææ§è¡è¿æ¥ã对ä¸ä¸ªå¤§è¡¨ç䏿¬¡é¡ºåºæ«æåå䏿¬¡æåºé常æ¯ç´¢å¼æ«æè¦å¿«ãç¶
èï¼å¦æå° LIMIT å ORDER BY
ç»åå¨ä¸èµ·ä½¿ç¨çè¯ï¼é常å°ä¼ä½¿ç¨ç´¢å¼ï¼å ä¸ºè¿æ¶ä»è¿å表中
çä¸å°é¨åè®°å½ã
å¦æä½ ç¡®ä¿¡PostgreSQLçä¼åå¨ä½¿ç¨é¡ºåºæ«ææ¯ä¸æ£ç¡®çï¼ä½ å¯ä»¥ä½¿ç¨SET
enable_seqscan TO 'off'æä»¤æ¥å³éé¡ºåºæ«æï¼
ç¶å忬¡è¿è¡æ¥è¯¢ï¼ä½ å°±å¯ä»¥çåºä½¿ç¨ä¸ä¸ªç´¢å¼æ«ææ¯å¦ç¡®å®è¦å¿«ä¸äºã
å½ä½¿ç¨éé符æä½ï¼ä¾å¦ LIKE æ ~ æ¶ï¼ç´¢å¼åªè½å¨ç¹å®çæåµä¸ä½¿ç¨ï¼
* å符串çå¼å§é¨åå¿é¡»æ¯æ®éå符串ï¼ä¹å°±æ¯è¯´ï¼
+ LIKE 模å¼ä¸è½ä»¥ % æå¤´ã
+ ~ ï¼æ£å表达å¼ï¼æ¨¡å¼å¿é¡»ä»¥ ^ æå¤´ã
* å符串ä¸è½ä»¥å¹éå¤ä¸ªåç¬¦çæ¨¡å¼ç±»æå¤´ï¼ä¾å¦ [a-e]ã
* 大å°åæ å³çæ¥æ¾ï¼å¦ ILIKE å ~* çä¸ä½¿ç¨ç´¢å¼ï¼ä½å¯ä»¥ç¨ 4.8
èæè¿°ç表达å¼ç´¢å¼ã
* å¨å initdb æ¶å¿é¡»éç¨ç¼ºççæ¬å°è®¾ç½® C
localeï¼å 为系ç»ä¸å¯è½ç¥éå¨éC localeæåµæ¶ä¸ä¸ä¸ªæå¤§å符æ¯ä»ä¹ã
å¨è¿ç§æåµä¸ï¼ä½ å¯ä»¥å建ä¸ä¸ªç¹æ®çtext_pattern_opsç´¢å¼æ¥ç¨äºLIKE
çç´¢å¼ã
å¨8.0ä¹åççæ¬ä¸­
ï¼é¤éè¦æ¥è¯¢çæ°æ®ç±»ååç´¢å¼çæ°æ®ç±»åç¸å¹éï¼å¦åç´¢å¼ç»å¸¸æ¯æªè¢«ç¨å°ï¼ç
¹å«æ¯å¯¹int2,int8åæ°å¼åçç´¢å¼ã
4.7) æå¦ä½æè½çå°æ¥è¯¢ä¼å卿¯ææ ·è¯ä¼°å¤çæçæ¥è¯¢ï¼
åè EXPLAIN æå页ã
4.8) æææ ·åæ£åè¡¨è¾¾å¼æç´¢å大å°åæ å³çæ­
£åè¡¨è¾¾å¼æ¥æ¾ï¼ææ ·å©ç¨ç´¢å¼è¿è¡å¤§å°åæ 峿¥æ¾ï¼
æä½ç¬¦ ~ å¤çæ£å表达å¼å¹éï¼è ~* å¤ç大å°åæ å³çæ­
£å表达å¼å¹éã大å°åæ å³ç LIKE åç§æä¸º ILIKEã
大å°åæ å³çç弿¯è¾é常ååï¼
SELECT *
FROM tab
WHERE lower(col) = 'abc';
è¿æ ·å°ä¸ä¼ä½¿ç¨æ åçç´¢å¼ã使¯å¯ä»¥å建ä¸ä¸ªå¨è¿ç§æåµä¸ä½¿ç¨ç表达å¼ç
´¢å¼:
CREATE INDEX tabindex ON tab (lower(col));
妿ä¸è¿°ç´¢å¼å¨å建æ¶å å¥UNIQUE约æï¼è½ç¶ç´¢å¼å段èªèº«å容å¯ä»¥å­
å¨å¤§å°åä¸éçå容ï¼ä½å¦ææUNIQUE约æåï¼è¿äºå容ä¸è½ä»ä»æ¯å¤§å°åä¸åï¼å¦åä
¼é æå²çªï¼ã为äºä¿è¯ä¸åçè¿ç§æåµï¼å¯ä»¥ä½¿ç¨CHECKçº¦ææ¡ä»¶ææ¯è§¦åå¨å¨å½
奿¶è¿è¡éå¶ã
4.9) å¨ä¸ä¸ªæ¥è¯¢éï¼æææ ·æ£æµä¸ä¸ªå段æ¯å¦ä¸º NULL ï¼æå¦ä½æè½åç¡®æåºèä¸è®ºæå­
段æ¯å¦å« NULL å¼ï¼
ç¨ IS NULL å IS NOT NULL æµè¯è¿ä¸ªå段ï¼å·ä½æ¹æ³å¦ä¸ï¼
SELECT *
FROM tab
WHERE col IS NULL;
为äºè½å¯¹å« NULLåæ®µæåºï¼å¯å¨ ORDER BY æ¡ä»¶ä¸ä½¿ç¨ IS NULLå IS NOT
NULL ä¿®é¥°ç¬¦ï¼æ¡ä»¶ä¸ºç true å°æ¯æ¡ä»¶ä¸ºåfalse æå¨åé¢ï¼ä¸é¢çä¾å­
å°±ä¼å°å« NULL çè®°å½æå¨ç»æçä¸é¢é¨åï¼
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
4.10) åç§å符类åä¹é´æä»ä¹ä¸åï¼
ç±»å åé¨åç§° 说æ
VARCHAR(n) varchar æå®äºæå¤§é¿åº¦ï¼åé¿å­
符串ï¼ä¸è¶³å®ä¹é¿åº¦çé¨åä¸è¡¥é½
CHAR(n) bpchar å®é¿å符串ï¼å®éæ°æ®ä¸è¶³å®ä¹é¿åº¦æ¶ï¼ä»¥ç©ºæ ¼è¡¥é½
TEXT text 没æç¹å«çä¸ééå¶ï¼ä»åè¡çæå¤§é¿åº¦éå¶ï¼
BYTEA bytea åé¿åèåºåï¼ä½¿ç¨NULLåç¬¦ä¹æ¯å许çï¼
"char" char å个å符
å¨ç³»ç»è¡¨åå¨ä¸äºé误信æ¯éä½ å°çå°åé¨åç§°ã
ä¸é¢æåçååç§ç±»åæ¯"varlena"ï¼åé¿ï¼ç±»åï¼ä¹å°±æ¯è¯´ï¼å¼å¤´çå个å­
èæ¯é¿åº¦ï¼åé¢ææ¯æ°æ®ï¼ã äºæ¯å®éå ç¨çç©ºé´æ¯å£°æç大å°è¦å¤ä¸äºã
ç¶èè¿äºç±»åå¦å®ä¹å¾é¿æ¶é½å¯ä»¥è¢«å缩åå¨ï¼å æ­
¤ç£ç空é´ä¹å¯è½æ¯é¢æ³çè¦å°ã
VARCHAR(n) å¨åå¨éå¶äºæå¤§é¿åº¦çåé¿åç¬¦ä¸²æ¯æå¥½çã TEXT éç¨äºå­
卿大å¯è¾¾ 1Gå·¦å³ä½æªå®ä¹éå¶é¿åº¦çå符串ã
CHAR(n) æéåäºåå¨é¿åº¦ç¸åçå符串ã CHAR(n)伿 ¹æ®æç»å®çå­
段é¿åº¦ä»¥ç©ºæ ¼è¡¥è¶³ï¼ä¸è¶³çåæ®µå容ï¼ï¼ è VARCHAR(n) åªå­
卿ç»å®çæ°æ®å容ã BYTEA ç¨äºåå¨äºè¿å¶æ°æ®ï¼å°¤å¶æ¯åå« NULL å­
èçå¼ãè¿äºç±»åå·æå·®ä¸å¤çæ§è½ã
4.11.1) æææ ·å建ä¸ä¸ªåºåå·ææ¯èªå¨éå¢çåæ®µï¼
PostgreSQL æ¯æ SERIAL æ°æ®ç±»åãï¼å­
段å®ä¹ä¸ºSERIALåï¼å°èªå¨å建ä¸ä¸ªåºåçæå¨ï¼ä¾å¦ï¼
CREATE TABLE person (
id SERIAL,
name TEXT
);
ä¼èªå¨è½¬æ¢ä¸ºä»¥ä¸SQLè¯å¥ï¼
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
åè create_sequence æå页è·åå³äºåºåçæå¨çæ´å¤ä¿¡æ¯ã
4.11.2) æå¦ä½è·å¾ä¸ä¸ªæå¥çåºåå·çå¼ï¼
ä¸ç§æ¹æ³æ¯å¨æå¥ä¹ååç¨å½æ° nextval() ä»åºåå¯¹è±¡éæ£ç´¢åºä¸ä¸ä¸ª SERIAL
å¼ï¼ç¶ååç¨æ¤å¼ç²¾ç¡®å°æå¥ãä½¿ç¨ 4.11.1 éçä¾è¡¨ï¼å¯ç¨ä¼ªç è¿æ ·æè¿°ï¼
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
è¿æ ·è¿è½å¨å¶ä»æ¥è¯¢ä¸ä½¿ç¨åæ¾å¨ new_id éçæ°å¼ï¼ä¾å¦ï¼ä½ä¸ºåç§ person
表çå¤é®ï¼ã 注æèªå¨å建ç SEQUENCE 对象çåç§°å°ä¼æ¯
<table>_<serialcolumn>_seqï¼ è¿é table å serialcolumn
å嫿¯ä½ ç表çåç§°åä½ ç SERIAL åæ®µçåç§°ã
类似çï¼å¨ SERIAL 对象缺çæå¥åä½ å¯ä»¥ç¨å½æ° currval() æ£ç´¢åèµå¼ç
SERIAL å¼ï¼ä¾å¦ï¼
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
4.11.3) åæ¶ä½¿ç¨ currval() ä¼å¯¼è´åå¶ä»ç¨æ·çå²çªæåµåï¼
ä¸ä¼ãcurrval() è¿åçæ¯ä½ æ¬æ¬¡ä¼è¯è¿ç¨æèµçå¼è䏿¯ææç¨æ·çå½åå¼ã
4.11.4) 为ä»ä¹ä¸å¨äºå¡å¼å¸¸ä¸æ¢åéç¨åºåå·å¢ï¼ä¸ºä»ä¹å¨åºåå·å段çåå¼ä¸åå¨é´æ­
å¢ï¼
ä¸ºäºæé«å¹¶åæ§ï¼åºåå·å¨éè¦çæ¶åèµäºæ­
£å¨è¿è¡çäºå¡ï¼å¹¶ä¸å¨äºå¡ç»æä¹åä¸è¿è¡éå®ï¼ è¿å°±ä¼å¯¼è´å¼å¸¸ä¸­
æ¢çäºå¡åï¼åºåå·ä¼åºç°é´éã
4.12) ä»ä¹æ¯ OID ï¼ä»ä¹æ¯ CTID ï¼
PostgreSQL
éåå»ºçæ¯ä¸è¡è®°å½é½ä¼è·å¾ä¸ä¸ªå¯ä¸çOIDï¼é¤éå¨å建表æ¶ä½¿ç¨WITHOUT
OIDSé项ã OIDå建æ¶ä¼èªå¨çæä¸ä¸ª4åèçæ´æ°ï¼ææ OID
å¨ç¸åºPostgreSQLæå¡å¨ä¸åæ¯å¯ä¸çã ç¶èï¼å®å¨è¶è¿40亿æ¶å°æº¢åºï¼ OIDæ­
¤åä¼åºç°éå¤ãPostgreSQL å¨å®çåé¨ç³»ç»è¡¨éä½¿ç¨ OID å¨è¡¨ä¹é´å»ºç«èç³»ã
å¨ç¨æ·çæ°æ®è¡¨ä¸ï¼æå¥½æ¯ä½¿ç¨SERIAlæ¥ä»£æ¿OID
å 为SERIALåªè¦ä¿è¯å¨å个表中
çæ°å¼æ¯å¯ä¸çå°±å¯ä»¥äºï¼è¿æ ·å®æº¢åºçå¯è½æ§å°±é常å°äºï¼
SERIAL8å¯ç¨æ¥ä¿å8åèçåºåæ°å¼ã
CTID ç¨äºæ è¯å¸¦çæ°æ®åï¼å°åï¼åï¼ååï¼åç§»çç¹å®çç©çè¡ã CTID
å¨è®°å½è¢«æ´æ¹æéè½½ååçæ¹åãç´¢å¼æ°æ®ä½¿ç¨å®ä»¬æåç©çè¡ã
4.13) 为ä»ä¹ææ¶å°é误信æ¯âERROR: Memory exhausted in AllocSetAlloc()âï¼
è¿å¾å¯è½æ¯ç³»ç»çèæååç¨åäºï¼æèåæ ¸å¯¹æäºèµæºæè¾ä½çéå¶å¼ãå¨å¯å¨
postmaster ä¹åè¯è¯ä¸é¢çå½ä»¤ï¼
ulimit -d 262144
limit datasize 256m
åå³äºä½ ç¨ç
shellï¼ä¸é¢å½ä»¤åªæä¸æ¡è½æåï¼ä½æ¯å®å°æä½ çè¿ç¨æ°æ®æ®µéå¶è®¾å¾æ¯è¾é«ï¼
å èä¹è®¸è½è®©æ¥è¯¢å®æãè¿æ¡å½ä»¤åºç¨äºå½åè¿ç¨ï¼ä»¥åææå¨è¿æ¡å½ä»¤è¿è¡ååå
»ºçåè¿ç¨ã
å¦æä½ æ¯å¨è¿è¡SQL客æ·ç«¯æ¶å 为åå°è¿åäºå¤ªå¤çæ°æ®èåºç°é®é¢ï¼è¯·å¨è¿è¡
客æ·ç«¯ä¹åæ§è¡ä¸è¿°å½ä»¤ã
4.14) æå¦ä½æè½ç¥éæè¿è¡çPostgreSQLççæ¬ï¼
ä» psql éï¼è¾å¥ SELECT version();æä»¤ã
4.15) æå¦ä½å建ä¸ä¸ªç¼ºç弿¯å½åæ¶é´çåæ®µï¼
ä½¿ç¨ CURRENT_TIMESTAMPï¼
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) æææ ·è¿è¡ outer join ï¼å¤è¿æ¥ï¼ï¼
PostgreSQL éç¨æ åç SQL è¯æ³æ¯æå¤è¿æ¥ãè¿éæ¯ä¸¤ä¸ªä¾åï¼
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
ææ¯
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
è¿ä¸¤ä¸ªçä»·çæ¥è¯¢å¨ t1.col å t2.col ä¸åè¿æ¥ï¼å¹¶ä¸è¿å t1 中
æææªè¿æ¥çè¡ï¼é£äºå¨ t2 䏿²¡æå¹éçè¡ï¼ã å³[å¤]è¿æ¥ï¼RIGHT OUTER
JOINï¼å°è¿å t2 䏿ªè¿æ¥çè¡ã å®å¨å¤è¿æ¥ï¼FULL OUTER JOINï¼å°è¿å t1 å t2
䏿ªè¿æ¥çè¡ã å³é®å OUTER å¨å·¦[å¤]è¿æ¥ãå³[å¤]è¿æ¥åå®å¨[å¤]è¿æ¥ä¸­
æ¯å¯éçï¼æ®éè¿æ¥è¢«ç§°ä¸ºåè¿æ¥ï¼INNER JOINï¼ã
4.17) å¦ä½ä½¿ç¨æ¶åå¤ä¸ªæ°æ®åºçæ¥è¯¢ï¼
没æåæ³æ¥è¯¢å½åæ°æ®åºä¹å¤çæ°æ®åºã
å 为PostgreSQLè¦å è½½ä¸æ°æ®åºç¸å³çç³»ç»ç®å½ï¼ç³»ç»è¡¨ï¼ï¼å æ­
¤è·¨æ°æ®åºçæ¥è¯¢å¦ä½æ§è¡æ¯ä¸å®çã
éå å¢å¼æ¨¡åcontrib/dblinkå许éç¨å½æ°è°ç¨å®ç°è·¨åºæ¥è¯¢ãå½ç¶ç¨æ·ä¹å¯ä»¥
åæ¶è¿æ¥å°ä¸åçæ°æ®åºæ§è¡æ¥è¯¢ç¶åå¨å®¢æ·ç«¯åå¹¶ç»æã
4.18) å¦ä½è®©å½æ°è¿åå¤è¡æå¤åæ°æ®ï¼
å¨å½æ°ä¸è¿åæ°æ®è®°å½éçåè½æ¯å¾å®¹æä½¿ç¨çï¼è¯¦æåè§ï¼
http://techdocs.postgresql.org/guides/SetReturningFunctions
4.19) 为ä»ä¹æå¨ä½¿ç¨PL/PgSQL彿°åå临æ¶è¡¨æ¶ä¼æ¶å°é误信æ¯ârelation with
OID ##### does not existâï¼
PL/PgSQLä¼ç¼å彿°çèæ¬å容ï¼ç±æ¤å¸¦æ¥çä¸ä¸ªä¸å¥½çå¯ä½ç¨æ¯è¥ä¸ä¸ª
PL/PgSQL
彿°è®¿é®äºä¸ä¸ªä¸´æ¶è¡¨ï¼ç¶å该表被å é¤å¹¶é建äºï¼å忬¡è°ç¨è¯¥å½æ°å
°å¤±è´¥ï¼ å 为ç¼åç彿°å容ä»ç¶æåæ§ç临æ¶è¡¨ãè§£å³çæ¹æ³æ¯å¨ PL/PgSQL
ä¸ç¨EXECUTE
对临æ¶è¡¨è¿è¡è®¿é®ãè¿æ ·ä¼ä¿è¯æ¥è¯¢å¨æ§è¡åæ»ä¼è¢«éæ°è§£æã
4.20) ç®åæåªäºæ°æ®å¤å¶æ¹æ¡å¯ç¨ï¼
âå¤å¶âåªæ¯ä¸ä¸ªæ¯è¯ï¼æå¥½å ç§å¤å¶ææ¯å¯ç¨ï¼æ¯ç§é½æä¼ç¹å缺ç¹ï¼
主/ä»å¤å¶æ¹å¼æ¯å许ä¸ä¸ªä¸»æå¡å¨æ¥å读/åçç³è¯·ï¼èå¤ä¸ªä»æå¡å¨åªè½æ¥åè
¯»/SELECTæ¥è¯¢çç³è¯·ï¼ ç®åææµè¡ä¸åè´¹ç主/ä»PostgreSQLå¤å¶æ¹æ¡æ¯
Slony-I ã
å¤ä¸ªä¸»æå¡å¨çå¤å¶æ¹å¼å许å°è¯»/åçç³è¯·åéç»å¤å°çè®¡ç®æºï¼è¿ç§æ¹å¼ç±äºé
è¦å¨å¤å°æå¡å¨ä¹é´åæ¥æ°æ®åå¨
å¯è½ä¼å¸¦æ¥è¾ä¸¥éçæ§è½æå¤±ï¼Pgclusteræ¯ç®åè¿ç§æ¹æ¡ 中
æå¥½çï¼èä¸è¿å¯ä»¥åè´¹ä¸è½½ã
乿ä¸äºåä¸éä»è´¹ååºäºç¡¬ä»¶çæ°æ®å¤å¶æ¹æ¡ï¼æ¯æä¸è¿°åç§å¤å¶æ¨¡åã
4.21) ä¸ºä½æ¥è¯¢ç»ææ¾ç¤ºç表åæååä¸æçæ¥è¯¢è¯å¥ä¸çä¸åï¼ä¸ºä½å¤§åç¶æä¸è½ä¿çï¼
æå¸¸è§çåå æ¯å¨å建表æ¶å¯¹è¡¨åææ¯åå使ç¨äºåå¼å·ââï¼å½ä½¿ç¨äºåå¼å·åï¼è¡
¨åæååï¼ç§°ä¸ºæ è¯ç¬¦ï¼å卿¶æ¯åºå 大å°åçï¼
è¿æè°çä½ å¨æ¥è¯¢æ¶è¡¨åæååä¹åºä½¿ç¨åå¼å·ï¼ä¸äºå·¥å·è½¯ä»¶ï¼åpgAdminä¼å¨
ååºå建表çæä»¤æ¶èªå¨å°å¨æ¯ä¸ªæ è¯ç¬¦ä¸å åå¼å·ã å æ­
¤ï¼ä¸ºäºæ è¯ç¬¦çç»ä¸ï¼ä½ åºè¯¥ï¼
* å¨å建表æ¶é¿åå°æ è¯ç¬¦ä½¿ç¨åå¼å·å¼èµ·æ¥ã
* 卿 è¯ç¬¦ä¸åªä½¿ç¨å°å忝ã
* ï¼ä¸ºäºä¸å·²åå¨çæ è¯ç¬¦ç¸åï¼å¨æ¥è¯¢ä¸ä½¿ç¨åå¼å·å°æ è¯ç¬¦å¼èµ·æ¥ã

View File

@ -1,793 +0,0 @@
PostgreSQL 常è¦åé¡ï¼FAQï¼
æè¿æ´æ°ï¼2007 å¹´ 2 æ 8 æ¥ ææäº 22:43:13 EST
䏿çæè¿æ´æ°ï¼2007 å¹´ 2 æ 12 æ¥ ææä¸ 12:00:04 CST
ç¶åç¶è·äººå¡ï¼Bruce Momjian (pgman@candle.pha.pa.us)
æ£é«ä¸æçç¶è·äººå¡ï¼éæç(ChaoYi, Kuo)ï¼kuo.chaoyi@gmail.comï¼
æ¬ææªçææ°çæ¬å¯ä»¥å¨
http://www.postgresql.org/files/documentation/faqs/FAQ.html æ¥çã
è使¥ç³»çµ±å¹³å°ç¸éçåé¡å¯å¨ http://www.postgresql.org/docs/faq/
裡æ¾å°çæ¡ã
_________________________________________________________________
常è¦åé¡
1.1)PostgreSQL æ¯ä»éº¼ï¼è©²æéº¼ç¼é³ï¼
1.2)誰æ§å¶å管çPostgreSQL ï¼
1.3)PostgreSQLççæ¬æ¯ä»éº¼ï¼
1.4)PostgreSQLå¯ä»¥éè¡å¨åªäºä½æ¥ç³»çµ±å¹³å°ä¸ï¼
1.5)æå¾åªè£¡è½å¾å°PostgreSQLï¼
1.6)ææ°çç PostgreSQL æ¯ä»éº¼ï¼
1.7)æå¾åªè£¡è½å¾å°å° PostgreSQL çæ¯æï¼
1.8)æå¦ä½æäº¤ä¸å BUG å ±åï¼
1.9)æå¦ä½ç解已ç¥ç BUG ææ«ç¼ºçåè½ï¼
1.10)è½å¤ ç²åçææ°ææªæåªäºï¼
1.11)ææè©²ææ¨£å¸ç¿ SQL ï¼
1.12)å¦ä½æäº¤è£ä¸ææ¯å å¥éç¼éä¼ï¼
1.13)PostgreSQL åå¶ä»è³æåº«ç³»çµ±æ¯èµ·ä¾å¦ä½ï¼
1.14)PostgreSQL å¯ä»¥èçæè¿ååå家夿å¶çè®ååï¼
ç¨æ¶å®¢æ¶ç«¯åé¡
2.1)æåå¯ä»¥ç¨ä»éº¼èªè¨å PostgreSQL é²è¡æºéï¼
2.2)æä»éº¼å·¥å·å¯ä»¥æ PostgreSQL ç¨æ¼ Web é é¢ï¼
2.3)PostgreSQL ææåå½¢ç¨æ¶çé¢(GUI)åï¼
系統管çåé¡
3.1)æææ¨£æè½æ PostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼
3.2)æå¦ä½æ§å¶ä¾èªå¶ä»é»è¦ç飿¥ï¼
3.3)æææ¨£èª¿æ´è³æåº«ä¼ºæå¨ä»¥ç²å¾æ´å¥½çæ§è½ï¼
3.4)PostgreSQL 裡å¯ä»¥ç²å¾ä»éº¼æ¨£çèª¿è©¦ç¹æ§ï¼
3.5)çºä»éº¼å¨è©¦å飿¥ç»éææ¶å°ãSorry, too many clientsã è¨æ¯ï¼
3.6)PostgreSQL çåç´éç¨æåªäºå§å®¹ï¼
3.7)(ä½¿ç¨ PostgreSQL )æéè¦ä½¿ç¨ä»éº¼é»è¦ç¡¬é«ï¼
æä½åé¡
4.1) å¦ä½åªé¸æä¸åæ¥è©¢çµæçé å¹¾è¡ï¼ææ¯é¨æ©çä¸è¡ï¼
4.2) å¦ä½æ¥ç表ãç´¢å¼ãè³æåº«ä»¥åç¨æ¶çå®ç¾©ï¼å¦ä½æ¥ç psql
裡ç¨å°çæ¥è©¢æä»¤ä¸¦é¡¯ç¤ºå®åï¼
4.3) å¦ä½æ´æ¹ä¸åæ¬ä½çè³æé¡åï¼
4.4) å®çè¨éï¼å®ä¸è¡¨ï¼ä¸åè³æåº«çæå¤§éå¶æ¯å¤å°ï¼
4.5) åå²ä¸åå¸åçææ¬æä»¶è£¡çè³æéè¦å¤å°ç£ç¢ç©ºéï¼
4.6) çºä»éº¼æçæ¥è©¢å¾æ¢ï¼çºä»éº¼éäºæ¥è©¢æ²æå©ç¨ç´¢å¼ï¼
4.7) æå¦ä½æè½çå°æ¥è©¢åªå卿¯ææ¨£è©ä¼°èçæçæ¥è©¢çï¼
4.8) æææ¨£åæ£å表éå¼æç´¢å大å°å¯«ç¡éçæ­
£å表é弿¥æ¾ï¼ææ¨£å©ç¨ç´¢å¼é²è¡å¤§å°å¯«ç¡éæ¥æ¾ï¼
4.9) å¨ä¸åæ¥è©¢è£¡ï¼æææ¨£æª¢æ¸¬ä¸åæ¬ä½æ¯å¦çº
NULLï¼æå¦ä½æè½æºç¢ºæåºèä¸è«ææ¬ä½æ¯å¦å«NULLå¼ï¼
4.10) å種å符é¡åä¹éæä»éº¼ä¸åï¼
4.11.1) æææ¨£åµå»ºä¸ååºåèåææ¯èªåéå¢çæ¬ä½ï¼
4.11.2) æå¦ä½ç²å¾ä¸åæå¥çåºåèçå¼ï¼
4.11.3) åæä½¿ç¨ currval() æå°è´åå¶ä»ç¨æ¶çè¡çªææ³åï¼
4.11.4) çºä»éº¼ä¸å¨äºåç°å¸¸ä¸æ¢å¾éç¨åºåèå¢ï¼çºä»éº¼å¨åºåèæ¬ä½çåå¼ä¸­
åå¨éæ·å¢ï¼
4.12) ä»éº¼æ¯ OIDï¼ä»éº¼æ¯ CTID ï¼
4.13) çºä»éº¼ææ¶å°é¯èª¤è³è¨ãERROR: Memory exhausted in
AllocSetAlloc()ãï¼
4.14) æå¦ä½æè½ç¥éæéè¡ç PostgreSQL ççæ¬ï¼
4.15) æå¦ä½åµå»ºä¸åé è¨å¼æ¯ç¶åæéçæ¬ä½ï¼
4.16) å¦ä½å·è¡å¤é£æ¥ï¼outer joinï¼æ¥è©¢ï¼
4.17) å¦ä½å·è¡æ¶åå¤åè³æåº«çæ¥è©¢ï¼
4.18) å¦ä½è®å½æ¸è¿åå¤è¡æå¤åè³æï¼
4.19) çºä»éº¼æå¨ä½¿ç¨ PL/PgSQL 彿¸ååè¨æè¡¨æææ¶å°é¯èª¤è³è¨ãrelation
with OID ##### does not existãï¼
4.20) ç®åæåªäºè³æè¤å¯«(replication)æ¹æ¡å¯ç¨ï¼
4.21) çºä½æ¥è©¢çµæé¡¯ç¤ºçè¡¨åææ¬åèæçæ¥è©¢èªå¥ä¸­
çä¸åï¼çºä½å¤§å¯«çæä¸è½ä¿çï¼
_________________________________________________________________
常è¦åé¡
1.1) PostgreSQL æ¯ä»éº¼ï¼è©²æéº¼ç¼é³ï¼
PostgreSQL è®ä½ Post-Gres-Q-Lï¼ææåä¹ç°¡ç¨±çºPostgres
ãæ³è½ä¸ä¸å¶ç¼é³ç人å¡å¯å¾é裡ä¸è¼è²é³æä»¶ï¼ MP3 æ ¼å¼ ã
PostgreSQL æ¯é¢åç®æ¨çéä¿è³æåº«ç³»çµ±ï¼å®å·æå³çµ±å業
è³æåº«ç³»çµ±çææåè½ï¼åæå嫿å°å¨ä¸ä¸ä»£ DBMS
系統ç使ç¨çå¢å¼·ç¹æ§ãPostgreSQL
æ¯èªç±åè²»çï¼ä¸¦ä¸æææºä»£ç¢¼é½å¯ä»¥ç²å¾ã
PostgreSQL
çéç¼éä¼ä¸»è¦çºå¿é¡èï¼ä»åéä½ä¸çåå°ä¸¦ééäºè¯ç¶²é²è¡è¯ç¹«ï¼éæ¯ä¸å社åéç¼é
ç®ï¼å®ä¸è¢«ä»»ä½å¬å¸æ§å¶ã
妿³å å¥éç¼éä¼ï¼è«åè¦éç¼äººå¡å¸¸è¦åé¡ï¼FAQï¼
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html
1.2) 誰æ§å¶ PostgreSQL ï¼
å¦æä½ å¨å°æ¾PostgreSQLçæéäººï¼ææ¯ä»éº¼ä¸­
央å§å¡æï¼ææ¯ä»éº¼æå±¬å¬å¸ï¼ä½ åªè½æ¾æ£äº---å çºä¸åä¹ä¸å­
å¨ï¼ä½æåç確æä¸å æ ¸å¿å§å¡æåCVS管ççµï¼ä½éäºå·¥ä½çµç設
ç«ä¸»è¦æ¯çºäºé²è¡ç®¡çå·¥ä½è䏿¯å°PostgreSQLé²è¡ç¨ä½å¼æ§å¶ï¼PostgreSQLé
ç®æ¯ç±ä»»ä½äººå
å¯åå çéç¼äººå¡ç¤¾ååææç¨æ¶æ§å¶çï¼ä½ æéè¦åçå°±æ¯è¨é±éµä»¶å表ï¼åèè¨è«å³å
¯ï¼è¦åèPostgreSQLçéç¼è©³è¦ éç¼äººå¡å¸¸åé¡ (Developer's FAQ) ç²åè³è¨ï¼ã
1.3) PostgreSQL ççæ¬æ¯ä»éº¼?
PostgreSQLçç¼å¸éµå¾ç¶å¸ç BSD çæ¬ãå®åè¨±ç¨æ¶ä¸éç®çå°ä½¿ç¨
PostgreSQLï¼çè³ä½ å¯ä»¥é·å® PostgreSQL
èä¸å«æºä»£ç¢¼ä¹å¯ä»¥ï¼å¯ä¸çéå¶å°±æ¯ä½ ä¸è½å è»é«èªèº«åé¡èåæå追訴æ³å¾
責任ï¼å¦å¤å°±æ¯è¦æ±ææçè»é«æ·è²ä¸é 忬以ä¸çæ¬è²æã
ä¸é¢å°±æ¯æåæä½¿ç¨çBSDçæ¬è²æå§å®¹ï¼
PostgreSQL è³æåº«ç®¡ç系統
é¨åçæ¬ï¼cï¼1996-2005ï¼PostgreSQL å¨çéç¼å°çµï¼é¨åçæ¬ï¼cï¼1994-1996
å å·å¤§å¸è£äº
ï¼Portions copyright (c) 1996-2005,PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of
Californiaï¼
å許çºä»»ä½ç®ç使ç¨ï¼æ·è²ï¼ä¿®æ¹ååç¼éåè»é«åå®çææªè䏿¶åä»»ä½è²»ç¨ï¼
並ä¸ç¡é ç°½ç½²å æ¤èç¢ççèæï¼åææ¯ä¸é¢ççæ¬è²æåæ¬æ®µä»¥åä¸é¢å©æ®µæå­
åºç¾å¨æææ·è²ä¸ã
ï¼Permission to use, copy, modify, and distribute this software and
its documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all
copies.ï¼
å¨ä»»ä½ææ³ä¸ï¼å å·å¤§å¸é½ä¸æ¿æå ä½¿ç¨æ­
¤è»é«åå¶ææªèå°è´çå°ä»»ä½ç¶äºäººçç´æ¥çï¼
鿥çï¼ç¹æ®çï¼éå çæèç¸ä¼´èççæå£ï¼åæ¬å©çæå¤±ç責任ï¼å³ä½¿å å·å¤§å­
¸å·²ç¶å»ºè°äºéäºæå¤±çå¯è½æ§æä¹æ¯å¦æ¤ã
ï¼IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA
HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.ï¼
å å·å¤§å¸æç¢ºæ¾æ£ä»»ä½ä¿èï¼åæ¬ä½ä¸å±éæ¼æä¸ç¹å®ç¨éç忥åå©ççé±å«ä¿èã
é裡æä¾çé份è»é«æ¯åºæ¼ãç¶ä½æ¯ãçåºç¤çï¼å èå å·å¤§å¸æ²æè²¬ä»»æä¾ç¶­
è·ï¼æ¯æï¼æ´æ°ï¼å¢å¼·æèä¿®æ¹çæåã
ï¼THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.ï¼
1.4) PostgreSQL å¯ä»¥éè¡å¨åªäºä½æ¥ç³»çµ±å¹³å°ä¸ï¼
ä¸è¬èªªä¾ï¼ä»»ä½ç¾å¨å° UNIX ç¸å®¹ç使¥ç³»çµ±ä¹ä¸é½è½éè¡ PostgreSQL
ãå¨å®è£æå裡ååºäºç¼ä½æç¶éæç¢ºæ¸¬è©¦çå¹³å°ã
PostgreSQL ä¹å¯ä»¥ç´æ¥éè¡å¨åºæ¼å¾®è» Windows-NT ç使¥ç³»çµ±ï¼å¦
Win2000 SP4ï¼WinXP å Win2003ï¼å·²è£½ä½å®æçå®è£åå¯å¾
http://pgfoundry.org/projects/pginstallerä¸è¼ï¼åºæ¼MSDOSçWindows使¥­
系統 ï¼Win95ï¼Win98ï¼WinMeï¼éè¦ééCygwin模æ¬ç°å¢éè¡PostgreSQLã
åæä¹æä¸åçº Novell Netware 6 éç¼ççæ¬å¯å¾ http://forge.novell.com
ç²åï¼çºOS/2(eComStation)éç¼ççæ¬å¯å¾
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F ä¸è¼ã
1.5) æå¾åªè£¡è½å¾å° PostgreSQLï¼
ééç覽å¨å¯å¾ http://www.postgresql.org/ftp/ ä¸è¼ï¼ä¹å¯ééFTPï¼å¾
ftp://ftp.PostgreSQL.org/pub/ ç«é»ä¸è¼ã
1.6) ææ°çç PostgreSQL æ¯ä»éº¼ï¼
PostgreSQL ææ°ççæ¬æ¯çæ¬ 8.2.3 ã
æåè¨åæ¯å¹´ç¼ä½ä¸å主è¦åç´çæ¬ï¼æ¯å¹¾åæç¼ä½ä¸åå°çæ¬ã
1.7) æå¾åªè£¡è½å¾å°å° PostgreSQL çæ¯æï¼
PostgreSQL社åéééµä»¶å表çºå¶å¤§å¤æ¸ç¨æ¶æä¾å¹«å©ï¼è¨é±éµä»¶å表ç主ç«é
»æ¯
http://www.postgresql.org/community/lists/ï¼ä¸è¬ææ³ä¸ï¼åå å¥General æ
Bugéµä»¶å表æ¯ä¸åè¼å¥½çéå§ã
主è¦çIRCé »éæ¯å¨FreeNode(irc.freenode.net)ç#postgresqlï¼çºäºé£ä¸æ­
¤é »éï¼å¯ä»¥ä½¿ç¨ UNIX ç¨åº ircï¼å¶æä»¤æ ¼å¼ï¼ irc -c '#postgresql'
"$USER" irc.freenode.net ï¼æè使ç¨å¶ä»IRC客æ¶ç«¯ç¨åºã卿¤ç¶²çµ¡ä¸éå­
å¨ä¸å PostgreSQL ç西ççé »é(#postgersql-es)åæ³èªé »é
(#postgresql-fr)ã忍£å°ï¼å¨ EFNET ä¸ä¹æä¸å PostgreSQL ç交æµé »éã
坿ä¾åæ¥æ¯æçå¬å¸å表å¯å¨ http://techdocs.postgresql.org/companies.php
ç覽ã
1.8) æå¦ä½æäº¤ä¸å BUG å ±åï¼
å¯è¨ªå http://www.postgresql.org/support/submitbugï¼å¡«å¯« Bug
ä¸å ±è¡¨æ ¼å³å¯ï¼å樣ä¹å¯è¨ªå ftp ç«é» ftp://ftp.PostgreSQL.org/pub/
æª¢æ¥æç¡æ´æ°çPostgreSQL çæ¬æè£ä¸ã
ééä½¿ç¨ Bug æäº¤è¡¨æ ¼ææ¯ç¼å¾ PostgreSQL éµä»¶å表ç Bug
é常ææä»¥ä¸ä¹ä¸åè¦ï¼
* ææäº¤å§å®¹ä¸æ¯ä¸å Bug åå¶ä¸æ¯ Bug çåå ã
* ææäº¤å§å®¹æ¯ä¸åå·²ç¥ç Bug 並ä¸å·²ç¶å å¥ TODO å¾èçä»»åå表ã
* ææäº¤ç Bug å·²å¨ç¶åçæ¬ä¸è¢«ä¿®æ£ã
* ææäº¤ç Bug 已修æ£ä½å°æªå°è£ä¸å å¥ç¾å¨çç¼å¸è»é«åã
* è«æ±æäº¤èæä¾æ´è©³ç´°çè³è¨ï¼
+ 使¥ç³»çµ±
+ PostgreSQL çæ¬
+ å¯éç¾ Bug çæ¸¬è©¦æ¡ä¾
+ 調試è³è¨
+ 調試è·è¹¤è¼¸åº
* ææäº¤å§å®¹æ¯ä¸åæ° Bugï¼å°å·è¡ä»¥ä¸å·¥ä½ï¼
+ åµå»ºä¸åæ°è£ä¸ä¸¦å°å¶å å¥ä¸ä¸å主è¦çæ¬ææ¯å°çæ¹é²çæ¬ä¸ã
+ æ¤ Bug æ«æä¸è½ä¿®æ£ï¼å°è¢«å è³ TODO å¾èçä»»åå表ã
1.9) æå¦ä½ç解已ç¥ç BUG ææ«ç¼ºçåè½ï¼
PostgreSQL æ¯æä¸åæ´å±ç SQL:2003 çåéãå鱿åç TODO å表ï¼çè§£å·²ç¥ Bug
åè¡¨ãæ«ç¼ºçåè½åå°ä¾çéç¼è¨åã
è¦æ±å¢å æ°åè½çç³è«éå¸¸ææ¶å°ä»¥ä¸ä¹ä¸çåè¦ï¼
* 該åè½å·²å å¥ TODO å¾èçä»»åå表ã
* 該åè½ä¸æ¯å¿é çï¼å çºï¼
+ 宿¯ç¾æçä¸ç¬¦å SQL æ¨æºçæåè½çéè¤ã
+ 該åè½æ§æå¤§å¤§å¢å 代碼çè¤éç¨åºï¼è帶ä¾çå¥½èæ¯å¾®ä¸è¶³éçã
+ 該åè½æ¯ä¸å®å¨ææ¯ä¸å¯é çã
* 該åè½å°è¢«å å¥ TODO å¾èçä»»åå表ã
PostgreSQL ä¸ä½¿ç¨ Bug è·è¹¤ç³»çµ±ï¼å çºæåç¼ç¾å¨éµä»¶å表中
ç´æ¥åè¦ä»¥åä¿è TODO
ä»»åå表總æ¯èæ¼ææ°çæçæ¹å¼å·¥ä½æçææ´é«ä¸äºãäºå¯¦ä¸ï¼Bug䏿卿åçè»é«ä¸­
åå¨å¾é·æéï¼ å°å½±é¿å¾å¤ç¨æ¶çBugä¹ç¸½æ¯å¾å¿«æè¢«ä¿®æ­
£ãå¯ä¸è½æ¾å°æææ¹é²ãæé«åä¿®æ£çå°æ¹æ¯ CVS
çæ¥èªè³è¨ï¼å³ä½¿æ¯å¨è»é«æ°çæ¬çç¼å¸è³è¨ä¸ä¹ä¸æååºæ¯ä¸èçè»é«æ´æ°ã
1.10) è½å¤ ç²åçææ°ææªæåªäºï¼
PostgreSQL åå«å¤§éçææªï¼ä¸»è¦æè©³ç´°çåèæåï¼æåé åä¸äºç測試ä¾åãåè¦
/doc ç®éï¼è¯è¨»ï¼æçº $PGHOME/docï¼ã ä½ éå¯ä»¥å¨ç·ç覽 PostgreSQL
çæåï¼å¶ç¶²åæ¯ï¼http://www.PostgreSQL.org/docsã
æå©æ¬éæ¼PostgreSQLçæ¸å¨ç·æä¾ï¼å¨
http://www.postgresql.org/docs/books/awbook.html å
http://www.commandprompt.com/ppbook/ ã 乿大éç PostgreSQL
æ¸ç±å¯ä¾è³¼è²·ï¼å¶ä¸æçºæµè¡ç䏿¬æ¯ç± Korry Douglas 編寫çãå¨
http://techdocs.PostgreSQL.org/techdocs/bookreviews.phpä¸ ä¸æå¤§éæé
PostgreSQL æ¸ç±çç°¡ä»ã å¨ http://techdocs.PostgreSQL.org/ 䏿¶éäºæé
PostgreSQL ç大éæè¡æç« ã
客æ¶ç«¯çå½ä»¤è¡ç¨åºpsqlæä¸äºä»¥ \d éé ­
çå½ä»¤ï¼å¯é¡¯ç¤ºéæ¼é¡åï¼æä½ç¬¦ï¼å½æ¸ï¼èåçè³è¨ï¼ä½¿ç¨ \?
å¯ä»¥é¡¯ç¤ºææå¯ç¨çå½ä»¤ã
æåç web ç«é»å嫿´å¤çææªã
1.11) ææè©²ææ¨£å¸ç¿ SQL ï¼
é¦åèæ®ä¸è¿°æå°çèPostgreSQLç¸éçæ¸ç±ï¼å¦å¤ä¸æ¬æ¯ Teach Yourself SQL in
21 Days, Second Editionï¼å¶è©³ç´°ä»ç´¹çç¶²åæ¯
http://members.tripod.com/er4ebus/sql/index.htmï¼ æåç許å¤ç¨æ¶åæ¡The
Practical SQL Handbookï¼ Bowman, Judith S.
編寫ï¼Addison-Wesleyå¬å¸åºçï¼å¶ä»çååæ¡ The Complete Reference SQL,
Groff 編寫ï¼McGraw-Hill å¬å¸åºçã
å¨ä¸åç¶²åä¸ä¹æå¾å¥½çæç¨ï¼ä»åæ¯
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com.
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12)å¦ä½æäº¤è£ä¸ææ¯å å¥éç¼éä¼ï¼
è©³è¦ éç¼äººå¡å¸¸è¦åé¡ (Developer's FAQ) ã
1.13) PostgreSQL åå¶ä»è³æåº«ç³»çµ±æ¯èµ·ä¾å¦ä½ï¼
è©å¹è»é«æå¥½å¹¾ç¨®æ¹æ³ï¼åè½ï¼æ§è½ï¼å¯é æ§ï¼æ¯æå广 ¼ã
åè½
PostgreSQL ææå¤§ååç¨è³æåº«æå¤çåè½ï¼ä¾å¦ï¼äºåï¼å­
æ¥è©¢ï¼è§¸ç¼å¨ï¼è¦åï¼å¤éµåè宿´æ§åè¤éçéå®çã
æåéæä¸äºå®åæ²æçç¹æ§ï¼å¦ç¨æ¶å®ç¾©é¡åï¼ç¹¼æ¿ï¼è¦ååå¤çæ¬ä¸¦è¡æ§å¶ä
»¥æ¸å°éççç¨çã
æ§è½
PostgreSQLåå¶ä»åç¨åéæºçè³æåº«å·æé¡ä¼¼çæ§è½ãå°æäºèç宿¯è¼å¿«ï¼å°
å¶ä»ä¸äºèç宿¯è¼æ¢ã èå¶ä»è³æåº«ç¸æ¯ï¼æåçæ§è½åªå£éå¸¸å¨ +/-
10%ä¹éã
å¯é æ§
æåé½ç¥éè³æåº«å¿é æ¯å¯é çï¼å¦åå®å°±ä¸é»ç¨é½æ²æãæååªååå°ç¼ä½ç¶éèª
çæ¸¬è©¦çï¼ç¼ºé·æå°çç©©å®ä»£ç¢¼ãæ¯åçæ¬è³å°æä¸åæç beta
測試æéï¼ä¸¦ä¸æåçç¼å¸æ­
·å²é¡¯ç¤ºæåå¯ä»¥æä¾ç©©å®çï¼ç¢åºçï¼å¯ç¨æ¼çç¢ä½¿ç¨ççæ¬ãæåç¸ä¿¡å¨é
æ¹é¢æåèå¶ä»çè³æåº«è»é«æ¯ç¸ç¶çã
æ¯æ
æåçéµä»¶å表æä¾ä¸åé常大çéç¼äººå¡åç¨æ¶ççµä»¥å¹«å©è§£æ±ºæç¢°å°ç
ä»»ä½åé¡ãæåä¸è½ä¿è­
總æ¯è½è§£æ±ºåé¡ï¼ç¸æ¯ä¹ä¸ï¼åç¨è³æåº«è»é«ä¹ä¸¦ä¸æ¯ç¸½è½å¤ æä¾è§
£æ±ºæ¹æ³ã
ç´æ¥èéç¼äººå¡ï¼ç¨æ¶ç¾¤ï¼æååæºç¨åºæ¥è§¸ä½¿PostgreSQLçæ¯ææ¯å¶ä»è³
æåº«éè¦å¥½ãéæä¸äºå業
æ§çå¨é¢æè¡æ¯æï¼å¯ä»¥çµ¦æä¾çµ¦é£äºéè¦ç人ãï¼åé±1.7 å°ç¯ï¼
广 ¼
æåå°ä»»ä½ç¨éé½åè²»ï¼åæ¬åç¨åéåç¨ç®çã
ä½ å¯ä»¥ä¸å éå¶å°åä½ çç¢å裡å 奿åç代碼ï¼é¤äºé£äºæåå¨ä¸é¢ççæ¬
è²æè£¡è²æç BSDçæ¬ä¹å¤çå§å®¹ã
1.14) PostgreSQL å¯ä»¥èçæè¿ååå家夿å¶çè®åå?
PostgreSQL 8.0ä¹åççæ¬æ¯ä½¿ç¨ä½æ¥ç³»çµ±ä¸çæåè³æåº«ä¾èç夿å¶çè³è¨ï¼èª
8.0 çå以å¾ççæ¬ PostgreSQL æèªèº«å«æææ°çæåè³è¨ã
_________________________________________________________________
ç¨æ¶å®¢æ¶ç«¯åé¡
2.1) æåå¯ä»¥ç¨ä»éº¼èªè¨å PostgreSQL é²è¡æºéï¼
PostgreSQL (é è¨ææ³)åªå®è£æ C åå§åµå¼ C
çæ¥å£ï¼å¶ä»çæ¥å£é½æ¯ç¨ç«çé ç®ï¼è½å¤ åå¥ä¸è¼ï¼éäºæ¥å£é ç®ç¨ç«ç好è
æ¯ä»åå¯ä»¥æåèªçç¼å¸è¨åååèªç¨ç«çéç¼çµã
ä¸äºç·¨ç¨èªè¨å¦ PHP é½æè¨ªå PostgreSQL çæ¥å£ï¼PerlãTCLãPython
以åå¾å¤å¶ä»èªè¨çæ¥å£å¨ http://gborg.postgresql.org ç¶²ç«ä¸ç
Drivers/Interfaces å°ç¯å¯æ¾å°ï¼ 並ä¸éé Internet å¾å®¹ææç´¢å°ã
2.2) æä»éº¼å·¥å·å¯ä»¥æ PostgreSQL ç¨æ¼ Web é é¢ï¼
ä¸åä»ç´¹ä»¥è³æåº«çºå¾å°çæºä¸é¯çç«é»æ¯ï¼http://www.webreview.comã
å°æ¼ Web éæï¼PHP æ¯ä¸åæ¥µå¥½çæ¥å£ãå®å¨ http://www.php.net/ã
å°æ¼è¤éçä»»åï¼å¾å¤äººæ¡ç¨ Perl æ¥å£å ä½¿ç¨ CGI.pm ç DBD::Pg æ mod_perl
ã
2.3)PostgreSQL ææåå½¢ç¨æ¶çé¢åï¼
åæ¥ç¨æ¶ææ¯éæºéç¼äººå¡è½æ¾å°å¾å¤çæé PostgreSQLçGUI å形工å·è»é«ï¼å¨
PostgreSQLç¤¾åææª æä¸å詳細çå表ã
_________________________________________________________________
系統管çåé¡
3.1)æææ¨£è½æ PostgreSQL è£å¨ /usr/local/pgsql 以å¤çå°æ¹ï¼
å¨éè¡ configure æå ä¸ --prefix é¸é ã
3.2) æå¦ä½æ§å¶ä¾èªå¶ä»é»è¦ç飿¥ï¼
é è¨ææ³ä¸ï¼PostgreSQL åªå許ä¾èªæ¬æ©ä¸éé unix å奿¥åæ TCP/IP
æ¹å¼ç飿¥ã ä½ åªæå¨ä¿®æ¹äºéç½®æä»¶ postgresql.conf ä¸ç
listen_addressesï¼ä¸ä¹å¨éç½®æä»¶ $PGDATA/pg_hba.conf 䏿éäº
åºæ¼é ç¨é»è¦ï¼ host-based ï¼ç身份èªèï¼ä¸¦éæ°åå
PostgreSQLï¼å¦åå¶ä»é»è¦æ¯ä¸è½èä½ ç PostgreSQL 伺æå¨é²è¡é£æ¥çã
3.3) æææ¨£èª¿æ´è³æåº«å¼æä»¥ç²å¾æ´å¥½çæ§è½ï¼
æä¸åä¸»è¦æ¹é¢å¯ä»¥æå PostgreSQL çæ½è½ã
æ¥è©¢æ¹å¼çè®å
éä¸»è¦æ¶åä¿®æ¹æ¥è©¢æ¹å¼ä»¥ç²åæ´å¥½çæ§è½:
+ åµå»ºç´¢å¼ï¼åæ¬è¡¨éå¼åé¨åç´¢å¼ï¼
+ ä½¿ç¨ COPY èªå¥ä»£æ¿å¤å Insert èªå¥ï¼
+ å°å¤åSQLèªå¥çµæä¸åäºå以æ¸å°æäº¤äºåçéé·ï¼
+ å¾ä¸åç´¢å¼ä¸æå夿¢è¨éæä½¿ç¨ CLUSTERï¼
+ å¾ä¸åæ¥è©¢çµæä¸ååºé¨åè¨éæä½¿ç¨ LIMITï¼
+ 使ç¨é ç·¨è¯å¼æ¥è©¢ï¼Prepared Query)ï¼
+ ä½¿ç¨ ANALYZE ä»¥ä¿æç²¾ç¢ºçåªåçµ±è¨ï¼
+ å®æä½¿ç¨ VACUUM æ pg_autovacuum
+ é²è¡å¤§éè³ææ´æ¹æååªé¤ç´¢å¼ï¼ç¶å¾é建索å¼ï¼
伺æå¨çéç½®
éç½®æä»¶ postgres.conf ä¸çå¾å¤è¨­
ç½®é½æå½±é¿æ§è½ï¼ææåæ¸çå表å¯è¦ï¼
管ç塿å/è³æåº«ä¼ºæå¨éè¡ç°å¢/è³æåº«ä¼ºæå¨éè¡éç½®ï¼
æé忏çè§£éå¯è¦ï¼http://www.varlena.com/varlena/GeneralBits/Tidb
its/annotated_conf_e.html å
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.htmlã
硬é«ç鏿
é»è¦ç¡¬é«å°æ§è½çå½±é¿å¯ç覽
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/inde
x.html å http://www.powerpostgresql.com/PerfList/ã
3.4)PostgreSQL 裡å¯ä»¥ç²å¾ä»éº¼æ¨£çèª¿è©¦ç¹æ§ï¼
PostgreSQL æå¾å¤é¡ä¼¼ log_*
ç伺æå¨éç½®è®éå¯ç¨æ¼æ¥è©¢çåå°åé²ç¨çµ±è¨ï¼èéäºå·¥ä½å°èª¿è©¦åæ§è½æ¸¬è©¦å
¾æå¹«å©ã
3.5) çºä»éº¼å¨è©¦å飿¥ææ¶å°ãSorry, too many
clientsï¼å·²æå¤ªå¤ç¨æ¶é£æ¥ï¼ãæ¶æ¯ï¼
éè¡¨ç¤ºä½ å·²éå°é è¨ 100 å並ç¼(åä½)å¾å°é²ç¨æ¸çéå¶ï¼ä½ éè¦ééä¿®æ¹
postgresql.conf æä»¶ä¸ç max_connections å¼ä¾ å¢å postmaster
çå¾å°ä½µç¼èçæ¸ï¼ä¿®æ¹å¾ééæ°åå postmasterã
3.6)PostgreSQL çåç´éç¨æåªäºå§å®¹ ï¼
PostgreSQL éç¼çµå°æ¯æ¬¡å°çæ¬çåç´ä¸»è¦åªåäºä¸äº Bug ä¿®æ£å·¥ä½ï¼å æ¤å¾
7.4.8 åç´å° 7.4.9 ä¸éè¦ dump å restoreï¼åéè¦åæ­
¢è³æåº«ä¼ºæå¨ï¼å®è£æ´æ°å¾çè»é«åï¼ç¶å¾éå伺æå¨å³å¯ã
ææPostgreSQLçç¨æ¶æè©²å¨ææ¥è¿ï¼ä½ æä½¿ç¨çä¸»çæ¬ï¼çå°æ¹é²çæ¬ç¼ä½ç¡å¿«åç´
ãåç®¡æ¯æ¬¡åç´å¯è½é½æä¸é»é¢¨éªï¼PostgreSQLçå°æ¹ é²çå忝è¨è¨ç¨ä¾ä¿®æ­
£ä¸äº Bug
çï¼ç¨å¼ç¢¼æ¹åè¼å°ï¼æä»¥é¢¨éªéæ¯å¾å°çãPostgreSQL社åèªçºä¸è¬ææ³ä¸ä¸åç´ç
風éªéæ¯å¤æ¼åç´çã
ä¸»çæ¬çåç´ï¼ä¾å¦å¾ 7.3 å° 7.4ï¼é常æä¿®æ¹ç³»çµ±è¡¨åè³æè¡¨çå§é¨æ ¼å¼ã
éäºæ¹è®ä¸è¬æ¯è¼è¤éï¼å æ¤æåä¸ç¶æè³ææä»¶çåå¾å¼å®¹æ§ãå æ¤å¾èçæ¬ä¸­
é²è¡è³æå°åºï¼dumpï¼/ç¶å¾å¨æ°çæ¬ä¸­
é²è¡è³æå°å¥ï¼reloadï¼å°ä¸»çæ¬çåç´æ¯å¿é çã
3.7)(ä½¿ç¨ PostgreSQL )æéè¦ä½¿ç¨ä»éº¼é»è¦ç¡¬é« ï¼
ç±æ¼é»è¦ç¡¬é«å¤§å¤æ¸æ¯ç¸å®¹çï¼äººå總æ¯å¾åæ¼ç¸ä¿¡ææé»è¦ç¡¬é«è³ªé乿¯ç¸
åçãäºå¯¦ä¸ä¸æ¯ï¼ ECC RAMï¼å¸¶å¥å¶æ ¡é©çè¨æ¶é«ï¼ï¼SCSI
ï¼ç¡¬ç¢ï¼ååªè³ªçä¸»æ©æ¿æ¯ä¸äºä¾¿å®è²¨è¦æ´å å¯é ä¸å·ææ´å¥½çæ§è½ã
PostgreSQL å¹¾ä¹å¯ä»¥éè¡å¨ä»»ä½ç¡¬é«ä¸ï¼
ä½å¦æå¯é æ§åæ§è½å°ä½ ç系統å¾éè¦ï¼ä½ å°±éè¦å¨é¢çç ç©¶ä¸ä¸ä½ ç硬é«çµæ
äºã卿åçéµä»¶å表ä¸ä¹æéæ¼ ç¡¬é«éç½®åæ§å¹æ¯çè¨è«ã
_________________________________________________________________
æä½åé¡
4.1) å¦ä½åªé¸æä¸åæ¥è©¢çµæçé å¹¾è¡ï¼ææ¯é¨æ©çä¸è¡ï¼
å¦æä½ åªæ¯è¦æåå¹¾è¡è³æï¼ä¸¦ä¸ä½ å¨å·è¡æ¥è©¢ä¸­
ç¥é確åçè¡æ¸ï¼ä½ å¯ä»¥ä½¿ç¨ LIMIT åè½ã 妿æä¸åç´¢å¼è ORDER BY 中
çæ¢ä»¶å¹éï¼PostgreSQL å¯è½å°±åªèçè¦æ±çé å¹¾æ¢è¨éï¼
ï¼å¦åå°å°æ´åæ¥è©¢é²è¡èçç´å°çæéè¦çè¡ï¼ã妿å¨å·è¡æ¥è©¢åè½æä¸ç¥é確åçè¨éæ
¸ï¼ å¯ä½¿ç¨æ¸¸æ¨(cursor)åFETCHåè½ã
å¯ä½¿ç¨ä»¥ä¸æ¹æ³æåä¸è¡é¨æ©è¨éçï¼
SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;
4.2)
å¦ä½æ¥ç表ãç´¢å¼ãè³æåº«ä»¥åç¨æ¶çå®ç¾©ï¼å¦ä½æ¥çpsql裡ç¨å°çæ¥è©¢æä»¤ä¸¦é¡¯ç¤ºå
®åï¼
å¨psqlä¸ä½¿ç¨ \dt å½ä»¤ä¾é¡¯ç¤ºè³æè¡¨çå®ç¾©ï¼è¦çè§£ psql 中
ç宿´å½ä»¤å表å¯ä½¿ç¨ \? ï¼å¦å¤ï¼ä½ ä¹å¯ä»¥é±è® psql çæºä»£ç¢¼ æä»¶
pgsql/src/bin/psql/describe.cï¼å®åæ¬çºçæ psql åææ§å½ä»¤ç輸åºçææ SQL
å½ä»¤ãä½ éå¯ä»¥å¸¶ -E é¸é åå psqlï¼ éæ¨£å®å°åå°åºä½ å¨ psql 中
æçµ¦åºçå½ä»¤å·è¡æçå§é¨å¯¦é使ç¨ç SQL
æ¥è©¢èªå¥ãPostgreSQL乿ä¾äºä¸åå¼å®¹ SQLç INFORMATION SCHEMA æ¥å£ï¼
ä½ å¯ä»¥å¾é裡ç²åéæ¼è³æåº«çè³è¨ã
å¨ç³»çµ±ä¸ä¹æä¸äºä»¥ pg_ æé çç³»çµ±è¡¨ä¹æè¿°äºè¡¨çå®ç¾©ã
ä½¿ç¨ psql -l æä»¤å¯ä»¥ååºææçè³æåº«ã
ä¹å¯ä»¥ç覽ä¸ä¸ pgsql/src/tutorial/syscat.source
æä»¶ï¼å®åèäºå¾å¤å¯å¾è³æåº«ç³»çµ±è¡¨ä¸ç²åè³è¨çSELECTèªæ³ã
4.3) å¦ä½æ´æ¹ä¸åæ¬ä½çè³æé¡åï¼
å¨8.0çæ¬è£¡æ´æ¹ä¸åæ¬ä½çè³æé¡åå¾å®¹æï¼å¯ä½¿ç¨ ALTER TABLE ALTER COLUMN
TYPE ã
å¨ä»¥åççæ¬ä¸ï¼å¯ä»¥é樣åï¼
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;
ä½ ç¶å¾å¯ä»¥ä½¿ç¨ VACUUM FULL tab æä»¤ä¾ä½¿ç³»çµ±æ¶åç¡æè³ææä½ç¨ç空éã
4.4) 宿¢è¨éï¼å®å表ï¼å®åè³æåº«çæå¤§éå¶æ¯å¤å°ï¼
ä¸é¢æ¯ä¸äºéå¶ï¼
å®åè³æåº«æå¤§å°ºå¯¸ï¼ ç¡éå¶ï¼å·²å卿 32TB çè³æåº«ï¼
å®å表çæå¤§å°ºå¯¸ï¼ 32 TB
ä¸è¡è¨éçæå¤§å°ºå¯¸ï¼ 1.6 TB
ä¸åæ¬ä½çæå¤§å°ºå¯¸? 1 GB
ä¸å表裡æå¤§åæ¸ï¼ ç¡éå¶
ä¸å表裡æå¤§æ¬ä½æ¸ï¼ 250-1600 ï¼èåé¡åæéï¼
ä¸å表裡çæå¤§ç´¢å¼æ¸éï¼ ç¡éå¶
ç¶ç¶ï¼å¯¦é䏿²æçæ£çç¡éå¶ï¼éæ¯è¦åå¯ç¨ç£ç¤ç©ºéãå¯ç¨è¨æ¶é«/交æåçå¶ç´ã
äºå¯¦ä¸ï¼ç¶ä¸è¿°éäºæ¸å¼è®å¾ç°å¸¸å°å¤§æï¼ç³»çµ±æ§è½ä¹æåå¾å¤§å½±é¿ã
å®è¡¨çæå¤§å¤§å° 32 TB ä¸éè¦ä½æ¥­
系統å°å®åæä»¶ä¹éééº¼å¤§çæ¯æã大表ç¨å¤å 1 GB çæä»¶åå²ï¼å æ­
¤æä»¶ç³»çµ±å¤§å°çéå¶æ¯ä¸éè¦çã
妿é è¨çå¡å¤§å°å¢é·å° 32K ï¼æå¤§çå®è¡¨å¤§å°åæå¤§åæ¸éå¯ä»¥å¢å å°ååã
æä¸åéå¶å°±æ¯ä¸è½å°å¤§å°å¤æ¼2000å­
ç¯çååµå»ºç´¢å¼ã幸éå°æ¯é樣çç´¢å¼å¾å°ç¨å°ãééå°å¤å­
ç¯åçå§å®¹é²è¡MD5åç¨éç®çµæé²è¡å½æ¸ç´¢å¼å¯å°åçå¯ä¸æ§å¾å°ä¿èï¼
並ä¸å¨ææª¢ç´¢å許å°åä¸çå®è©é²è¡æç´¢ã
4.5) åå²ä¸åå¸åçææ¬æä»¶è£¡çè³æéè¦å¤å°ç£ç¤ç©ºéï¼
ä¸å Postgres è³æåº«ï¼å­
å²ä¸åææ¬æä»¶ï¼æä½ç¨ç空éæå¤å¯è½éè¦ç¸ç¶æ¼éåææ¬æä»¶èªèº«å¤§å°5åçç£ç¤ç©ºé
ã
ä¾å¦ï¼åè¨æä¸å 100,000 è¡çæä»¶ï¼æ¯è¡æä¸åæ´æ¸åä¸åææ¬æè¿°ã å設
ææ¬ä¸²çå¹³åé·åº¦çº20ä½åçµ(Byte)ãææ¬æä»¶ä½ç¨ 2.8 MBãå­
æ¾éäºè³æçPostgreSQLè³æåº«æä»¶å¤§ç´æ¯ 5.2 MB:
24 ååçµ: æ¯è¡çé ï¼å¤§ç´å¼ï¼
24 ååçµç¯: ä¸åæ´æ¸åæ¬ä½åä¸åææ¬åæ¬ä½
+ 4 ååçµç¯: é é¢å§æååçµçæé
----------------------------------------
52 ååçµæ¯è¡
PostgreSQL è³æé ç大尿¯ 8192 ä½åçµ (8 KB)ï¼åï¼
8192 ååçµæ¯é
------------------- = 158 è¡/è³æé ï¼åä¸åæ´ï¼
52 ååçµæ¯è¡
100000 è³æè¡
-------------------- = 633 è³æé ï¼åä¸åæ´ï¼
146 è¡/è³æé
633 è³æé * 8192 åç¯/é = 5,185,536 åç¯ï¼5.2 MBï¼
ç´¢å¼ä¸éè¦é麼å¤çé¡å¤æ¶èï¼ä½ä¹ç¢ºå¯¦åæ¬è¢«ç´¢å¼çè³æï¼å æ­
¤å®åä¹å¯è½å¾å¤§ã
ç©ºå¼ NULL åæ¾å¨ä½åä¸ï¼å æ¤ä½ç¨å¾å°ç空éã
4.6) çºä»éº¼æçæ¥è©¢å¾æ¢ï¼çºä»éº¼éäºæ¥è©¢æ²æå©ç¨ç´¢å¼ï¼
ä¸¦éæ¯åæ¥è©¢é½æèªå使ç¨ç´¢å¼ãåªæå¨è¡¨ç大å°è¶éä¸åæå°å¼ï¼ä¸¦ä¸æ¥è©¢åªæé
¸ä¸è¡¨ä¸è¼å°æ¯ä¾çè¨éææææ¡ç¨ç´¢å¼ã 鿝å çºç´¢å¼æçå¼èµ·çé¨å³ç£ç¤å­
åå¯è½æ¯ç´æ¥å°è®å表ï¼é åºæçï¼æ´æ¢ã
çºäºå¤æ·æ¯å¦ä½¿ç¨ç´¢å¼ï¼PostgreSQL
å¿é ç²å¾æé表ççµ±è¨å¼ãéäºçµ±è¨å¼å¯ä»¥ä½¿ç¨ VACUUM ANALYZEï¼æ ANALYZE
ç²å¾ã 使ç¨çµ±è¨å¼ï¼åªåå¨ç¥é表中
æå¤å°è¡ï¼å°±è½å¤ æ´å¥½å°å¤æ·æ¯å¦å©ç¨ç´¢å¼ã
çµ±è¨å¼å°ç¢ºå®åªåç飿¥é åºå飿¥æ¹æ³ä¹å¾æç¨ãå¨è¡¨çå§å®¹ç¼çè®åæï¼æå®æé²è
¡çµ±è¨å¼çæ´æ°æ¶éã
ç´¢å¼é常ä¸ç¨æ¼ ORDER BY
æå·è¡é£æ¥ãå°ä¸å大表ç䏿¬¡é åºæçåå䏿¬¡æåºé常æ¯ç´¢å¼æçè¦å¿«ãç¶èï¼å¦æ
å° LIMIT å ORDER BY
çµåå¨ä¸èµ·ä½¿ç¨ç話ï¼éå¸¸å°æä½¿ç¨ç´¢å¼ï¼å çºéæåè¿å表ä¸çä¸å°é¨åè¨éã
å¦æä½ ç¢ºä¿¡PostgreSQLçåªåå¨ä½¿ç¨é åºæçæ¯ä¸æ£ç¢ºçï¼ä½ å¯ä»¥ä½¿ç¨SET
enable_seqscan TO 'off'æä»¤ä¾ééé åºæçï¼
ç¶å¾å次éè¡æ¥è©¢ï¼ä½ å°±å¯ä»¥çåºä½¿ç¨ä¸åç´¢å¼æçæ¯å¦ç¢ºå¯¦è¦å¿«ä¸äºã
ç¶ä½¿ç¨éé符æä½ï¼ä¾å¦ LIKE æ ~ æï¼ç´¢å¼åªè½å¨ç¹å®çææ³ä¸ä½¿ç¨ï¼
* å符串çéå§é¨åå¿é æ¯æ®éå符串ï¼ä¹å°±æ¯èªªï¼
+ LIKE 模å¼ä¸è½ä»¥ % æé ã
+ ~ ï¼æ£å表éå¼ï¼æ¨¡å¼å¿é 以 ^ æé ã
* å符串ä¸è½ä»¥å¹éå¤ååç¬¦çæ¨¡å¼é¡æé ï¼ä¾å¦ [a-e]ã
* 大å°å¯«ç¡éçæ¥æ¾ï¼å¦ ILIKE å ~* çä¸ä½¿ç¨ç´¢å¼ï¼ä½å¯ä»¥ç¨ 4.8
ç¯æè¿°ç表éå¼ç´¢å¼ã
* å¨å initdb æå¿é æ¡ç¨é è¨çæ¬å°è¨ç½® C
localeï¼å çºç³»çµ±ä¸å¯è½ç¥éå¨é C locale ææ³æä¸ä¸åæå¤§å符æ¯ä»éº¼ã
å¨éç¨®ææ³ä¸ï¼ä½ å¯ä»¥åµå»ºä¸åç¹æ®ç text_pattern_ops ç´¢å¼ä¾ç¨æ¼
LIKE çç´¢å¼ã
å¨ 8.0 ä¹åççæ¬ä¸­
ï¼é¤éè¦æ¥è©¢çè³æé¡ååç´¢å¼çè³æé¡åç¸å¹éï¼å¦åç´¢å¼ç¶å¸¸æ¯æªè¢«ç¨å°ï¼ç¹å¥æ
¯å° int2, int8 忏å¼åçç´¢å¼ã
4.7) æå¦ä½æè½çå°æ¥è©¢åªå卿¯ææ¨£è©ä¼°èçæçæ¥è©¢ï¼
åè EXPLAIN æåé ã
4.8) æææ¨£åæ£å表éå¼æç´¢å大å°å¯«ç¡éçæ­
£å表é弿¥æ¾ï¼ææ¨£å©ç¨ç´¢å¼é²è¡å¤§å°å¯«ç¡éæ¥æ¾ï¼
æä½ç¬¦ ~ èçæ£å表éå¼å¹éï¼è ~* èç大å°å¯«ç¡éçæ£å表éå¼å¹éã大å°å¯«ç¡éç
LIKE è®ç¨®æçº ILIKEã
大å°å¯«ç¡éçç弿¯è¼é常寫åï¼
SELECT *
FROM tab
WHERE lower(col) = 'abc';
鿍£å°ä¸æä½¿ç¨æ¨æºçç´¢å¼ã使¯å¯ä»¥åµå»ºä¸åå¨éç¨®ææ³ä¸ä½¿ç¨ç表éå¼ç´¢å¼
:
CREATE INDEX tabindex ON tab (lower(col));
妿ä¸è¿°ç´¢å¼å¨åµå»ºæå å¥ UNIQUE ç´æï¼éç¶ç´¢å¼æ¬ä½èªèº«å§å®¹å¯ä»¥å­
å²å¤§å°å¯«ä¸éçå§å®¹ï¼ä½å¦ææ UNIQUE
ç´æå¾ï¼éäºå§å®¹ä¸è½å忝大å°å¯«ä¸åï¼å¦åæé æè¡çªï¼ãçºäºä¿è­
ä¸ç¼çéç¨®ææ³ï¼å¯ä»¥ä½¿ç¨ CHECK ç´ææ¢ä»¶ææ¯è§¸ç¼å¨å¨é奿é²è¡éå¶ã
4.9) å¨ä¸åæ¥è©¢è£¡ï¼æææ¨£æª¢æ¸¬ä¸åæ¬ä½æ¯å¦çº NULL
ï¼æå¦ä½æè½æºç¢ºæåºèä¸è«ææ¬ä½æ¯å¦å« NULL å¼ï¼
ç¨ IS NULL å IS NOT NULL 測試é忬ä½ï¼å·é«æ¹æ³å¦ä¸ï¼
SELECT *
FROM tab
WHERE col IS NULL;
çºäºè½å°å« NULL æ¬ä½æåºï¼å¯å¨ ORDER BY æ¢ä»¶ä¸ä½¿ç¨ IS NULL å IS NOT
NULL ä¿®é£¾ç¬¦ï¼æ¢ä»¶çºç true å°æ¯æ¢ä»¶çºå false æå¨åé¢ï¼ä¸é¢çä¾å­
å°±æå°å« NULL çè¨éæå¨çµæçä¸é¢é¨åï¼
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
4.10) å種å符é¡åä¹éæä»éº¼ä¸åï¼
é¡å å§é¨å稱 說æ
VARCHAR(n) varchar æå®äºæå¤§é·åº¦ï¼è®é·å­
符串ï¼ä¸è¶³å®ç¾©é·åº¦çé¨åä¸è£é½
CHAR(n) bpchar å®é·å符串ï¼å¯¦éè³æä¸è¶³å®ç¾©é·åº¦æï¼ä»¥ç©ºæ ¼è£é½
TEXT text æ²æç¹å¥çä¸ééå¶ï¼ååè¡çæå¤§é·åº¦éå¶ï¼
BYTEA bytea è®é·åç¯åºåï¼ä½¿ç¨NULLåç¬¦ä¹æ¯å許çï¼
"char" char å®åå符
å¨ç³»çµ±è¡¨åå¨ä¸äºé¯èª¤è³è¨è£¡ä½ å°çå°å§é¨å稱ã
ä¸é¢æåçåå種é¡åæ¯ "varlena"ï¼è®é·ï¼é¡åï¼ä¹å°±æ¯èªªï¼éé çååå­
ç¯æ¯é·åº¦ï¼å¾é¢ææ¯è³æï¼ã æ¼æ¯å¯¦éä½ç¨çç©ºéæ¯è²æç大å°è¦å¤ä¸äºã
ç¶èéäºé¡åå¦å®ç¾©å¾é·æé½å¯ä»¥è¢«å£ç¸®åå²ï¼å æ­
¤ç£ç¤ç©ºéä¹å¯è½æ¯é æ³çè¦å°ã
VARCHAR(n) å¨åå²éå¶äºæå¤§é·åº¦çè®é·åç¬¦ä¸²æ¯æå¥½çã TEXT é©ç¨æ¼å­
岿大å¯é 1G å·¦å³ä½æªå®ç¾©éå¶é·åº¦çå符串ã
CHAR(n) æé©åæ¼åå²é·åº¦ç¸åçå符串ã
CHAR(n)ææ ¹ææçµ¦å®çæ¬ä½é·åº¦ä»¥ç©ºæ ¼è£è¶³ï¼ä¸è¶³çæ¬ä½å§å®¹ï¼ï¼ è
VARCHAR(n) åªåå²æçµ¦å®çè³æå§å®¹ã BYTEA ç¨æ¼åå²äºé²å¶è³æï¼å°¤å¶æ¯åå«
NULL åç¯çå¼ãéäºé¡åå·æå·®ä¸å¤çæ§è½ã
4.11.1) æææ¨£åµå»ºä¸ååºåèææ¯èªåéå¢çæ¬ä½ï¼
PostgreSQL æ¯æ SERIAL
è³æé¡åãï¼æ¬ä½å®ç¾©çºSERIALå¾ï¼å°èªååµå»ºä¸ååºåçæå¨ï¼ä¾å¦ï¼
CREATE TABLE person (
id SERIAL,
name TEXT
);
æèªåè½æçºä»¥ä¸SQLèªå¥ï¼
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
åè create_sequence æåé ç²åéæ¼åºåçæå¨çæ´å¤è³è¨ã
4.11.2) æå¦ä½ç²å¾ä¸åæå¥çåºåèçå¼ï¼
ä¸ç¨®æ¹æ³æ¯å¨æå¥ä¹ååç¨å½æ¸ nextval() å¾åºåå°è±¡è£¡æª¢ç´¢åºä¸ä¸å SERIAL
å¼ï¼ç¶å¾åç¨æ¤å¼ç²¾ç¢ºå°æå¥ãä½¿ç¨ 4.11.1 裡çä¾è¡¨ï¼å¯ç¨å½ç¢¼é樣æè¿°ï¼
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
鿍£éè½å¨å¶ä»æ¥è©¢ä¸ä½¿ç¨åæ¾å¨ new_id è£¡çæ°å¼ï¼ä¾å¦ï¼ä½çºåç§ person
表çå¤éµï¼ã 注æèªååµå»ºç SEQUENCE å°è±¡çåç¨±å°ææ¯
<table>_<serialcolumn>_seqï¼ é裡 table å serialcolumn
å奿¯ä½ ç表çå稱åä½ ç SERIAL æ¬ä½çå稱ã
é¡ä¼¼çï¼å¨ SERIAL å°è±¡é è¨æå¥å¾ä½ å¯ä»¥ç¨å½æ¸ currval() 檢索å賦å¼ç
SERIAL å¼ï¼ä¾å¦ï¼
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
4.11.3) åæä½¿ç¨ currval() æå°è´åå¶ä»ç¨æ¶çè¡çªææ³åï¼
䏿ãcurrval() è¿åçæ¯ä½ æ¬æ¬¡æè©±é²ç¨æè³¦çå¼è䏿¯ææç¨æ¶çç¶åå¼ã
4.11.4) çºä»éº¼ä¸å¨äºåç°å¸¸ä¸æ¢å¾éç¨åºåèå¢ï¼çºä»éº¼å¨åºåèæ¬ä½çåå¼ä¸åå¨éæ·å¢ï¼
çºäºæé«ä½µç¼æ§ï¼åºåèå¨éè¦çæåè³¦äºæ­
£å¨éè¡çäºåï¼ä¸¦ä¸å¨äºåçµæä¹åä¸é²è¡éå®ï¼ éå°±æå°è´ç°å¸¸ä¸­
æ¢çäºåå¾ï¼åºåèæåºç¾ééã
4.12) ä»éº¼æ¯ OID ï¼ä»éº¼æ¯ CTID ï¼
PostgreSQL 裡åµå»ºçæ¯ä¸è¡è¨é齿ç²å¾ä¸åå¯ä¸ç OIDï¼é¤éå¨åµå»ºè¡¨æä½¿ç¨
WITHOUT OIDS é¸é ã OID åµå»ºææèªåçæä¸å 4ä½åçµçæ´æ¸ï¼ææ OID å¨ç¸æ
PostgreSQL 伺æå¨ä¸åæ¯å¯ä¸çã ç¶èï¼å®å¨è¶é 40åæå°æº¢åºï¼ OID æ­
¤å¾æåºç¾éè¤ãPostgreSQL å¨å®çå§é¨ç³»çµ±è¡¨è£¡ä½¿ç¨ OID
å¨è¡¨ä¹é建ç«è¯ç¹«ã
å¨ç¨æ¶çè³æè¡¨ä¸ï¼æå¥½æ¯ä½¿ç¨ SERIAl ä¾ä»£æ¿ OID å çº SERIAL åªè¦ä¿è­
å¨å®å表ä¸çæ¸å¼æ¯å¯ä¸çå°±å¯ä»¥äºï¼éæ¨£å®æº¢åºçå¯è½æ§å°±é常å°äºï¼
SERIAL8 å¯ç¨ä¾ä¿å8ååçµçåºåæ¸å¼ã
CTID ç¨æ¼æ¨è帶èè³æå¡ï¼å°åï¼åï¼å¡å§ï¼åç§»çç¹å®çç©çè¡ã CTID
å¨è¨éè¢«æ´æ¹æéè¼å¾ç¼çæ¹è®ãç´¢å¼è³æä½¿ç¨å®åæåç©çè¡ã
4.13) çºä»éº¼ææ¶å°é¯èª¤è³è¨ãERROR: Memory exhausted in AllocSetAlloc()ãï¼
éå¾å¯è½æ¯ç³»çµ±çèæ¬å§åç¨åäºï¼æèå§æ ¸å°æäºè³æºæè¼ä½çéå¶å¼ãå¨åå
postmaster ä¹å試試ä¸é¢çå½ä»¤ï¼
ulimit -d 262144
limit datasize 256m
åæ±ºæ¼ä½ ç¨ç
shellï¼ä¸é¢å½ä»¤åªæä¸æ¢è½æåï¼ä½æ¯å®å°æä½ çé²ç¨è³ææ®µéå¶è¨å¾æ¯è¼é«ï¼
å èä¹è¨±è½è®æ¥è©¢å®æã鿢å½ä»¤æç¨æ¼ç¶åé²ç¨ï¼ä»¥åææå¨éæ¢å½ä»¤éè¡å¾åµå»ºç
åé²ç¨ã
å¦æä½ æ¯å¨éè¡SQL客æ¶ç«¯æå çºå¾å°è¿åäºå¤ªå¤çè³æèåºç¾åé¡ï¼è«å¨éè¡å®¢æ¶ç
«¯ä¹åå·è¡ä¸è¿°å½ä»¤ã
4.14) æå¦ä½æè½ç¥éæéè¡çPostgreSQLççæ¬ï¼
å¾ psql 裡ï¼è¼¸å¥ SELECT version();æä»¤ã
4.15) æå¦ä½åµå»ºä¸åé è¨å¼æ¯ç¶åæéçæ¬ä½ï¼
ä½¿ç¨ CURRENT_TIMESTAMPï¼
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) æææ¨£é²è¡ outer join ï¼å¤é£æ¥ï¼ï¼
PostgreSQL æ¡ç¨æ¨æºç SQL èªæ³æ¯æå¤é£æ¥ãé裡æ¯å©åä¾åï¼
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
ææ¯
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
éå©åçå¹çæ¥è©¢å¨ t1.col å t2.col ä¸å飿¥ï¼ä¸¦ä¸è¿å t1 中
æææªé£æ¥çè¡ï¼é£äºå¨ t2 䏿²æå¹éçè¡ï¼ã å³[å¤]飿¥ï¼RIGHT OUTER
JOINï¼å°è¿å t2 䏿ªé£æ¥çè¡ã å®å¨å¤é£æ¥ï¼FULL OUTER JOINï¼å°è¿å t1 å t2
䏿ªé£æ¥çè¡ã ééµå OUTER å¨å·¦[å¤]飿¥ãå³[å¤]飿¥åå®å¨[å¤]飿¥ä¸­
æ¯å¯é¸çï¼æ®é飿¥è¢«ç¨±çºå§é£æ¥ï¼INNER JOINï¼ã
4.17) å¦ä½ä½¿ç¨æ¶åå¤åè³æåº«çæ¥è©¢ï¼
æ²æè¾¦æ³æ¥è©¢ç¶åè³æåº«ä¹å¤çè³æåº«ã
å çºPostgreSQLè¦å è¼èè³æåº«ç¸éç系統ç®éï¼ç³»çµ±è¡¨ï¼ï¼å æ­
¤è·¨è³æåº«çæ¥è©¢å¦ä½å·è¡æ¯ä¸å®çã
éå å¢å¼æ¨¡å¡ contrib/dblink
å許æ¡ç¨å½æ¸èª¿ç¨å¯¦ç¾è·¨åº«æ¥è©¢ãç¶ç¶ç¨æ¶ä¹å¯ä»¥åæé£æ¥å°ä¸åçè³æåº«å·è
¡æ¥è©¢ç¶å¾å¨å®¢æ¶ç«¯åä½µçµæã
4.18) å¦ä½è®å½æ¸è¿åå¤è¡æå¤åè³æï¼
å¨å½æ¸ä¸è¿åè³æè¨ééçåè½æ¯å¾å®¹æä½¿ç¨çï¼è©³æåè¦ï¼
http://techdocs.postgresql.org/guides/SetReturningFunctions
4.19) çºä»éº¼æå¨ä½¿ç¨ PL/PgSQL 彿¸ååè¨æè¡¨æææ¶å°é¯èª¤è³è¨ãrelation with OID
##### does not existãï¼
PL/PgSQL æç·©å彿¸çè³æ¬å§å®¹ï¼ç±æ¤å¸¶ä¾çä¸åä¸å¥½çå¯ä½ç¨æ¯è¥ä¸å
PL/PgSQL
彿¸è¨ªåäºä¸åè¨æè¡¨ï¼ç¶å¾è©²è¡¨è¢«åªé¤ä¸¦é建äºï¼å忬¡èª¿ç¨è©²å½æ¸å°å¤
±æï¼ å çºç·©åç彿¸å§å®¹ä»ç¶æåèçè¨æè¡¨ãè§£æ±ºçæ¹æ³æ¯å¨ PL/PgSQL 中
ç¨EXECUTE å°è¨æè¡¨é²è¡è¨ªåã鿍£æä¿èæ¥è©¢å¨å·è¡å總æè¢«éæ°è§£æã
4.20) ç®åæåªäºè³æè¤å¯«(replication)æ¹æ¡å¯ç¨ï¼
ãè¤å¯«ãåªæ¯ä¸åè¡èªï¼æå¥½å¹¾ç¨®è¤å¯«æè¡å¯ç¨ï¼æ¯ç¨®é½æåªé»å缺é»ï¼
主/å¾å¼è¤å¯«æ¹å¼æ¯å許ä¸å主伺æå¨æ¥åè®/寫çç³è«ï¼èå¤åå¾ä¼ºæå¨åªè½æ¥å
è®/SELECTæ¥è©¢çç³è«ï¼ ç®åææµè¡ä¸åè²»ç主/å¾PostgreSQLè¤å¯«æ¹æ¡æ¯
Slony-I ã
å¤å主伺æå¨çè¤å¯«æ¹å¼å許å°è®/寫çç³è«ç¼é給å¤å°ç主æ©ï¼é種æ¹å¼ç±æ¼é
è¦å¨å¤å°ä¼ºæå¨ä¹éåæ¥è³æè®å å¯è½æå¸¶ä¾è¼å´éçæ§è½æå¤±ï¼Pgcluster
æ¯ç®åéç¨®æ¹æ¡ä¸æå¥½çï¼ä¸¦ä¸éå¯ä»¥åè²»ä¸è¼ã
乿ä¸äºåæ¥éä»è²»ååºæ¼ç¡¬é«çè³æè¤å¯«æ¹æ¡ï¼æ¯æä¸è¿°å種è¤å¯«æ¨¡åã
4.21) çºä½æ¥è©¢çµæé¡¯ç¤ºçè¡¨åææ¬åèæçæ¥è©¢èªå¥ä¸çä¸åï¼çºä½å¤§å¯«çæä¸è½ä¿çï¼
æå¸¸è¦çåå æ¯å¨åµå»ºè¡¨æå°è¡¨åææ¯æ¬å使ç¨äºéå¼è( ' '
)ï¼ç¶ä½¿ç¨äºéå¼èå¾ï¼è¡¨åææ¬åï¼ç¨±çºæ¨è符ï¼å岿æ¯åå 大å°å¯«çï¼
éæè¬èä½ å¨æ¥è©¢æè¡¨åææ¬åä¹æä½¿ç¨éå¼èï¼ä¸äºå·¥å·è»é«ï¼å pgAdmin
æå¨ç¼åºåµå»ºè¡¨çæä»¤æèªåå°å¨æ¯åæ¨è符ä¸å éå¼èã å æ¤ï¼çºäºæ¨è­
符ççµ±ä¸ï¼ä½ æè©²ï¼
* å¨åµå»ºè¡¨æé¿åå°æ¨è符使ç¨éå¼èå¼èµ·ä¾ã
* 卿¨è符ä¸åªä½¿ç¨å°å¯«åæ¯ã
* ï¼çºäºèå·²åå¨çæ¨è符ç¸åï¼å¨æ¥è©¢ä¸ä½¿ç¨éå¼èå°æ¨è符å¼èµ·ä¾ã

View File

@ -1,849 +0,0 @@
Frequently Asked Questions
Casto kladené dotazy (FAQ) PostgreSQL
Poslední aktualizace: 29. ríjna 2007 (aktualizováno pro PostgreSQL
8.3)
Soucasný správce: Bruce Momjian (bruce@momjian.us)
Prelozil: Pavel Stehule (pavel.stehule@gmail.com)
Nejaktuálnejsí verzi tohoto dokumentu naleznete na adrese
http://www.postgresql.org/files/documentation/faqs/FAQ.html
Odpovedi na otázky vázané na konkrétní platformy naleznete na adrese
http://www.postgresql.org/docs/faq/.
_________________________________________________________________
Obecné otázky
1.1) Co je to PostgreSQL? Jaká je správná výslovnost slova PostgreSQL?
1.2) Kdo rídí vývoj PostgreSQL?
1.3) Pod jakou licencí je PostgreSQL?
1.4) Na kterých platformách lze provozovat PostgreSQL?
1.5) Kde mohu získat PostgreSQL?
1.6) Jaká je poslední verze?
1.7) Kde mohu získat podporu?
1.8) Jak a kam hlásit chyby?
1.9) Kde najdu informace o známých chybách nebo nepodporovaných
vlastnostech?
1.10) Jaká je dostupná dokumentace?
1.11) Jak se mohu naucit SQL?
1.12) Jak se mohu pripojit k týmu vývojáru?
1.13) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
1.14) Je PostgreSQL pripraven na aktuální zavádení letního casu v
nekterých zemích?
Dotazy na klientská rozhraní
2.1) Která rozhraní jsou pouzitelná pro PostgreSQL?
2.2) Jaké nástroje lze pouzít pro PostgreSQL a web?
2.3) Existuje grafické rozhraní pro PostgreSQL?
Administrativní dotazy
3.1) Jak nainstalovat PostgreSQL jinam nez do /usr/local/pgsql?
3.2) Jak nastavit pravidla pro prístup z jiných stanic?
3.3) Jak vyladit databázi na vyssí výkon?
3.4) Jaké mám ladící prostredky?
3.5) Co znamená "Sorry, too many clients", kdyz se zkousím pripojit?
3.6) Proc je nutný dump a obnovení (load) databáze pri upgradu
PostgreSQL?
3.7) Jaký hardware bych mel pouzívat?
Provozní dotazy
4.1) Jak získat pouze první rádek dotazu? Náhodný rádek?
4.2) Jak získám seznam tabulek, indexu, databází, a definovaných
uzivatelu. Mohu videt dotazy, které pouzívá psql pro zobrazení techto
informací?
4.3) Jak zmenit datový typ sloupce?
4.4) Jaká je maximální velikost rádku, tabulky a databáze?
4.5) Kolik diskového prostoru je potreba k ulození dat z normálního
textového souboru?
4.6) Muj dotaz je pomalý a nepouzívá vytvorené indexy. Proc?
4.7) Jak zjistím, jak se vyhodnocuje muj dotaz?
4.8) Jak pouzít case-(in)sensitive regulární výraz? Jak pouzít index
pro case insensitive hledání?
4.9) Jak v dotazu detekovat, ze polozka je NULL? Jak bezpecne spojit
dva retezce, pokud mohou obsahovat NULL? Lze trídit podle toho, jestli
je polozka NULL nebo ne?
4.10) Jaké jsou rozdíly mezi ruznými znakovými typy?
4.11.1) Jak vytvorit serial/auto-increment polozku?
4.11.2) Jak získat hodnotu SERIAL po vlození rádku?
4.11.3) Nezpusobí currval() a nextval() problémy ve více uzivatelském
prostredí?
4.11.4) Proc není vygenerované císlo pouzito pri prerusení
transakce?Proc vznikají díry v císlování prostrednictvím sekvence nebo
typu SERIAL?
4.12) Co to je OID? Co je to CTID?
4.13) Co znamená chybové hlásení "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.14) Jak zjistím, kterou verzi PostgreSQL pouzívám?
4.15) Jak vytvorit sloupec, který bude implicitne obsahovat aktuální
cas?
4.16) Jak provést vnejsí spojení (outer join)?
4.17) Jak provést dotaz napríc nekolika databázemi?
4.18) Muze funkce vrátit více rádku nebo sloupcu?
4.19) Co je prícinou chyby "relation with OID xxxxx does not exist"?
4.20) Jaké jsou moznosti replikace databází?
4.21) Proc v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí?
Proc jsou velká písmena v názvech automaticky prevedena na malá
písmena?
_________________________________________________________________
Obecné otázky
1.1) Co je to PostgreSQL? Jaká je správná výslovnost slova PostgreSQL?
Výslovnost PostgreSQL je Post-Gres-Q-L , nebo zjednodusene Postgres .
V rade jazyku je slovo PostgreSQL obtízne vyslovitelný, proto se v
hovoru casto pouzívá zjednodusená forma názvu. Pro ty, kterí by si
rádi poslechli výslovnost, je k dispozici audiozáznam v MP3 formátu.
PostgreSQL je relacní databáze s nekterými objektovými rysy, která má
moznosti tradicních komercních databázových systému s nekolika
rozsíreními, které lze najít v DBMS systémech prístí generace.
Pouzívání PostgreSQL není omezené a veskeré zdrojové kódy jsou volne
dostupné.
Za vývojem PostgreSQL je mezinárodní skupina nezávislých vývojáru
navzájem komunikujících prostrednictvím internetu. Tento projekt není
rízen zádnou obchodní organizací. Pokud se chcete pridat k projektu,
prectete si vývojárské FAQ na adrese
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html .
1.2) Kdo rídí vývoj PostgreSQL?
Pokud budete hledat organizaci rídící vývoj PostgreSQL, budete
zklamáni. Nic takového neexistuje. Existují pouze "core" a CVS skupiny
uzivatelu, ale ty existují více z administrátorských duvodu nez z
organizacních. Projekt je smerován komunitou vývojáru a uzivatelu, ke
které se kdokoliv muze pripojit. Jediné co potrebuje, je prihlásit se
do elektronické konference. Více ve vývojárském FAQ.
1.3) Pod jakou licencí je PostgreSQL?
PostgreSQL je predmetem následujících autorských práv:
Dílcí Copyright (c) 1996-2009, PostgreSQL Global Development Group
Dílcí Copyright (c) 1994-6, Regents of the University of California
Udeluje se oprávnení k uzití, rozmnozování, provádení úprav a
rozsirování tohoto softwaru a dokumentace k nemu, pro jakékoli úcely,
bez licencního poplatku a bez písemné licencní smlouvy, za podmínky,
ze na vsech jeho kopiích je uvedeno oznámení o výse uvedených právech,
jakoz i obsah tohoto a dvou následujících odstavcu.
THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ZÁDNÉM
PRÍPADE ODPOVEDNA ZÁDNÉ TRETÍ OSOBE ZA PRÍMOU, NEPRÍMOU, ZVLÁSTNÍ,
NAHODILOU NEBO VÝSLEDNOU SKODU, VCETNE USLÉHO ZISKU, ZPUSOBENOU UZITÍM
TOHOTO SOFTWARU A DOKUMENTACE K NEMU, A TO I V PRÍPADE, ZE THE
UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOZNOSTI VZNIKU TAKOVÉ
SKODY.
THE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO
NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VÝROBKU KE
SPECIFICKÝM ÚCELUM. NÍZE UVEDENÝ SOFTWARE JE POSKYTNUT "JAK STOJÍ A
LEZÍ" A THE UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO
ÚDRZBU, PODPORU, AKTUALIZACI, VYLEPSENÍ NEBO MODIFIKACI.
Výse uvedené je BSD licence, bezná licence otevreného zdroje. Není zde
zádné omezení ohledne uzití kódu zdroje. Jsme s tím spokojeni a nemáme
v úmyslu na této skutecnosti cokoli menit.
1.4) Na kterých platformách lze provozovat PostgreSQL?
Strucne receno, PostgreSQL bezí na vsech moderních unixových
systémech. Seznam tech, u kterých probehlo testování, naleznete v
instalacních instrukcích.
PostreSQL také bezí nativne na vsech Microsof Windows systémech
odvozených z Microsoft Windows NT jako jsou Windows 2000SP4, WindowsXP
a Windows2003. Instalacní balícek naleznete na adrese
http://pgfoundry.org/projects/pginstaller. Na starsích systémech s
jeste MS-DOS jádrem lze spustit PostgreSQL s emulacním programem
Cygwin.
Dále existuje port pro Novell Netware 6 port na adrese
http://forge.novell.com, a pro OS/2 verze (eComStation) na adrese
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F .
1.5) Kde mohu získat PostgreSQL?
Pomocí webového klienta z adresy http://www.postgresql.org/ftp/ nebo
klienta ftp z adresy ftp://ftp.postgresql.org/pub/.
1.6) Jaká je poslední verze?
Nejnovejsí verzí PostgreSQL je verze 8.2.5
V plánu je uvolnovat kazdorocne jednu velkou verzi a kazdých nekolik
mesícu malé verze.
1.7) Kde mohu získat podporu?
Nejcastejsí forma podpory uzivatelum PostgreSQL komunitou je
prostrednictvím e-mailu. Na nasem webovém serveru naleznete odkaz na
stránky,kde se muzete prihlásit do elektronické konference. Pro
zacátek jsou doporucené konference general nebo bugs.
Dalsí cestou je IRC kanál #postgresql na Freenode (irc.freenode.net).
K pripojení pouzijte Unixový príkaz irc -x '#postgresql' "$USER"
irc.freenode.net nebo jakékoholiv jiného IRC klienta. V této síti
existuje jeste spanelská (#postgresql-es) a francouzská
(#postgresqlfr) verze. Dalsí PostgreSQL kanál naleznete na EFNet.
Seznam spolecností poskytující komercní podporu naleznete na adrese
http://techdocs.postgresql.org/companies.php.
1.8) Jak a kam hlásit chyby?
Vyplnte formulár na adrese
http://www.postgresql.org/support/submitbug. Na nasem ftp serveru
ftp://ftp.postgresql.org/pub/ si overte, ze pouzíváte aktuální verzi
PostreSQL.
Chyby reportované prostrednictvím chybového formuláre nebo zasláním
mailu do PostgreSQL konference obvykle generuje následující odezvu:
* Nejedná se o chybu, a proc
* Jedná se o známou chybu, která je jiz v seznamu úkolu TODO
* Tato chyba byla opravena v aktuální verzi
* Tato chyba byla jiz opravena ve verzi, která zatím nebyla
oficiálne uvolnena
* Pozadavek na dalsí doplnující informace:
+ Operacní systém
+ Verze PostgreSQL
+ Test reprodukující chybu
+ Ladící informace
+ Backtrace výstup debuggeru
* Jedná se o zatím nezjistenou chybu, pak muzete cekat
+ Záplatu odstranující chybu, která bude vlozena do dalsí velké
nebo malé verze
+ Informaci, ze se jedná o chybu, kterou nelze okamzite resit a
je proto pridána do TODO
1.9) Kde najdu informace o známých chybách nebo nepodporovaných vlastnostech?
PostgreSQL podporuje rozsírenou podmnozinu SQL:2003. V nasem TODO
naleznete seznam známých chyb, chybejících vlastností, a plány do
budoucna.
Odezva na pozadavek na novou vlastnost PostgreSQL je obvykle:
* Pozadavek je jiz v TODO
* Pozadovaná funkce není chtená protoze
+ Duplikuje jiz existující funkci, která respektuje SQL
standard
+ Implementací funkce by se prílis zkomplikoval kód bez
relevantního prínosu
+ Funkce by mohla být nebezpecná nebo nespolehlivá
* Pozadavek je pridán do TODO
PostgreSQL nepozívá systém pro sledování chyb, protoze jsme zjistili,
ze je efektivnejsí prímo reagovat na maily a udrzovat aktuální TODO. V
praxi je snaha o co nejrychlejsí resení chyb, a chyby, které by se
mohly projevit u mnoha uzivatelu jsou opravovány velice rychle. Jediné
místo, kde lze dohledat vsechny zmeny, rozsírení a opravy v PostgreSQL
je CVS log. Poznámky k verzi "Release notes" nezachycují vsechny
zmeny, k nemz doslo.
1.10) Jaká je dostupná dokumentace?
PostgreSQL obsahuje vynikající dokumentaci zahrnující manuál,
manuálové stránky a testovací príklady. Podívejte se do adresáre /doc.
Manuál je prístupný online na http://www.postgresql.org/docs.
K dispozici jsou zdarma dve online knihy na adresách
http://www.postgresql.org/docs/books/awbook.html a
http://www.commandprompt.com/ppbook/. Dalsí literaturu lze zakoupit.
Nejpopulárnejsí je od Kerryho Douglase. Seznam dostupné literatury je
na http://techdocs.postgresql.org/techdocs/bookreviews.php. Jeste je
kolekce technicky orientovaných clánku tematicky spojených s
PostgreSQL na adrese http://techdocs.postgresql.org/.
Rádkový klient psql má \d príkazy pro zobrazení informací o typech,
operátorech, funkcích, agregacních funkcí, atd. Pouzijte \? pro
zobrazení dostupných príkazu.
Dalsí dokumentaci najdete na nasem webu.
1.11) Jak se mohu naucit SQL?
Podívejte se do výse uvedené dokumentace. Dalsí online knihou je
"Teach Yourself SQL in 21 Days, Second Edition" na adrese
http://members.tripod.com/er4ebus/sql/index.htm. Mnoho nasich
uzivatelu doporucuje knihu The Practical SQL Handbook, Bowman, Judith
S., et al., Addison-Wesley. Dalsí The Complete Reference SQL, Groff et
al., McGraw-Hill.
Dalsí online tutoriály jsou dostupné na adresách:
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12) Jak se mohu pripojit k týmu vývojáru?
Prostudujte si Developer's FAQ.
1.13) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
Software muzeme porovnávat z nekolika ruzných pohledu: vlastnosti,
výkon, spolehlivost, podpora a cena.
Vlastnosti
PostgreSQL nabízí vetsinu funkcí funkcionality velkých komercních DBMS
systému jako jsou: transakce, vnorené dotazy, spouste, referencní
integrita a sofistikovaný systém zamykání. Poskytujeme urcité funkce,
které ostatní systémy bezne nepodporují. Napr. uzivatelem definované
typy, dedicnost, pravidla (rules), a MVCC architekturu.
Výkon
Výkon PostgreSQL je srovnatelný s ostatními komercními nebo Open
Source databázemi. V nekterých prípadech je rychlejsí, jindy
pomalejsí. Nás výkon je obvykle +/-10% vuci ostatním databázím.
Spolehlivost
Uvedomujeme si, ze databáze musí být stoprocentne spolehlivá, jinak je
nepouzitelná. Snazíme se, aby kazdá verze byla dobre otestována a
obsahovala minimum chyb. Kazdá verze je minimálne nekolik mesícu v
beta testovacím rezimu. Do produkcního rezimu se dostane, az kdyz
nedochází k dalsím zmenám nebo opravám. Veríme, ze jsem více nez
srovnatelní s ostatními databázemi v této oblasti.
Podpora
Na nasich internetových konferencích se setkává velká skupina vývojáru
a uzivatelu pri resení vyskytujících se problému. Nase internetové
konference umoznují kontakt velké skupiny vývojáru a uzivatelu.
Nemuzeme garantovat opravu chyby, ale komercní DBMSs také vzdy
negarantují resení problému. Veríme ale, ze díky prímému kontaktu na
vývojáre, nasi uzivatelskou komunitu, manuálum, a dostupným zdrojovým
kódum máme lepsí podporu nez ostatní DBMSs. Pro ty, kterí preferují
komercní "per-incident" podporu, existuje spolecností, kterí ji
nabízejí (FAQ sekce 1.7.)
Cena
PostgreSQL lze pouzívat bezplatne (a to i pro komercní pouzití). Také
muzete neomezene pouzívat nás kód ve svých produktech s výjimkami
specifikovanými v nasí licenci (prebíráme BSD licenci).
1.14) Je PostgreSQL pripraven na aktuální zavádení letního casu v nekterých
zemích?
Pocínaje verzí 8.0.[4+] podporuje PostgreSQL letní cas také pro USA.
Podpora letního casu (daylight saving time) pro Kanadu a Západní
Austrálii je obsazena ve verzích 8.0.[10+] a 8.1.[6+] a vsech
následujících verzích. Starsí verze pouzívaly systémovou databázi
casových zón obsahující, krome jiného, informaci o tom, zda se pro
danou casovou zónu rozlisuje mezi letním a zimním casem.
_________________________________________________________________
Dotazy na klientská rozhraní
2.1) Která rozhraní jsou pouzitelná pro PostgreSQL?
PostgreSQL se distribuuje pouze s rozhraním pro jazyk C a embedded C.
Vsechna dalsí rozhraní predstavují nezávislé projekty, které je treba
stáhnout z internetu samostatne. Osamostatnení techto projektu
umoznuje nezávislost vývojových týmu a moznost vydávat nové verze bez
ohledu na vydání nové verze PostgreSQL.
Nekteré programovací jazyky jako je napr. PHP obsahují rozhraní pro
PostgreSQL. Rozhraní pro jazyky jako je Perl, Tcl, Python a mnoho
dalsích jsou dostupné na adrese: http://gborg.postgresql.org v sekci
Drivers/Interfaces.
2.2) Jaké nástroje lze pouzít pro PostgreSQL a web?
Dobrým úvodem do problematiky databází v prostredí webových stránek
muze být web http://www.webreview.com.
PHP (http://www.php.net) je vynikajícím rozhraním pro tvorbu webu.
Pro slozitejsí úlohy se casto pouzívá Perl a jeho BDB:Pg rozhraní s
podporou CGI - CGI.pm nebo mod_perl(u).
2.3) Existuje grafické rozhraní pro PostgreSQL?
K dispozici je rada grafických nástroju podporujících PostgreSQL a to
od komercních nebo open source vývojáru. Podrobný seznam naleznete na
adrese http://www.postgresql.org/docs/techdocs.54.
_________________________________________________________________
Administrativní dotazy
3.1) Jak nainstalovat PostgreSQL jinam nez do /usr/local/pgsql?
Pri spoustení configure nastavte parametr --prefix
3.2) Jak nastavit pravidla pro prístup z jiných stanic?
Ve výchozí konfiguraci, PostgreSQL umoznuje pouze pripojení z
lokálního uzivatele prostrednictvím Unix domain sockets nebo TCP/IP
spojení. Bez modifikace listen_addresses v souboru postgresql.conf, a
povolení adresy v souboru $PGDATA/pg_hba.conf se nelze pripojit k
PostgreSQL z ostatních stanic. Zmena výse zmínených parametru vyzaduje
restart databázového serveru.
3.3) Jak vyladit databázi na vyssí výkon?
Výkon systému muzete ovlivnit ve trech oblastech:
Zmeny dotazu
* Pouzitím indexu vcetne cástecných a funkcionálních
* Pouzitím COPY místo opakovaných INSERTu
* Sloucením mnoha SQL príkazu do jedné transakce snízením rezie na
commit
* Pouzíváním CLUSTERU, pokud nacítáte vetsí pocet rádek podle indexu
* Pouzitím klauzule LIMIT v poddotazech
* Pouzitím predpripravených dotazu
* Pouzíváním ANALYZE. Tento príkaz aktualizuje statistiky, které se
pouzívají pri optimalizaci dotazu
* Pravidelné pouzití VACUUM nebo pouzívání pg_autovacuum
* Odstranením indexu pred rozsáhlými zmenami v datech
Konfigurace serveru
Urcité parametry v souboru postgresql.conf mají vliv na výkon serveru.
Detaily naleznete v prírucce Administrátora v Server Run-time
Environment/Run-time Configuration. Dalsí komentáre naleznete v
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.ht
ml a http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Výber hardware
Vliv hardware na výkon serveru je popsán v dokumentech
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html
a http://www.powerpostgresql.com/PerfList/.
3.4) Jaké mám ladící prostredky?
Nastavením log_* promenných v konfiguraci serveru si vynutíte logování
dotazu a procesních statistik, které Vám mohou pomoci pri ladení a
optimalizaci výkonu.
3.5) Co znamená "Sorry, too many clients", kdyz se zkousím pripojit?
Prekrocil jste výchozí limit, který je 100 soucasne pripojených
uzivatelu. V konfiguraci serveru v postgresql.conf tuto hodnotu muzete
zvetsit zmenou hodnoty max_connection. Nezapomente restartovat server.
3.6) Proc je nutný dump a obnovení (load) databáze pri upgradu PostgreSQL?
Zpusob císlování je popsán v dokumentaci na
http://www.postgresql.org/support/versioning. Instrukce k provedení
migrace na vyssí verzi jsou taktéz v dokumentaci na adrese
http://www.postgresql.org/docs/current/static/install-upgrading.html.
3.7) Jaký hardware bych mel pouzívat?
Jelikoz PC jsou vetsinou kompatibilní, lidé mají tendence verit, ze
vsechna PC jsou stejne kvalitní. Coz není pravda. Pameti ECC, SCSI a
kvalitní základní desky jsou mnohem spolehlivejsí a výkonnejsí nez
lacinejsí hardware. PostgreSQL pobezí na vetsine hardwaru, nicméne
pokud je pro Vás spolehlivost a výkon systému dulezitá, je dobré
venovat cas nalezení vhodné hardwarové konfigurace. Na nasich
elektronických konferencích muzete diskutovat o vhodných konfiguracích
a znackách.
_________________________________________________________________
Provozní dotazy
4.1) Jak získat pouze první rádek dotazu? Náhodný rádek?
Pokud potrebujete pouze nekolik rádku a pokud víte kolik, pouzijte
SELECT LIMIT. Pokud bude mozné pouzít index shodující se s ORDER BY,
je mozné, ze se nebude provádet celý dotaz. Pokud neznáte pocet
záznamu, pouzijte kurzor a príkaz FETCH.
Pro výber náhodného rádku pouzijte príkaz ve tvaru:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) Jak získám seznam tabulek, indexu, databází, a definovaných uzivatelu.
Mohu videt dotazy, které pouzívá psql pro zobrazení techto informací?
V psql príkazem \dt získáte seznam tabulek. Úplný seznam príkazu psql
získáte príkazem \?. Alternativne si muzete prostudovat zdrojový kód
psql - soubor pgsql/src/bin/psql/describe.c, který obsahuje SQL
príkazy, které jsou generovány pro získání výstupu psql "backslash"
príkazu. Také muzete nastartovat psql s parametrem -E, který zpusobí
zobrazení vsech SQL príkazu, které se odesílají na server. PostgreSQL
také podporuje SQL standard INFORMACNÍ SCHÉMATA (standardní systémové
tabulky). Klasickým dotazem do systémových tabulek získáte pozadované
informace o strukture databáze.
Systémové tabulky PostgreSQL (mimo rámec SQL standardu) pouzívají
prefix pg_. Pro zjistení struktury databáze je muzete pouzít také, i
kdyz preferovány jsou dotazy do informacního schématu.
Seznam vsech databází získáte príkazem psql -l
Dalsí inspiraci najdete v souboru pgsql/src/tutorial/syscat.source.
Obsahuje ilustracní SELECTy potrebné k získání informací z systémových
tabulek databáze.
4.3) Jak zmenit datový typ sloupce?
Ve verzích 8.0 a pozdejsích jednoduse:
ALTER TABLE ALTER COLUMN TYPE
V starsích verzích:
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;
Po zmene spustte príkaz VACUUM FULL, aby doslo k uvolnení diskového
prostoru pouzitého v tu chvíli jiz neplatnými záznamy.
4.4) Jaká je maximální velikost rádku, tabulky a databáze?
PostgreSQL má tato omezení:
Maximální velikost databáze: neomezena (existují 32TB db)
Maximální velikost tabulky: 32 TB
Maximální velikost rádky: 480GB
Maximální velikost polozky 1 GB
Maximální pocet rádku v tabulce: neomezeno
Maximální pocet sloupcu v tabulce: 250-1600 podle typu
Maximální pocet indexu na tabulce: neomezeno
Ve skutecnosti nic není neomezeno, limitem bývá vzdy dostupná disková
pamet nebo velikost operacní pameti. Pokud máte nekterou z techto
hodnot neobvykle velkou, muze dojít ke snízení výkonu.
Maximální velikost tabulky je 32 TB a nevyzaduje podporu velkých
souboru operacním systémem. Velké tabulky se ukládají do nekolika 1 GB
souboru takze limity souborového systému nejsou podstatné.
Maximální velikost tabulky a maximální pocet sloupcu muzeme
zectyrnásobit nastavením velikosti bloku na 32K.
Indexy jsou povolené pouze na sloupcích jejichz délka je mensí nez
2000 znaku. Pokud tuto délku prekrocíme a index potrebujeme pro
zajistení jednoznacnosti, je vhodnejsí pouzít funkcionální index nad
MD5 funkcí nebo fulltextový index.
4.5) Kolik diskového prostoru je potreba k ulození dat z normálního textového
souboru?
PostgreSQL vyzaduje az petinásobek diskového prostoru k ulození dat z
textového souboru.
Napríklad, uvazujme soubor se 100 tisíci rádky obsahující na kazdé
rádce celé císlo a textový popis. Text je v prumerne dvacet bytu
dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze
obsahující odpovídající data bude zhruba 5.2 MB.
24 bytu: hlavicka rádku (priblizne)
24 bytu: jedna celocíselná polozka a jedna textová
+ 4 byty: ukazatel na stránku k entici
------------------------------------------------------
52 bytu na rádek
Velikost datové stránky PostgreSQL je 8192 bytu (8KB)
8192 bytu na stránce
---------------------- = 158 rádek na stránku
52 bytu za rádek
100000 rádek
----------------------- = 633 stránek (zaokrouhleno nahoru)
158 rádek na stránce
633 datových stránek * 8192 bytu na kazdou stránku = 5,185,536 bytu (5.2 MB)
Indexy nemají tak velkou rezii, ale mohou být také velké, protoze
obsahují indexovaná data.
Hodnoty NULL jsou ulozeny v bitmapách, takze zabírají jen velmi málo
diskového prostoru.
4.6) Muj dotaz je pomalý a nepouzívá vytvorené indexy. Proc?
Kazdý dotaz nemusí nutne pouzít existující indexy. Index se pouzije
tehdy, kdyz je tabulka vetsí nez urcitá minimální velikost, a dotaz
vybírá pouze procentuálne malou cást rádku tabulky. To proto, ze
náhodný prístup k disku daný ctením indexu muze být pomalejsí nez
lineární ctení tabulky nebo sekvencní ctení.
PostgreSQL rozhoduje o pouzití indexu na základe statistiky prístupu k
tabulce. Tyto statistiky se shromazdují príkazy VACUUM ANALYZE nebo
ANALYZE. Díky statistikám má optimizer informaci o poctu rádek v
tabulce a muze lépe rozhodnout o pouzití indexu. Statistiky se uplatní
pri urcení optimálního poradí a metody spojení tabulek. Statistiky by
se meli aktualizovat opakovane, tak jak se mení obsah tabulek.
Indexy nejsou obycejne pouzity pro setrídení nebo spojení tabulek.
Sekvencní zpracování následované explicitním trídením je obycejne
rychlejsí nez pouzití indexu na velké tabulce.
Jinak je tomu v prípade pouzití LIMIT a ORDER BY, pri kterém se
vetsinou index pouzije, jelikoz je výsledkem pouze malá cást tabulky.
Pokud si myslíte, ze optimizer mylne zvolil sekvencní prohledávání
tabulky, pouzijte príkaz SET enable_seqscan TO 'off' a zkuste zda je
prohledávání s indexem rychlejsí.
Pri vyhledávání na základe vzoru jako je napr. operátor LIKE nebo ~ se
indexy pouzijí pouze za urcitých skutecností:
* zacátek hledaného vzoru musí být ukotven k zacátku, tj.
+ vzor LIKE nesmí zacínat %
+ ~ regulární výraz musí zacínat ^
* vzor nesmí zacínat intervalem, napr. [a-e]
* vyhledávaní, které není Case sensitiv jako je ILIKE nebo ~*
nepouzívá indexy. Muzete ale pouzít funkcionální indexy, které
jsou popsány v sekci 4.8
* pri inicializaci databáze (initdb) musí být pouzito C locale nebo
vytvorte speciální text_pattern_index, který umozní, pri
respektování zmínených podmínek pouzití indexu operací LIKE. Pro
vyhledávání celých slov je mozné a výhodné pouzít fulltext.
4.7) Jak zjistím, jak se vyhodnocuje muj dotaz?
Podívejte se do nápovedy k príkazu EXPLAIN.
4.8) Jak pouzít case-(in)sensitive regulární výraz? Jak pouzít index pro case
insensitive hledání?
Vyhledávání prostrednictvím regulárních vzoru zajistuje operátor ~,
který je case-sensitive. Jeho case-insensitive varianta je operátor
~*. Case-insensitive variací operátoru LIKE je operátor ILIKE.
Case-insensitive vyhledání se resí:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Tento dotaz nepouzije standardní index. Musíte pouzít tzv.
funkcionální index:
CREATE INDEX tabindex ON tab (lower(col));
Pokud index vytvoríme jako unikátní, tak muzeme ukládat retezce
obsahující malá i velká písmena, ale nikoliv retezce, které se od sebe
odlisují jen v malých a velkých písmenech. K zajistení zápisu retezce
obsahující pouze malá nebo pouze velká písmena pouzijte CHECK kontroly
nebo triggery.
4.9) Jak v dotazu detekovat, ze polozka je NULL? Jak bezpecne spojit dva
retezce, pokud mohou obsahovat NULL? Lze trídit podle toho, jestli je polozka
NULL nebo ne?
Pokud chcete testovat hodnotu NULL pouzijte operátor IS:
SELECT *
FROM tab
WHERE col IS NULL;
K spojení retezcu, které mohou obsahovat hodnotu NULL, pouzívejte
funkci COALESCE(), napr.:
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
Pokud chcete trídit podle hodnoty NULL, pouzijte výraz IS NULL nebo IS
NOT NULL v klauzuli ORDER. Hodnota pravda má prednost pred hodnotou
false a tedy pokud pouzijete:
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
tak záznamy s NULL budou na zacátku setrídených dat.
4.10) Jaké jsou rozdíly mezi ruznými znakovými typy?
Typ Interní název Poznámky
VARCHAR(n) varchar n urcuje maximální délku
CHAR(n) bpchar retezec je do dané délky rozsíren mezerami
TEXT text bez omezení délky
BYTEA bytea pole bytu nespecifikované délky
"char" char jeden znak
Na interní názvy muzete narazit v systémovém katalogu nebo v nekterých
chybových hláseních.
Ctyri první typy jsou tzv. varlena typy (první ctyri byty na disku
jsou obsahují délku, ostatní obsahují vlastní data). Skutecne obsazený
prostor je tedy o neco málo vetsí nez deklarovaná velikost. Na druhou
stranu, delsí retezce jsou komprimovány, takze obsazený prostor na
disku muze být mensí nez se ceká.
VARCHAR(n) je vhodný pro ukládání ruzne dlouhých retezcu u kterých
známe délkové omezení, TEXT pro retezce bez omezení délky (maximum je
jeden gigabyte).
CHAR(n) se pouzívá pro ulození stejne dlouhých retezcu. CHAR(n) doplní
mezerami na specifikovanou délku, VARCHAR(n) hodnoty se ukládají tak
jak jsou. BYTEA je pro ukládání binárních dat - non ASCII hodnot.
Vsechny zmínené typy mají podobné výkonové charakteristiky.
4.11.1) Jak vytvorit serial/auto-increment polozku?
V PostgreSQL muzete pouzít datový typ SERIAL. Jeho pouzitím se
automaticky vytvorí sekvence. Napríklad:
CREATE TABLE person (
id SERIAL,
name TEXT
);
je automaticky transformováno na:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
Podrobnejsí informace najdete v manuálu v popisu príkazu
create_sequence.
4.11.2) Jak získat hodnotu SERIAL po vlození rádku?
Nejjednodussím zpusob, jak získat vygenerovanou hodnotu typu SERIAL,
je vyuzít klauzuli RETURNING. Pro tabulku z 4.11.1 vypadá takto:
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
Také muzete pouzít funkci nextvall() a její výsledek pouzít v príkazu
INSERT, nebo zavolat currval() po provedení príkazu INSERT.
4.11.3) Nezpusobí currval() a nextval() problémy ve více uzivatelském
prostredí?
Ne, currval vrací vzdy hodnotu, která byla vygenerována pro vás.
4.11.4) Proc není vygenerované císlo pouzito pri prerusení transakce?Proc
vznikají díry v císlování prostrednictvím sekvence nebo typu SERIAL?
Poté co sekvence vygeneruje nové císlo, tak se nedochází k zamcení
sekvence a neceká se na úspesné nebo neúspesné dokoncení transakce.
Odvoláním transakce, která si vyzádala císla sekvence se tato císla
nenávratne ztratí.
4.12) Co to je OID? Co je to CTID?
V prípade, ze tabulku nezalozíme s atributem WITHOUT OIDS, tak má
kazdý rádek unikátní identifikacní císlo OID. Toto císlo je 4 bajtové
celé císlo, které je jedinecné v celé instalaci. Pretece po 4
miliardách rádku. PostgreSQL pouzívá OIDs jako interní linky v
interních systémových tabulkách.
K získání unikátního císla v nesystémových tabulkách je vhodnejsí
pouzití typu SERIAL nez OID, jelikoz sekvence SERIAL se pouzívá pouze
pro jednu tabulku a je tudíz méne náchylná na pretecení. Pokud byste
se toho obávali, pouzijte typ SERIAL8.
CTID se pouzívá k identifikaci konkrétního fyzického rádku. CTID se
mení pokud je rádek modifikován nebo znovu nacten. Pouzívají ho indexy
jako adresaci fyzických rádku.
4.13) Co znamená chybové hlásení "ERROR: Memory exhausted in
AllocSetAlloc()"?
Pravdepodobne jste vycerpal dostupnou virtuální pamet, nebo tvuj
kernel má prílis nízké limity u urcitých zdroju. Pred startem
PostgreSQL vyzkousejte:
ulimit -d 262144
limit datasize 256m
Mozná, ze se projde pouze jeden príkaz - zálezí to na vasem shellu.
Mel by zvednout limity datových segmentu vasich procesu na dostatecne
velkou hodnotu a snad umoznit dokoncení dotazu. Zmena limitu se bude
aplikovat pouze na aktuální proces a na vsechny nove vytvorené
procesy. Jestlize máte problém s SQL klientem, protoze vám server
vrátil prílis dat, zkuste to pred startem klienta.
4.14) Jak zjistím, kterou verzi PostgreSQL pouzívám?
V psql napiste:
SELECT version();
4.15) Jak vytvorit sloupec, který bude implicitne obsahovat aktuální cas?
Pouzijte CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) Jak provést vnejsí spojení (outer join)?
PostgreSQL podporuje standardní SQL syntaxi pro vnejsí spojení. Zde
jsou dva príklady:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
nebo
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Tyto identické dotazy spojí sloupec t1.col k sloupci t2.col, a jeste
vrátí vsechny nespárované rádky t2 (ty, které nedohledá v t2). RIGHT
JOIN by pripojil vsechny nespárované rádky z t2. FULL JOIN vrátí
vsechny spárované rádky i vsechny zbývající rádky z obou tabulek.
Klícové slovo OUTER je volitelné. Bezná operace JOIN se také oznacuje
jako vnitrní spojení.
4.17) Jak provést dotaz napríc nekolika databázemi?
Neexistuje zádný zpusob, jak se v dotazu odkazovat na tabulky z jiné
nez aktuální databáze. A to protoze má systémové tabulky ulozené
nezávisle v kazdé databázi a není tak úplne zrejmé, jak by se dotaz
provedený napríc databázemi mel chovat.
Jeden z doplnku dblink umoznuje dotaz nad nekolika tabulkami pomocí
funkcí. Druhý zpusob je simultální pripojení klienta ke vsem
relevantním databázím a sloucení výsledku na strane klienta.
4.18) Muze funkce vrátit více rádku nebo sloupcu?
Jde to jednoduse pomocí set-returning funkce. Více na
http://www.postgresql.org/docs/techdocs.17.
4.19) Co je prícinou chyby "relation with OID xxxxx does not exist"?
Nechteným vedlejsím efektem kesování SQL dotazu v PL/pgSQL funkci je
problém s neplatnými odkazy na docasné tabulky, které byly od prvního
spustení funkce zruseny a znovu vytvoreny pred dalsím spustením
PL/pgSQL funkce. Resením je pouzít príkaz EXECUTE a to proto, ze
provádecí plán SQL príkazu spousteného príkazem EXECUTE se vytvárí
pokazdé znovu (neukládá se do cache).
Tento problém by se nemel vyskytovat u PostgreSQL verze 8.3 a vyssích
verzích.
4.20) Jaké jsou moznosti replikace databází?
Replikaci databáze umoznuje nekolik technoligií. Kazdá má urcité
výhody a nevýhody.
Master/Slave replikaci podporuje jeden hlavní server, který prijímá
pozadavky na zápis a ctení, a nekolik podrízených serveru, které
umoznují pouze ctení (SELECT). Nejrozsírenejsím volne dostupným
resením tohoto typu je Slony-I.
Replikace typu Multi-master podporuje existenci nekolika serveru s
povoleným zápisem na více replikovaných serverech. Toto resení zvysuje
zátez serveru, protoze je nutná synchronizace serveru.
Nejrozsírenejsím volne dostupným resením je PGCluster.
Jeste existuje nekolik komercních a hardware resení replikací
podporujících ruzné modely replikace.
4.21) Proc v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí? Proc
jsou velká písmena v názvech automaticky prevedena na malá písmena?
Nejcastejsím duvodem nerozpoznání názvu objektu bylo pouzití vlození
názvu sloupce nebo tabulky mezi uvozovky pri zakládání tabulky. Pokud
se název zapíse mezi uvozovky, pak je case sensitive, a v dusledku
toho je nutné názvy techto sloupcu nebo tabulek v SQL príkazech také
vkládat mezi uvozovky (pokud obsahují velká písmena). Nekteré
programy, jako je napríklad pgAdmin, automaticky pouzívají uvozovky.
Takze pokud chcete, aby systém identifikoval identifikátor, musíte:
* nepouzívat uvozovky v príkazu CREATE TABLE
* v identifikátoru pouzít pouze malá písmena
* v dotazech vkládat identifikátory do uvozovek

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,978 +0,0 @@
Häufig gestellte Fragen (FAQ) zu PostgreSQL
Current maintainer: Bruce Momjian (bruce@momjian.us).
Deutsche Übersetzung von Ian Barwick (barwick@gmail.com).
Letzte Aktualisierung der deutschen Übersetzung: Fr., den 19.10.2007,
17:00 MEZ
Die aktuellste Version dieses Dokuments liegt auf der
PostgreSQL-Website:
* http://www.postgresql.org/docs/faqs.FAQ.html (engl.)
* http://www.postgresql.org/docs/faqs.FAQ_german.html (dt.)
Übersetzungen dieses Dokuments in anderen Sprachen sowie plattform-
spezifische FAQs können unter http://www.postgresql.org/docs/faq/
eingesehen werden.
_________________________________________________________________
Allgemeine Fragen
1.1) Was ist PostgreSQL? Wie wird es ausgesprochen?
1.2) Wer kontrolliert PostgreSQL?
1.3) Welchem Copyright unterliegt PostgreSQL?
1.4) Auf welchen Plattformen läuft PostgreSQL?
1.5) Woher bekomme ich PostgreSQL?
1.6) Was ist die neueste Version von PostgreSQL?
1.7) Wo bekomme ich Support für PostgreSQL?
1.8) Wie kann ich einen Fehlerbericht abgeben?
1.9) Wie erfahre ich von bekannten Bugs oder fehlenden Features?
1.10) Welche Dokumentation ist für PostgreSQL verfügbar?
1.11) Wie kann ich SQL lernen?
1.12) Wie kann ich im Entwicklerteam mitarbeiten?
1.13) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?
1.14) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in
verschiedenen Ländern klar?
Fragen zu Benutzerprogrammen
2.1) Welche Schnittstellen gibt es für PostgreSQL?
2.2) Wie kann man PostgreSQL mit einer Website nutzen?
2.3) Hat PostgreSQL eine grafische Benutzerschnittstelle?
Administrative Fragen
3.1) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?
3.2) Wie regle ich Zugriffe von anderen Rechnern?
3.3) Wie kann ich eine bessere Performanz erreichen?
3.4) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?
3.5) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine
Verbindung aufzubauen versuche. Warum?
3.6) Wie wird PostgreSQL aktualisiert?
3.7) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?
Fragen zum Betrieb
4.1) Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen
bzw. eine beliebige Zeile in einer Abfrage aus?
4.2) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder
Benutzer in der Datenbank definiert sind? Wie bekomme ich die von psql
verwendeten Abfragen?
4.3) Wie ändere ich den Datentyp einer Spalte?
4.4) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine
Datenbank?
4.5) Wieviel Plattenplatz wird benötigt, um die Daten aus einer
typischen Textdatei abzuspeichern?
4.6) Meine Abfragen sind langsam oder benutzen die Indexe nicht.
Warum?
4.7) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
Abfrage auswertet?
4.8) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei
einer Suche, bei der Groß- und Kleinschreibweisen ignoriert werden?
Wie verwende ich einen Index bei solchen Suchabfragen?
4.9) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?
4.10) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?
4.11.1) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung
des Wertes?
4.11.2) Wie bekomme ich den Wert einer SERIAL-Sequenz?
4.11.3) Führt currval() zu einer Race-Condition mit anderen Nutzern?
4.11.4) Warum werden die Sequenzwerte nach einem Transaktionsabbruch
nicht zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
Sequenz-/SERIAL-Spalte?
4.12) Was ist ein OID? Was ist ein CTID?
4.13) Wieso bekomme ich den Fehler: "FATAL: Memory exhausted in
AllocSetAlloc()"?
4.14) Wie kann ich feststellen, welche PostgreSQL-Version bei mir
läuft?
4.15) Wie kann ich eine Spalte erstellen, deren Default-Wert immer die
aktuelle Uhrzeit enthalten soll?
4.16) Wie führe ich eine OUTER JOIN durch?
4.17) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?
4.18) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
zurückgeben lassen?
4.19) Warum bekomme ich eine Fehlermeldung wie
"relation with OID ##### does not exist" wenn ich temporäre Tabellen
in
PL/PgSQL-Funktionen benutze?
4.20) Welche Replikationslösungen gibt es?
4.21) Warum werden die Tabellen- und Spaltennamen in meiner Abfrage
nicht erkannt? Warum werden Großbuchstaben umgewandelt?
_________________________________________________________________
Allgemeine Fragen
1.1) Was ist PostgreSQL? Wie wird es ausgesprochen?
Die (englische) Aussprache ist "Post-Gres-Q-L". Im allgemeinen
Sprachgebrauch hat sich die Kurzform "Postgres" auch durchgesetzt.
(Für diejenigen, die es interessiert: eine MP3-Datei mit der
amerikanischen Aussprache befindet sich hier:
http://www.postgresql.org/files/postgresql.mp3
PostgreSQL ist ein objektrelationales Datenbanksystem, das die Vorzüge
von kommerziellen Datenbanksystemen mit zukunftsweisenden Innovationen
kombiniert. PostgreSQL ist freie Software und dessen kompletter
Quellcode ist öffentlich verfügbar.
Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen
Entwicklern durchgeführt. Dieses Team ist für die Gesamtentwicklung
von PostgreSQL verantwortlich. Es handelt sich um ein
Gemeinschaftsprojekt, das nicht von einer bestimmten Firma
kontrolliert wird. Lesen Sie die Entwickler-FAQ:
http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn Sie an einer
Mitarbeit interessiert sind.
1.2) Wer kontrolliert PostgreSQL?
Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas
existiert gar nicht. Es gibt zwar das "Core Committee" sowie
Entwickler, die CVS-Schreibberechtigung haben, jedoch haben diese
Gruppen eher nur eine administrative Rolle. Das Projekt wird durch die
Community gesteuert, die aus den Entwicklern sowie natürlich auch den
Nutzern besteht - jeder kann daran teilnehmen. (Lesen Sie die
Entwickler-FAQ: http://www.postgresql.org/docs/faqs.FAQ_DEV.html wenn
Sie an der PostgreSQL-Entwicklung teilnehmen möchten).
1.3) Welchem Copyright unterliegt PostgreSQL?
PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im
Grunde genommen erlaubt diese den Nutzern, beliebig mit dem Code
umzugehen, auch der Weiterverkauf von Binärversionen ohne Quellcode
ist erlaubt. Die einzige Einschränkung besteht darin, dass PostgreSQL
auf keinen Fall für etwaige Probleme mit der Software haftet. Außerdem
muß der Copyright- Text in allen Kopien der Software enthalten sein.
Dies ist der Originaltext der BSD-Lizenz:
PostgreSQL Data Base Management System
Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of California
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all
copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Es gilt die Copyright-Klausel im Original!
1.4) Auf welchen Plattformen läuft PostgreSQL?
Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der
jeweiligen Versionsfreigabe getestet wurden, sind in den
Installationsanleitungen aufgelistet.
PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen wie
Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes
Installationspaket kann von http://pgfoundry.org/projects/pginstaller
heruntergeladen werden. DOS-basierte Windows-Versionen (Win95, Win98,
WinMe) können PostgreSQL nur mit Hilfe der Cygwin-Umgebung ausführen.
Eine Portierung für Novell Netware 6 gibt es unter
http://forge.novell.com sowie eine OS/2 (eComStation) version unter
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F.
1.5) Woher bekomme ich PostgreSQL?
Per Web-Browser hier: http://www.postgresql.org/ftp/ und per FTP hier:
ftp://ftp.postgresql.org/pub/.
1.6) Was ist die neueste Version von PostgreSQL?
Die neueste Version von PostgreSQL ist 8.2.5.
Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich,
kleinere Korrekturversionen alle paar Monaten.
1.7) Wo bekomme ich Support für PostgreSQL?
Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die
Web-Seite http://www.postgresql.org/community/lists/ bietet einen
Überblick. Die Listen general und bugs bieten einen guten Einstieg.
Eine deutschsprachige Mailing-Liste gibt es hier:
http://archives.postgresql.org/pgsql-de-allgemein/.
Der wichtigsten IRC-Channel ist #postgresql auf Freenode
(irc.freenode.net). Unter UNIX/Linux können Sie mit z.B. irc -c
'#postgresql' "$USER" irc.freenode.net. daran teilnehmen. Auf Freenode
gibt es einen spanischsprachigen Channel #postgresql-es, einen
französischen, #postgresqlfr sowie einen brasilianischen,
#postgresql-br . Es gibt außerdem einen PostgreSQL-Channel bei EFNet.
Eine Liste von Unternehmen, die Support für PostgreSQL auf
kommerzieller Basis leisten, kann unter
http://www.postgresql.org/support/professional_support eingesehen
werden.
1.8) Wie kann ich einen Fehlerbericht abgeben?
Nutzen Sie das Formular unter
http://www.postgresql.org/support/submitbug. Schauen Sie aber vorher
unter ftp://ftp.postgresql.org/pub/ nach, ob es mittlerweile eine
neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.
Bugs, die über das Formular bzw. eine der Mailing-Listen
bekanntgegeben wurden, erhalten typischerweise einer der folgenden
Reaktionen:
* es ist kein Bug, der Grund wird benannt
* es ist ein bereits bekannter Bug, der bereits auf der TODO-Liste
aufgenommen wurde
* der Bug wurde in der aktuellen Version behoben
* der Bug wurde bereits behoben, befindet sich aber noch nicht in
einer offiziell veröffentlichten Version
* es wird um eingehendere Informationen gebeten, z.B.:
+ Betriebssystem
+ PostgreSQL-Version
+ reproduzierbarer Fallbeispiel
+ Debugging-Information
+ Debugger-Backtrace-Ausgabe
* der Bug ist neu. Folgendes könnte passieren:
+ ein Patch wird erstellt und in der nächsten Version
eingebaut;
+ oder der Bug kann nicht sofort behoben werden und wird auf
die TODO-Liste gesetzt
1.9) Wie erfahre ich von bekannten Bugs oder fehlenden Features?
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe
unsere TODO-Liste unter http://www.postgresql.org/docs/faqs.TODO.html
für eine Auflistung der bekannten Bugs, fehlenden Features und
zukünftigen Pläne.
Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der
folgenden Antworten:
* das Feature ist bereits auf der TODO-Liste
* das Feature ist nicht wünschenswert, weil:
+ es vorhandene Funktionalität dupliziert, welche bereits dem
SQL-Standard folgt
+ es würde die Komplexität der Code-Basis erhöhen, ohne
nennenswerte Vorteile zu bringen
+ es wäre unsicher bzw. unzuverlässig
* das neue Feature wird der TODO-Liste hinzugefügt
PostgreSQL verwendet kein Bugtracking-System, da es sich als
effizienter erwiesen hat, E-Mails direkt zu beantworten und die
TODO-Liste aktuell zu halten. In der Praxis werden Bugs sehr schnell
beseitigt, und diejenigen Bugs, die Auswirkungen auf eine große Anzahl
von Nutzern haben, werden meist kurzfristig korrigiert. Der einzige
Überblick über alle Änderungen, Verbesserungen und Korrekturen in
einer PostgreSQL-Version befindet sich in den CVS-Log-Meldungen. Auch
die Release-Notes listen nicht jede Änderung in der Software auf.
1.10) Welche Dokumentation ist für PostgreSQL verfügbar?
PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das /doc-
Verzeichnis. Ausserdem sind alle Handbücher online unter
http://www.postgresql.org/docs/ verfügbar.
Zwei Bücher zu PostgreSQL sind online verfügbar unter
http://www.postgresql.org/docs/books/awbook.html und
http://www.commandprompt.com/ppbook/ .
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter
http://www.postgresql.org/docs/books Diverse technische Artikel
befinden sich unter http://www.postgresql.org/docs/techdocs .
psql hat einige nützliche \d-Befehle, um Informationen über Typen,
Operatoren, Funktionen, Aggregate, usw. zu zeigen.
Die PostgreSQL-Website enthält noch mehr Dokumentation.
1.11) Wie kann ich SQL lernen?
Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten
Einstieg. Viele PostgreSQL-Anwender mögen "The Practical SQL Handbook"
(Bowman et al., Addison Wesley). Andere dagegen mögen "The Complete
Reference SQL" (Groff et al., McGraw-Hill).
Es gibt ausserdem einige nützliche Online-Tutorials:
* http://www.intermedia.net/support/sql/sqltut.shtm
* http://sqlcourse.com
* http://www.w3schools.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12) Wie kann ich im Entwicklerteam mitarbeiten?
Lesen Sie in der Entwickler-FAQ unter
http://www.postgresql.org/docs/faqs.FAQ_DEV.html nach.
1.13) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,
Performanz, Zuverlässigkeit, Support und Preis.
Eigenschaften
PostgreSQL besitzt die meisten Eigenschaften - wie
Transaktionen, Unterabfragen (Subqueries), Trigger, Views,
referenzielle Integrität bei Fremdschlüsseln und verfeinertes
Locking - die bei großen kommerziellen DBMS vorhanden sind. Es
bietet außerdem einige anderen Eigenschaften, die diese nicht
immer haben, wie benutzerbestimmte Typen, Vererbung, Regeln,
und die Multi-Versionen-Steuerung zum Verringern
konkurrierender Locks.
Performanz
Die Performanz von PostgreSQL ist mit der von kommerziellen und
anderen Open-Source-Datenbanken vergleichbar. In manchen
Bereichen ist es schneller, in anderen langsamer. In der Regel
beträgt der Unterschied +/-10%.
Zuverlässigkeit
Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht
zuverlässig arbeitet. Daher bemühen wir uns, nur streng
geprüften und beständigen Code freizugeben, der nur ein Minimum
an Programmfehlern aufweist. Jede Freigabe hat mindestens einen
Monat Betatest-Phase hinter sich, und unsere Freigabehistorie
beweist, dass wir stabile und solide Versionen freigeben, die
im Produktionsbetrieb genutzt werden können. Wir glauben, dass
wir im Vergleich mit anderer Datenbanksoftware vorteilhaft
dastehen.
Support
Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit
einer großen Gruppe von Entwicklern und Benutzern mögliche
Probleme zu lösen. Wir können nicht immer eine Fehlerbehebung
garantieren, kommerzielle DBMS tun dies aber auch nicht. Der
direkte Kontakt zur Entwickler- und Benutzergemeinschaft und
der Zugriff auf die Handbücher und den Quellcode ermöglicht
einen im Vergleich zu anderen DBMS höherwertigeren Support. Es
gibt jedoch auch Anbieter von kommerziellen Support-Leistungen
(siehe FAQ-Punkt 1.7).
Preis
PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie
auch für die nicht-kommerzielle Nutzung. Sie können den
PostgreSQL-Code ohne Einschränkungen (außer denjenigen, die in
der oben angegebene BSD-artigen Lizenz erwähnt werden) in Ihr
Produkt integrieren.
1.14) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen
Ländern klar?
Änderungen bei der US-Sommerzeit sind ab PostgreSQL Version 8.0.4
berücksichtigt. Änderungen in Canada und Western Australia sind ab
8.0.10 bzw. 8.1.6 berücksichtigt. PostgreSQL-Versionen vor 8.0 nutzen
die Zeitzonendatenbank des Betriebssystems, um die Sommerzeit zu
berechnen.
Fragen zu Benutzerprogrammen
2.1) Welche Schnittstellen gibt es für PostgreSQL?
Die PostgreSQL-Installation stellt nur Schnittstellen für C und
Embedded C bereit. Alle weitere Schnittstellen sind unabhängige
Projekte, die einzeln heruntergeladen werden werden müssen. Diese
Trennung ermöglicht individuelle Entwickler-Teams und
Entwicklungszyklen für die jeweiligen Projekte.
Einige Programmiersprachen wie PHP haben eine PostgreSQL-
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie Perl,
TCL, Python und viele anderen sind unter http://gborg.postgresql.org
im Bereich Drivers/Interfaces verfügbar sowie per Internet-Suche.
2.2) Wie kann man PostgreSQL in einer Website nutzen?
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter
http://www.webreview.com (engl.) eingesehen werden.
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP
gibt es bei http://www.php.net
Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm
oder mod_perl.
2.3) Hat PostgreSQL eine grafische Benutzerschnittstelle?
Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL - sowohl
kommerziell als auch Open-Source. Eine ausführliche Liste befindet
sich unter http://www.postgresql.org/docs/techdocs.54 .
_________________________________________________________________
Administrative Fragen
3.1) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?
Bei der Ausführung von configure die Option --prefix mit dem
Zielverzeichnis angeben.
3.2) Wie regle ich Zugriffe von anderen Rechnern?
PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn
Sie in der Datei postgresql.conf die Einstellung listen_addresses
anpassen, in der Datei $PGDATA/pg_hba.conf host-basierte
Authentifizierung einschalten und den Server neu starten.
3.3) Wie kann ich eine bessere Performanz erreichen?
Es gibt drei große Bereiche, in denen Performanzverbesserungen erzielt
werden können:
Abfrageoptimierung
Die Modifizierung von Abfragen kann eine bessere Performanz
erzielen:
+ Erstellung von Indexen, einschliesslich partieller Indexe
sowie Expressionsindexe
+ Einsatz von COPY anstelle multipler INSERT-Anweisungen
+ Gruppierung von mehreren Abfragen innerhalb einer
Transaktion, um Aufwand beim Abschluss von Transaktionen
einzusparen
+ Einsatz von CLUSTER beim Holen von einer großen Anzahl von
Datenreihen aus einem Index
+ Einsatz von LIMIT, um eine Untermenge der Abfragen-
ergebnisse zurückzuliefern
+ Einsatz von vorbereiteten Befehlen (prepared queries)
+ Einsatz von ANALYZE, um die Datenbankstatistik für den
Abfragenplaner aktuell zu halten
+ Regelmäßiger Einsatz von VACUUM bzw. pg_autovacuum
+ Bei großen Datenveränderungen die Löschung von Indexen
Server-Konfiguration
Einige Einstellungen in der Datei postgresql.conf wirken auf
die Performanz aus. Das Handbuch enthält unter
http://www.postgresql.org/docs/current/static/runtime-config.ht
ml eine komplette Auflistung. Kommentare zu den jeweiligen
Einstellungen gibt es unter
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
nf_e.html und
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Hardware-Auswahl
Die Auswirkung von Hardware auf Performanz wird unter
http://momjian.us/main/writings/pgsql/hw_performance/index.html
und http://www.powerpostgresql.com/PerfList/ erläutert.
3.4) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?
Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche
log_*-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests
sehr nützlich sein.
3.5) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine
Verbindung aufzubauen versuche. Warum?
Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in
postgresql.conf den Wert max_connections ändern und den Server
neustarten.
3.6) Wie wird PostgreSQL aktualisiert?
Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf
der Seite http://www.postgresql.org/support/versioning. Detaillierte
technische Informationen gibt es auf der Seite
http://www.postgresql.org/docs/current/static/install-upgrading.html
3.7) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?
PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend
sein, im Server-Betrieb jedoch lohnt sich auf jeden Fall die
Investition in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI,
Hauptplatinen und Netzteile von namhaften Herstellern). Nutzen Sie
unsere Mailing-Listen, um Hardware-Optionen zu diskutieren.
_________________________________________________________________
Fragen zum Betrieb
4.1) Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen bzw. eine
beliebige Zeile in einer Abfrage aus?
Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden
Reihen bereits kennen, nutzen Sie LIMIT. Wenn die ORDER BY- Anweisung
mit einem Index verwendet wird, ist es möglich, dass die gesamte
Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der der
anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor und
FETCH.
Um eine beliebige Zeile auszuwählen, nutzen Sie ORDER BY random():
SELECT spalte
FROM tabelle
ORDER BY random()
LIMIT 1
4.2) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder Benutzer
in der Datenbank definiert sind? Wie bekomme ich die von psql verwendeten
Abfragen?
In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere
psql-Befehle lassen sich mit \? anzeigen. Sie können sich die Datei
pgsql/src/bin/psql/describe.c mit dem Quellcode für psql ansehen. Sie
enthält die SQL-Abfragen, die die Backslash-Kommandos (\) ausführen.
Sie können psql auch mit der -E Option starten. Danach gibt psql die
Abfragen aus, die es bei der Ausführung der Befehle benutzt. Außerdem
biete PostgreSQL ein SQL-kompatibles INFORMATION SCHEMA, das
Metainformation über die Datenbank zur Verfügung stellt.
Mit psql -l können Sie alle Datenbanken anzeigen lassen.
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele
SELECT- Abfragen, mit deren Hilfe man Information über die
Systemtabellen erhalten kann.
4.3) Wie ändere ich den Datentyp einer Spalte?
Ab Version 8.0 kann der Datentyp einer Spalte mit ALTER TABLE ALTER
COLUMN TYPE geändert werden, sofern der neue Datentyp die Werte des
alten Datentype aufnehmen kann.
Bei früheren Versionen gehen Sie wie folgt vor:
BEGIN;
ALTER TABLE tabelle ADD COLUMN neue_spalte neuer_datentyp;
UPDATE tabelle SET neue_spalte = CAST(alte_spalte AS neuer_datentyp);
ALTER TABLE tabelle DROP COLUMN alte_spalte;
COMMIT;
Um den Speicherplatz freizugeben, der von der gelöschten Spalte
verwendet wurde, führen Sie VACUUM FULL aus.
4.4) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?
Es bestehen folgende Obergrenzen:
Maximale Größe eine Datenbank? unbeschränkt (es existieren
Datenbanken mit 32 TB)
Maximale Größe einer Tabelle? 32 TB
Maximale Größe einer Zeile? 400 GB
Maximale Größe einer Spalte? 1 GB
Maximale Anzahl von Zeilen in einer Tabelle?
unbeschränkt
Maximale Anzahl von Spalten in einer Tabelle?
250-1600 je nach Spaltentyp
Maximale Anzahl von Indexen für eine Tabelle?
unbeschränkt
Selbstverständlich sind dies theoretische Werte, die oft durch die
verfügbaren Platten- und Speicherressourcen beschränkt werden. Extreme
Größen können zu Leistungseinbußen führen.
Die maximale Tabellengröße von 32 TB benötigt keine
Large-File-Unterstützung im Betriebssystem. Große Tabellen werden in
Dateien mit einer Größe von je 1 GB aufgeteilt, wodurch etwaige
dateisystem-bedingte Beschränkungen nicht relevant sind.
Die maximale Tabellengröße und die maximale Anzahl von Spalten können
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB
heraufsetzt. Die Tabellengröße kann auch durch Tabellenpartitionierung
vergrößert werden.
Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten
eine UNIQUE-Constraint setzen zu können, nutzen Sie einen funktionalen
Index mit dem MD5-Hash-Wert der Spalte. Um innerhalb einer großen, mit
Text belegten Spalte suchen zu können, verwenden Sie einen
Volltext-Index.
4.5) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
Textdatei abzuspeichern?
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen
Textdatei bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe
der Datei beanspruchen.
Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und
einer Textbeschreibung pro Zeile. Gehen wir davon aus, dass die
durchschnittliche Länge der Textbeschreibung 20 Byte beträgt. Die
einfache Datei würde 2,8 MB groß sein. Die Größe der
PostgreSQL-Datenbankdatei, die diese Daten enthält, liegt ungefähr bei
5,2 MB:
24 Bytes: jeder Zeilenkopf (ungefähr)
+24 Bytes: ein Integer-Feld und ein Textfeld
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel
-----------------------------------------------
52 Bytes pro Zeile
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB),
also:
8192 Bytes pro Seite
--------------------- = 146 Zeilen pro Seite (abgerundet)
52 Bytes pro Zeile
100.000 Datenzeilen
------------------------ = 685 Datenbankseiten (aufgerundet)
158 Zeilen pro Seite
633 Datenbankseiten * 8192 Bytes pro Seite = 5,185,536 bytes (5,2 MB)
Indexe beanspruchen nicht so viel Platz. Da sie jedoch die Daten
beinhalten, die sie indizieren, können auch sie sehr groß werden.
NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig
Platz in Anspruch nehmen.
4.6) Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum?
Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe
werden nur dann verwendet, wenn die abzufragende Tabelle eine
bestimmte Größe übersteigt, und die Abfrage nur eine kleine
Prozentzahl der Tabellenzeilen abfragt. Der Grund hierfür ist der,
dass die durch einen Index verursachten Festplattenzugriffe manchmal
länger dauern würden als ein einfaches Auslesen aller Tabellenzeilen
(sequentieller Scan).
Um festzustellen, ob ein Index verwendet werden soll, braucht
PostgreSQL Statistiken über die Tabelle. Diese Statistiken werden
durch die Anweisungen VACUUM ANALYZE bzw. ANALYZE berechnet. Anhand
der Statistiken kennt der Abfragenoptimierer die Anzahl der
Tabellenzeilen und kann besser entscheiden, ob Indexe verwendet werden
sollen. Statistiken sind auch bei der Ermittlung der optimalen
JOIN-Reihenfolgen und -Methoden wertvoll. Daher sollten diese
regelmässig durchgeführt werden, da sich der Inhalt einer Tabelle ja
auch verändert.
Indexe werden normalerweise nicht in ORDER BY-Abfrage oder in JOINs
verwendet. Ein sequentieller Scan mit anschließendem explizitem
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer
großen Tabelle. Jedoch wird bei einer Abfrage, in der LIMIT zusammen
mit ORDER BY verwendet wird, oftmals ein Index verwendet, da nur ein
kleiner Abschnitt der Tabelle zurückgeliefert wird.
Sollte es danach aussehen, also ob der Optimierer irrtümlich einen
sequentiellen Scan ausführt, führen Sie SET enable_seqscan TO 'off'
aus und prüfen Sie, ob die Indexabfrage dadurch scheller geworden ist.
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indexe
nur unter bestimmten Umständen verwendet werden:
* Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:
+ LIKE-Suchmuster dürfen nicht mit % anfangen;
+ ~ (reguläre Ausdrücke) müssen mit ^ anfangen.
* Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e])
beginnen.
* Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen
(z.B. ILIKE bzw. ~*), verwenden keine Indexe. Stattdessen können
funktionale Indexe verwendet werden, die im Punkt 4.8 beschrieben
werden.
* Die Standard-Locale "C" muss während der Datenbank-Initialisierung
mit initdb verwendet worden sein, da andere locales den
nächstgrößten Wert nicht ermitteln können. Es ist allerdings
möglich, einen besonderen text_pattern_ops-Index für solche Fälle
zu erstellen.
In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders
für Indexe auf Spalten mit den Datentypen INT2, INT8 und NUMERIC
4.7) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
Abfrage auswertet?
Vgl. die EXPLAIN Man-Page.
4.8) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer
Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende
ich einen Index bei solchen Suchabfragen?
Der Operator ~ wendet einen regulären Ausdruck an und ~* wendet ihn
an, ohne die Groß- und Kleinschreibung zu beachten. Ebenso beachtet
LIKE die Groß- und Kleinschreibung, und ILIKE nicht.
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren,
werden in der Regel so ausgedruckt:
SELECT *
FROM tabelle
WHERE LOWER(spalte) = 'abc'
Hier wird kein normaler Index benutzt. Legt man hingegen einen
funktionalen Index an, so wird er auf jeden Fall verwendet:
CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))
Falls der obige Index als einen UNIQUE-Index angelegt wird, können
keine Werte in die Spalte eingefügt werden, die sich nur durch ihre
Groß- und Kleinschreibung unterscheiden. Um Fehler zu vermeiden muß
ein CHECK-Constraint oder ein Trigger eingesetzt werden.
4.9) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist? Kann nach der
NULL-Belegung sortiert werden?
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.
SELECT *
FROM tabelle
WHERE spalte IS NULL
Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder
nicht, verwenden Sie die Bedingungen IS NULL bzw. IS NOT NULL in der
ORDER BY-Klausel. Da Bedingungen, die wahr sind, höher als das
Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die
NULL-Spalten zuerst gelistet werden:
SELECT *
FROM tabelle
ORDER BY (spalte IS NOT NULL)
4.10) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?
Typ interner Name Bemerkungen
-------------------------------------------------
VARCHAR(n) varchar die Größe legt die Maximallänge fest; kein
Auffüllen mit Leerzeichen
CHAR(n) bpchar mit Leerzeichen gefüllt bis zur angegebenen Länge
TEXT text keine obere Schranke für die Länge
BYTEA bytea Bytearray mit variabler Länge (auch für
'\0'-Bytes geeignet)
"char" char 1 Zeichen
Der interne Name kommt vor allem in den Systemkatalogen und in manchen
Fehlermeldungen vor.
Die ersten vier Typen sind "varlena"-Typen (d.h. die ersten vier Bytes
geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich
belegte Platz immer etwas mehr als die deklarierte Feldgröße.
Allerdings wird unter Umständen auf diese Datentypen Datenkompression
durch das TOAST- Verfahren angewendet, womit der tatsächlich belegte
Platz auch geringer als erwartet ausfallen kann.
Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich
VARCHAR(n). Die maximale Länge eines VARCHAR(n)-Felds wird bei der
Tabellendefinition festgelegt. TEXT setzt keine Längengrenze,
allerdings gibt es eine systembedingte Obergrenze von 1 GB.
CHAR(n) ist geeignet für die Speicherung von Zeichenketten, die alle
die gleiche Länge haben. Bitte beachten Sie, dass CHAR(n) automatisch
Zeichenketten bis zur definierten Feldlänge mit Leerzeichen ausfüllt,
während bei VARCHAR(n) nur die tatsächlich eingegebene Zeichenkette
gespeichert wird.
BYTEA ist für binäre Daten, besonders für Werte, die NULL-Bytes haben.
Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften
auf.
4.11.1) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des
Wert?
PostgreSQL bietet einen SERIAL-Datentyp. Dieser erzeugt automatisch
eine Sequenz auf die angegebene Spalte. Zum Beispiel:
CREATE TABLE person (
id SERIAL,
name TEXT
)
wird automatisch in:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
umgewandelt.
Die create_sequence Man-Page liefert weitere Informationen über
Sequenzen.
4.11.2) Wie bekomme ich den Wert einer SERIAL-Sequenz?
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten
SERIAL-Wert von dem Sequenzobjekt vor der Auszuführung einer
INSERT-Anweisung anzufordern und ihn dann explizit in die
INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in 4.11.1
könnte dieser Vorgang in einer Pseudosprache so aussehen:
new_id = output of execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Danach stünde der neue Wert in der Variablen new_id für die Verwendung
in weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel
zur Tabelle 'person'). Bitte beachten Sie, dass der Name des
automatisch erstellten SEQUENCE-Objektes folgenden Name hat:
«table»_«serialcolumn»_seq wobei 'table' und 'serialcolumn' die Namen
der jeweils betreffenden Tabelle / Spalte darstellen.
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den
automatisch eingefügten SERIAL-Wert mit der currval()-Funktion
zurückgeben lassen:
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
new_id = output of execute("SELECT currval('person_id_seq')");
4.11.3) Führt currval() zu einer Race-Condition mit anderen Nutzern?
Nein. currval() liefert einen Wert zurück, der von Ihrer
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur
Verfügung steht.
4.11.4) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
Sequenz-/SERIAL-Spalte?
Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern,
werden Sequenzen gerade nicht für andere Transaktionen gesperrt,
sondern die Sequenznummern werden den laufenden Transaktionen sofort
zugeteilt. Lücken in der Sequenznummerierung werden durch abgebrochene
Transaktionen verursacht.
4.12) Was ist ein OID? Was ist ein CTID?
Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige
OID, sofern die Tabelle nicht mit der Option WITHOUT OIDS angelegt
wurde. OIDs sind automatisch zugewiesene 4-Byte-Integer, die innerhalb
der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem
Wert von ungefähr 4 Milliarden über. PostgreSQL verwendet OIDs, um
seine interne Systemtabellen zu verbinden.
Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird
allerdings empfohlen, statt OIDs Werte zu verwenden, die vonSERIAL-
Sequenzen erzeugt werden. SERIAL-Sequenzen sind innerhalb einer
Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem
können 8-Byte-Sequenzwerte mit SERIAL8 erzeugt werden.
CTIDs werden benutzt, um bestimmte physikalische Zeilen durch Block
und Offset Werte zu identifizieren. CTIDs verändern sich, sobald
Zeilen verändert oder zurückgeladen werden. Sie werden in
Indexeinträgen benutzt um auf die physikalischen Zeilen zu zeigen.
4.13) Wieso bekomme ich einen Fehler: "ERROR: Memory exhausted in
AllocSetAlloc()"?
Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.
Probieren Sie vor dem Start von postmaster folgendes:
ulimit -d 262144
limit datasize 256m
Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments
für Prozesse erhöht werden und eventuell die erfolgreiche Ausführung
der Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-CLient
haben, weil das Backend zu viele Daten zurückliefert, versuchen Sie
dies vor dem Start des SQL-Clients.
4.14) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?
Geben Sie in psql SELECT VERSION(); ein.
4.15) Wie kann ich eine Spalte erstellen, deren Default-Wert immer die
aktuelle Uhrzeit enthalten soll?
Dazu verwenden Sie CURRENT_TIMESTAMP:
CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) Wie führe ich eine OUTER JOIN durch?
PostgreSQL unterstützt OUTER JOINs nach dem SQL- Standardsyntax. Hier
zwei Beispiele:
SELECT *
FROM tabelle_1 t1
LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)
bzw.:
SELECT *
FROM tabelle_1 t1
LEFT OUTER JOIN tabelle_2 t2 USING (spalte)
Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die
Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in
tabelle_1 (diejenigen, die keine Entsprechung in tabelle_2 haben)
zurück. Ein RIGHT JOIN würde hingegen alle unverknüpften Zeilen in
tabelle_2 hinzufügen und ein FULL JOIN würde alle verknüpften Zeilen
sowie jeweils alle unverknüpften Zeilen aus den beiden Tabellen
zurückliefern. Die Angabe von OUTER ist nicht zwingend und kann in
LEFT, RIGHT und FULL-Verknüpfungen weggelassen werden. Normale
Verknüpfungen sind INNER JOINs.
4.17) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?
Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine
Datenbank zuzugreifen. Da PostgreSQL datenbank-spezifische
Systemkataloge lädt, ist eine datenbankübergreifende Abfrage nicht
möglich.
contrib/dblink ist eine Erweiterung, die datenbankübergreifende
Abfragen über Funktionsaufrufe ermöglicht.
4.18) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion zurückgeben
lassen?
Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:
http://www.postgresql.org/docs/techdocs.17.
4.19) Warum bekomme ich eine Fehlermeldung wie "relation with OID ##### does
not exist" wenn ich temporäre Tabellen in PL/PgSQL-Funktionen benutze?
In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in
einer Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn
eine PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese
Tabelle anschließend gelöscht bzw. neu erstellt wird, die Funktion
fehlschlagen wird, da die gecachten Funktionsinhalte noch auf die alte
temporäre Tabelle zeigen. Die Lösung für diese Probleme besteht darin,
in der PL/PgSQL- Funktion mittels EXECUTE auf temporäre Tabellen
zuzugreifen. Dies bewirkt, dass bei jedem Funktionsruf die betreffende
Abfrage neu geparst wird.
Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht
mehr auf.
4.20) Welche Replikationslösungen gibt es?
Der Begriff "replikation" umfasst mehrere verschiedene Technologien,
jede mit eigenen Vor- und Nachteilen.
Mit "Master/slave"-Replikation werden Änderungen in einer
Hauptdatenbank durchgeführt und an "Sklaven" verteilt, die im
Nur-Lese-Modus arbeiten. Die populärste Lösung für PostgreSQL ist
Slony-I.
"Multi-master replication" ermöglicht sowohl lesende als auch
schreibende Zugriffe über mehrere Datenbank-Server hinweg. Allerdings
hat diese Art von Replikation eine negative Auswirkung auf die
Performanz durch die Notwendigkeit, Änderungen zwischen Servern zu
synchronisieren. Pgcluster ist die populärste freie Lösung für
PostgreSQL.
Es gibt auch einige kommerzielle und hardware-basierte
Replikationslösungen für verschiedene Arten der Replikation.
4.21) Warum werden die Tabellen- und Spaltennamen in meiner Abfrage nicht
erkannt? Warum werden Großbuchstaben umgewandelt?
Die häufigste Ursache ist die Verwendung von Gänsefüßchen bei der
Anlegung von Tabellen, z.B.:
CREATE TABLE "Tabelle"
("SPALTE1" INT)
Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren) in
genau der Schreibweise gespeichert (vgl. Dokumentation), was dazu
führt, dass man sie danach immer in Gänsefüßchen angeben muss. Im
obigen Beispiel muss man also immer etwa SELECT * FROM "Tabelle"
verwenden. Um dieses Problem zu vermeiden, müssen Sie immer eines der
folgenden Punkte beachten:
* bei der Tabellenanlegung keine Gänsefüßchen verwenden;
* in Identifikatoren nur Kleinschreibung verwenden;
* immer Identifikatoren mit Gänsefüßchen versehen
_________________________________________________________________
Anmerkungen des Übersetzers
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher
liegt die Übersetzung nicht immer auf dem aktuellsten Stand.
Die aktuellste Version der deutschen Übersetzung befindet sich immer
unter http://sql-info.de/de/postgresql/FAQ_german.html. Diese
"Arbeitsversion" enthält eventuell Änderungen, die noch nicht auf der
PostgreSQL-Website eingebunden worden sind.
Über Verbesserungshinweise und Korrekturvorschläge sowie
Verständnisfragen zum Inhalt der FAQ freue ich mich. Ich nehme auch
allgemeine Fragen zu PostgreSQL gerne entgegen, verweise jedoch auf
die Mailing-Listen als schnelle und zuverlässige Anlaufstellen.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,988 +0,0 @@
Otvety na chasto zadavaemye voprosy po PostgreSQL
Data poslednego obnovleniya: Sreda 25 iyunya 23:54:14 EDT 2008
Anglijskij variant soprovozhdaet: Bryus Mom'yan (Bruce Momjian)
(bruce@monjian.us)
Pereviol na russkij: Viktor Vislobokov (admin@postgresql.ru.net)
Samuyu svezhuyu anglijskuyu versiyu dokumenta mozhno najti na
http://www.postgresql.org/files/documentation/faqs/FAQ.html.
Samuyu svezhuyu russkuyu versiyu dokumenta mozhno najti na
http://postgresql.ru.net/docs/FAQ_russian.html.
Otvety na voprosy specifichnye dlya konkretnyh platform mozhno najti
na http://www.postgresql.org/docs/faq/.
_________________________________________________________________
Obschie voprosy
1.1) CHto takoe PostgreSQL? Kak proiznositsya `eto nazvanie? CHto
takoe Postgres?
1.2) Kto upravlyaet PostgreSQL?
1.3) Kakovy avtorskie prava na PostgreSQL?
1.4) Na kakih platformah rabotaet PostgreSQL?
1.5) Gde mozhno vzyat' PostgreSQL?
1.6) Kakaya versiya naibolee svezhaya?
1.7) Gde poluchit' podderzhku?
1.8) Kak mne soobschit' ob oshibke?
1.9) Kak najti informaciyu ob izvestnyh oshibkah ili otsutstvuyuschih
vozmozhnostyah?
1.10) Kakaya dokumentaciya imeetsya v nalichii?
1.11) Kak nauchit'sya SQL?
1.12) Kak mne otpravit' ispravlenie ili prisoedinitsya k komande
razrabotchikov?
1.13) Kak sravnit' PostgreSQL s drugimi SUBD? Mozhet li PostgreSQL
byt' vstroennoj?
1.14) Budet li PostgreSQL rabotat' s poslednimi izmeneniyami, v raznyh
stranyh, kasayuschimisya dnevnogo vremeni?
1.15) Kak mne otpisat'sya ot spiskov rassylki PostgreSQL? Kak
izbezhat' polucheniya dubliruyuschihsya soobschenij?
Voprosy pol'zovatelej po klientskoj chasti
2.1) Kakie interfejsy est' dlya PostgreSQL?
2.2) Kakie instrumenty suschestvuyut dlya ispol'zovaniya PostgreSQL
cherez Web?
2.3) Est' li u PostgreSQL graficheskij interfejs pol'zovatelya?
Voprosy administrirovaniya
3.1) Kak mne ustanovit' PostgreSQL v mesto otlichnoe ot
/usr/local/pgsql?
3.2) Kak mne upravlyat' soedineniyami ot drugih komp'yuterov?
3.3) Kakie nastrojki mne nuzhno sdelat' dlya uluchsheniya
proizvoditel'nosti?
3.4) Kakie vozmozhnosti dlya otladki est' v nalichii?
3.5) Pochemu ya poluchayu soobschenie "Sorry, too many clients" kogda
pytayus' podklyuchit'sya k baze?
3.6) Kak vypolnit' obnovlenie PostgreSQL?
3.7) Kakoe komp'yuternoe "zhelezo" ya dolzhen ispol'zovat'?
Voprosy `ekspluatacii
4.1) Kak vypolnit' SELECT tol'ko dlya neskol'kih pervyh strochek
zaprosa? Dlya proizvol'noj stroki?
4.2) Kak mne najti kakie tablicy, indeksy, bazy dannyh i pol'zovateli
suschestvuyut? Kak mne uvidet' zaprosy, kotorye ispol'zuet psql dlya
polucheniya `etoj informacii?
4.3) Kak izmenit' tip dannyh kolonki?
4.4) Kakovy maksimal'nye razmery dlya strok v tablice, tablic i bazy
dannyh?
4.5) Kak mnogo diskovogo prostranstva v baze dannyh nuzhno dlya
sohraneniya dannyh iz obychnogo tekstovogo fajla?
4.6) Pochemu moi zaprosy rabotayut medleno? Pochemu oni ne ispol'zuyut
moi indeksy?
4.7) Kak posmotret' na to, kak optimizator vypolnyaet moj zapros?
4.8) Kak mne vypolnit' poisk regulyarnogo vyrazheniya i poisk
nezavisimyj ot registra bukv poisk regulyarnogo vyrazheniya? Kak mne
ispol'zovat' indeks dlya poiska nezavisimogo ot registra bukv?
4.9) Kak mne opredelit', chto znachenie polya v kakom-libo zaprose
ravno NULL? Kak mne soedinit' vozmozhnye NULL? Mogu ya sortirovat'
polya NULL ili net?
4.10) Kakovy otlichiya mezhdu raznymi simvol'nymi tipami?
4.11.1) Kak mne sozdat' pole serial/s-avto-uvelicheniem?
4.11.2) Kak mne poluchit' znachenie pri vstavke SERIAL?
4.11.3) Ne mozhet li poluchit'sya tak, chto ispol'zovanie currval() i
nextval() privedet k zaciklirovaniyu s drugimi pol'zovatelyami?
4.11.4) Pochemu chisla iz moej posledovatel'nosti ne ispol'zuyutsya
snova pri otmene tranzakcii? Pochemu sozdayutsya razryvy pri numeracii
v kolonke, gde ya ispol'zuyu posledovatel'nost'/SERIAL?
4.12) CHto takoe OID? CHto takoe CTID?
4.13) Pochemu ya poluchayu oshibku "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.14) Kak mne uznat', kakaya versiya PostgreSQL zapuschena?
4.15) Kak mne sozdat' kolonku kotoraya po umolchaniyu budet soderzhat'
tekuschee vremya?
4.16) Kak vypolnit' vneshnee svyazyvanie?
4.17) Kak vypolnyat' zaprosy, ispol'zuyuschie neskol'ko baz dannyh?
4.18) Kak mne vernut' iz funkcii neskol'ko strok tablicy?
4.19) Pochemu ya poluchayu oshibku "relation with OID #### ne
suschestvuet", kogda obraschayuts' k vremennym tablicam v funkciyah
PL/PgSQL?
4.20) Kakie est' resheniya dlya replikacii?
4.21) Pochemu imena tablicy i kolonok ne raspoznayutsya v v moiom
zaprose? Pochemu ne sohranyayutsya zaglavnye bukvy?
_________________________________________________________________
Obschie voprosy
1.1) CHto takoe PostgreSQL? Kak proiznositsya `eto nazvanie? CHto takoe
Postgres?
PostgreSQL proiznositsya Post-Gres-Q-L (Post-Gres-K'yu-`El). (Dlya
osobo lyubopytstvuyuschih kak proiznosit' "PostgreSQL", suschestvuet
audio-fajl).
PostgreSQL - `eto ob"ektno-relyacionnaya sistema upravleniya bazami
dannyh (SUBD), kotoraya imeet tradicionnye vozmozhnosti kommercheskih
SUBD s rasshireniyami, kotorye est' v SUBD novogo pokoleniya.
PostgreSQL - `eto svobodnoe i polnost'yu otkrytoe programmnoe
obespechenie.
Razrabotku PostgreSQL vypolnyaet komanda razrabotchikov, razbrosannaya
po vsemu miru i svyazannaya cherez Internet. Razrabotka yavlyaetsya
obschestvennym proektom i ne upravlyaetsya kakoj-libo kompaniej.
Podrobnosti smotrite v FAQ dlya razrabotchikov,
http://www.postgresql.org/docs/faqs.FAQ_DEV.html
Postgres -- `eto shiroko ispol'zuemoe sokraschenie dlya PostgreSQL.
Pervonachal'nym imenem proekta v Berkli bylo Postgres i `etot nik
teper' naibolee populyaren v razgovorah o PostgreSQL po sravneniyu s
drugimi. Esli vam trudno polnost'yu progovarivat' 'PostgreSQL', mozhno
prosto govorit' 'Postgres'.
1.2) Kto upravlyaet PostgreSQL?
Esli vy ischite kakogo-to osobennogo cheloveka, central'nyj komitet
ili upravlyayuschuyu kompaniyu, to naprasno --- ih net. U nas est'
yadro komiteta i razrabotchikov, rabotayuschih s CVS, no `eti gruppy
sluzhat bol'she dlya administrativnyh celej, chem dlya upravleniya.
Proekt napryamuyu funkcioniruet s pomosch'yu soobschestva
razrabotchikov i pol'zovatelej, k kotoromu mozhet prisoedinitsya
kazhdyj. Vsio chto nuzhno -- `eto podpisat'sya na spiski rassylki i
uchastvovat' v diskussiyah. (Podrobnosti o tom kak vklyuchit'sya v
razrabotku PostgreSQL smotrite v FAQ dlya razrabotchikov.)
1.3) Kakovy avtorskie prava na PostgreSQL?
PostgreSQL rasprostranyaetsya po klassicheskoj licenzii BSD. `Eta
licenziya ne soderzhit ogranichenij na to, kak budet ispol'zovat'sya
ishodnyj kod. Nam nravitsya `eta licenziya i u nas net namerenij eio
menyat'. Vot `eta licenziya BSD, kotoruyu my ispol'zuem:
Sistema Upravleniya Bazami Dannyh PostgreSQL
Portions copyright (c) 1996-2008, PostgreSQL Global Development Group
Portions Copyright (c) 1994-1996 Regents of the University of
California
Predostavlyayutsya prava na ispol'zovanie, kopirovanie, izmenenie i
rasprostranenie dannogo programmnogo obespecheniya i ego dokumentacii
dlya lyubyh celej, besplatno i bez podpisaniya kakogo-libo
soglasheniya, pri uslovii chto dlya kazhdoj kopii budut predostavleny
dannoe vyshe zamechanie ob avtorskih pravah, tekuschij paragraf i dva
sleduyuschih paragrafa.
KALIFORNIJSKIJ UNIVERSITET NE NESET NIKAKOJ OTVETSTVENNOSTI ZA LYUBYE
POVREZHDENIYA, VKLYUCHAYA POTERYU DOHODA, NANESENNYE PRYAMYM ILI
NEPRYAMYM, SPECIAL'NYM ILI SLUCHAJNYM ISPOL'ZOVANIEM DANNOGO
PROGRAMMNOGO OBESPECHENIYA ILI EGO DOKUMENTACII, DAZHE ESLI
KALIFORNIJSKIJ UNIVERSITET BYL IZVESCHEN O VOZMOZHNOSTI TAKIH
POVREZHDENIJ.
KALIFORNIJSKIJ UNIVERSITET SPECIAL'NO OTKAZYVAZYVAETSYA PREDOSTAVLYAT'
LYUBYE GARANTII, VKLYUCHAYA, NO NE OGRANICHIVAYAS' TOL'KO `ETIMI
GARANTIYAMI: NEYAVNYE GARANTII PRIGODNOSTI TOVARA ILI PRIGODNOSTI DLYA
OTDEL'NOJ CELI. DANNOE PROGRAMMNOE OBESPECHENIE PREDOSTAVLYAETSYA NA
OSNOVE PRICIPA "KAK EST'" I KALIFORNIJSKIJ UNIVERSITET NE OBYAZAN
PREDOSTAVLYAT' SOPROVOZHDENIE, PODDERZHKU, OBNOVLENIYA, RASSHIRENIYA
ILI IZMENENIYA.
1.4) Na kakih platformah rabotaet PostgreSQL?
Obychno, PostgreSQL mozhet rabotat' na lyuboj sovremennoj platforme
sovmestimoj s Unix. V instrukcii po ustanovke, vy najdete spisok teh
platform, na kotoryh byli provedeny testovye zapuski PostgreSQL k
momentu vyhoda dannoj versii.
PostgreSQL takzhe rabotaet na operacionnyh sistemah Microsoft Windows,
osnovannyh na NT, takih kak Win2000 SP4, WinXP i Win2003. Paket
installyatora dostupen po adresu
http://www.postgresql.org/download/windows. Versii Windows, osnovannye
na MS-DOS (Win95, Win98, WinMe) mogut zapuskat' PostgreSQL s
pomosch'yu Cygwin.
Takzhe suschestvuet versiya sportirovannaya pod Novell Netware 6 na
http://developer.novell.com/wiki/index.php/Postgresql, i versiya dlya
OS/2 (eComStation) na
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgre
SQL&stype=all&sort=type&dir=%2F.
1.5) Gde mozhno vzyat' PostgreSQL?
CHerez brauzer, ispol'zuya http://www.postgresql.org/ftp/ i cherez
ftp, ispol'zuya ftp://ftp.postgresql.org/pub/.
1.6) Kakaya versiya naibolee svezhaya?
Poslednij vypusk PostgreSQL - `eto versiya 8.3.3
My planiruem vypuskat' novye starshie versii kazhdyj god, a mladshie
versii kazhdye neskol'ko mesyacev.
1.7) Gde poluchit' podderzhku?
Soobschestvo PostgreSQL predostavlyaet pomosch' mnozhestvu
pol'zovatelej cherez E-mail. Osnovnoj web-sajt dlya podpiski na spiski
rassylki po E-mail `eto: http://www.postgresql.org/community/lists/.
Horoshim mestom dlya togo, chtoby nachat' zadavat' voprosy
yavlyayutsya spiski general (obschie voprosy) ili bugs (oshibki).
Glavnym IRC kanalom yavlyaetsya #postgreql, raspolozhennyj na servere
Freenode (irc.freenode.net). CHtoby podklyuchit'sya, vy mozhete
ispol'zovat' v Unix vyzov programmy irc -c '#postgresql' "$USER"
irc.freenode.net ili lyuboj drugoj IRC klient. Na `etom zhe servere
suschestvuyut kanaly na ispanskom (#postgresql-es), francuzskom
(#postgresqlfr) i brazil'skom (#postgresql-br) yazykah. Takzhe
suschestvuet kanal po PostgreSQL na servere EFNet.
Spisok kommercheskoj podderzhki kompanij dostupen na
http://www.postgresql.org/support/professional_support.
1.8) Kak mne soobschit' ob oshibke?
Posetite stranichku so special'noj formoj otchiota ob oshibke v
PostgreSQL po adresu: http://www.postgresql.org/support/submitbug.
Takzhe prover'te nalichie bolee svezhej versii PostgreSQL na nashem
FTP sajte ftp://ftp.postgresql.org/pub/.
Na oshibki, uvedomlenie o kotoryh byli sdelany cherez special'nuyu
formu ili otpravlennye v kakoj-libo spisok rassylki PostgreSQL,
obychno generiruetsya odin iz sleduyuschih otvetov:
* `Eto ne oshibka i pochemu
* `Eto izvestnaya oshibka i ona uzhe est' v spiske TODO
* Dannaya oshibka byla ispravlena v tekuschem vypuske
* Dannaya oshibka byla ispravlena, no ispravlenie poka ne popalo v
oficial'nyj vypusk
* Zaprashivaetsya bolee detal'naya informaciya:
+ Operacionnaya sistema
+ Versiya PostgreSQL
+ Test, vosproizvodyaschij oshibku
+ Otladochnaya informaciya
+ Vyvod backtrace otladchika
* `Eto novaya oshibka. Mozhet proizojti sleduyuschee:
+ Budet sozdano ispravlenie, kotoroe budet vklyucheno v
sleduyuschij vypusk
+ Oshibka ne mozhet byt' ispravlena nemedlenno i budet
dobavlena v spisok TODO
1.9) Kak najti informaciyu ob izvestnyh oshibkah ili otsutstvuyuschih
vozmozhnostyah?
PostgreSQL podderzhivaet rasshirennyj podklass SQL:2003. Smotrite nash
spisok TODO na predmet izvestnyh oshibok, otsutstvuyuschih
vozmozhnostej i buduschih planov.
Na zapros kakoj-libo vozmozhnosti obychno prihodyat sleduyuschie
otvety:
* Dannaya vozmozhnost' uzhe est' v spiske TODO
* Dannaya vozmozhnost' nezhelatel'na potomu chto:
+ Ona dubliruet suschestvuyuschuyu funkcional'nost', kotoraya
sleduet standartu SQL
+ Dannaya vozmozhnost' sil'no uslozhnila by kod, no dala by
malen'kuyu vygodu
+ Dannaya vozmozhnost' nebezopasna ili nenadiozhna
* Dannaya novaya vozmozhnost' dobavlena v spisok TODO
PostgreSQL ne ispol'zuet kakuyu-libo sistemu otslezhivaniya oshibok,
potomu chto my obnaruzhili, chto ispol'zovanie pryamogo obrascheniya
po `elektronnoj pochte i obnovlyaemogo spiska TODO yavlyaetsya bolee
`effektivnym. Na praktike, oshibki v programmnom obespechenii
sohranyayutsya ochen' nedolgo, a oshibki, kotorye vazhny bol'shomu
kolichestvu pol'zovatelej ispravlyayutsya momental'no. Est' tol'ko
odno mesto, gde mozhno najti vse izmeneniya, uluchsheniya i
ispravleniya, sdelannye v vypuske PostgreSQL - `eto zhurnaly
soobschenij sistemy kontrolya versij CVS. Dazhe zamechaniya k vypuskam
ne soderzhat vse izmeneniya, sdelannye v programmnom obespechenii.
1.10) Kakaya dokumentaciya imeetsya v nalichii?
PostgreSQL soderzhit mnogo dokumentacii, vklyuchaya bol'shoe
rukovodstvo, stranicy `elektronnogo rukovodstva man i nekotorye
malen'kie testovye primery. Smotrite v katalog /doc. Vy takzhe mozhete
prosmatrivat' dokumentaciyu v Internet po adresu
http://www.postgresql.org/docs.
Suschestvuet dve knigi po PostgreSQL dostupnye po adresam
http://www.PostgreSQL.org/docs/books/awbook.html i
http://www.commandprompt.com/ppbook/. Est' neskol'ko knig po
PostgreSQL, kotorye mozhno kupit'. Odnu iz naibolee populyarnyh
napisal Korri Duglas (Korry Douglas). Spisok obzorov po `etim knigam
dostupen po adresu http://www.postgresql.org/docs/books/. Krome togo,
po adresu
http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides
%2C_and_Documentation vy mozhete najti kollekciyu tehnicheskih statej,
posveschennyh PostgreSQL.
Klient komandnoj stroki psql imeet neskol'ko komand \d dlya
otobrazheniya informacii po tipam, operatoram, funkciyam, agregatam i
t.d. - ispol'zujte \? dlya polucheniya spiska dostupnyh komand.
Nash sajt soderzhit esche bol'she informacii.
1.11) Kak mne nauchit'sya SQL?
Vo-pervyh, voz'mite odnu iz knig po PostgreSQL, o kotoryh govorilos'
vyshe. Mnogim iz nashih pol'zovatelej takzhe nravitsya kniga The
Practical SQL Handbook, Bowman, Judith S., et al., Addison-Wesley.
Drugim nravitsya The Complete Reference SQL, Groff et al.,
McGraw-Hill.
Suschestvuet takzhe mnozhestvo prekrasnyh uchebnikov dostupnyh v
online:
* http://www.intermedia.net/support/sql/sqltut.shtm,
* http://sqlcourse.com.
* http://www.w3school.com/sql/default.asp
* http://mysite.verizon.net/Graeme_Birchall/id1.html
1.12) Kak mne prislat' ispravlenie ili prisoedinitsya k komande
razrabotchikov?
Smotrite FAQ dlya razrabotchikov.
1.13) Kak sravnit' PostgreSQL s drugimi SUBD? Mozhet li PostgreSQL byt'
vstroennym?
Suschestvuet neskol'ko metodov sravneniya programmnogo obespecheniya:
vozmozhnosti, proizvoditel'nost', nadezhnost', podderzhka i cena.
Vozmozhnosti
PostgreSQL imeet bol'shinstvo vozmozhnostej predstavlennyh v
bol'shih kommercheskih SUBD, takie kak: tranzakcii, podzaprosy,
triggery, predstavleniya, ssylochnoj celostnosti vtorichnogo
klyucha i raznye blokirovki. U nas est' nekotorye vozmozhnosti,
kotoryh net u nih: tipy, opredelyaemye pol'zovatelem, mehanizm
nasledovaniya, pravila i konkuretnoe mnogoversionnoe upravlenie
dlya raboty s soderzhimym blokirovok.
Proizvoditel'nost'
Proizvoditel'nost' PostgreSQL shodna s drugimi kommercheskimi
SUBD i s SUBD s otkrytym ishodnym kodom. V kakih-to veschah my
bystree, v kakih-to medlennee. Nasha proizvoditel'nosti obychno
+/-10% po sravneniyu s drugimi SUBD.
Nadezhnost'
My ponimali, chto nasha SUBD dolzhna byt' nadezhnoj ili ona
nichego ne budet stoit'. My staraemsya vypuskat' horosho
proverennyj, stabil'nyj kod, kotoryj soderzhit minimum oshibok.
Kazhdyj vypusk prohodit stadiyu beta-testirovaniya po krajnej
mere v techenii odnogo mesyaca i nasha istoriya vypuskov
pokazyvaet chto my mozhem predostavlyat' stabil'nye, monolitnye
vypuski, kotorye gotovy k produktivnomu ispol'zovaniyu. My
verim, chto my proizvodim proverku ne huzhe, chem u drugih
SUBD.
Podderzhka
Nash spisok rassylki predostavlyaet vozmozhmozhnost' obscheniya
s bol'shoj gruppoj razrabotchikov i pol'zovatelej, kotorye
mogut pomoch' reshit' lyubye voznikshie problemy. V to zhe
vremya, my ne garantiruem kakie-libo ispravleniya, no i
razrabotchiki kommercheskih SUBD ne vsegda delayut
ispravleniya. Pryamoj dostup k razrabotchikam, soobschestvu
pol'zovatelej, rukovodstvam i ishodnym tekstam chasto delayut
podderzhku PostgreSQL prevoshodyaschej drugie SUBD.
Suschestvuet kommercheskaya podderzhka po rezul'tam voznikshih
incidentov, kotoraya dostupna dlya teh komu ona nuzhna.
(Smotrite Sekciyu 1.7.)
Cena
Nash produkt besplaten kak dlya kommercheskogo tak, i ne dlya
kommercheskogo ispol'zovaniya. Vy mozhete dobavlyat' svoj kod v
nash produkt bez ogranichenij, za isklyucheniem teh, chto
opisyvayutsya v nashej licenzii stilya BSD, kotoraya privedena
vyshe.
PostgreSQL razrabatyvaetsya po arhitekture klient/server, kotoraya
trebuet otdel'nyh processov dlya kazhdogo klienta i servera, a takzhe
neskol'ko vspomogatel'nyh processov. Mnogie vstraivaemye arhitektury
mogut sootvetstvovat' takim trebovaniyam. Odnako, esli vasha
vstraivaemaya arhitektura trebuet server baz dannyh dlya zapuska
vnutri prikladnogo processa, vy ne mozhete ispol'zovat' Postgres i vam
luchshe by vybrat' dlya bazy dannyh kakoe-libo drugoe oblegchennoe
reshenie.
1.14) Budet li PostgreSQL rabotat' s poslednimi izmeneniyami, v raznyh
stranyh, kasayuschimisya dnevnogo vremeni?
Izmeneniya v sohranenii dnevnogo vremeni v SSHA vklyucheny v
PostgreSQL versii 8.0.[4+] i vo vse sleduyuschie vypuski, naprimer v
8.1. Izmeneniya po Kanade i Zapadnoj Avstralii vklyucheny v 8.0.[10+],
8.1.[6+] i vse sleduyuschie vypuski. Vypuski PostgreSQL do 8.0
ispol'zuyut informaciyu o sohranenii dnevnogo vremeni iz bazy dannyh
vremennyh zon v operacionnoj sisteme.
_________________________________________________________________
1.15) Kak mne otpisat'sya ot spiskov rassylki PostgreSQL? Kak izbezhat'
polucheniya dubliruyuschih soobschenij?
Stranica Majordomo na sajte PostgreSQL pozvolyaet podpisat'sya ili
otpisat'sya ot lyubogo iz spiskov rassylki PostgreSQL. (Vam mozhet
ponadobitsya vash parol' dlya Majordomo, kotoryj otpravlyaetsya na
vash E-mail, chtoby vojti v upravlenie vashimi podpiskami.)
Vse spiski rassylki PostgreSQL nastarivayutsya tak, chtoby gruppovoj
otvet uhodil na adres spiska i na adres avtora soobscheniya. Tak
sdelano, chtoby pol'zovateli poluchali otvety na E-mail kak mozhno
bystree. Esli vy ne hotite poluchat' dubliruyuschie E-mail
soobscheniya iz spiska, v sluchayah kogda vy uzhe poluchili `eti
soobscheniya napryamuyu, ustanovite flazhok eliminatecc na stranice
Change Settings v Majordomo. Vy takzhe mozhete izbezhat' polucheniya
kopij svoih soobschenij dlya samogo sebya, esli snimite flazhok
selfcopy.
_________________________________________________________________
Voprosy pol'zovatelej po klientskoj chasti
2.1) Kakie interfejsy est' dlya PostgreSQL?
Ustanovka PostgreSQL vklyuchaet tol'ko C i vstroennyj (embedded) C
interfejsy. Vse drugie interfejsy yavlyayutsya nezavisimymi proektami
i zagruzhayutsya otdel'no; samostoyatel'nost' proektov pozvolyaet im
organizovat' sobstvennoe raspisanie vypuskov novyh versij i imet'
sobstvennuyu komandu razrabotchikov.
Nekotorye yazyki programmirovaniya, takie kak PHP vklyuchayut v sebya
interfejs k PostgreSQL. Interfejsy dlya takih yazykov kak Perl, TCL,
Python i mnogih drugih, dostupny na http://pgfoundry.org.
2.2) Kakie instrumenty suschestvuyut dlya ispol'zovaniya PostgreSQL cherez
Web?
Prekrasnoe vvedenie vo vzaimodejstvie baz dannyh i Web mozhno najti
na: http://www.webreview.com
Dlya integracii s Web, PHP http://www.php.net yavlyaetsya neplohim
interfejsom.
V slozhnyh sluchayah, mnogie pol'zuyutsya Perl i DBD::Pg s CGI.pm ili
mod_perl.
2.3) Est' li u PostgreSQL graficheskij interfejs pol'zovatelya?
Dlya PostgreSQL suschestvuet bol'shoe kolichestvo instrumentov s
graficheskim interfejsom kak kommercheskih, tak i otkrytyh.
Podrobnosti mozhno najti v Dokumentacii soobschestva dlya GUI
istrumentov PostgreSQL
_________________________________________________________________
Voprosy administrirovaniya
3.1) Kak mne ustanovit' PostgreSQL v mesto otlichnoe ot /usr/local/pgsql?
Zadajte opciyu --prefix kogda zapuskaete configure.
3.2) Kak mne upravlyat' soedineniyami ot drugih komp'yuterov?
Po umolchaniyu, PostgreSQL razreshaet tol'ko soedineniya na lokal'noj
mashine cherez sokety domena Unix ili TCP/IP soedineniya. Dlya togo,
chtoby drugie mashiny smogli podklyuchit'sya k baze vy dolzhny
izmenit' listen_addresses v postgresql.conf, razreshit'
host-avtorizaciya v fajle $PGDATA/pg_hba.conf i perestartovat' server
SUBD.
3.3) Kakie nastrojki mne nuzhno sdelat' dlya uluchsheniya proizvoditel'nosti?
Suschestvuet tri glavnyh oblasti, kotorye potencial'no mogut
uvelichit' proizvoditel'nost':
Izmenenie zaprosa
`Eto oznachaet modifikaciyu zaprosov dlya polucheniya luchshej
proizvoditel'nosti:
+ Sozdanie indeksov, vklyuchaya indeksy vyrazhenij i
chastichnye indeksy
+ Ispol'zovanie COPY vmesto mnozhestva INSERT
+ Gruppirovka neskol'kih operatorov v edinuyu tranzakciyu dlya
umen'sheniya nagruzki pri vypolnenii zaversheniya tranzakcii
+ Ispol'zovanie CLUSTER, kogda iz indeksa beriotsya mnozhestvo
strok
+ Ispol'zovanie LIMIT dlya togo, chtoby vozvraschalas' tol'ko
chast' vyvoda ot zaprosa
+ Ispol'zovanie Podgotovlennyh (Prepared) zaprosov
+ Ispol'zovanie ANALYZE dlya obsluzhivaniya statistiki
optimizatora
+ Regulyarnoe ispol'zovanie VACUUM ili pg_autovacuum
+ Udalenie indeksov vo vremya bol'shih izmenenij dannyh
Nastrojka servera
Nekotorye ustanovki v postgresql.conf vliyayut na
proizvoditel'nost'. Podrobnyj polnyj spisok ustanovok sm. v
Administration Guide/Server Run-time Environment/Run-time
Configuration, a kommentarii sm. v
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_co
nf_e.html i
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Vybor "zheleza" - apparatnogo obespecheniya
Vliyanie "zheleza" na proizvoditel'nost' podrobno opisano v
http://www.powerpostgresql.com/PerfList/ i
http://momjian.us/main/writings/pgsql/hw_performance/index.html
.
3.4) Kakie vozmozhnosti dlya otladki est' v nalichii?
Est' mnozhestvo ustanovok v nastrojkah servera, nachinayuschihsya na
log_* na
http://www.postgresql.org/docs/current/interactive/runtime-config-logg
ing.html, pozvolyayuschih protokolirovat' zaprosy i statistiku raboty
processa, kotoraya ochen' polezna dlya otladki i izmereniya
proizvoditel'nosti.
3.5) Pochemu ya poluchayu soobschenie "Sorry, too many clients" kogda
pytayus' podklyuchit'sya k baze?
Vy dostigli ustanovlennogo po umolchaniyu ogranicheniya v 100 sessij
podklyucheniya k baze dannyh. Vam neobhodimo uvelichit' limit na
kolichestvo konkurentnyh backend processov dlya vashego servera BD,
izmeniv znachenie max_connections v fajle postgresql.conf i
perestartovat' server BD.
3.6) Kak vypolnit' obnovlenie PostgreSQL?
Sm. informaciyu ob obnovlenii v
http://www.postgresql.org/support/versioning i special'nye instrukcii
v
http://www.postgresql.org/docs/current/static/install-upgrading.html.
3.7) Kakoe komp'yuternoe "zhelezo" ya dolzhen ispol'zovat'?
Poskol'ku "zhelezo" personal'nyh komp'yuterov yavlyaetsya naibolee
sovmestimym, lyudi sklonny verit', chto takoe "zhelezo" imeet
odinakovoe kachestvo. `Eto ne tak. Pamyat' ECC, SCSI i kachestvennye
materinskie platy yavlyayutsya bolee nadiozhnymi i imeyut bolee
luchshuyu proizvoditel'nost', chem menee dorogoe "zhelezo". PostgreSQL
budet rabotat' na lyubom "zheleze", no esli dlya vas vazhny
nadiozhnost' i proizvoditel'nost', to s vashej storony budet mudro
postavit' sootvetstvuyuschee "zhelezo". Obsudit' raznoe "zhelezo"
mozhno v nashih spiskah rassylki.
_________________________________________________________________
Voprosy `ekspluatacii
4.1) Kak vypolnit' SELECT tol'ko dlya neskol'kih pervyh strochek zaprosa?
Proizvol'noj stroki?
Dlya polucheniya tol'ko neskol'kih strok, esli vy znaete ih
kolichestvo na moment vypolneniya SELECT ispol'zujte LIMIT.
Esli est' kakoj-libo indeks, kotoryj sovpadaet s ORDER BY, to
vozmozhno, chto ves' zapros vypolnen i ne budet. Esli vy ne znaete
kolichestva neobhodimyh strok na moment vypolneniya SELECT,
ispol'zujte kursor i FETCH.
To SELECT a random row, use:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) Kak mne najti kakie tablicy, indeksy, bazy dannyh i pol'zovateli
suschestvuyut? Kak mne uvidet' zaprosy, kotorye ispol'zuet psql dlya
polucheniya `etoj informacii?
CHtoby prosmatrivat' tablicy v psql, ispol'zujte komandu \dt. Polnyj
spisok komand v psql vy mozhete poluchit', ispol'zuya \?. Krome togo,
vy mozhete posmotret' ishodnyj kod psql v fajle
pgsql/src/bin/psql/describe.c. On soderzhit komandy SQL kotorye
generiruyutsya pri vvode v psql komand, nachinayuschihsya s obratnoj
kosoj cherty. Vy takzhe mozhete zapustit' psql s opciej -E tak, chtoby
`eta programma vydavala zaprosy, kotorye ona ispol'zuet dlya
vypolneniya zadannyh vami komand. PostgreSQL takzhe predostavlyaet SQL
sovmestimyj s INFORMATION SCHEMA interfejs, s pomosch'yu kotorogo, vy
mozhete sformirovat' zapros na poluchenie informacii o baze dannyh.
Takzhe suschestvuyut sistemnye tablicy, nachinayuschiesya s pg_.
Ispol'zujte psql -l dlya polucheniya spiska vseh baz dannyh.
Takzhe posmotrite fajl pgsql/src/tutorial/syscat.source. On pokazyvaet
mnogie iz operatorov SELECT neobhodimyh dlya polucheniya informacii iz
sistemnyh tablic bazy dannyh.
4.3) Kak izmenit' tip dannyh kolonki?
V 8.0 i bolee pozdnih versiyah, izmenenie tipa kolonki vypolnyaetsya
ochen' legko cherez ALTER TABLE ALTER COLUMN TYPE.
V bolee rannih versiyah sdelajte tak:
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;
4.4) Kakovy maksimal'nye razmery dlya strok v tablice, tablic i bazy dannyh?
Suschestvuyut sleduyuschie ogranicheniya:
Maksimal'nyj razmer bazy? neogranichen (suschestvuyut bazy na 32 TB)
Maksimal'nyj razmer tablicy? 32 TB
Maksimal'nyj razmer stroki? 400 Gb
Maksimal'nyj razmer polya? 1 GB
Maksimal'noe kolichestvo strok v tablice? neogranicheno
Maksimal'noe kolichestvo kolonok v tablice? 250-1600 v zavisimosti ot
tipa
Maksimal'noe kolichestvo indeksov v tablice? neogranicheno
Razumeetsya, ponyatie "neogranicheno" na samom dele ogranichivaetsya
dostupnym diskovym prostranistvom i razmerami pamyati/svoppinga. Kogda
znacheniya perechislennye vyshe neopravdano bol'shie, mozhet
postradat' proizvoditel'nost'.
Maksimal'nyj razmer tablicy v 32 TB ne trebuet chtoby operacionnaya
sistema podderzhivala fajly bol'shih razmerov. Bol'shie tablicy
hranyatsya kak mnozhestvo fajlov razmerom v 1 GB, tak chto
ogranicheniya, kotorye nakladyvaet fajlovaya sistema ne vazhny.
Maksimal'nyj razmer tablicy i maksimal'noe kolichestvo kolonok mogut
byt' uvelicheny v chetyre raza, esli razmer bloka po umolchaniyu budet
uvelichen do 32k.
Suschestvuet ogranichenie, po kotoromu indeksy ne mogut sozdavat'sya
dlya kolonok dlinnee chem 2,000 simvolov. K schast'yu takie indeksy
vryad li dejstvitel'no komu-to nuzhny. Unikal'nost' garantiruetsya
nailuchim obrazom, s pomosch'yu funkcional'nogo indeksa iz h`esha MD5
dlinnoj kolonki, a polnotekstovoe indeksirovanie pozvolyaet iskat'
slova vnutri kolonki.
4.5) Kak mnogo diskovogo prostranstva v baze dannyh nuzhno dlya sohraneniya
dannyh iz obychnogo tekstovogo fajla?
SUBD PostgreSQL mozhet potrebovat'sya diskovogo prostranstva do 5 raz
bol'she dlya sohraneniya dannyh iz prostogo tekstovogo fajla.
V kachestve primera, rassmotrim fajl v 100,000 strok v kazhdoj, iz
kotoryh celoe chislo i tekstovoe opisanie. Pri `etom dlina teksta, v
srednem, sostavlyaet 20 bajt. Razmer prostogo fajla sostavit 2.8 MB.
Razmer bazy PostgreSQL, soderzhaschej `eti zhe dannye sostavit
priblizitel'no 5.2 MB iz kotoryh:
24 bajt: na kazhdyj zagolovok stroki v tablice (priblizitel'no)
+ 24 bajta: odno pole s celochislennym tipom i odno tekstovoe pole
+ 4 bajta: ukazatel' na stranice dlya vsej tablichnoj stroki
----------------------------------------
56 bajt na stroku v tablice
Razmer stranicy dannyh v PostgreSQL sostavlyaet 8192 bajt (8 KB), tak chto:
8192 bajt na stranicu
--------------------- = 158 strok v tablice na stranicu BD (okruglionno)
52 bajt na stroku v tablice
100000 strok dannyh
----------------------- = 633 stranic v BD (okruglionno)
158 strok v tablice na stranicu
633 stranic BD * 8192 bajt na stranicu = 5,185,536 bajt (5.2 MB)
Indeksy ne trebuyut tak mnogo, no poskol'ku oni sozdayutsya dlya
bol'shogo kolichestva dannyh, oni takzhe mogut byt' veliki.
Znacheniya NULL hranyatsya kak bitovye karty i po`etomu oni zanimayut
ochen' malo mesta.
4.6) Pochemu moi zaprosy rabotayut medleno? Pochemu oni ne ispol'zuyut moi
indeksy?
Indeksy ne ispol'zuyutsya dlya kazhdogo zaprosa. Oni ispol'zuyutsya
tol'ko esli tablica bol'she minimal'nogo razmera i zapros vybiraet
tol'ko malen'kij procent strok v tablice. Tak ustroeno, potomu chto
dostup k disku s primeneniem randomizacii pri skanirovanii indeksov
mozhet byt' medlennee, chem prostoe chtenie tablicy ili ee
posledovatel'noe skanirovanie.
CHtoby opredelit' neobhodimost' ispol'zovaniya indeksa dlya kakoj-libo
tablicy, PostgreSQL dolzhen imet' statistiku po `etoj tablice. `Eta
statistika sobiraetsya pri ispol'zovanii VACUUM ANALYZE ili prosto
ANALYZE. Ispol'zuya statistiku, optimizator uznaet o tom kak mnogo
strok v tablice i esli on dolzhen ispol'zovat' indeksy, to on mozhet
prinimat' luchshie resheniya. Statistika takzhe vliyaet na opredelenie
optimal'nogo poryadka svyazyvaniya i metoda svyazyvaniya. Pri
izmenenii soderzhimogo tablicy dolzhen periodicheski vypolnyatsya sbor
statistiki.
Obychno indeksy ne ispol'zuyutsya dlya ORDER BY ili dlya vypolneniya
svyazyvanij. Posledovatel'nyj perebor sleduyuschij za yavnoj
sortirovkoj obychno bystree, chem poisk po indeksam v bol'shoj
tablice. Odnako, ORDER BY chasto kombiniruetsya s LIMIT i v `etom
sluchae indeks budet ispol'zovat'sya, poskol'ku pri vypolnenii budet
vozvraschat'sya nebol'shaya chast' tablicy.
Esli vam kazhetsya, chto optimizator nekorrektno vybiraet
posledovatel'nyj perebor, ispol'zujte SET enable_seqscan TO 'off' i
zapustite zapros snova, chtoby uvidet', dejstvitel'no li skanirovanie
indeksov bystree.
Kogda ispol'zuyutsya operacii s shablonami, naprimer LIKE ili ~,
indeksy mogut byt' ispol'zovany v sleduyuschih sluchayah:
* Nachalo stroki poiska dolzhno sovpadat' s nachalom iskomoj stroki,
t.e.:
+ LIKE shablony ne dolzhny nachinat'sya s %..
+ ~ shablony regulyarnyh vyrazhenij dolzhna nachinat'sya na ^.
* Stroka poiska ne dolzhna nachinat'sya s simvola klassa, t.e.
[a-e].
* Poisk nezavisimyj ot registra, takoj kak ILIKE i ~* ne ispol'zuet
indeksy. Vmesto nego, ispol'zujte indeksy vyrazhenij, kotorye
opisyvayutsya v sekcii 4.8.
* Vo vremya initdb dolzhna ispol'zovat'sya lokal' po umolchaniyu C,
potomu chto ne suschestvuet vozmozhnosti uznat' sleduyuschij
naibol'shij simvol dlya ne-C lokali. Vy mozhete dlya takih
sluchaev sozdat' special'nyj indeks text_pattern_ops kotoryj
rabotaet tol'ko dlya LIKE indeksirovaniya. Dlya poiska slov takzhe
mozhno ispol'zovat' polnotekstovyj indeks.
4.7) Kak posmotret' na to, kak optimizator vypolnyaet moj zapros?
Smotrite stranicu rukovodstva posvyaschennuyu EXPLAIN.
4.8) Kak mne vypolnit' poisk regulyarnogo vyrazheniya i poisk nezavisimyj ot
registra bukv poisk regulyarnogo vyrazheniya? Kak mne ispol'zovat' indeks
dlya poiska nezavisimogo ot registra bukv?
Operator ~ proizvodit poisk regulyarnogo vyrazheniya, a operator ~*
proizvodit nezavisimyj ot registra bukv poisk regulyarnogo
vyrazheniya. Nezavisimyj ot registra variant LIKE nazyvaetsya ILIKE.
Nezavisimoe ot registra sravnenie obychno vyrazhaetsya tak:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
`Eta konstrukciya ne budet ispol'zovat' standartnyj indeks. Odnako,
esli vy sozdadite indeks vyrazheniya, on budet ispol'zovan:
CREATE INDEX tabindex ON tab (lower(col));
Esli vysheukazannyj indeks sozdaiotsya kak UNIQUE, to kolonka, dlya
kotoroj on sozdaiotsya mozhet hranit' simvoly i v verhnem, i v nizhnem
registre, indes ne mozhet imet' identichnyh znachenij, kotorye
otlichayutsya tol'ko registrom. CHtoby v kolonke mozhno bylo hranit'
simvoly tol'ko v opredelionnom registre, ispol'zujte ogranichenie
CHECK ili proverku cherez trigger.
4.9) Kak mne opredelit', chto znachenie polya v kakom-libo zaprose ravno
NULL? Kak mne soedinit' vozmozhnye NULL? Mogu ya sortirovat' polya NULL ili
net?
Vy prosto sravnivaete znachenie s IS NULL i IS NOT NULL, kak zdes':
SELECT *
FROM tab
WHERE col IS NULL;
CHtoby soedinit' s vozmozhnymi znacheniyami NULL, ispol'zujte
COALESCE() kak zdes':
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
CHtoby otsortirovat' dannye po znacheniyu ispol'zujte modifikatory IS
NULL i IS NOT NULL v vyrazhenii ORDER BY. Kogda oni budut generirovat'
znacheniya istina, to pri sortirovke oni budut vyshe, chem znacheniya
lozh', tak chto zapisi s NULL budut v otsortirovannom spiske sverhu:
SELECT *
FROM tab
ORDER BY (col IS NOT NULL);
4.10) Kakovy otlichiya mezhdu raznymi simvol'nymi tipami?
Tip Vnutrennee imya Zamechaniya
VARCHAR(n) varchar razmer zadaet maksimal'nuyu dlinu, net zapolneniya
CHAR(n) bpchar zapolnyaetsya pustotoj do fiksirovannoj dliny
TEXT text net zadavaemogo verhnego ogranicheniya ili dliny
BYTEA bytea massiv bajt peremennoj dliny (mozhno ispol'zovat'
null-bajt bez opaski)
"char" char odin simvol
Vnutrennee imya vy mozhete uvidet', kogda smotrite sistemnye katalogi
i v nekotoryh soobscheniyah ob oshibkah.
Pervye chetyre tipa yavlyayutsya "varlena" tipami (t.e., pervye
chetyre bajta na diske yavlyayutsya dlinnoj, za kotoroj sleduyut
dannye). Takim obrazom, fakticheski ispol'zuemoe prostranstvo bol'she,
chem oboznachennyj razmer. Odnako, dlinnye znacheniya takzhe
szhimayutsya, tak chto zanimaemoe diskovoe prostranstvo mozhet takzhe
byt' i men'she, chem ozhidalos'.
VARCHAR(n) - `eto luchshee reshenie, kogda nuzhno hranit' stroki
peremennoj dliny, ne prevyshayuschie opredelennogo razmera. TEXT -
`eto luchshee reshenie dlya strok neogranichennoj dliny, s maksimal'no
dopustimoj dlinoj v 1 gigabajt.
CHAR(n) - `eto luchshee reshenie dlya hraneniya strok, kotorye obychno
imeyut odinakovuyu dlinu. CHAR(n) zapolnyaetsya pustotoj do zadannoj
dliny, v to vremya kak VARCHAR(n) hranit tol'ko simvoly, iz kotoryh
sostoit stroka. BYTEA ispol'zuetsya dlya hraneniya binarnyh dannyh,
znacheniya kotoryh mogut vklyuchat' NULL bajty. Vse tipy opisannye
zdes', imeyut shodnye harakteristiki proizvoditel'nosti.
4.11.1) Kak mne sozdat' pole serial/s-avto-uvelicheniem?
PostgreSQL podderzhivaet tip dannyh SERIAL. On avtomaticheski sozdaet
posledovatel'nost'. Naprimer:
CREATE TABLE person (
id SERIAL,
name TEXT
);
avtomaticheski transliruetsya v:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
Avtomaticheski sozdannaya posledovatel'nost' imeet imya vida
<tablica>_<kolonka_serial>_seq, gde tablica i kolonka_serial - `eto
sootvetstvenno imena tablicy i kolonki s tipom SERIAL. Smotrite
podrobnosti o posledovatel'nostyah na stranice rukovodstva
posvyaschennoj create_sequence.
4.11.2) Kak mne poluchit' znachenie pri vstavke SERIAL?
Prostejshij sposob poluchit' naznachennoe znachenie SERIAL `eto
ispol'zovat' RETURNING. Ispol'zuya dlya primera tablicu v 4.11.1, `eto
mozhet vyglyadet' tak:
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
Vy takzhe mozhete vyzvat' nextval() i ispol'zovat' `eto znachenie v
INSERT ili vyzvat' currval() posle INSERT.
4.11.3) Ne mozhet li poluchit'sya tak, chto ispol'zovanie currval() i
nextval() privedet k zaciklirovaniyu s drugimi pol'zovatelyami?
Net. currval() vozvraschaet tekuschee znachenie, naznachennoe vashej
sessiej, a ne drugimi sessiyami.
4.11.4) Pochemu chisla iz moej posledovatel'nosti ne ispol'zuyutsya snova pri
otmene tranzakcii? Pochemu sozdayutsya razryvy pri numeracii v kolonke, gde
ya ispol'zuyu posledovatel'nost'/SERIAL?
Dlya realizacii konkuretnosti, znacheniya posledovatel'nostej, pri
neobhodimosti vydayutsya vo vremya zapuska tranzakcij i ne
blokiruyutsya do polnogo vypolneniya tranzakcij. `Eto mozhet vyzyvat'
razryvy v numeracii pri otmene tranzakcij.
4.12) CHto takoe OID? CHto takoe CTID?
Esli tablica sozdana s WITH OIDS, to kazhdaya stroka poluchaet
unikal'nyj indentifikator OID. OID - `eto avtomaticheski naznachaemoe
unikal'noe 4-h bajtovoe celoe chislo, kotoroe unikal'no dlya vsej
ustanovlennoj SUBD. Odnako, posle togo kak ego znachenie prevysit 4
milliarda, znacheniya OID nachinayut dublirovat'sya. PostgreSQL
ispol'zuet OID dlya svyazyvaniya svoih vnutrennih tablic.
Dlya unikal'nogo znacheniya v strokah tablicy pol'zovatelya, luchshim
sposobom yavlyaetsya ispol'zovanie SERIAL vmesto OID, potomu chto
posledovatel'nosti SERIAL unikal'ny tol'ko vnutri tablicy i takim
obrazom men'she podverzheny perepolneniyu. Dlya hraneniya znachenij
8-mi bajtnoj posledovatel'nosti dostupen tip SERIAL8.
CTID ispol'zuetsya dlya identifikacii special'nyh fizicheskih zapisej
s blochnymi i offset znacheniyami. CTID izmenyaetsya posle togo kak
stroki v tablice byli izmeneny ili peregruzheny.
TID ispol'zuetsya indeksnymi zapisyami v kachestve ukazatelya na
fizicheskie zapisi.
4.13) Pochemu ya poluchayu oshibku "ERROR: Memory exhausted in
AllocSetAlloc()"?
Predpolozhitel'no u vas zakonchilas' virtual'naya pamyat' ili chto
vashe yadro imeet malen'kij limit na opredelennye resursy. Popytajtes'
pered zapuskom servera BD vypolnit' sleduyuschie komandy:
ulimit -d 262144
limit datasize 256m
V zavisimosti ot komandnogo interpretatora shell, tol'ko odna iz
dannyh komand vypolnitsya uspeshno, no ona pozvolit vam ustanovit'
bol'shij segment dannyh processa i vozmozhno reshit problemu. `Eta
komanda izmenyaet parametry tekuschego processa i vseh ego potomkov,
sozdannyh posle eio zapuska. Esli u vas voznikla problema s SQL
klientom, potomu chto backend vozvraschaet slishkom bol'shoj ob"em
dannyh, popytajtes' vypolnit' `etu komandu pered zapuskom klienta.
4.14) Kak mne uznat', kakaya versiya PostgreSQL zapuschena?
Iz psql, naberite SELECT version();
4.15) Kak mne sozdat' kolonku kotoraya po umolchaniyu budet soderzhat'
tekuschee vremya?
Ispol'zujte CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) Kak mne vypolnit' vneshnee svyazyvanie?
PostgreSQL podderzhivaet vneshnee svyazyvanie, ispol'zuya standartnyj
sintaksis SQL. Vot dva primera:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
ili
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
`Eto identichnye zaprosy svyazyvaniya t1.col i t2.col, takzhe
vozvraschayut lyubye nesvyazannye stroki v t1 (kotorye ne sovpadayut s
t2). RIGHT svyazyvanie dolzhno dobavit' nesvyazannye stroki t2. FULL
svyazyvanie dolzhno vozvratit' sovpavshie stroki plyus vse
nesvyazannye stroki iz t1 i t2. Slovo OUTER yavlyaetsya
neobyazatel'nym i naznachaetsya v LEFT, RIGHT i FULL svyazyvaniyah.
Obychnye svyazyvaniya nazyvayutsya INNER svyazyvaniya.
4.17) Kak vypolnyat' zaprosy, ispol'zuyuschie neskol'ko baz dannyh?
Ne suschestvuet sposoba sozdat' zapros k bazam dannyh otlichnym ot
tekuschej. Poskol'ku PostgreSQL zagruzhaet sistemnye katalogi
specifichnye dlya bazy dannyh, neponyatno dazhe, kak dolzhen sebya
vesti takoj mezhbazovyj zapros.
contrib/dblink pozvolyaet zaprosy mezhdu bazami, ispol'zuya vyzovy
funkcij. Razumeetsya, klient mozhet odnovremenno takzhe ustanavlivat'
soedieneniya s razlichnymi bazami dannyh i takih obrazom ob"edinyat'
informaciyu iz nih.
4.18) Kak mne vernut' iz funkcii neskol'ko strok tablicy?
Vy mozhete legko ispol'zovat' funkcii, vozvraschayuschie spisok,
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_
PL/pgSQL_functions.
4.19) Pochemu ya poluchayu oshibku "relation with OID #### ne suschestvuet",
kogda obraschayuts' k vremennym tablicam v funkciyah PL/PgSQL?
V PostgreSQL do versii 8.3, PL/PgSQL k`eshiruet scenarii funkcii i
odin iz negativnyh `effektov `etogo sostoit v tom, chto esli funkciya
PL/PgSQL obraschaetsya k vremennoj tablice i `eta tablica pozdnee
udalyaetsya i peresozdaetsya, a funkciya zatem vyzyvaetsya snova, to
ee vyzov privedet k oshibke, potomu chto sk`eshirovannoe soderzhimoe
funkcii soderzhit ukazatel' na staruyu vremennuyu tablicu. CHtoby
reshit' `etu problemu, ispol'zujte EXECUTE dlya dostupa k vremennym
tablicam v PL/PgSQL. Ispol'zovanie `etogo operatora zastavit zapros
peregenerirovat'sya kazhdyj raz.
V PostgreSQL 8.3 i pozdnee, `etoj problemy net.
4.20) Kakie est' resheniya dlya replikacii?
Hotya "replikaciya" -- `eto edinyj termin, est' neskol'ko raznyh
tehnologij dlya vypolneniya replikacij s raznymi osobennostyami dlya
kazhdoj.
Replikaciya Master/slave pozvolyaet imet' odin glavnyj (master) server
dlya vypolneniya zaprosov chteniya/zapisi, v to vremya kak
podchinionnye (slave) servera mogut proizvodit' tol'ko zaprosy
chteniya/SELECT. Naibolee populyarnym resheniem dlya replikacii
master-slave v PostgreSQL yavlyaetsya Slony-I.
Replikaciya Multi-master pozvolyaet vypolnyat' zaprosy chteniya/zapisi
na neskol'kih, repliciruemyh drug s drugom komp'yuetrah. `Eta
osobennost' takzhe privodit k potere proizvoditel'nosti, potomu chto
neobhodima sinhronizaciya izmenenij mezhdu neskol'kimi serverami.
Naibolee populyarnym resheniem dlya takoj replikacii v PostgreSQL
yavlyaetsya PGcluster.
4.21) Pochemu imena tablicy i kolonok ne raspoznayutsya v v moiom zaprose?
Pochemu ne sohranyayutsya zaglavnye bukvy?
Naibolee chasto imena neraspoznayutsya iz-za ispol'zovaniya dvojnyh
kavychek v imeni tablicy ili kolonki pri sozdanii tablicy. Pri
ispol'zovanii dvojnyh kavychek, imya tablicy i kolonki (kotorye
nazyvayut identifikatorami) sohranyayutsya v registro-zavisimom vide;
`eto oznachaet, chto vy dolzhny ispol'zovat' dvojnye kavychki, kogda
ukazyvaete `eti imena v zaprose. Nekotorye interfejsy, takie kak
pgAdmin, vo vremya sozdaniya tablicy dobavlyayut dvojnye kavychki
avtomaticheski. Takim obrazom, chtoby identifikatory raspoznavalis' vy
dolzhny sledovat' odnomu iz sleduyuschih pravil:
* Izbegat' ispol'zovaniya dvojnyh kavychek pri sozdanii tablic
* Ispol'zovat' v identifikatorah tol'ko simvoly nizhnego registra
* Ispol'zovat' dvojnye kavychki dlya identifikatorov v zaprosah

File diff suppressed because it is too large Load Diff

View File

@ -1,82 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type"
content="text/html; charset=ISO-8859-1">
<title>PostgreSQL Native Win32 Status Report</title>
</head>
<body>
<h1 style="text-align: center;">Compiling PostgreSQL On Native Win32 FAQ<br>
</h1>
<P>Last updated: Thu Oct 14 18:22:57 EDT 2004</P>
<P>Current maintainer: Bruce Momjian &lt;<A href=
"mailto:bruce@momjian.us">bruce@momjian.us</A>&gt;<BR>
</P>
<P>The most recent version of this document can be viewed at <A href=
"http://www.postgresql.org/docs/faqs.FAQ_MINGW.html">
http://www.postgresql.org/docs/faqs.FAQ_MINGW.html</A>.</P>
<P>The FAQ Running & Installing PostgreSQL On Native Windows is at <A href=
"http://pginstaller.projects.postgresql.org/faq/FAQ_windows.html">
http://pginstaller.projects.postgresql.org/faq/FAQ_windows.html</A>.</P>
<p>The native Win32 port is built from source using MinGW tools.&nbsp;
There is also a precompiled binary installer called <span
style="font-style: italic;">pginstaller</span> which you can find at
from <a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>.&nbsp;
It is a fully native build and uses no additional software like MinGW.
The ready-made installer files are available on the main PostgreSQL ftp servers
in the binary/win32 directory.
<br>
</p>
<h2>Tools for Building Binaries<br>
</h2>
<p> The native Win32 port requires a 32-bit NT-based Microsoft
operating
system, like Windows NT 4, Windows 2000/2003, or Windows XP. (NT 4
is no longer supported since version 8.2)&nbsp; Earlier
operating systems do not have sufficient infrastructure. Building the
port also
requires MinGW and Msys, which can be downloaded from <a
href="http://www.mingw.org/">http://www.mingw.org/</a>. MinGW is
a Unix-like build environment for Microsoft operating systems.
Msys is a collection of unix tools required to run shell scripts like <i>configure.&nbsp;
</i>Neither is required to run the resulting binaries;&nbsp; they are
needed only for creating the binaries.&nbsp; Work is in progress to support
building using Visual C++ in a future version.<br>
</p>
<h2>Steps For Building Binaries<br>
</h2>
<ul>
<li>Download the nightly snapshot tarball from <a
href="ftp://ftp.postgresql.org/pub/dev">ftp://ftp.postgresql.org/pub/dev</a>
or checkout via CVS (you will need <i>bison, flex,</i> and <i>perl</i>
installed to build from CVS)<br>
</li>
<li>Run <i>configure</i> (you might need to add the --without-zlib
argument, depending on whether you have installed <span
style="font-style: italic;">zlib
</span>on MinGW)</li>
<li>Run <i>make install</i></li>
</ul>
Note:&nbsp; it is suggested that you run <i>psql</i> under <i>CMD.EXE.</i>,
as the Msys console has buffering issues.<br>
<br>
If you make a change that you want to contribute, make a context diff
and send
it to the mailing list. <br>
<h2>Resources</h2>
There are several resources that helped us complete this port:<br>
<ul>
<li>PeerDirect port of PostgreSQL 7.2 to Win32 (<a
href="ftp://momjian.postgresql.org/pub/postgresql/win32/PeerDirect">ftp://momjian.postgresql.org/pub/postgresql/win32/PeerDirect</a>)</li>
<li>CONNX Win32 signal code(<a
href="ftp://momjian.postgresql.org/pub/postgresql/win32/CONNX">ftp://momjian.postgresql.org/pub/postgresql/win32/CONNX</a>)</li>
<li>SRA port of PostgreSQL to Win32 (unfortunately, this is not
publically available because the threaded portion is proprietary)</li>
<li>CHM help files (<a
href="http://www.pgadmin.org/snapshots/help/en_US/pgadmin3.chm">http://www.pgadmin.org/snapshots/help/en_US/pgadmin3.chm</a>)</li>
</ul>
</body>
</html>

View File

@ -1,942 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META name="generator" content="HTML Tidy, see www.w3.org">
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>FAQ do PostgreSQL</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
alink="#0000ff">
<H1>Perguntas Frequentes (FAQ) sobre PostgreSQL</H1>
<P>&Uacute;ltima atualiza&ccedil;&atilde;o: Sex Nov 16 10:53:50 EST 2007</P>
<P>Mantenedor atual: Bruce Momjian (<A href=
"mailto:bruce@momjian.us">bruce@momjian.us</A>)
</P>
<P>Traduzido por: Euler Taveira de Oliveira (<A href=
"mailto:euler@timbira.com">euler@timbira.com</A>)</P>
<P>A vers&atilde;o mais recente desse documento pode ser vista em <A href=
"http://www.postgresql.org/files/documentation/faqs/FAQ.html">
http://www.postgresql.org/files/documentation/faqs/FAQ.html</A> (EN).<BR>
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ_brazilian.html">
http://www.postgresql.org/files/documentation/faqs/FAQ_brazilian.html</A> (pt_BR).</P>
<P>Perguntas sobre plataformas espec&iacute;ficas s&atilde;o respondidas em <A href=
"http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</A>.</P>
<HR>
<H2 align="center">Perguntas Gerais</H2>
<A href="#item1.1">1.1</A>) O que &eacute; PostgreSQL? Como ele &eacute; pronunciado?
O que &eacute; Postgres?<BR>
<A href="#item1.2">1.2</A>) Quem controla o PostgreSQL?<BR>
<A href="#item1.3">1.3</A>) Qual &eacute; a licen&ccedil;a do PostgreSQL?<BR>
<A href="#item1.4">1.4</A>) Quais plataformas o PostgreSQL pode ser executado?<BR>
<A href="#item1.5">1.5</A>) Onde eu posso conseguir o PostgreSQL?<BR>
<A href="#item1.6">1.6</A>) Qual &eacute; a &uacute;ltima vers&atilde;o?<BR>
<A href="#item1.7">1.7</A>) Onde eu posso conseguir suporte?<BR>
<A href="#item1.8">1.8</A>) Como eu posso submeter um relato de um bug?<BR>
<A href="#item1.9">1.9</A>) Como eu posso saber quais s&atilde;o os bugs conhecidos ou caracter&iacute;sticas ausentes?<BR>
<A href="#item1.10">1.10</A>) Que documenta&ccedil;&atilde;o est&aacute; dispon&iacute;vel?<BR>
<A href="#item1.11">1.11</A>) Como eu posso aprender <SMALL>SQL</SMALL>?<BR>
<A href="#item1.12">1.12</A>) Como posso submeter uma corre&ccedil;&atilde;o (patch) ou me juntar a equipe de desenvolvimento?<BR>
<A href="#item1.13">1.13</A>) Como &eacute; o PostgreSQL comparado a outros <SMALL>SGBD</SMALL>s?<BR>
<A href="#item1.14">1.14</A>) O PostgreSQL gerenciará as mudan&ccedil;as de hor&aacute;rio devido ao hor&aacute;rio de ver&atilde;o em v&aacute;rios pa&iacute;ses?<BR>
<H2 align="center">Perguntas sobre Clientes</H2>
<A href="#item2.1">2.1</A>) Quais interfaces est&atilde;o dispon&iacute;veis para PostgreSQL?<BR>
<A href="#item2.2">2.2</A>) Quais ferramentas est&atilde;o dispon&iacute;veis para utilizar o PostgreSQL com p&aacute;ginas Web?<BR>
<A href="#item2.3">2.3</A>) O PostgreSQL tem interfaces gr&aacute;ficas para interagir com usu&aacute;rio?<BR>
<H2 align="center">Perguntas Administrativas</H2>
<A href="#item3.1">3.1</A>) Como eu instalo o PostgreSQL em um local diferente de <I>/usr/local/pgsql</I>?<BR>
<A href="#item3.2">3.2</A>) Como eu controlo conex&otilde;es de outras m&aacute;quinas?<BR>
<A href="#item3.3">3.3</A>) Como eu ajusto o servidor de banco de dados para obter uma performance melhor?<BR>
<A href="#item3.4">3.4</A>) Quais caracter&iacute;sticas de depura&ccedil;&atilde;o est&atilde;o dispon&iacute;veis?<BR>
<A href="#item3.5">3.5</A>) Por que eu recebo <I>"Sorry, too many clients"</I> quando eu tento conectar?<BR>
<A href="#item3.6">3.6</A>) Qual &eacute; o processo de atualiza&ccedil;&atilde;o do PostgreSQL?<BR>
<A href="#item3.7">3.7</A>) Que tipo de hardware eu devo usar?<BR>
<H2 align="center">Perguntas Operacionais</H2>
<A href="#item4.1">4.1</A>) Como eu fa&ccedil;o um <SMALL>SELECT</SMALL> somente dos primeiros registros de uma consulta? Um registro rand&ocirc;mico?<BR>
<A href="#item4.2">4.2</A>) Como eu descubro quais tabelas, &iacute;ndices, bancos de dados e usu&aacute;rios est&atilde;o definidos? Como eu vejo as consultas utilizadas pelo <I>psql</I> para mostr&aacute;-los?<BR>
<A href="#item4.3">4.3</A>) Como voc&ecirc; muda o tipo de dado de uma coluna?<BR>
<A href="#item4.4">4.4</A>) Qual &eacute; o tamanho m&aacute;ximo de um registro, uma tabela e um banco de dados?<BR>
<A href="#item4.5">4.5</A>) Quanto espa&ccedil;o em disco &eacute; necess&aacute;rio para armazenar dados de um arquivo texto?<BR>
<A href="#item4.6">4.6</A>) Por que minhas consultas est&atilde;o lentas? Por que elas n&atilde;o est&atilde;o utilizando meus &iacute;ndices?<BR>
<A href="#item4.7">4.7</A>) Como eu vejo como o otimizador de consultas est&aacute; avaliando minha consulta?<BR>
<A href="#item4.8">4.8</A>) Como eu fa&ccedil;o buscas com express&otilde;es regulares e buscas com express&otilde;es regulares sem diferenciar mau&uacute;sculas de min&uacute;sculas? Como eu utilizo um &iacute;ndice para buscas sem distinguir mai&uacute;sculas de min&uacute;sculas?<BR>
<A href="#item4.9">4.9</A>) Em uma consulta, como eu detecto se um campo &eacute; <SMALL>NULL</SMALL>? Como eu posso concatenar poss&iacute;veis <SMALL>NULL</SMALL>s? Como eu posso ordenar por um campo que &eacute; <SMALL>NULL</SMALL> ou n&atilde;o?<BR>
<A href="#item4.10">4.10</A>) Qual &eacute; a diferen&ccedil;a entre os v&aacute;rios tipos de dado de caracteres?<BR>
<A href="#item4.11.1">4.11.1</A>) Como eu crio um campo serial/auto incremento?<BR>
<A href="#item4.11.2">4.11.2</A>) Como eu consigo o valor de um campo
<SMALL>SERIAL</SMALL>?<BR>
<A href="#item4.11.3">4.11.3</A>) <I>currval()</I> n&atilde;o lida com condi&ccedil;&atilde;o de corrida com outros usu&aacute;rios?<BR>
<A href="#item4.11.4">4.11.4</A>) Por que os n&uacute;meros da minha sequ&ecirc;ncia n&atilde;o s&atilde;o reutilizados quando uma transa&ccedil;&atilde;o &eacute; abortada? Por que h&aacute; intervalos nos n&uacute;meros da minha sequ&ecirc;ncia/coluna SERIAL?<BR>
<A href="#item4.12">4.12</A>) O que &eacute; um <SMALL>OID</SMALL>? O que &eacute; um <SMALL>CTID</SMALL>?<BR>
<A href="#item4.13">4.13</A>) Por que eu recebo o erro <I>"ERROR: Memory exhausted in AllocSetAlloc()"</I>?<BR>
<A href="#item4.14">4.14</A>) Como eu informo qual vers&atilde;o do PostgreSQL eu estou utilizando?<BR>
<A href="#item4.15">4.15</A>) Como eu crio uma coluna que conter&aacute; por padr&atilde;o a hora atual?<BR>
<A href="#item4.16">4.16</A>) Como eu fa&ccedil;o uma jun&ccedil;&atilde;o externa (outer join)?<BR>
<A href="#item4.17">4.17</A>) Como eu fa&ccedil;o consultas utilizando m&uacute;ltiplos bancos de dados?<BR>
<A href="#item4.18">4.18</A>) Como eu retorno m&uacute;ltiplos registros ou colunas de uma fun&ccedil;&atilde;o?<BR>
<A href="#item4.19">4.19</A>) Por que eu obtenho erros "relation with OID ######
does not exist" ao acessar tabelas tempor&aacute;rias em fun&ccedil;&otilde;es PL/PgSQL?<BR>
<A href="#item4.20">4.20</A>) Quais solu&ccedil;&otilde;es de replica&ccedil;&atilde;o est&atilde;o dispon&iacute;veis?<BR>
<A href="#item4.21">4.21</A>) Por que os nomes de minhas tabelas e colunas n&atilde;o
s&atilde;o reconhecidos em minha consulta? Por que as mai&uacute;sculas n&atilde;o s&atilde;o preservadas?<BR>
<HR>
<H2 align="center">Perguntas Gerais</H2>
<H3 id="item1.1">1.1) O que &eacute; PostgreSQL? Como ele &eacute; pronunciado? O que &eacute; Postgres?</H3>
<P>PostgreSQL &eacute; pronunciado <I>Post-Gres-Q-L</I>.
(Para os curiosos que querem saber como se diz "PostgreSQL", um
<a href="http://www.postgresql.org/files/postgresql.mp3">arquivo de &aacute;udio</a> est&aacute; dispon&iacute;vel).</P>
<P>O PostgreSQL &eacute; um sistema de banco de dados objeto-relacional que tem as
caracter&iacute;sticas de sistemas de bancos de dados comerciais tradicionais com
melhoramentos encontrados nos sistemas <SMALL>SGBD</SMALL>s de pr&oacute;xima gera&ccedil;&atilde;o.
PostgreSQL &eacute; livre e o c&oacute;digo-fonte completo est&aacute; dispon&iacute;vel.</P>
<P>O desenvolvimento do PostgreSQL &eacute; feito por um grupo de desenvolvedores
volunt&aacute;rios (na sua maioria) espalhados pelo mundo e que se comunicam via
Internet. &Eacute; um projeto da comunidade e n&atilde;o &eacute; controlado por nenhuma
empresa. Para se envolver, veja a FAQ do desenvolvedor em <A href=
"http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
http://www.postgresql.org/docs/faqs.FAQ_DEV.html</A>
</P>
<P>Postgres &eacute; um apelido para o PostgreSQL amplamente utilizado. Era o nome original do
projeto em Berkeley e dentre os outros apelidos &eacute; o preferido. Se voc&ecirc; acha
'PostgreSQL' dif&iacute;cil de pronunciar, diga apenas 'Postgres'.</P>
<H3 id="item1.2">1.2) Quem controla o PostgreSQL?<BR></H3>
<P>Se voc&ecirc; est&aacute; procurando por um mantenedor, comit&ecirc; central ou empresa
controladora do PostgreSQL, desista --- n&atilde;o h&aacute; um(a). N&oacute;s temos um
comit&ecirc; core e committers CVS, mas estes grupos s&atilde;o mais para quest&otilde;es
administrativas do que controle. O projeto &eacute; direcionado pela comunidade
de desenvolvedores e usu&aacute;rios, que qualquer um pode se juntar. Tudo o que
voc&ecirc; precisa &eacute; se inscrever nas listas de discuss&atilde;o e participar das
discuss&otilde;es. Veja a <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ do desenvolvedor</A> para obter informa&ccedil;&otilde;es como se envolver com o
desenvolvimento do PostgreSQL.</P>
<H3 id="item1.3">1.3) Qual &eacute; a licen&ccedil;a do PostgreSQL?</H3>
<P>O PostgreSQL &eacute; distribu&iacute;do sob a licen&ccedil;a BSD cl&aacute;ssica. Basicamente,
ela permite que usu&aacute;rios fa&ccedil;am qualquer coisa com o c&oacute;digo, incluindo
revender os bin&aacute;rios sem o c&oacute;digo-fonte. A &uacute;nica restri&ccedil;&atilde;o &eacute; que voc&ecirc;
n&atilde;o nos responsabilize legalmente por problemas com o programa de computador.
H&aacute; tamb&eacute;m a exig&ecirc;ncia de que esta licen&ccedil;a apare&ccedil;a em todas as c&oacute;pias
do programa de computador. Aqui est&aacute; a licen&ccedil;a BSD que usamos atualmente:</P>
<P>PostgreSQL est&aacute; sujeito a seguinte licen&ccedil;a:</P>
<P>PostgreSQL Data Base Management System</P>
<P>Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-1996 Regents of the University of California</P>
<P>Permission to use, copy, modify, and distribute this software
and its documentation for any purpose, without fee, and without a
written agreement is hereby granted, provided that the above
copyright notice and this paragraph and the following two
paragraphs appear in all copies.</P>
<P>IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</P>
<P>THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE
UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.</P>
<H3 id="item1.4">1.4) Quais plataformas o PostgreSQL pode ser executado?</H3>
<P>Em geral, qualquer plataforma moderna compat&iacute;vel com Unix deve ser capaz de executar o PostgreSQL. As plataformas que foram testadas antes do lan&ccedil;amento de uma vers&atilde;o s&atilde;o listadas nas instru&ccedil;&otilde;es de instala&ccedil;&atilde;o.</P>
<P>O PostgreSQL tamb&eacute;m executa nativamente nos sistemas operacionais Microsoft Windows
baseados no NT tais como Win200 SP4, WinXP e Win2003. Um instalador pr&eacute;-empacotado est&aacute;
dispon&iacute;vel em <a href= "http://pgfoundry.org/projects/pginstaller">
http://pgfoundry.org/projects/pginstaller</a>. Vers&otilde;es do Windows baseadas no MS-DOS
(Win95, Win98, WinMe) podem executar o PostgreSQL utilizando o Cygwin.</P>
<p>H&aacute; tamb&eacute;m uma vers&atilde;o para o Novell Netware 6 em
<a href="http://forge.novell.com">http://forge.novell.com</a>
e uma vers&atilde;o para OS/2 (eComStation) em <a href=
"http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F">
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F</a>.</p>
<H3 id="item1.5">1.5) Onde eu posso conseguir o PostgreSQL?</H3>
<P>Via navegador web, utilize <a href="http://www.postgresql.org/ftp/">
http://www.postgresql.org/ftp/</a> e via ftp, utilize
<A href="ftp://ftp.postgresql.org/pub/">
ftp://ftp.postgresql.org/pub/</A>.</P>
<H3 id="item1.6">1.6) Qual &eacute; a &uacute;ltima vers&atilde;o?</H3>
<P>A &uacute;ltima vers&atilde;o do PostgreSQL &eacute; a vers&atilde;o 8.2.5.</P>
<P>N&oacute;s planejamos lan&ccedil;ar vers&otilde;es novas a cada ano com vers&otilde;es
corretivas em alguns meses.</P>
<H3 id="item1.7">1.7) Onde eu posso conseguir suporte?</H3>
<P>A comunidade do PostgreSQL fornece assist&ecirc;ncia a muitos de seus
usu&aacute;rios via e-mail. O principal s&iacute;tio web para inscri&ccedil;&atilde;o nas listas
de e-mail &eacute; <a href="http://www.postgresql.org/community/lists/">
http://www.postgresql.org/community/lists/</a>. As listas <I>general</I>
e <I>bugs</I> s&atilde;o um bom lugar para in&iacute;cio.</P>
<P>O principal canal de IRC &eacute; o <I>#postgresql</I> na Freenode (<I>irc.freenode.net</I>). Para se conectar voc&ecirc; pode utilizar o comando Unix <code>irc -c '#postgresql' "$USER" irc.freenode.net</code> ou utilizar qualquer outro cliente de IRC. Um canal hisp&acirc;nico (<I>#postgresql-es</I>) e um franc&ecirc;s (<I>#postgresqlfr</I>) tamb&eacute;m existem na mesma rede. H&aacute; tamb&eacute;m um canal PostgreSQL na EFNet.</P>
<P>Uma lista de empresas que prestam suporte comercial est&aacute; dispon&iacute;vel em <A href=
"http://www.postgresql.org/support/professional_support">
http://www.postgresql.org/support/professional_support</A>.</P>
<H3 id="item1.8">1.8) Como eu informo a exist&ecirc;ncia de um bug?</H3>
<P>Visite o formul&aacute;rio que reporta bugs do PostgreSQL em <A href=
"http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</A>.</P>
<P>Verifique tamb&eacute;m o nosso ftp <A href=
"ftp://ftp.postgresql.org/pub">ftp://ftp.postgresql.org/pub</A> para
ver se h&aacute; uma vers&atilde;o mais recente do PostgreSQL.</P>
<P>Bugs submetidos utilizando o formul&aacute;rio ou informado a qualquer
lista de discuss&atilde;o do PostgreSQL tipicamente gera uma das seguintes
respostas:</P>
<ul>
<li>N&atilde;o &eacute; um bug e o porqu&ecirc;</li>
<li>&Eacute; um bug conhecido e j&aacute; est&aacute; na lista de
<A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
<li>O bug foi corrigido na vers&atilde;o atual</li>
<li>O bug foi corrigido mas n&atilde;o foi empacotado em um vers&atilde;o oficial</li>
<li>Um pedido foi feito para obter informa&ccedil;&otilde;es detalhadas:
<ul>
<li>Sistema Operacional</li>
<li>Vers&atilde;o do PostgreSQL</li>
<li>Exemplo de teste que reproduz o bug</li>
<li>Informa&ccedil;&otilde;es sobre depura&ccedil;&atilde;o</li>
<li>Sa&iacute;da reconstituidora de vest&iacute;gios (backtrace) do depurador</li>
</ul>
</li>
<li>O bug &eacute; novo. O seguinte pode ocorrer:
<ul>
<li>Uma corre&ccedil;&atilde;o &eacute; criada e ser&aacute; inclu&iacute;da na pr&oacute;xima vers&atilde;o</li>
<li>O bug n&atilde;o pode ser corrigido imediatamente e &eacute; adicionado
a lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
</ul>
</li>
</ul>
<H3 id="item1.9">1.9) Como eu posso saber quais s&atilde;o os bugs conhecidos
ou funcionalidades ausentes?</H3>
<P>O PostgreSQL suporta um subconjunto extendido do <SMALL>SQL:2003</SMALL>.
Veja nossa lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A>
que cont&eacute;m bugs conhecidos, funcionalidades ausentes e planos futuros.</P>
<P>Uma solicita&ccedil;&atilde;o de funcionalidade geralmente resulta em uma das
seguintes respostas:</P>
<ul>
<li>A funcionalidade j&aacute; est&aacute; na lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
<li>A funcionalidade n&atilde;o &eacute; desej&aacute;vel porque:
<ul>
<li>Ela duplica uma funcionalidade existente que j&aacute; segue o
padr&atilde;o SQL</li>
<li>A funcionalidade aumentar&aacute; a complexidade do c&oacute;digo mas
adicionar&aacute; pouco benef&iacute;cio</li>
<li>A funcionalidade ser&aacute; insegura ou n&atilde;o-confi&aacute;vel</li>
</ul>
</li>
<li>A nova funcionalidade &eacute; adicionada a lista de
<A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A></li>
</ul>
<P>O PostgreSQL n&atilde;o utiliza sistema de acompanhamento de bugs porque
n&oacute;s achamos mais eficiente responder diretamente o e-mail e manter a
lista de <A href="http://www.postgresql.org/docs/faqs.TODO.html">AFAZERES</A>
atualizada. Na pr&aacute;tica, bugs n&atilde;o duram muito no programa; e bugs que afetam
uma grande quantidade de usu&aacute;rios s&atilde;o corrigidos rapidamente. O &uacute;nico lugar
para encontrar todas as mudan&ccedil;as, melhorias e corre&ccedil;&otilde;es em uma vers&atilde;o do
PostgreSQL &eacute; ler as mensagens de log do
<a href="http://www.postgresql.org/developer/sourcecode/">CVS</a>. At&eacute; mesmo
as notas de lan&ccedil;amento n&atilde;o listam todas as mudan&ccedil;as feitas no programa.</P>
<H3 id="item1.10">1.10) Que documenta&ccedil;&atilde;o est&aacute; dispon&iacute;vel?</H3>
<P>O PostgreSQL inclui vasta documenta&ccedil;&atilde;o, incluindo um manual extenso,
p&aacute;ginas de manuais (man pages) e alguns exemplos teste. Veja o diret&oacute;rio
<I>/doc</I>. Voc&ecirc; tamb&eacute;m pode pesquisar os manuais online em <A href=
"http://www.postgresql.org/docs">http://www.postgresql.org/docs</A>.
</P>
<P>H&aacute; dois livros sobre PostgreSQL dispon&iacute;veis online em <A href=
"http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</A>
e <A href=
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
H&aacute; uma lista de livros sobre PostgreSQL dispon&iacute;veis para compra. Um dos mais
populares &eacute; o do Korry Douglas. Uma lista de an&aacute;lise sobre os livros pode ser
encontrada em <A href=
"http://www.postgresql.org/docs/books/">http://www.postgresql.org/docs/books/</A>.
H&aacute; tamb&eacute;m uma cole&ccedil;&atilde;o de artigos t&eacute;cnicos sbore PostgreSQL em <A href="http://www.postgresql.org/docs/techdocs/">http://www.postgresql.org/docs/techdocs/</A>.</P>
<P>O programa cliente de linha de comando <I>psql</I> tem alguns comandos \d para
mostrar informa&ccedil;&otilde;es sobre tipos, operadores, fun&ccedil;&otilde;es, agrega&ccedil;&otilde;es, etc. - utilize \?
para mostrar os comandos dispon&iacute;veis.</P>
<P>Nosso s&iacute;tio web cont&eacute;m ainda mais documenta&ccedil;&atilde;o.</P>
<H3 id="item1.11">1.11) Como eu posso aprender <SMALL>SQL</SMALL>?</H3>
<P>Primeiro, considere os livros espec&iacute;ficos sobre PostgreSQL mencionados
acima. Muitos de nossos usu&aacute;rios gostam do <I>The Practical SQL Handbook</I>,
Bowman, Judith S., et al., Addison-Wesley. Outros do <I>The
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
<P>H&aacute; tamb&eacute;m bons tutoriais dispon&iacute;veis online:
<UL>
<LI> <A href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</A>
</LI>
<LI>
<A href="http://sqlcourse.com/">http://sqlcourse.com</A>
</LI>
<LI>
<A href="http://www.w3schools.com/sql/default.asp">http://www.w3schools.com/sql/default.asp</A>
</LI>
<LI><A href=
"http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</A>
</LI>
</UL>
<H3 id="item1.12">1.12) Como posso submeter uma corre&ccedil;&atilde;o (patch) ou me juntar a equipe de desenvolvimento?</H3>
<P>Veja a <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ do Desenvolvedor</A>.</P>
<H3 id="item1.13">1.13) Como &eacute; o PostgreSQL comparado a outros <SMALL>SGBD</SMALL>s?</H3>
<P>H&aacute; v&aacute;rias maneiras de se medir um software: funcionalidades, performance, confiabilidade, suporte e pre&ccedil;o.</P>
<DL>
<DT><B>Funcionalidades</B></DT>
<DD>PostgreSQL tem muitas caracter&iacute;sticas presentes em muitos <SMALL>SGBD</SMALL>s comerciais como transa&ccedil;&otilde;es, subconsultas, gatilhos, vis&otilde;es, integridade referencial de chave estrangeira e bloqueio (lock) sofisticado. N&oacute;s temos algumas funcionalidades que eles n&atilde;o tem, como tipos definidos pelo usu&aacute;rio, heran&ccedil;a, regras e controle de concorr&ecirc;ncia de m&uacute;ltiplas vers&otilde;es para reduzir bloqueios (locks).<BR>
<BR>
</DD>
<DT><B>Performance</B></DT>
<DD>A performance do PostgreSQL &eacute; compar&aacute;vel a outros bancos de dados comerciais e de c&oacute;digo livre. Ele &eacute; mais r&aacute;pido em algumas coisas, mais lento em outras. Nossa performance &eacute; geralmente +/- 10% comparada a de outros bancos de dados.
<BR>
</DD>
<DT><B>Confiabilidade</B></DT>
<DD>N&oacute;s sabemos que um <SMALL>SGBD</SMALL> deve ser confi&aacute;vel ou ele &eacute; in&uacute;til. N&oacute;s empenhamos em lan&ccedil;ar vers&otilde;es bem testadas, de c&oacute;digo est&aacute;vel e que tenha o m&iacute;nimo de bugs. Cada vers&atilde;o tem no m&iacute;nimo um m&ecirc;s de teste em vers&atilde;o beta, e nosso hist&oacute;rico de vers&otilde;es mostra que n&oacute;s podemos fornecer vers&otilde;es est&aacute;veis e s&oacute;lidas que est&atilde;o prontas para uso em produ&ccedil;&atilde;o. N&oacute;s acreditamos que somos comparados a nosso favor com outros sistemas de bancos de dados nessa &aacute;rea.<BR>
<BR>
</DD>
<DT><B>Suporte</B></DT>
<DD>Nossas listas de discuss&atilde;o fornecem contato com um grupo de desenvolvedores e usu&aacute;rios para ajudar a resolver muitos problemas encontrados. Enquanto n&oacute;s n&atilde;o podemos garantir o conserto, <SMALL>SGBD</SMALL>s comerciais nem sempre fornecem tamb&eacute;m. Com acesso direto aos desenvolvedores, a comunidade de usu&aacute;rios, manuais e o c&oacute;digo fonte faz com que o suporte do PostgreSQL seja superior ao de outros <SMALL>SGBD</SMALL>s. H&aacute; suporte comercial por incidente dispon&iacute;veis para aqueles que precisam de um. (Veja <A href="#item1.7">se&ccedil;&atilde;o 1.7 da FAQ</A>).<BR>
<BR>
</DD>
<DT><B>Pre&ccedil;o</B></DT>
<DD>N&oacute;s somos livres para uso dele tanto comercial quanto n&atilde;o comercial. Voc&ecirc; pode adicionar nosso c&oacute;digo ao seu produto sem limita&ccedil;&otilde;es, exceto aquelas descritas na nossa licen&ccedil;a BSD mencionada acima.<BR>
<BR>
</DD>
</DL>
<H3 id="item1.14">1.14) O PostgreSQL gerenciar&aacute; mudan&ccedil;as no hor&aacute;rio devido ao hor&aacute;rio de ver&atilde;o em v&aacute;rios pa&iacute;ses?</H3>
<P>Mudan&ccedil;as no hor&aacute;rio de ver&atilde;o dos USA foram inclu&iacute;das nas vers&otilde;es 8.0 .[4+] do PostgreSQL e em todas as vers&otilde;es grandes, i.e. 8.1. Mudan&ccedil;as no Canad&aacute; e Austr&aacute;lia Oeste foram inclu&iacute;das na 8.0.[10+], 8.1.[6+] e em todas as vers&otilde;es grandes subsequentes. Vers&otilde;es do PostgreSQL anteriores a 8.0 utilizam o banco de dados de zona hor&aacute;ria do sistema operacional para informa&ccedil;&otilde;es sobre hor&aacute;rio de ver&atilde;o.</P>
<HR>
<H2 align="center">Perguntas sobre Clientes</H2>
<H3 id="item2.1">2.1) Quais interfaces est&atilde;o dispon&iacute;veis para PostgreSQL?</H3>
<p>A instala&ccedil;&atilde;o do PostgreSQL inclui somente as interfaces <SMALL>C</SMALL> e
<SMALL>C</SMALL> embutida. Todas as outras interfaces s&atilde;o projetos independentes
que podem ser obtidos separadamente; sendo separados permitem que eles tenham
suas pr&oacute;prias datas de lan&ccedil;amento e time de desenvolvedores.</P>
<P>Algumas linguagens de programa&ccedil;&atilde;o como <SMALL>PHP</SMALL> incluem uma
interface para PostgreSQL. Interfaces para linguagens como Perl,
<SMALL>TCL</SMALL>, Python e muitas outras est&atilde;o dispon&iacute;veis em
<a href="http://www.pgfoundry.org">http://www.pgfoundry.org</A>.
</P>
<H3 id="item2.2">2.2) Quais ferramentas est&atilde;o dispon&iacute;veis para utilizar o PostgreSQL com p&aacute;ginas Web?</H3>
<P>Uma boa introdu&ccedil;&atilde;o para p&aacute;ginas web que utilizam bancos de dados pode ser vista em:
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
<P>Para integra&ccedil;&atilde;o na Web, PHP (<A
href="http://www.php.net">http://www.php.net</A>)
&eacute; uma excelente interface.</P>
<P>Para casos complexos, muitos usam a Interface Perl e DBD::Pg com CGI.pm
ou mod_perl.</P>
<H3 id="item2.3">2.3) O PostgreSQL tem interfaces gr&aacute;ficas para iteragir com o usu&aacute;rio?</H3>
<P>H&aacute; um vasto n&uacute;mero de Ferramentas Gr&aacute;ficas (GUI), que est&atilde;o dispon&iacute;veis
para o PostgreSQL, comerciais e de desenvolvedores de c&oacute;digo aberto. Uma
lista detalhada pode ser encontrada em <A href="http://www.postgresql.org/docs/techdocs.54">
Documenta&ccedil;&atilde;o da Comunidade PostgreSQL</A></P>
<HR>
<H2 align="center">Perguntas Administrativas</H2>
<H3 id="item3.1">3.1) Como eu instalo o PostgreSQL em um local diferente de <I>/usr/local/pgsql</I>?</H3>
<P>Especifique a op&ccedil;&atilde;o <I>--prefix</I> quando executar o <I>configure</I>.</P>
<H3 id="item3.2">3.2) Como eu controlo conex&otilde;es de outras m&aacute;quinas?</H3>
<P>Por padr&atilde;o, o PostgreSQL s&oacute; permite conex&otilde;es da m&aacute;quina local utilizando soquetes de dom&iacute;nio Unix ou conex&otilde;es TCP/IP. Outras m&aacute;quinas n&atilde;o poder&atilde;o conectar-se a menos que voc&ecirc; modifique <I>listen_addresses</I> no <I>postgresql.conf</I>, habilite a autentica&ccedil;&atilde;o por m&aacute;quina modificando o arquivo <I>$PGDATA/pg_hba.conf</I> e reinicie o servidor PostgreSQL.</P>
<H3 id="item3.3">3.3) Como eu ajusto o servidor de banco de dados para obter uma performance melhor?</H3>
<P>H&aacute; tr&ecirc;s grandes &aacute;reas para melhorar a performance em potencial:</P>
<DL>
<DT><B>Mudan&ccedil;a de Consultas</B></DT>
<DD>Isto involve modificar consultas para obter melhor performance:
<ul>
<li>Cria&ccedil;&atilde;o de &iacute;ndices, incluir express&otilde;es e &iacute;ndices parciais</li>
<li>Utiliza&ccedil;&atilde;o o COPY ao inv&eacute;s de m&uacute;ltiplos comandos <SMALL>INSERT</SMALL>s</li>
<li>Agrupamento de m&uacute;ltiplos comandos em uma &uacute;nica transa&ccedil;&atilde;o para diminuir
a despesa com efetiva&ccedil;&otilde;es (commit)</li>
<li>Utiliza&ccedil;&atilde;o do <SMALL>CLUSTER</SMALL> quando recuperar v&aacute;rios registros de
um &iacute;ndice</li>
<li>Utiliza&ccedil;&atilde;o do <SMALL>LIMIT</SMALL> para retornar um subconjunto da sa&iacute;da
da consulta</li>
<li>Utiliza&ccedil;&atilde;o de Consultas preparadas</li>
<li>Utiliza&ccedil;&atilde;o de <SMALL>ANALYZE</SMALL> para manter as estat&iacute;sticas do
otimizador corretas</li>
<li>Utiliza&ccedil;&atilde;o regular do <SMALL>VACUUM</SMALL> ou <I>pg_autovacuum</I></li>
<li>Remo&ccedil;&atilde;o de &iacute;ndices durante grande mudan&ccedil;a de dados</li>
</ul><BR>
<BR>
</DD>
<DT><B>Configura&ccedil;&atilde;o do Servidor</B></DT>
<DD>Um grande n&uacute;mero de configura&ccedil;&otilde;es que afetam a performance.
Para obter detalhes adicionais, veja <a href=
"http://www.postgresql.org/docs/current/static/runtime-config.html">
Administration Guide/Server Run-time Environment/Run-time
Configuration</a> para listagem completa, e para
coment&aacute;rios veja <a href=
"http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
e <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>.
<BR>
<BR>
</DD>
<DT><B>Sele&ccedil;&atilde;o do Hardware</B></DT>
<DD>O efeito do hardware na performance &eacute; detalhado em
<a href="http://www.powerpostgresql.com/PerfList/">
http://www.powerpostgresql.com/PerfList/</a> e <a
href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">
http://momjian.us/main/writings/pgsql/hw_performance/index.html</a>.
<BR>
<BR>
</DD>
</DL>
<H3 id="item3.4">3.4) Quais caracter&iacute;sticas de depura&ccedil;&atilde;o est&atilde;o dispon&iacute;veis?</H3>
<P>H&aacute; muitas vari&aacute;veis de configura&ccedil;&atilde;o do servidor <CODE>log_*</CODE>
que habilitam a exibi&ccedil;&atilde;o de consultas e estat&iacute;sticas que podem ser
muito &uacute;teis para depura&ccedil;&atilde;o e medidas de performance.</P>
<H3 id="item3.5">3.5) Por que eu recebo <I>"Sorry, too many clients"</I> quando eu tento conectar?</H3>
<P>Voc&ecirc; atingiu o limite padr&atilde;o de 100 sess&otilde;es. Voc&ecirc;
precisa aumentar o limite do servidor PostgreSQL, que diz
quantos processos servidor concorrentes ele pode iniciar, alterando
o valor <I>max_connections</I> no <I>postgresql.conf</I> e
reiniciando o <I>postmaster</I>.</P>
<H3 id="item3.6">3.6) Qual &eacute; o processo de atualiza&ccedil;&atilde;o do PostgreSQL?</H3>
<P>Veja <a
href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>
para discussão geral sobre atualizações e <a href=
"http://www.postgresql.org/docs/current/static/install-upgrading.html">
http://www.postgresql.org/docs/current/static/install-upgrading.html</a>
para instru&ccedil;&otilde;es espec&iacute;ficas.</P>
<H3 id="item3.7">3.7) Que tipo de hardware eu devo usar?</H3>
<P>Por causa do hardware de PC ser em sua maioria compat&iacute;vel, pessoas tendem a acreditar que todos os hardwares de PC s&atilde;o de mesma qualidade. N&atilde;o &eacute; verdade. ECC RAM, SCSI e placas m&atilde;e de qualidade s&atilde;o mais confi&aacute;veis e t&ecirc;m uma melhor performance do que hardwares mais baratos. O PostgreSQL executar&aacute; em quase todo hardware, mas se a confiabilidade e a performance forem importantes &eacute; prudente pesquisar sobre as op&ccedil;&otilde;es de hardware. Nossas listas de discuss&atilde;o podem ser usadas para discutir op&ccedil;&otilde;es de hardware e dilemas.</P>
<HR>
<H2 align="center">Perguntas Operacionais</H2>
<H3 id="item4.1">4.1) Como eu fa&ccedil;o um <SMALL>SELECT</SMALL> somente dos primeiros registros de uma consulta? Um registro rand&ocirc;mico?</H3>
<P>Para obter somente alguns registros, se voc&ecirc; sabe o n&uacute;mero de
registros necess&aacute;rios ao executar o <SMALL>SELECT</SMALL> utilize
o <SMALL>LIMIT</SMALL>. Se um &iacute;ndice corresponde no <SMALL>ORDER
BY</SMALL> &eacute; poss&iacute;vel que a consulta toda n&atilde;o tenha que ser
executada. Se voc&ecirc; n&atilde;o sabe o n&uacute;mero de registros ao executar o
<SMALL>SELECT</SMALL>, utilize um cursor e o <SMALL>FETCH</SMALL>.</P>
<P>Para <SMALL>obter</SMALL> um registro rand&ocirc;mico, utilize:</P>
<PRE>
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</PRE>
<H3 id="item4.2">4.2) Como eu descubro quais tabelas, &iacute;ndices, bancos de dados e usu&aacute;rios est&atilde;o definidos? Como eu vejo as consultas utilizadas pelo <I>psql</I> para mostr&aacute;-los?</H3>
<P>Utilize o comando \dt para ver tabelas no <I>psql</I>. Para obter
uma lista completa dos comandos no psql voc&ecirc; pode utilizar \?.
Alternativamente, voc&ecirc; pode ler o c&oacute;digo-fonte do <I>psql</I> no arquivo
<I>pgsql/src/bin/psql/describe.c</I>, ele cont&eacute;m os comandos <SMALL>SQL</SMALL>
que geram a sa&iacute;da para os comandos de contrabarra do <I>psql</I>. Voc&ecirc;
tamb&eacute;m pode iniciar o <I>psql</I> com a op&ccedil;&atilde;o <I>-E</I> para que as consultas
utilizadas para executar os comandos que voc&ecirc; informou seja exibida.
O PostgreSQL tamb&eacute;m fornece uma inteface compat&iacute;vel com <SMALL>SQL</SMALL> do
INFORMATION SCHEMA que voc&ecirc; pode consultar para obter informa&ccedil;&atilde;o sobre o
banco de dados.</P>
<P>H&aacute; tamb&eacute;m tabelas do sistema que come&ccedil;am com <I>pg_</I> que os descrevem
tamb&eacute;m.</P>
<P>Utilizando o <I>psql -l</I> listar&aacute; todos os bancos de dados.</P>
<P>Veja tamb&eacute;m o arquivo <I>pgsql/src/tutorial/syscat.source</I>. Ele
ilustra muitos dos comandos <SMALL>SELECT</SMALL>s necess&aacute;rios para obter
informa&ccedil;&atilde;o das tabelas de sistema do banco de dados.</P>
<H3 id="item4.3">4.3) Como voc&ecirc; muda o tipo de dado de uma coluna?</H3>
<P>Mudar o tipo de dado de uma coluna pode ser feito facilmente na vers&atilde;o 8.0
ou superior com <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.</P>
<P>Em vers&otilde;es anteriores, fa&ccedil;a isso:</P>
<PRE>
BEGIN;
ALTER TABLE tab ADD COLUMN col_nova <i>novo_tipo_dado</i>;
UPDATE tab SET col_nova = CAST(col_antiga AS <i>novo_tipo_dado</i>);
ALTER TABLE tab DROP COLUMN col_antiga;
COMMIT;
</PRE>
<P>Voc&ecirc; pode ent&atilde;o querer fazer um <I>VACUUM FULL tab</I> para recuperar
o espa&ccedil;o em disco utilizado pelos registros expirados.</P>
<H3 id="item4.4">4.4) Qual &eacute; o tamanho m&aacute;ximo de um registro, uma tabela e um banco de dados?</H3>
<P>Estes s&atilde;o os limites:</P>
<BLOCKQUOTE>
<TABLE>
<TR><TD>Tamanho m&aacute;ximo de um banco de dados?</TD><TD>ilimitado (existem bancos de dados de 32 TB)</TD></TR>
<TR><TD>Tamanho m&aacute;ximo de uma tabela?</TD><TD>32 TB</TD></TR>
<TR><TD>Tamanho m&aacute;ximo de um registro?</TD><TD>400 GB</TD></TR>
<TR><TD>Tamanho m&aacute;ximo de um campo?</TD><TD>1 GB</TD></TR>
<TR><TD>N&uacute;mero m&aacute;ximo de registros em uma tabela?</TD><TD>ilimitado</TD></TR>
<TR><TD>N&uacute;mero m&aacute;ximo de colunas em uma tabela?</TD><TD>250-1600 dependendo dos tipos das colunas</TD></TR>
<TR><TD>N&uacute;mero m&aacute;ximo de &iacute;ndices em uma tabela?</TD><TD>ilimitado</TD></TR>
</TABLE>
</BLOCKQUOTE>
<P>&Eacute; claro, que eles n&atilde;o s&atilde;o ilimitados, mas limitados
ao espa&ccedil;o em disco dispon&iacute;vel e espa&ccedil;o em mem&oacute;ria/swap.
A Performance ser&aacute; penalizada quando estes valores se tornarem grandes.</P>
<P>O tamanho m&aacute;ximo de uma tabela com 32 TB n&atilde;o requer suporte a
arquivos grandes do sistema operacional. Tabelas grandes s&atilde;o armazenadas
como m&uacute;ltiplos arquivos de 1 GB ent&atilde;o o limite do sistema de
arquivos n&atilde;o &eacute; importante.</P>
<P>O tamanho m&aacute;ximo de uma tabela, o tamanho de um registro e o n&uacute;mero
m&aacute;ximo de colunas podem ser quadruplicados aumentando-se o tamanho padr&atilde;o
do bloco para 32k. O tamanho m&aacute;ximo de uma tabela pode tamb&eacute;m ser aumentado utilizando
particionamento de tabela.</P>
<P>Uma limita&ccedil;&atilde;o &eacute; que &iacute;ndices n&atilde;o podem ser criados em colunas maiores do que
2.000 caracteres. Felizmente, tais &iacute;ndices s&atilde;o raramente necess&aacute;rios. Unicidade &eacute;
melhor garantida por um &iacute;ndice de uma fun&ccedil;&atilde;o de um hash MD5 de uma coluna longa, e
indexa&ccedil;&atilde;o de texto longo permite a busca de palavras dentro da coluna.</P>
<H3 id="item4.5">4.5) Quanto espa&ccedil;o em disco &eacute; necess&aacute;rio para armazenar dados de um arquivo texto?</H3>
<P>Um banco de dados PostgreSQL ir&aacute; requerer at&eacute; cinco vezes a quantidade de espa&ccedil;o requerida para armazenar dados em um arquivo texto.</P>
<P>Como um exemplo, considere um arquivo com 100.000 linhas contendo um inteiro e uma descri&ccedil;&atilde;o em cada linha. Suponha que o tamanho m&eacute;dio da descri&ccedil;&atilde;o &eacute; de vinte bytes. O arquivo ter&aacute; 2,8 MB. O tamanho do arquivo do banco de dados PostgreSQL que cont&eacute;m esses dados pode ser estimado em 5,2 MB:</P>
<PRE>
24 bytes: cada cabe&ccedil;alho de registro (aproximadamente)
24 bytes: um campo int e um campo texto
+ 4 bytes: ponteiro na p&aacute;gina para a tupla
-------------------------------------------
52 bytes por registro
O tamanho de uma p&aacute;gina de dados no PostgreSQL &eacute; 8192 bytes (8 KB), ent&atilde;o:
8192 bytes por p&aacute;gina
------------------------ = 158 registros por p&aacute;gina do banco de dados (arredondado para baixo)
52 bytes por registro
100000 registros de dados
---------------------------- = 633 p&aacute;ginas do banco de dados (arredondado para cima)
158 registros por p&aacute;gina
633 p&aacute;ginas do banco de dados * 8192 bytes por p&aacute;gina = 5.185.536 bytes (5,2 MB)
</PRE>
<P>&Iacute;ndices n&atilde;o requerem muito espa&ccedil;o, mas cont&eacute;m
dados que foram indexados, ent&atilde;o eles podem ocupar algum espa&ccedil;o.</P>
<P><SMALL>NULL</SMALL>s s&atilde;o armazenados como bitmaps, ent&atilde;o eles
utilizam muito pouco espa&ccedil;o.</P>
<H3 id="item4.6">4.6) Por que minhas consultas est&atilde;o lentas? Por que elas n&atilde;o est&atilde;o utilizando meus &iacute;ndices?</H3>
<P>&Iacute;ndices n&atilde;o s&atilde;o utilizados por toda consulta. &Iacute;ndices s&atilde;o utilizados somente
se a tabela &eacute; maior do que um tamanho m&iacute;nimo, e a consulta seleciona somente uma
pequena porcentagem dos registros da tabela. Isto porque o acesso rand&ocirc;mico ao
disco causado pela busca indexada pode ser mais lento do que uma leitura ao longo
da tabela ou busca sequencial.</P>
<P>Para determinar se um &iacute;ndice deveria ser utilizado, o PostgreSQL deve ter
estat&iacute;sticas sobre a tabela. Estas estat&iacute;sticas s&atilde;o coletadas utilizando o
<SMALL>VACUUM ANALYZE</SMALL> ou simplesmente o <SMALL>ANALYZE</SMALL>.
Utilizando estat&iacute;sticas, o otimizador sbae quantos registros est&atilde;o na tabela,
e pode melhor determinar se &iacute;ndices deveriam ser utilizados.
Estat&iacute;sticas tamb&eacute;m s&atilde;o &uacute;teis para determinar a ordem de jun&ccedil;&atilde;o &oacute;tima e m&eacute;todos
de jun&ccedil;&atilde;o. Cole&ccedil;&atilde;o de estat&iacute;sticas deveriam ser feitas periodicamente a
medida que o conte&uacute;do da tabela muda.</P>
<P>&Iacute;ndices n&atilde;o s&atilde;o normalmente utilizados para <SMALL>ORDER BY</SMALL> ou para
fazer jun&ccedil;&otilde;es. Uma busca sequencial seguido por uma ordena&ccedil;&atilde;o expl&iacute;cita &eacute;
geralmente mais r&aacute;pida do que uma busca indexada em uma tabela grande.
Contudo, <SMALL>LIMIT</SMALL> combinado com <SMALL>ORDER BY</SMALL>
frequentemente utilizar&aacute; &iacute;ndice porque somente uma pequena por&ccedil;&atilde;o da tabela
ser&aacute; retornada.</P>
<P>Se voc&ecirc; acredita que o otimizador est&aacute; incorreto ao escolher uma busca
sequencial, utilize <CODE>SET enable_seqscan TO 'off'</CODE> e execute a
consulta novamente para ver se uma busca indexada &eacute; realmente mais r&aacute;pida.</P>
<P>Ao utilizar operadores curinga tais como <SMALL>LIKE</SMALL> ou <I>~</I>,
&iacute;ndices podem ser utilizados somente em algumas condi&ccedil;&otilde;es:</P>
<UL>
<LI>O in&iacute;cio da cadeia de caracteres da busca deve ser iniciar com uma
cadeia de caracteres, i.e.
<UL>
<LI>modelos <SMALL>LIKE</SMALL> n&atilde;o devem iniciar com <I>%</I>.</LI>
<LI>modelos <I>~</I> (express&otilde;es regulares) devem iniciar com <I>^</I>.</LI>
</UL></LI>
<LI>A cadeia de caracteres utilizada na busca n&atilde;o pode iniciar com a classe de
caracteres e.g. [a-e].</LI>
<LI>Busca que n&atilde;o diferenciam mai&uacute;sculas de min&uacute;sculas tais como <SMALL>ILIKE</SMALL> e
<I>~*</I> n&atilde;o utilizam &iacute;ndices. Em vez disso, utilize &iacute;ndice de express&atilde;o, que
&eacute; descrito na se&ccedil;&atilde;o <a href="#item4.8">4.8</a>.</LI>
<LI>O idioma padr&atilde;o <I>C</I> deve ser usando durante o <i>initdb</i>
porque n&atilde;o &eacute; poss&iacute;vel saber o pr&oacute;ximo caracter em idiomas que n&atilde;o sejam o C.
Voc&ecirc; pode criar um &iacute;ndice especial <CODE>text_pattern_ops</CODE> para tais casos
que funcionam somente para indexa&ccedil;&atilde;o com <SMALL>LIKE</SMALL>. Tamb&eacute;m &eacute;
poss&iacute;vel utilizar indexa&ccedil;&atilde;o de busca textual para buscas por palavras.
</LI>
</UL>
<P>Em vers&otilde;es anteriores a 8.0, &iacute;ndices frequentemente n&atilde;o podem ser utilizados
a menos que os tipos de dados correspondam aos tipos de coluna do &iacute;ndice. Isto era
particularmente verdadeiro para &iacute;ndices de coluna int2, int8 e numeric.</P>
<H3 id="item4.7">4.7) Como eu vejo como o otimizador de consulta est&aacute; avaliando a minha consulta?</H3>
<P>Veja o comando <SMALL>EXPLAIN</SMALL> no manual.</P>
<H3 id="item4.8">4.8) Como eu fa&ccedil;o buscas com express&otilde;es regulares
e buscas com express&otilde;es regulares sem diferenciar mai&uacute;sculas de min&uacute;sculas? Como eu
utilizo um &iacute;ndice para buscas que n&atilde;o diferenciam mai&uacute;sculas de min&uacute;sculas?</H3>
<P>O operador <I>~</I> faz avalia&ccedil;&atilde;o de express&otilde;es regulares,
e <I>~*</I> faz avalia&ccedil;&atilde;o n&atilde;o sens&iacute;vel a mai&uacute;sculas
de express&otilde;es regulares. A variante n&atilde;o sens&iacute;vel a mai&uacute;sculas
do <SMALL>LIKE</SMALL> &eacute; chamada de <SMALL>ILIKE</SMALL>.</P>
<P>Compara&ccedil;&otilde;es de igualdade n&atilde;o sens&iacute;veis a mai&uacute;sculas
s&atilde;o normalmente expressadas como:</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</PRE>
Isso n&atilde;o ir&aacute; utilizar o &iacute;ndice padr&atilde;o. Contudo, se
voc&ecirc; criar um &iacute;ndice de express&atilde;o, ele ser&aacute; utilizado:
<PRE>
CREATE INDEX tabindex ON tab (lower(col));
</PRE>
<P>Se o &iacute;ndice acima &eacute; criado como <SMALL>UNIQUE</SMALL>, embora a
coluna possa armazenar caracteres mai&uacute;sculos e min&uacute;sculos, ele n&atilde;o
pode ter valores id&ecirc;nticos que diferem apenas em letras mai&uacute;sculas e min&uacute;sculas.
Para for&ccedil;ar uma letra mai&uacute;scula ou min&uacute;scula a ser armazenada na coluna, utilize
uma restri&ccedil;&atilde;o <SMALL>CHECK</SMALL> ou um gatilho.</P>
<H3 id="item4.9">4.9) Em uma consulta, como eu detecto se um campo &eacute; <SMALL>NULL</SMALL>? Como eu posso concatenar poss&iacute;veis <SMALL>NULL</SMALL>s? Como eu posso ordenar por um campo que &eacute; <SMALL>NULL</SMALL> ou n&atilde;o?</H3>
<P>Voc&ecirc; testa a coluna com <SMALL>IS NULL</SMALL> e <SMALL>IS
NOT NULL</SMALL>, como a seguir:</P>
<PRE>
SELECT *
FROM tab
WHERE col IS NULL;
</PRE>
<P>Para concatenar com poss&iacute;veis <SMALL>NULL</SMALL>s, utilize <I>COALESCE()</I>, assim:</P>
<PRE>
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
</PRE>
<P>Para ordenar pelo status <SMALL>NULL</SMALL>, utilize os modificadores
<SMALL>IS NULL</SMALL> e <SMALL>IS NOT NULL</SMALL> na sua cl&aacute;usula
<SMALL>ORDER BY</SMALL>. Coisas que s&atilde;o <I>verdadeiro</I> ser&atilde;o ordenadas acima
das coisas que s&atilde;o <I>falso</I>, ent&atilde;o a consulta a seguir ir&aacute; colocar
entradas NULL no in&iacute;cio da lista de resultados:</P>
<PRE>
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
</PRE>
<H3 id="item4.10">4.10) Qual &eacute; a diferen&ccedil;a entre os v&aacute;rios tipos de dado de caracteres?</H3>
<BLOCKQUOTE>
<TABLE>
<TR><TH>Tipo</TH><TH>Nome Interno</TH><TH>Observa&ccedil;&atilde;o</TH></TR>
<TR><TD>VARCHAR(n)</TD><TD>varchar</TD><TD>tamanho especifica o tamanho
m&aacute;ximo, sem preenchimento</TD></TR>
<TR><TD>CHAR(n)</TD><TD>bpchar</TD><TD>preenchimento em branco para
comprimento fixo espec&iacute;fico</TD></TR>
<TR><TD>TEXT</TD><TD>text</TD><TD>nenhum limite superior espec&iacute;fico no
comprimento</TD></TR>
<TR><TD>BYTEA</TD><TD>bytea</TD><TD>vetor de bytes de comprimento vari&aacute;vel
(seguro a byte nulo)</TD></TR>
<TR><TD>"char"</TD><TD>char</TD><TD>um caracter</TD></TR>
</TABLE>
</BLOCKQUOTE>
<P>Voc&ecirc; ver&aacute; o nome interno quando examinar o cat&aacute;logo do sistema e em algumas mensagens de erro.</P>
<P>Os primeiros quatro tipos acima s&atilde;o do tipo "varlena" (i.e., os primeiros quatro bytes no disco s&atilde;o o comprimento seguido pelos dados). Consequentemente o espa&ccedil;o atual utilizado &eacute; ligeiramente maior do que o tamanho declarado. Contudo, valores longos s&atilde;o tamb&eacute;m sujeitos a compress&atilde;o, ent&atilde;o o espa&ccedil;o em disco pode tamb&eacute;m ser bem menor do que o esperado.</P>
<SMALL>VARCHAR(n)</SMALL> &eacute; melhor quando est&aacute; armazenando cadeias de caracteres de comprimento vari&aacute;vel e h&aacute; um limite de tamanho desta cadeia. <SMALL>TEXT</SMALL> &eacute; para cadeias de caracteres de comprimento ilimitado, com o m&aacute;ximo de um gigabyte.
<P><SMALL>CHAR(n)</SMALL> &eacute; para armazenar cadeias de caracteres que s&atilde;o todas do mesmo tamanho. <SMALL>CHAR(n)</SMALL> preenche com espa&ccedil;os em branco at&eacute; o tamanho especificado, enquanto o <SMALL>VARCHAR(n)</SMALL> armazena somente os caracteres fornecidos. <SMALL>BYTEA</SMALL> &eacute; para armazenar dados bin&aacute;rios, particularmente valores que incluem bytes <SMALL>NULL</SMALL>. Todos os tipos descritos aqui tem caracter&iacute;sticas de performance similares.</P>
<H3 id="item4.11.1">4.11.1) Como eu crio um campo serial/auto incremento?</H3>
<P>PostgreSQL suporta o tipo de dados <SMALL>SERIAL</SMALL>. Ele cria
automaticamente uma sequ&ecirc;ncia. Por exemplo:</P>
<PRE>
CREATE TABLE pessoa (
id SERIAL,
nome TEXT
);
</PRE>
&eacute; automaticamente traduzido em:
<PRE>
CREATE SEQUENCE pessoa_id_seq;
CREATE TABLE pessoa (
id INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
nome TEXT
);
</PRE>
<P>Sequ&ecirc;ncias automaticamente criadas s&atilde;o nomeadas como
&lt;<i>tabela</i>&gt;_&lt;<i>colunaserial</i>&gt;_<i>seq</i>, onde
<i>tabela</i> e <i>colunaserial</i> s&atilde;o os nomes da tabela e
da coluna serial, respectivamente. Veja a p&aacute;gina sobre
<I>create_sequence</I> no manual para obter informa&ccedil;&otilde;es
adicionais sobre sequ&ecirc;ncias.
<H3 id="item4.11.2">4.11.2) Como eu consigo o valor de um campo
<SMALL>SERIAL</SMALL>?</H3>
<P>A maneira mais simples de obter o pr&oacute;ximo valor <SMALL>SERIAL</SMALL>
de uma sequ&ecirc;ncia &eacute; com <SMALL>RETURNING</SMALL>. Utilizando o
exemplo da tabela em <A href="#item4.11.1">4.11.1</A>, ele ficaria assim:
<PRE>
INSERT INTO pessoa (nome) VALUES ('Blaise Pascal') RETURNING id;
</PRE>
Voc&ecirc; tamb&eacute;m pode chamar <I>nextval()</I> e utilizar o valor no
<SMALL>INSERT</SMALL> ou chamar <I>currval()</I> <I>ap&oacute;s</I> o
<SMALL>INSERT</SMALL>.
<H3 id="item4.11.3">4.11.3) <I>currval()</I> n&atilde;o lida com condi&ccedil;&atilde;o de corrida com outros usu&aacute;rios?</H3>
<P>N&atilde;o. <I>currval()</I> retorna o valor atual atribuido pela sua sess&atilde;o, e n&atilde;o por todas as sess&otilde;es.</P>
<H3 id="item4.11.4">4.11.4) Por que os n&uacute;meros da minha sequ&ecirc;ncia n&atilde;o s&atilde;o reutilizados quando uma transa&ccedil;&atilde;o &eacute; abortada? Por que h&aacute; intervalos nos n&uacute;meros da minha sequ&ecirc;ncia/coluna SERIAL?</H3>
<P>Para melhorar a concorr&ecirc;ncia, valores da sequ&ecirc;ncia s&atilde;o atribu&iacute;dos a transa&ccedil;&otilde;es correntes e n&atilde;o s&atilde;o travados at&eacute; que a transa&ccedil;&atilde;o seja finalizada. Isso causa intervalos na numera&ccedil;&atilde;o por causa de transa&ccedil;&otilde;es abortadas.</P>
<H3 id="item4.12">4.12) O que &eacute; um <SMALL>OID</SMALL>? O que &eacute; um <SMALL>CTID</SMALL>?</H3>
<P>Se uma tabela &eacute; criada com <SMALL>WITH OIDS</SMALL>, cada registro recebe um <SMALL>OID</SMALL> &uacute;nico.
O<SMALL>ID</SMALL>s s&atilde;o automaticamente atribu&iacute;dos como inteiros de 4 bytes
que s&atilde;o &uacute;nicos ao longo de toda instala&ccedil;&atilde;o. Contudo, eles s&atilde;o limitados em
4 bilh&otilde;es e, ent&atilde;o, os O<SMALL>ID</SMALL>s come&ccedil;am a ser duplicados. O PostgreSQL
utiliza <SMALL>OID</SMALL>s para ligar as tabelas do sistema.</P>
<P>Para numerar registros nas tabelas do usu&aacute;rios, &eacute; melhor utilizar
<SMALL>SERIAL</SMALL> ao inv&eacute;s de O<SMALL>ID</SMALL>s porque
sequ&ecirc;ncias <SMALL>SERIAL</SMALL> s&atilde;o &uacute;nicas somente em uma tabela; e
s&atilde;o menos prop&iacute;cias a atingir o limite.
<SMALL>SERIAL8</SMALL> est&aacute; dispon&iacute;vel para armazenar valores de sequ&ecirc;ncias
com oito bytes.</P>
<P>C<SMALL>TID</SMALL>s s&atilde;o utilizados para identificar registros f&iacute;sicos
espec&iacute;ficos com valores de block e deslocamento. C<SMALL>TID</SMALL>s mudam
ap&oacute;s registros serem modificados ou recarregados. Eles s&atilde;o utilizados por
&iacute;ndices para apontar registros f&iacute;sicos.</P>
<H3 id="item4.13">4.13) Por que eu recebo o erro <I>"ERROR: Memory exhausted in AllocSetAlloc()"</I>?</H3>
<P>Voc&ecirc; provavelmente est&aacute; sem mem&oacute;ria virtual no seu sistema, ou o seu n&uacute;cleo (kernel) tem um limite baixo para certos recursos. Tente isto antes de iniciar o servidor PostgreSQL:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
Dependendo da sua shell, somente um desses comando ter&aacute; sucesso, mas ele definir&aacute; o segmento de dados do seu processo com um limite maior e talvez permita que a consulta seja feita. Este comando &eacute; aplicado ao processo atual e todos os subprocessos criados depois do comando ser executado. Se voc&ecirc; tiver problemas com o cliente <SMALL>SQL</SMALL> porque o processo servidor retornou muitos dados, tente-o antes de iniciar o cliente.
<H3 id="item4.14">4.14) Como eu informo qual vers&atilde;o do PostgreSQL eu estou utilizando?</H3>
<P>No <I>psql</I>, digite <CODE>SELECT version();</CODE></P>
<H3 id="item4.15">4.15) Como eu crio uma coluna que conter&aacute; por padr&atilde;o a hora atual?</H3>
<P>Utilize <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
CREATE TABLE teste (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</PRE>
<H3 id="item4.16">4.16) Como eu fa&ccedil;o uma jun&ccedil;&atilde;o externa (outer join)?</H3>
<P>PostgreSQL suporta jun&ccedil;&otilde;es externas utilizando a sintaxe padr&atilde;o do SQL. Aqui temos dois exemplos:</P>
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</PRE>
or
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</PRE>
<P>Essas duas consultas ind&ecirc;nticas juntam t1.col com t2.col, e tamb&eacute;m
retornam qualquer registro que n&atilde;o foi juntado em t1 (aqueles que n&atilde;o
combinaram com t2). Uma jun&ccedil;&atilde;o a direita <SMALL>RIGHT</SMALL>
adicionaria registros que n&atilde;o foram juntados da tabela t2.
Uma jun&ccedil;&atilde;o completa (<SMALL>FULL</SMALL>) retornaria os registros
combinados mais todos os registros n&atilde;o combinados de t1 e t2.
A palavra <SMALL>OUTER</SMALL> &eacute; opcional e &eacute; assumida nas
jun&ccedil;&otilde;es <SMALL>LEFT</SMALL>, <SMALL>RIGHT</SMALL> e <SMALL>FULL</SMALL>.
Jun&ccedil;&otilde;es ordin&aacute;rias s&atilde;o chamadas jun&ccedil;&otilde;es
internas (<SMALL>INNER</SMALL>).</P>
<H3 id="item4.17">4.17) Como eu fa&ccedil;o consultas utilizando m&uacute;ltiplos bancos de dados?</H3>
<P>N&atilde;o h&aacute; outra maneira de consultar um banco de dados caso ele
n&atilde;o seja o atual. Porque o PostgreSQL carrega cat&aacute;logos do sistema
espec&iacute;ficos do banco de dados, &eacute; incerto como uma consulta em banco
de dados distintos pode se comportar.</P>
<P><I>contrib/dblink</I> permite consultas em bancos de dados distintos utilizando
chamadas de fun&ccedil;&otilde;es. &Eacute; claro, que um cliente pode fazer
conex&otilde;es simult&acirc;neas em bancos de dados diferentes e juntar os
resultados no cliente.</P>
<H3 id="item4.18">4.18) Como eu retorno m&uacute;ltiplos registros ou colunas de uma fun&ccedil;&atilde;o?</H3>
<P>&Eacute; f&aacute;cil utilizando fun&ccedil;&otilde;es que retornam conjunto,
<a href="http://www.postgresql.org/docs/techdocs.17">
http://www.postgresql.org/docs/techdocs.17</a>.</P>
<H3 id="item4.19">4.19) Por que eu obtenho erros "relation with OID ######
does not exist" ao acessar tabelas tempor&aacute;rias em fun&ccedil;&otilde;es PL/PgSQL?</H3>
<P>Em vers&otilde;es do PostgreSQL &lt; 8.3, PL/PgSQL armazena o conte&uacute;do da fun&ccedil;&atilde;o, e o efeito indesejado &eacute; que se uma fun&ccedil;&atilde;o PL/PgSQL acessa uma tabela tempor&aacute;ria, e aquela tabela &eacute; removida e criada novamente, e a fun&ccedil;&atilde;o &eacute; chamada novamente, a fun&ccedil;&atilde;o ir&aacute; falhar porque o conte&uacute;do armazenado da fun&ccedil;&atilde;o ainda apontar&aacute; para a tabela tempor&aacute;ria antiga. A solu&ccedil;&atilde;o &eacute; utilizar o <SMALL>EXECUTE</SMALL> para acesso a tabelas tempor&aacute;rias no PL/PgSQL. Isto ir&aacute; fazer com que a consulta seja avaliada toda vez.</P>
<P>Este problema n&atilde;o ocorre no PostgreSQL 8.3 ou superior.</P>
<H3 id="item4.20">4.20) Quais solu&ccedil;&otilde;es de replica&ccedil;&atilde;o est&atilde;o dispon&iacute;veis?</H3>
<P>Embora "replica&ccedil;&atilde;o" seja um termo simples, h&aacute; v&aacute;rias tecnologias para fazer
replica&ccedil;&atilde;o, com vantagens e desvantagens para cada um.</P>
<P>Replica&ccedil;&atilde;o mestre/escravo permite que um mestre receba consultas de leitura e
escrita, enquanto os escravos s&oacute; podem aceitar leitura/consultas <SMALL>SELECT</SMALL>.
A solu&ccedil;&atilde;o mais popular de replica&ccedil;&atilde;o mestre-escravo para PostgreSQL dispon&iacute;vel livremente
&eacute; <A href="http://main.slony.info">Slony-I</A>.</P>
<P>Replica&ccedil;&atilde;o com m&uacute;ltiplos mestres permite que consultas leitura/escrita sejam
enviadas para m&uacute;ltiplos computadores replicadores. Esta capacidade tamb&eacute;m tem
um s&eacute;rio impacto na performance por causa da necessidade de sincronizar as mudan&ccedil;as
entre os servidores. <A href="http://pgfoundry.org/projects/pgcluster/">PGCluster</a>
&eacute; a solu&ccedil;&atilde;o mais popular dispon&iacute;vel livremente para PostgreSQL.</P>
<P>H&aacute; tamb&eacute;m solu&ccedil;&otilde;es de replica&ccedil;&atilde;o comerciais e baseadas em hardware dispon&iacute;veis
que suportam uma variedade de modelos de replica&ccedil;&atilde;o.</P>
<H3 id="item4.21">4.21) Por que os nomes de minhas tabelas e colunas n&atilde;o
s&atilde;o reconhecidos em minha consulta? Por que as mai&uacute;sculas n&atilde;o s&atilde;o preservadas?</H3>
<P>A causa mais comum de nomes desconhecidos &eacute; o uso de aspas ao redor dos nomes da tabela ou coluna
durante a cria&ccedil;&atilde;o da tabela. Ao utilizar aspas, nomes de tabela e coluna
(chamados de identificadores) s&atilde;o armazenados <a
href="http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">
como especificado</a>, significando que voc&ecirc; deve utilizar aspas quando se
referir aos nomes na consulta. Algumas interfaces, como pgAdmin,
automaticamente colocam aspas nos identificadores durante a cria&ccedil;&atilde;o da tabela.
Ent&atilde;o, para identificadores serem reconhecidos, voc&ecirc; deve:
<UL>
<LI>Evitar colocar aspas no identificador ao criar tabelas</LI>
<LI>Utilizar somente caracteres min&uacute;sculos em identificadores</LI>
<LI>Colocar aspas em identificadores ao referenci&aacute;-los nas consultas</LI>
</UL>
</BODY>
</HTML>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,645 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>PostgreSQL FAQ</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="cs">
<meta name="description" lang="en" content="Czech translation of FAQ for PostgreSQL">
<meta name="description" lang="cs" content="Český překlad FAQ PostgreSQL">
</head>
<body bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000" alink="#0000ff">
<h1>Frequently Asked Questions</h1>
<p><i>Často kladené dotazy (FAQ) PostgreSQL</i>
</p>
<p>Poslední aktualizace: 29. října 2007 (aktualizováno pro PostgreSQL 8.3)
</p>
<p>Současný správce: Bruce Momjian (bruce@momjian.us)
</p>
<p>Přeložil: Pavel Stěhule (pavel.stehule@gmail.com)
</p>
<p>Nejaktuálnější verzi tohoto dokumentu naleznete na adrese
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ.html" title="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</a>
</p>
<p>Odpovědi na otázky vázané na konkrétní platformy naleznete na
adrese <a href="http://www.postgresql.org/docs/faq/" title="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>.
</p>
<hr>
<h2 align="center">Obecné otázky</h2>
<a href="#item1.1">1.1</a>) Co je to PostgreSQL? Jaká je správná výslovnost slova PostgreSQL?<br>
<a href="#item1.2">1.2</a>) Kdo řídí vývoj PostgreSQL?<br>
<a href="#item1.3">1.3</a>) Pod jakou licencí je PostgreSQL?<br>
<a href="#item1.4">1.4</a>) Na kterých platformách lze provozovat PostgreSQL?<br>
<a href="#item1.5">1.5</a>) Kde mohu získat PostgreSQL?<br>
<a href="#item1.6">1.6</a>) Jaká je poslední verze?<br>
<a href="#item1.7">1.7</a>) Kde mohu získat podporu?<br>
<a href="#item1.8">1.8</a>) Jak a kam hlásit chyby?<br>
<a href="#item1.9">1.9</a>) Kde najdu informace o známých chybách nebo nepodporovaných vlastnostech?<br>
<a href="#item1.10">1.10</a>) Jaká je dostupná dokumentace?<br>
<a href="#item1.11">1.11</a>) Jak se mohu naučit SQL?<br>
<a href="#item1.12">1.12</a>) Jak se mohu připojit k týmu vývojářů?<br>
<a href="#item1.13">1.13</a>) Jak je na tom PostgreSQL v porovnání s jinými databázemi?<br>
<a href="#item1.14">1.14</a>) Je PostgreSQL připraven na aktuální zavádění letního času v některých zemích?<br>
<h2 align="center">Dotazy na klientská rozhraní</h2>
<a href="#item2.1">2.1</a>) Která rozhraní jsou použitelná pro PostgreSQL?<br>
<a href="#item2.2">2.2</a>) Jaké nástroje lze použít pro PostgreSQL a web?<br>
<a href="#item2.3">2.3</a>) Existuje grafické rozhraní pro PostgreSQL?<br>
<h2 align="center">Administrativní dotazy</h2>
<a href="#item3.1">3.1</a>) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?<br>
<a href="#item3.2">3.2</a>) Jak nastavit pravidla pro přístup z jiných stanic?<br>
<a href="#item3.3">3.3</a>) Jak vyladit databázi na vyšší výkon?<br>
<a href="#item3.4">3.4</a>) Jaké mám ladící prostředky?<br>
<a href="#item3.5">3.5</a>) Co znamená "Sorry, too many clients", když se zkouším připojit?<br>
<a href="#item3.6">3.6</a>) Proč je nutný dump a obnovení (load) databáze při upgradu PostgreSQL?<br>
<a href="#item3.7">3.7</a>) Jaký hardware bych měl používat?<br>
<h2 align="center">Provozní dotazy</h2>
<a href="#item4.1">4.1</a>) Jak získat pouze první řádek dotazu? Náhodný řádek?<br>
<a href="#item4.2">4.2</a>) Jak získám seznam tabulek, indexů, databází, a definovaných uživatelů. Mohu vidět dotazy, které používá psql pro zobrazení těchto informací?<br>
<a href="#item4.3">4.3</a>) Jak změnit datový typ sloupce?<br>
<a href="#item4.4">4.4</a>) Jaká je maximální velikost řádku, tabulky a databáze?<br>
<a href="#item4.5">4.5</a>) Kolik diskového prostoru je potřeba k uložení dat z normálního textového souboru?<br>
<a href="#item4.6">4.6</a>) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?<br>
<a href="#item4.7">4.7</a>) Jak zjistím, jak se vyhodnocuje můj dotaz?<br>
<a href="#item4.8">4.8</a>) Jak použít case-(in)sensitive regulární výraz? Jak použít index pro case insensitive hledání?<br>
<a href="#item4.9">4.9</a>) Jak v dotazu detekovat, že položka je NULL? Jak bezpečně spojit dva řetězce, pokud mohou obsahovat NULL? Lze třídit podle toho, jestli je položka NULL nebo ne?<br>
<a href="#item4.10">4.10</a>) Jaké jsou rozdíly mezi různými znakovými typy?<br>
<a href="#item4.11.1">4.11.1</a>) Jak vytvořit serial/auto-increment položku?<br>
<a href="#item4.11.2">4.11.2</a>) Jak získat hodnotu SERIAL po vložení řádku?<br>
<a href="#item4.11.3">4.11.3</a>) Nezpůsobí currval() a nextval() problémy ve více uživatelském prostředí?<br>
<a href="#item4.11.4">4.11.4</a>) Proč není vygenerované číslo použito při přerušení transakce?Proč vznikají díry v číslování prostřednictvím sekvence nebo typu SERIAL?<br>
<a href="#item4.12">4.12</a>) Co to je OID? Co je to CTID?<br>
<a href="#item4.13">4.13</a>) Co znamená chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"?<br>
<a href="#item4.14">4.14</a>) Jak zjistím, kterou verzi PostgreSQL používám?<br>
<a href="#item4.15">4.15</a>) Jak vytvořit sloupec, který bude implicitně obsahovat aktuální čas?<br>
<a href="#item4.16">4.16</a>) Jak provést vnější spojení (outer join)?<br>
<a href="#item4.17">4.17</a>) Jak provést dotaz napříč několika databázemi?<br>
<a href="#item4.18">4.18</a>) Může funkce vrátit více řádků nebo sloupců?<br>
<a href="#item4.19">4.19</a>) Co je příčinou chyby "relation with OID xxxxx does not exist"?<br>
<a href="#item4.20">4.20</a>) Jaké jsou možnosti replikace databází?<br>
<a href="#item4.21">4.21</a>) Proč v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí? Proč jsou velká písmena v názvech automaticky převedena na malá písmena?<br>
<hr>
<h2 align="center">Obecné otázky</h2>
<h3><a name="item1.1">1.1</a>) Co je to PostgreSQL? Jaká je správná výslovnost slova PostgreSQL?</h3>
<p>Výslovnost PostgreSQL je <i>Post-Gres-Q-L</i>
, nebo zjednodušeně <i>Postgres</i>
. V řadě jazyků je slovo PostgreSQL obtížně vyslovitelný, proto se v hovoru často používá zjednodušená forma názvu. Pro ty, kteří by si rádi poslechli výslovnost, je k dispozici audiozáznam v <a href="http://www.postgresql.org/files/postgresql.mp3" title="http://www.postgresql.org/files/postgresql.mp3">MP3 formátu</a>.
</p>
<p>PostgreSQL je relační databáze s některými objektovými rysy, která má možnosti tradičních
komerčních databázových systémů s několika rozšířeními, které lze najít v DBMS
systémech příští generace. Používání PostgreSQL není omezené a veškeré zdrojové kódy jsou
volně dostupné.
</p>
<p>Za vývojem PostgreSQL je mezinárodní skupina nezávislých vývojářů navzájem komunikujících
prostřednictvím internetu. Tento projekt není řízen žádnou obchodní organizací. Pokud se chcete
přidat k projektu, přečtěte si vývojářské FAQ na adrese <a href="http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html" title="http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html">http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html</a> .
</p>
<h3><a name="item1.2">1.2</a>) Kdo řídí vývoj PostgreSQL?</h3>
<p>Pokud budete hledat organizaci řídící vývoj PostgreSQL, budete zklamáni. Nic takového
neexistuje. Existují pouze "core" a CVS skupiny uživatelů, ale ty existují více z administrátorských
důvodů než z organizačních. Projekt je směrován komunitou vývojářů a uživatelů, ke které se
kdokoliv může připojit. Jediné co potřebuje, je přihlásit se do elektronické konference. Více ve
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html" title="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">vývojářském FAQ</a>.
</p>
<h3><a name="item1.3">1.3</a>) Pod jakou licencí je PostgreSQL?</h3>
<p>PostgreSQL je předmětem následujících autorských práv:
</p>
<p>Dílčí Copyright (c) 1996-2009, PostgreSQL Global Development Group<br>
Dílčí Copyright (c) 1994-6, Regents of the University of California
</p>
<p>Uděluje se oprávnění k užití, rozmnožování, provádění úprav a
rozšiřování tohoto softwaru a dokumentace k němu, pro jakékoli účely,
bez licenčního poplatku a bez písemné licenční smlouvy, za podmínky,
že na všech jeho kopiích je uvedeno oznámení o výše uvedených právech,
jakož i obsah tohoto a dvou následujících odstavců.
</p>
<p>THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ŽÁDNÉM
PŘÍPADĚ ODPOVĚDNA ŽÁDNÉ TŘETÍ OSOBĚ ZA PŘÍMOU, NEPŘÍMOU, ZVLÁŠTNÍ,
NAHODILOU NEBO VÝSLEDNOU ŠKODU, VČETNĚ UŠLÉHO ZISKU, ZPŮSOBENOU UŽITÍM
TOHOTO SOFTWARU A DOKUMENTACE K NĚMU, A TO I V PŘÍPADĚ, ŽE THE
UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOŽNOSTI VZNIKU TAKOVÉ
ŠKODY.
</p>
<p>THE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO
NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VÝROBKU KE
SPECIFICKÝM ÚČELŮM. NÍŽE UVEDENÝ SOFTWARE JE POSKYTNUT "JAK STOJÍ A
LEŽÍ" A THE UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO
ÚDRŽBU, PODPORU, AKTUALIZACI, VYLEPŠENÍ NEBO MODIFIKACI.
</p>
<p>Výše uvedené je BSD licence, běžná licence otevřeného zdroje. Není zde
žádné omezení ohledně užití kódu zdroje. Jsme s tím spokojeni a nemáme
v úmyslu na této skutečnosti cokoli měnit.
</p>
<h3><a name="item1.4">1.4</a>) Na kterých platformách lze provozovat PostgreSQL?</h3>
<p>Stručně řečeno, PostgreSQL běží na všech moderních unixových systémech. Seznam těch, u kterých proběhlo testování, naleznete v instalačních instrukcích.
</p>
<p>PostreSQL také běží nativně na všech Microsof Windows systémech odvozených z Microsoft Windows NT jako jsou Windows 2000SP4, WindowsXP a Windows2003. Instalační balíček naleznete na adrese <a href="http://pgfoundry.org/projects/pginstaller" title="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>. Na starších systémech s ještě MS-DOS jádrem lze spustit PostgreSQL s emulačním programem Cygwin.
</p>
<p>Dále existuje port pro Novell Netware 6 port na adrese <a href="http://forge.novell.com" title="http://forge.novell.com">http://forge.novell.com</a>, a pro OS/2 verze (eComStation) na adrese <a href="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F" title="http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F">http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F</a> .
</p>
<h3><a name="item1.5">1.5</a>) Kde mohu získat PostgreSQL?</h3>
<p>Pomocí webového klienta z adresy <a href="http://www.postgresql.org/ftp/" title="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a> nebo klienta ftp z adresy <a href="ftp://ftp.postgresql.org/pub/" title="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a>.
</p>
<h3><a name="item1.6">1.6</a>) Jaká je poslední verze?</h3>
<p>Nejnovější verzí PostgreSQL je verze 8.2.5
</p>
<p>V plánu je uvolňovat každoročně jednu velkou verzi a každých několik měsíců malé verze.
</p>
<h3><a name="item1.7">1.7</a>) Kde mohu získat podporu?</h3>
<p>Nejčastější forma podpory uživatelům PostgreSQL komunitou je prostřednictvím e-mailů. Na našem webovém serveru naleznete <a href="http://www.postgresql.org/community/lists/" title="http://www.postgresql.org/community/lists/">odkaz</a> na stránky,kde se můžete přihlásit do elektronické konference. Pro začátek jsou doporučené konference general nebo bugs.
</p>
<p>Další cestou je IRC kanál #postgresql na Freenode (irc.freenode.net). K připojení použijte Unixový příkaz irc -x '#postgresql' "$USER" irc.freenode.net nebo jakékoholiv jiného IRC klienta. V této síti existuje ještě španělská (#postgresql-es) a francouzská (#postgresqlfr) verze. Další PostgreSQL kanál naleznete na EFNet.
</p>
<p>Seznam společností poskytující komerční podporu naleznete na adrese <a href="http://techdocs.postgresql.org/companies.php" title="http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</a>.
</p>
<h3><a name="item1.8">1.8</a>) Jak a kam hlásit chyby?</h3>
<p>Vyplňte formulář na adrese <a href="http://www.postgresql.org/support/submitbug" title="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>. Na našem ftp serveru <a href="ftp://ftp.postgresql.org/pub/" title="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a> si ověřte, že používáte aktuální verzi PostreSQL.
</p>
<p>Chyby reportované prostřednictvím chybového formuláře nebo zasláním mailu do PostgreSQL konference obvykle generuje následující odezvu:
</p>
<ul><li> Nejedná se o chybu, a proč
</li>
<li> Jedná se o známou chybu, která je již v seznamu úkolů <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
</li>
<li> Tato chyba byla opravena v aktuální verzi
</li>
<li> Tato chyba byla již opravena ve verzi, která zatím nebyla oficiálně uvolněna
</li>
<li> Požadavek na další doplňující informace:
<ul><li> Operační systém
</li>
<li> Verze PostgreSQL
</li>
<li> Test reprodukující chybu
</li>
<li> Ladící informace
</li>
<li> Backtrace výstup debuggeru
</li>
</ul>
</li>
<li> Jedná se o zatím nezjištěnou chybu, pak můžete čekat
<ul><li> Záplatu odstraňující chybu, která bude vložena do další velké nebo malé verze
</li>
<li> Informaci, že se jedná o chybu, kterou nelze okamžitě řešit a je proto přidána do <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
</li>
</ul>
</li>
</ul>
<h3><a name="item1.9">1.9</a>) Kde najdu informace o známých chybách nebo nepodporovaných vlastnostech?</h3>
<p>PostgreSQL podporuje rozšířenou podmnožinu SQL:2003. V našem <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a> naleznete seznam známých chyb, chybějících vlastností, a plány do budoucna.
</p>
<p>Odezva na požadavek na novou vlastnost PostgreSQL je obvykle:
</p>
<ul><li> Požadavek je již v <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
</li>
<li> Požadovaná funkce není chtěná protože
<ul><li> Duplikuje již existující funkci, která respektuje SQL standard
</li>
<li> Implementací funkce by se příliš zkomplikoval kód bez relevantního přínosu
</li>
<li> Funkce by mohla být nebezpečná nebo nespolehlivá
</li>
</ul>
</li>
<li> Požadavek je přidán do <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
</li>
</ul>
<p>PostgreSQL nepožívá systém pro sledování chyb, protože jsme zjistili, že je efektivnější přímo reagovat na maily a udržovat aktuální <a href="http://www.postgresql.org/docs/faqs.TODO.html" title="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>. V praxi je snaha o co nejrychlejší řešení chyb, a chyby, které by se mohly projevit u mnoha uživatelů jsou opravovány velice rychle. Jediné místo, kde lze dohledat všechny změny, rozšíření a opravy v PostgreSQL je CVS log. Poznámky k verzi "Release notes" nezachycují všechny změny, k němž došlo.
</p>
<h3><a name="item1.10">1.10</a>) Jaká je dostupná dokumentace?</h3>
<p>PostgreSQL obsahuje vynikající dokumentaci zahrnující manuál, manuálové stránky a testovací příklady. Podívejte se do adresáře /doc. Manuál je přístupný online na <a href="http://www.postgresql.org/docs" title="http://www.postgresql.org/docs">http://www.postgresql.org/docs</a>.
</p>
<p>K dispozici jsou zdarma dvě online knihy na adresách <a href="http://www.postgresql.org/docs/books/awbook.html" title="http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</a> a <a href="http://www.commandprompt.com/ppbook/" title="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>. Další literaturu lze zakoupit. Nejpopulárnější je od Kerryho Douglase. Seznam dostupné literatury je na <a href="http://techdocs.postgresql.org/techdocs/bookreviews.php" title="http://techdocs.postgresql.org/techdocs/bookreviews.php">http://techdocs.postgresql.org/techdocs/bookreviews.php</a>. Ještě je kolekce technicky orientovaných článků tematicky spojených s PostgreSQL na adrese <a href="http://techdocs.postgresql.org/" title="http://techdocs.postgresql.org/">http://techdocs.postgresql.org/</a>.
</p>
<p>Řádkový klient psql má \d příkazy pro zobrazení informací o typech, operátorech, funkcích, agregačních funkcí, atd. Použijte \? pro zobrazení dostupných příkazů.
</p>
<p>Další dokumentaci najdete na našem webu.
</p>
<h3><a name="item1.11">1.11</a>) Jak se mohu naučit SQL?</h3>
<p>Podívejte se do výše uvedené dokumentace. Další online knihou je "Teach Yourself SQL in 21 Days, Second Edition" na adrese <a href="http://members.tripod.com/er4ebus/sql/index.htm" title="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a>. Mnoho našich uživatelů doporučuje knihu The Practical SQL Handbook, Bowman, Judith S., et al., Addison-Wesley. Další The Complete Reference SQL, Groff et al., McGraw-Hill.
</p>
<p>Další online tutoriály jsou dostupné na adresách:
</p>
<ul><li> <a href="http://www.intermedia.net/support/sql/sqltut.shtm" title="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a>
</li>
<li> <a href="http://sqlcourse.com" title="http://sqlcourse.com">http://sqlcourse.com</a>
</li>
<li> <a href="http://www.w3schools.com/sql/default.asp" title="http://www.w3schools.com/sql/default.asp">http://www.w3schools.com/sql/default.asp</a>
</li>
<li> <a href="http://mysite.verizon.net/Graeme_Birchall/id1.html" title="http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</a>
</li>
</ul>
<h3><a name="item1.12">1.12</a>) Jak se mohu připojit k týmu vývojářů?</h3>
<p>Prostudujte si <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html" title="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">Developer's FAQ</a>.
</p>
<h3><a name="item1.13">1.13</a>) Jak je na tom PostgreSQL v porovnání s jinými databázemi?</h3>
<p>Software můžeme porovnávat z několika různých pohledů: vlastnosti, výkon, spolehlivost, podpora a cena.
</p>
<script></script>
<h4> Vlastnosti </h4>
<p>PostgreSQL nabízí většinu funkcí funkcionality velkých komerčních DBMS systémů jako jsou: transakce, vnořené dotazy, spouště, referenční integrita a sofistikovaný systém zamykání. Poskytujeme určité funkce, které ostatní systémy běžně nepodporují. Např. uživatelem definované typy, dědičnost, pravidla (rules), a MVCC architekturu.
</p>
<h4> Výkon </h4>
<p>Výkon PostgreSQL je srovnatelný s ostatními komerčními nebo Open Source databázemi. V některých případech je rychlejší, jindy pomalejší. Náš výkon je obvykle +/-10% vůči ostatním databázím.
</p>
<h4> Spolehlivost </h4>
<p>Uvědomujeme si, že databáze musí být stoprocentně spolehlivá, jinak je nepoužitelná. Snažíme se, aby každá verze byla dobře otestována a obsahovala minimum chyb. Každá verze je minimálně několik měsíců v beta testovacím režimu. Do produkčního režimu se dostane, až když nedochází k dalším změnám nebo opravám. Věříme, že jsem více než srovnatelní s ostatními databázemi v této oblasti.
</p>
<h4> Podpora </h4>
<p>Na našich internetových konferencích se setkává velká skupina vývojářů a uživatelů při řešení vyskytujících se problémů.
Naše internetové konference umožňují kontakt velké skupiny vývojářů a uživatelů. Nemůžeme garantovat opravu chyby, ale komerční DBMSs také vždy negarantují řešení problémů. Věříme ale, že díky přímému kontaktu na vývojáře, naši uživatelskou komunitu, manuálům, a dostupným zdrojovým kódům máme lepší podporu než ostatní DBMSs. Pro ty, kteří preferují komerční "per-incident" podporu, existuje společností, kteří ji nabízejí (FAQ sekce 1.7.)
</p>
<h4> Cena </h4>
<p>PostgreSQL lze používat bezplatně (a to i pro komerční použití). Také můžete neomezeně používat náš kód ve svých produktech s výjimkami specifikovanými v naší licenci (přebíráme BSD licenci).
</p>
<h3><a name="item1.14">1.14</a>) Je PostgreSQL připraven na aktuální zavádění letního času v některých zemích?</h3>
<p>Počínaje verzí 8.0.[4+] podporuje PostgreSQL letní čas také pro USA. Podpora letního času (daylight saving time) pro Kanadu a Západní Austrálii je obsažena ve verzích 8.0.[10+] a 8.1.[6+] a všech následujících verzích. Starší verze používaly systémovou databázi časových zón obsahující, kromě jiného, informaci o tom, zda se pro danou časovou zónu rozlišuje mezi letním a zimním časem.
</p>
<hr>
<h2 align="center">Dotazy na klientská rozhraní</h2>
<h3><a name="item2.1">2.1</a>) Která rozhraní jsou použitelná pro PostgreSQL?</h3>
<p>PostgreSQL se distribuuje pouze s rozhraním pro jazyk C a embedded C. Všechna další rozhraní představují nezávislé projekty, které je třeba stáhnout z internetu samostatně. Osamostatnění těchto projektů umožňuje nezávislost vývojových týmů a možnost vydávat nové verze bez ohledu na vydání nové verze PostgreSQL.
</p>
<p>Některé programovací jazyky jako je např. PHP obsahují rozhraní pro PostgreSQL. Rozhraní pro jazyky jako je Perl, Tcl, Python a mnoho dalších jsou dostupné na adrese: <a href="http://gborg.postgresql.org" title="http://gborg.postgresql.org">http://gborg.postgresql.org</a> v sekci Drivers/Interfaces.
</p>
<h3><a name="item2.2">2.2</a>) Jaké nástroje lze použít pro PostgreSQL a web?</h3>
<p>Dobrým úvodem do problematiky databází v prostředí webových stránek může být web <a href="http://www.webreview.com" title="http://www.webreview.com">http://www.webreview.com</a>.
</p>
<p>PHP (<a href="http://www.php.net" title="http://www.php.net">http://www.php.net</a>) je vynikajícím rozhraním pro tvorbu webů.
</p>
<p>Pro složitější úlohy se často používá Perl a jeho BDB:Pg rozhraní s podporou CGI - CGI.pm nebo mod_perl(u).
</p>
<h3><a name="item2.3">2.3</a>) Existuje grafické rozhraní pro PostgreSQL?</h3>
<p>K dispozici je řada grafických nástrojů podporujících PostgreSQL a to od komerčních nebo open source vývojářů. Podrobný seznam naleznete na adrese
<a href="http://www.postgresql.org/docs/techdocs.54" title="http://www.postgresql.org/docs/techdocs.54">http://www.postgresql.org/docs/techdocs.54</a>.
</p>
<hr>
<h2 align="center">Administrativní dotazy</h2>
<h3><a name="item3.1">3.1</a>) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?</h3>
<p>Při spouštění configure nastavte parametr --prefix
</p>
<h3><a name="item3.2">3.2</a>) Jak nastavit pravidla pro přístup z jiných stanic?</h3>
<p>Ve výchozí konfiguraci, PostgreSQL umožňuje pouze připojení z lokálního uživatele prostřednictvím Unix domain sockets nebo TCP/IP spojení. Bez modifikace listen_addresses v souboru postgresql.conf, a povolení adresy v souboru $PGDATA/pg_hba.conf se nelze připojit k PostgreSQL z ostatních stanic. Změna výše zmíněných parametrů vyžaduje restart databázového serveru.
</p>
<h3><a name="item3.3">3.3</a>) Jak vyladit databázi na vyšší výkon?</h3>
<p>Výkon systému můžete ovlivnit ve třech oblastech:
</p>
<h4> Změny dotazu </h4>
<ul><li> Použitím indexů včetně částečných a funkcionálních
</li>
<li> Použitím COPY místo opakovaných INSERTů
</li>
<li> Sloučením mnoha SQL příkazů do jedné transakce snížením režie na commit
</li>
<li> Používáním CLUSTERU, pokud načítáte větší počet řádek podle indexu
</li>
<li> Použitím klauzule LIMIT v poddotazech
</li>
<li> Použitím předpřipravených dotazů
</li>
<li> Používáním ANALYZE. Tento příkaz aktualizuje statistiky, které se používají při optimalizaci dotazu
</li>
<li> Pravidelné použití VACUUM nebo používání pg_autovacuum
</li>
<li> Odstraněním indexů před rozsáhlými změnami v datech
</li>
</ul>
<h4> Konfigurace serveru </h4>
<p>Určité parametry v souboru postgresql.conf mají vliv na výkon serveru. Detaily naleznete v příručce Administrátora v Server Run-time Environment/Run-time Configuration. Další komentáře naleznete v <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html" title="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a> a <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html" title="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>.
</p>
<h4> Výběr hardware </h4>
<p>Vliv hardware na výkon serveru je popsán v dokumentech <a href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html" title="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html">http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</a> a <a href="http://www.powerpostgresql.com/PerfList/" title="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a>.
</p>
<h3><a name="item3.4">3.4</a>) Jaké mám ladící prostředky?</h3>
<p>Nastavením log_* proměnných v konfiguraci serveru si vynutíte logování dotazů a procesních statistik, které Vám mohou pomoci při ladění a optimalizaci výkonu.
</p>
<h3><a name="item3.5">3.5</a>) Co znamená "Sorry, too many clients", když se zkouším připojit?</h3>
<p>Překročil jste výchozí limit, který je 100 současně připojených uživatelů. V konfiguraci serveru v postgresql.conf tuto hodnotu můžete zvětšit změnou hodnoty max_connection. Nezapomeňte restartovat server.
</p>
<h3><a name="item3.6">3.6</a>) Proč je nutný dump a obnovení (load) databáze při upgradu PostgreSQL?</h3>
<p>Způsob číslování je popsán v dokumentaci na <a href="http://www.postgresql.org/support/versioning" title="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>. Instrukce k provedení migrace na vyšší verzi jsou taktéž v dokumentaci na adrese <a href="http://www.postgresql.org/docs/current/static/install-upgrading.html" title="http://www.postgresql.org/docs/current/static/install-upgrading.html">http://www.postgresql.org/docs/current/static/install-upgrading.html</a>.
</p>
<h3><a name="item3.7">3.7</a>) Jaký hardware bych měl používat?</h3>
<p>Jelikož PC jsou většinou kompatibilní, lidé mají tendence věřit, že všechna PC jsou stejně kvalitní. Což není pravda. Paměti ECC, SCSI a kvalitní základní desky jsou mnohem spolehlivější a výkonnější než lacinější hardware. PostgreSQL poběží na většině hardwaru, nicméně pokud je pro Vás spolehlivost a výkon systému důležitá, je dobré věnovat čas nalezení vhodné hardwarové konfigurace. Na našich elektronických konferencích můžete diskutovat o vhodných konfiguracích a značkách.
</p>
<hr>
<h2 align="center">Provozní dotazy</h2>
<h3><a name="item4.1">4.1</a>) Jak získat pouze první řádek dotazu? Náhodný řádek?</h3>
<p>Pokud potřebujete pouze několik řádků a pokud víte kolik, použijte
SELECT LIMIT. Pokud bude možné použít index shodující se s ORDER BY,
je možné, že se nebude provádět celý dotaz. Pokud neznáte počet záznamů,
použijte kurzor a příkaz FETCH.
</p>
<p>Pro výběr náhodného řádku použijte příkaz ve tvaru:
</p>
<pre>
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</pre>
<h3><a name="item4.2">4.2</a>) Jak získám seznam tabulek, indexů, databází, a definovaných uživatelů. Mohu vidět dotazy, které používá psql pro zobrazení těchto informací?</h3>
<p>V psql příkazem \dt získáte seznam tabulek. Úplný seznam příkazů psql získáte příkazem \?. Alternativně si můžete prostudovat zdrojový kód psql - soubor pgsql/src/bin/psql/describe.c, který obsahuje SQL příkazy, které jsou generovány pro získání výstupu psql "backslash" příkazů. Také můžete nastartovat psql s parametrem -E, který způsobí zobrazení všech SQL příkazů, které se odesílají na server. PostgreSQL také podporuje SQL standard INFORMAČNÍ SCHÉMATA (standardní systémové tabulky). Klasickým dotazem do systémových tabulek získáte požadované informace o struktuře databáze.
</p>
<p>Systémové tabulky PostgreSQL (mimo rámec SQL standardů) používají prefix pg_. Pro zjištění struktury databáze je můžete použít také, i když preferovány jsou dotazy do informačního schématu.
</p>
<p>Seznam všech databází získáte příkazem psql -l
</p>
<p>Další inspiraci najdete v souboru pgsql/src/tutorial/syscat.source. Obsahuje ilustrační SELECTy potřebné k získání informací z systémových tabulek databáze.
</p>
<h3><a name="item4.3">4.3</a>) Jak změnit datový typ sloupce?</h3>
<p>Ve verzích 8.0 a pozdějších jednoduše:
</p>
<pre>
ALTER TABLE ALTER COLUMN TYPE
</pre><p>V starších verzích:
</p>
<pre>
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;
</pre><p>Po změně spusťte příkaz VACUUM FULL, aby došlo k uvolnění diskového prostoru použitého v tu chvíli již neplatnými záznamy.
</p>
<h3><a name="item4.4">4.4</a>) Jaká je maximální velikost řádku, tabulky a databáze?</h3>
<p>PostgreSQL má tato omezení:
</p>
<table border="0">
<tr><td> Maximální velikost databáze: </td><td> neomezena (existují 32TB db)
</td></tr>
<tr><td> Maximální velikost tabulky: </td><td> 32 TB
</td></tr>
<tr><td> Maximální velikost řádky: </td><td> 480GB
</td></tr>
<tr><td> Maximální velikost položky </td><td> 1 GB
</td></tr>
<tr><td> Maximální počet řádků v tabulce: </td><td> neomezeno
</td></tr>
<tr><td> Maximální počet sloupců v tabulce: </td><td> 250-1600 podle typů
</td></tr>
<tr><td> Maximální počet indexů na tabulce: </td><td> neomezeno
</td></tr>
</table>
<p>Ve skutečnosti nic není neomezeno, limitem bývá vždy dostupná disková
paměť nebo velikost operační paměti. Pokud máte některou z těchto
hodnot neobvykle velkou, může dojít ke snížení výkonu.
</p>
<p>Maximální velikost tabulky je 32 TB a nevyžaduje podporu velkých
souborů operačním systémem. Velké tabulky se ukládají do několika 1 GB
souborů takže limity souborového systému nejsou podstatné.
</p>
<p>Maximální velikost tabulky a maximální počet sloupců můžeme
zečtyřnásobit nastavením velikosti bloku na 32K.
</p>
<p>Indexy jsou povolené pouze na sloupcích jejichž délka je menší než 2000 znaků. Pokud tuto délku překročíme a index potřebujeme pro zajištění jednoznačnosti, je vhodnější použít funkcionální index nad MD5 funkcí nebo fulltextový index.
</p>
<h3><a name="item4.5">4.5</a>) Kolik diskového prostoru je potřeba k uložení dat z normálního textového souboru?</h3>
<p>PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z
textového souboru.
</p>
<p>Například, uvažujme soubor se 100 tisíci řádky obsahující na každé
řádce celé číslo a textový popis. Text je v průměrně dvacet bytů
dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze
obsahující odpovídající data bude zhruba 5.2 MB.
</p>
<pre>
24 bytů: hlavička řádku (přibližně)
24 bytů: jedna celočíselná položka a jedna textová
+ 4 byty: ukazatel na stránku k entici
------------------------------------------------------
52 bytů na řádek
</pre><p>Velikost datové stránky PostgreSQL je 8192 bytů (8KB)
</p>
<pre>
8192 bytů na stránce
---------------------- = 158 řádek na stránku
52 bytů za řádek
100000 řádek
----------------------- = 633 stránek (zaokrouhleno nahoru)
158 řádek na stránce
633 datových stránek * 8192 bytů na každou stránku = 5,185,536 bytů (5.2 MB)
</pre><p>Indexy nemají tak velkou režii, ale mohou být také velké, protože
obsahují indexovaná data.
</p>
<p>Hodnoty NULL jsou uloženy v bitmapách, takže zabírají jen velmi málo
diskového prostoru.
</p>
<h3><a name="item4.6">4.6</a>) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?</h3>
<p>Každý dotaz nemusí nutně použít existující indexy. Index se použije
tehdy, když je tabulka větší než určitá minimální velikost, a dotaz
vybírá pouze procentuálně malou část řádků tabulky. To proto, že
náhodný přístup k disku daný čtením indexu může být pomalejší než
lineární čtení tabulky nebo sekvenční čtení.
</p>
<p>PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k
tabulce. Tyto statistiky se shromažďují příkazy VACUUM ANALYZE nebo
ANALYZE. Díky statistikám má optimizer informaci o počtu řádek v
tabulce a může lépe rozhodnout o použití indexů. Statistiky se uplatní
při určení optimálního pořadí a metody spojení tabulek. Statistiky by
se měli aktualizovat opakovaně, tak jak se mění obsah tabulek.
</p>
<p>Indexy nejsou obyčejně použity pro setřídění nebo spojení tabulek.
Sekvenční zpracování následované explicitním tříděním je obyčejně
rychlejší než použití indexu na velké tabulce.
</p>
<p>Jinak je tomu v případě použití LIMIT a ORDER BY, při kterém se
většinou index použije, jelikož je výsledkem pouze malá část tabulky.
</p>
<p>Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání
tabulky, použijte příkaz SET enable_seqscan TO 'off' a zkuste zda je
prohledávání s indexem rychlejší.
</p>
<p>Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se
indexy použijí pouze za určitých skutečností:
</p>
<ul><li> začátek hledaného vzoru musí být ukotven k začátku, tj.
<ul><li> vzor LIKE nesmí začínat %
</li>
<li> ~ regulární výraz musí začínat ^
</li>
</ul>
</li>
<li> vzor nesmí začínat intervalem, např. [a-e]
</li>
<li> vyhledávaní, které není Case sensitiv jako je ILIKE nebo ~* nepoužívá indexy. Můžete ale použít funkcionální indexy, které jsou popsány v sekci 4.8
</li>
<li> při inicializaci databáze (initdb) musí být použito C locale nebo vytvořte speciální text_pattern_index, který umožní, při respektování zmíněných podmínek použití indexu operací LIKE. Pro vyhledávání celých slov je možné a výhodné použít fulltext.
</li>
</ul>
<h3><a name="item4.7">4.7</a>) Jak zjistím, jak se vyhodnocuje můj dotaz?</h3>
<p>Podívejte se do nápovědy k příkazu EXPLAIN.
</p>
<h3><a name="item4.8">4.8</a>) Jak použít case-(in)sensitive regulární výraz? Jak použít index pro case insensitive hledání?</h3>
<p>Vyhledávání prostřednictvím regulárních vzorů zajišťuje operátor ~, který je case-sensitive. Jeho case-insensitive varianta je operátor ~*. Case-insensitive variací operátoru LIKE je operátor ILIKE.
</p>
<p>Case-insensitive vyhledání se řeší:
</p>
<pre>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</pre><p>Tento dotaz nepoužije standardní index. Musíte použít tzv. funkcionální index:
</p>
<pre>
CREATE INDEX tabindex ON tab (lower(col));
</pre><p>Pokud index vytvoříme jako unikátní, tak můžeme ukládat řetězce obsahující malá i velká písmena, ale nikoliv řetězce, které se od sebe odlišují jen v malých a velkých písmenech. K zajištění zápisu řetězce obsahující pouze malá nebo pouze velká písmena použijte CHECK kontroly nebo triggery.
</p>
<h3><a name="item4.9">4.9</a>) Jak v dotazu detekovat, že položka je NULL? Jak bezpečně spojit dva řetězce, pokud mohou obsahovat NULL? Lze třídit podle toho, jestli je položka NULL nebo ne?</h3>
<p>Pokud chcete testovat hodnotu NULL použijte operátor IS:
</p>
<pre>
SELECT *
FROM tab
WHERE col IS NULL;
</pre><p>K spojení řetězců, které mohou obsahovat hodnotu NULL, používejte funkci COALESCE(), např.:
</p>
<pre>
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
</pre><p>Pokud chcete třídit podle hodnoty NULL, použijte výraz IS NULL nebo IS NOT NULL v klauzuli ORDER. Hodnota pravda má přednost před hodnotou false a tedy pokud použijete:
</p>
<pre>
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
</pre><p>tak záznamy s NULL budou na začátku setříděných dat.
</p>
<h3><a name="item4.10">4.10</a>) Jaké jsou rozdíly mezi různými znakovými typy?</h3>
<table border="0">
<tr><td>Typ </td><td> Interní název </td><td> Poznámky
</td></tr>
<tr><td> VARCHAR(n)</td><td> varchar</td><td> n určuje maximální délku
</td></tr>
<tr><td> CHAR(n)</td><td> bpchar </td><td> řetězec je do dané délky rozšířen mezerami
</td></tr>
<tr><td> TEXT</td><td> text</td><td> bez omezení délky
</td></tr>
<tr><td> BYTEA</td><td> bytea</td><td> pole bytů nespecifikované délky
</td></tr>
<tr><td> "char"</td><td> char</td><td> jeden znak
</td></tr>
</table>
<p>Na interní názvy můžete narazit v systémovém katalogu nebo v některých chybových hlášeních.
</p>
<p>Čtyři první typy jsou tzv. varlena typy (první čtyři byty na disku jsou obsahují délku, ostatní obsahují vlastní data). Skutečně obsazený prostor je tedy o něco málo větší než deklarovaná velikost. Na druhou stranu, delší řetězce jsou komprimovány, takže obsazený prostor na disku může být menší než se čeká.
</p>
<p>VARCHAR(n) je vhodný pro ukládání různě dlouhých řetězců u kterých známe délkové omezení, TEXT pro řetězce bez omezení délky (maximum je jeden gigabyte).
</p>
<p>CHAR(n) se používá pro uložení stejně dlouhých řetězců. CHAR(n) doplní mezerami na specifikovanou délku, VARCHAR(n) hodnoty se ukládají tak jak jsou. BYTEA je pro ukládání binárních dat - non ASCII hodnot. Všechny zmíněné typy mají podobné výkonové charakteristiky.
</p>
<h3><a name="item4.11.1">4.11.1</a>) Jak vytvořit serial/auto-increment položku?</h3>
<p>V PostgreSQL můžete použít datový typ SERIAL. Jeho použitím se automaticky vytvoří sekvence.
Například:
</p>
<pre>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</pre><p>je automaticky transformováno na:
</p>
<pre>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</pre><p>Podrobnější informace najdete v manuálu v popisu příkazu create_sequence.
</p>
<h3><a name="item4.11.2">4.11.2</a>) Jak získat hodnotu SERIAL po vložení řádku?</h3>
<p>Nejjednodušším způsob, jak získat vygenerovanou hodnotu typu SERIAL, je využít klauzuli RETURNING. Pro tabulku z 4.11.1 vypadá takto:
</p>
<pre>
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
</pre><p>Také můžete použít funkci nextvall() a její výsledek použít v příkazu INSERT, nebo zavolat currval() po provedení příkazu INSERT.
</p>
<h3><a name="item4.11.3">4.11.3</a>) Nezpůsobí currval() a nextval() problémy ve více uživatelském prostředí?</h3>
<p>Ne, currval vrací vždy hodnotu, která byla vygenerována pro vás.
</p>
<h3><a name="item4.11.4">4.11.4</a>) Proč není vygenerované číslo použito při přerušení transakce?Proč vznikají díry v číslování prostřednictvím sekvence nebo typu SERIAL?</h3>
<p>Poté co sekvence vygeneruje nové číslo, tak se nedochází k zamčení sekvence a nečeká se na úspěšné nebo neúspěšné dokončení transakce. Odvoláním transakce, která si vyžádala čísla sekvence se tato čísla nenávratně ztratí.
</p>
<h3><a name="item4.12">4.12</a>) Co to je OID? Co je to CTID?</h3>
<p>V případě, že tabulku nezaložíme s atributem WITHOUT OIDS, tak má každý řádek unikátní identifikační číslo OID. Toto číslo je 4 bajtové celé číslo, které je jedinečné v celé instalaci. Přeteče po 4 miliardách řádků. PostgreSQL používá OIDs jako interní linky v interních systémových tabulkách.
</p>
<p>K získání unikátního čísla v nesystémových tabulkách je vhodnější použití typu SERIAL než OID, jelikož sekvence SERIAL se používá pouze pro jednu tabulku a je tudíž méně náchylná na přetečení. Pokud byste se toho obávali, použijte typ SERIAL8.
</p>
<p>CTID se používá k identifikaci konkrétního fyzického řádku. CTID se mění pokud je řádek modifikován nebo znovu načten. Používají ho indexy jako adresaci fyzických řádků.
</p>
<h3><a name="item4.13">4.13</a>) Co znamená chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"?</h3>
<p>Pravděpodobně jste vyčerpal dostupnou virtuální paměť, nebo tvůj kernel
má příliš nízké limity u určitých zdrojů. Před startem PostgreSQL vyzkoušejte:
</p>
<pre>
ulimit -d 262144
limit datasize 256m
</pre><p>Možná, že se projde pouze jeden příkaz - záleží to na vašem shellu.
Měl by zvednout limity datových segmentů vašich procesů na dostatečně velkou
hodnotu a snad umožnit dokončení dotazu. Změna limitů se bude aplikovat
pouze na aktuální proces a na všechny nově vytvořené procesy. Jestliže máte
problém s SQL klientem, protože vám server vrátil příliš dat, zkuste to
před startem klienta.
</p>
<h3><a name="item4.14">4.14</a>) Jak zjistím, kterou verzi PostgreSQL používám?</h3>
<p>V psql napište:
</p>
<pre>
SELECT version();
</pre>
<h3><a name="item4.15">4.15</a>) Jak vytvořit sloupec, který bude implicitně obsahovat aktuální čas?</h3>
<p>Použijte CURRENT_TIMESTAMP:
</p>
<pre>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</pre>
<h3><a name="item4.16">4.16</a>) Jak provést vnější spojení (outer join)?</h3>
<p>PostgreSQL podporuje standardní SQL syntaxi pro vnější spojení. Zde jsou
dva příklady:
</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre><p>nebo
</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</pre><p>Tyto identické dotazy spojí sloupec t1.col k sloupci t2.col, a ještě vrátí všechny nespárované řádky t2 (ty, které nedohledá v t2). RIGHT JOIN by připojil všechny nespárované řádky z t2. FULL JOIN vrátí všechny spárované řádky i všechny zbývající řádky z obou tabulek. Klíčové slovo OUTER je volitelné. Běžná operace JOIN se také označuje jako vnitřní spojení.
</p>
<h3><a name="item4.17">4.17</a>) Jak provést dotaz napříč několika databázemi?</h3>
<p>Neexistuje žádný způsob, jak se v dotazu odkazovat na tabulky z jiné než aktuální databáze. A to protože má systémové tabulky uložené nezávisle v každé databázi a není tak úplně zřejmé, jak by se dotaz provedený napříč databázemi měl chovat.
</p>
<p>Jeden z doplňků dblink umožňuje dotaz nad několika tabulkami pomocí funkcí. Druhý způsob je simultální připojení klienta ke všem relevantním databázím a sloučení výsledku na straně klienta.
</p>
<h3><a name="item4.18">4.18</a>) Může funkce vrátit více řádků nebo sloupců?</h3>
<p>Jde to jednoduše pomocí set-returning funkce. Více na
<a href="http://www.postgresql.org/docs/techdocs.17" title="http://www.postgresql.org/docs/techdocs.17">http://www.postgresql.org/docs/techdocs.17</a>.
</p>
<h3><a name="item4.19">4.19</a>) Co je příčinou chyby "relation with OID xxxxx does not exist"?</h3>
<p>Nechtěným vedlejším efektem kešování SQL dotazů v PL/pgSQL funkci je problém s neplatnými odkazy na dočasné tabulky, které byly od prvního spuštění funkce zrušeny a znovu vytvořeny před dalším spuštěním PL/pgSQL funkce. Řešením je použít příkaz EXECUTE a to proto, že prováděcí plán SQL příkazu spouštěného příkazem EXECUTE se vytváří pokaždé znovu (neukládá se do cache).
</p>
<p>Tento problém by se neměl vyskytovat u PostgreSQL verze 8.3 a vyšších verzích.
</p>
<h3><a name="item4.20">4.20</a>) Jaké jsou možnosti replikace databází?</h3>
<p>Replikaci databáze umožňuje několik technoligií. Každá má určité výhody a nevýhody.
</p>
<p>Master/Slave replikaci podporuje jeden hlavní server, který přijímá požadavky na zápis a čtení, a několik podřízených serverů, které umožňují pouze čtení (SELECT). Nejrozšířenějším volně dostupným řešením tohoto typu je <a href="http://main.slony.info/" title="http://main.slony.info/">Slony-I</a>.
</p>
<p>Replikace typu Multi-master podporuje existenci několika serverů s povoleným zápisem na více replikovaných serverech. Toto řešení zvyšuje zátěž serverů, protože je nutná synchronizace serverů. Nejrozšířenějším volně dostupným řešením je <a href="http://pgfoundry.org/projects/pgcluster/" title="http://pgfoundry.org/projects/pgcluster/">PGCluster</a>.
</p>
<p>Ještě existuje několik komerčních a hardware řešení replikací podporujících různé modely replikace.
</p>
<h3><a name="item4.21">4.21</a>) Proč v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí? Proč jsou velká písmena v názvech automaticky převedena na malá písmena?</h3>
<p>Nejčastějším důvodem nerozpoznání názvu objektu bylo použití vložení názvu sloupce nebo tabulky mezi uvozovky při zakládání tabulky. Pokud se název zapíše mezi uvozovky, pak je case sensitive, a v důsledku toho je nutné názvy těchto sloupců nebo tabulek v SQL příkazech také vkládat mezi uvozovky (pokud obsahují velká písmena). Některé programy, jako je například pgAdmin, automaticky používají uvozovky. Takže pokud chcete, aby systém identifikoval identifikátor, musíte:
</p>
<ul><li> nepoužívat uvozovky v příkazu CREATE TABLE
</li>
<li> v identifikátoru použít pouze malá písmena
</li>
<li> v dotazech vkládat identifikátory do uvozovek
</li>
</ul>
</body>
</htm>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +0,0 @@
The FAQ* files in this directory are the master versions, and the
../../FAQ* text files are created using lynx:
lynx -force_html -dont_wrap_pre -dump -hiddenlinks=ignore -nolist FAQ*