Commit f3f45c87 authored by Peter Eisentraut's avatar Peter Eisentraut

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
parent f7ad9cab
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
PostgreSQL 常FAQ
2007 年 1 30 17:37:01 EST
2007 年 2 1 12:55:04 CST
维人Bruce Momjian (pgman@candle.pha.pa.us)
维人Daojing.Zhoudoudou586@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?
PostgreSQLBSD许使PostgreSQL
以PostgreSQL代 以就 软件
们追责任就软件中
须以声就们使BSD声容
PostgreSQL管系
c1996-2005PostgreSQL c1994-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
SP4WinXP Win2003已
http://pgfoundry.org/projects/pginstaller载MSDOSWindows
Win95Win98WinMeCygwin模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件表个好
主IRCFreeNode(irc.freenode.net)#postgresql为
以使UNIXirc令 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表
访ftpftp://ftp.PostgreSQL.org/pub/
PostgreSQL补
使Bug交表 PostgreSQL件表Bug常以
* 交容个BugBug
* 交容个已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
以线PostgreSQLhttp://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(缺)CC项
载项好
们以计
PHP访PostgreSQLPerlTCLPython以
http://gborg.postgresql.orgDrivers/Interfaces
并Internet容索
2.2) 工以PostgreSQL Web 页
个以为http://www.webreview.com
对 Web PHP 个好http://www.php.net/
对任人 Perl 使CGI.pmDBD::Pg mod_perl
2.3)PostgreSQL形
人PostgreSQLGUI形工软件
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个容SQLINFORMATION 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个表中
就以 溢就常
SERIAL88
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
建表令个 符
为 符 该
* 建表 符使起
* 符使
* 为已 符询使 符起
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管工設
主管工PostgreSQLPostgreSQL
任人
人社 就件表
PostgreSQL詳 人常 (Developer's FAQ)
1.3) PostgreSQL 麼?
PostgreSQL BSD 許使
PostgreSQL 以 PostgreSQL
代碼以就 身追訴
責任就 以
就使BSD容
PostgreSQL 庫管系統
c1996-2005PostgreSQL c1994-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 SP4WinXP Win2003已製
http://pgfoundry.org/projects/pginstallerMSDOSWindows業
系統 Win95Win98WinMeCygwin模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 PerlTCLPython
以 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 形
人 PostgreSQLGUI 形工
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
建表令符
符統 該
* 建表符使起
* 符使寫
* 已符詢使符起
Frequently Asked Questions
Casto kladen dotazy (FAQ) PostgreSQL
Posledn aktualizace: 29. rjna 2007 (aktualizovno pro PostgreSQL
8.3)
Soucasn sprvce: Bruce Momjian (bruce@momjian.us)
Prelozil: Pavel Stehule (pavel.stehule@gmail.com)
Nejaktulnejs verzi tohoto dokumentu naleznete na adrese
http://www.postgresql.org/files/documentation/faqs/FAQ.html
Odpovedi na otzky vzan na konkrtn platformy naleznete na adrese
http://www.postgresql.org/docs/faq/.
_________________________________________________________________
Obecn otzky
1.1) Co je to PostgreSQL? Jak je sprvn vslovnost slova PostgreSQL?
1.2) Kdo rd vvoj PostgreSQL?
1.3) Pod jakou licenc je PostgreSQL?
1.4) Na kterch platformch lze provozovat PostgreSQL?
1.5) Kde mohu zskat PostgreSQL?
1.6) Jak je posledn verze?
1.7) Kde mohu zskat podporu?
1.8) Jak a kam hlsit chyby?
1.9) Kde najdu informace o znmch chybch nebo nepodporovanch
vlastnostech?
1.10) Jak je dostupn dokumentace?
1.11) Jak se mohu naucit SQL?
1.12) Jak se mohu pripojit k tmu vvojru?
1.13) Jak je na tom PostgreSQL v porovnn s jinmi databzemi?
1.14) Je PostgreSQL pripraven na aktuln zavden letnho casu v
nekterch zemch?
Dotazy na klientsk rozhran
2.1) Kter rozhran jsou pouziteln pro PostgreSQL?
2.2) Jak nstroje lze pouzt 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 prstup z jinch stanic?
3.3) Jak vyladit databzi na vyss vkon?
3.4) Jak mm ladc prostredky?
3.5) Co znamen "Sorry, too many clients", kdyz se zkousm pripojit?
3.6) Proc je nutn dump a obnoven (load) databze pri upgradu
PostgreSQL?
3.7) Jak hardware bych mel pouzvat?
Provozn dotazy
4.1) Jak zskat pouze prvn rdek dotazu? Nhodn rdek?
4.2) Jak zskm seznam tabulek, indexu, databz, a definovanch
uzivatelu. Mohu videt dotazy, kter pouzv psql pro zobrazen techto
informac?
4.3) Jak zmenit datov typ sloupce?
4.4) Jak je maximln velikost rdku, tabulky a databze?
4.5) Kolik diskovho prostoru je potreba k ulozen dat z normlnho
textovho souboru?
4.6) Muj dotaz je pomal a nepouzv vytvoren indexy. Proc?
4.7) Jak zjistm, jak se vyhodnocuje muj dotaz?
4.8) Jak pouzt case-(in)sensitive regulrn vraz? Jak pouzt index
pro case insensitive hledn?
4.9) Jak v dotazu detekovat, ze polozka je NULL? Jak bezpecne spojit
dva retezce, pokud mohou obsahovat NULL? Lze trdit podle toho, jestli
je polozka NULL nebo ne?
4.10) Jak jsou rozdly mezi ruznmi znakovmi typy?
4.11.1) Jak vytvorit serial/auto-increment polozku?
4.11.2) Jak zskat hodnotu SERIAL po vlozen rdku?
4.11.3) Nezpusob currval() a nextval() problmy ve vce uzivatelskm
prostred?
4.11.4) Proc nen vygenerovan cslo pouzito pri prerusen
transakce?Proc vznikaj dry v cslovn prostrednictvm sekvence nebo
typu SERIAL?
4.12) Co to je OID? Co je to CTID?
4.13) Co znamen chybov hlsen "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.14) Jak zjistm, kterou verzi PostgreSQL pouzvm?
4.15) Jak vytvorit sloupec, kter bude implicitne obsahovat aktuln
cas?
4.16) Jak provst vnejs spojen (outer join)?
4.17) Jak provst dotaz naprc nekolika databzemi?
4.18) Muze funkce vrtit vce rdku nebo sloupcu?
4.19) Co je prcinou chyby "relation with OID xxxxx does not exist"?
4.20) Jak jsou moznosti replikace databz?
4.21) Proc v dotazu nejsou rozpoznny nzvy mch tabulek nebo funkc?
Proc jsou velk psmena v nzvech automaticky prevedena na mal
psmena?
_________________________________________________________________
Obecn otzky
1.1) Co je to PostgreSQL? Jak je sprvn vslovnost slova PostgreSQL?
Vslovnost PostgreSQL je Post-Gres-Q-L , nebo zjednodusene Postgres .
V rade jazyku je slovo PostgreSQL obtzne vysloviteln, proto se v
hovoru casto pouzv zjednodusen forma nzvu. Pro ty, kter by si
rdi poslechli vslovnost, je k dispozici audiozznam v MP3 formtu.
PostgreSQL je relacn databze s nektermi objektovmi rysy, kter m
moznosti tradicnch komercnch databzovch systmu s nekolika
rozsrenmi, kter lze najt v DBMS systmech prst generace.
Pouzvn PostgreSQL nen omezen a vesker zdrojov kdy jsou volne
dostupn.
Za vvojem PostgreSQL je mezinrodn skupina nezvislch vvojru
navzjem komunikujcch prostrednictvm internetu. Tento projekt nen
rzen zdnou obchodn organizac. Pokud se chcete pridat k projektu,
prectete si vvojrsk FAQ na adrese
http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html .
1.2) Kdo rd vvoj PostgreSQL?
Pokud budete hledat organizaci rdc vvoj PostgreSQL, budete
zklamni. Nic takovho neexistuje. Existuj pouze "core" a CVS skupiny
uzivatelu, ale ty existuj vce z administrtorskch duvodu nez z
organizacnch. Projekt je smerovn komunitou vvojru a uzivatelu, ke
kter se kdokoliv muze pripojit. Jedin co potrebuje, je prihlsit se
do elektronick konference. Vce ve vvojrskm FAQ.
1.3) Pod jakou licenc je PostgreSQL?
PostgreSQL je predmetem nsledujcch autorskch prv:
Dlc Copyright (c) 1996-2009, PostgreSQL Global Development Group
Dlc Copyright (c) 1994-6, Regents of the University of California
Udeluje se oprvnen k uzit, rozmnozovn, provden prav a
rozsirovn tohoto softwaru a dokumentace k nemu, pro jakkoli cely,
bez licencnho poplatku a bez psemn licencn smlouvy, za podmnky,
ze na vsech jeho kopich je uvedeno oznmen o vse uvedench prvech,
jakoz i obsah tohoto a dvou nsledujcch odstavcu.
THE UNIVERSITY OF CALIFORNIA ("KALIFORNSK UNIVERZITA") NEN V ZDNM
PRPADE ODPOVEDNA ZDN TRET OSOBE ZA PRMOU, NEPRMOU, ZVLSTN,
NAHODILOU NEBO VSLEDNOU SKODU, VCETNE USLHO ZISKU, ZPUSOBENOU UZITM
TOHOTO SOFTWARU A DOKUMENTACE K NEMU, A TO I V PRPADE, ZE THE
UNIVERSITY OF CALIFORNIA BYLA INFORMOVNA O MOZNOSTI VZNIKU TAKOV
SKODY.
THE UNIVERSITY OF CALIFORNIA ZEJMNA NEPOSKYTUJE JAKKOLI ZRUKY, A TO
NEJEN ZRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VROBKU KE
SPECIFICKM CELUM. NZE UVEDEN SOFTWARE JE POSKYTNUT "JAK STOJ A
LEZ" A THE UNIVERSITY OF CALIFORNIA NEN POVINNA ZAJISTIT JEHO
DRZBU, PODPORU, AKTUALIZACI, VYLEPSEN NEBO MODIFIKACI.
Vse uveden je BSD licence, bezn licence otevrenho zdroje. Nen zde
zdn omezen ohledne uzit kdu zdroje. Jsme s tm spokojeni a nemme
v myslu na tto skutecnosti cokoli menit.
1.4) Na kterch platformch lze provozovat PostgreSQL?
Strucne receno, PostgreSQL bez na vsech modernch unixovch
systmech. Seznam tech, u kterch probehlo testovn, naleznete v
instalacnch instrukcch.
PostreSQL tak bez nativne na vsech Microsof Windows systmech
odvozench z Microsoft Windows NT jako jsou Windows 2000SP4, WindowsXP
a Windows2003. Instalacn balcek naleznete na adrese
http://pgfoundry.org/projects/pginstaller. Na starsch systmech s
jeste MS-DOS jdrem lze spustit PostgreSQL s emulacnm programem
Cygwin.
Dle 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 zskat PostgreSQL?
Pomoc webovho 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 plnu je uvolnovat kazdorocne jednu velkou verzi a kazdch nekolik
mescu mal verze.
1.7) Kde mohu zskat podporu?
Nejcastejs forma podpory uzivatelum PostgreSQL komunitou je
prostrednictvm e-mailu. Na nasem webovm serveru naleznete odkaz na
strnky,kde se muzete prihlsit do elektronick konference. Pro
zactek jsou doporucen konference general nebo bugs.
Dals cestou je IRC kanl #postgresql na Freenode (irc.freenode.net).
K pripojen pouzijte Unixov prkaz irc -x '#postgresql' "$USER"
irc.freenode.net nebo jakkoholiv jinho IRC klienta. V tto sti
existuje jeste spanelsk (#postgresql-es) a francouzsk
(#postgresqlfr) verze. Dals PostgreSQL kanl naleznete na EFNet.
Seznam spolecnost poskytujc komercn podporu naleznete na adrese
http://techdocs.postgresql.org/companies.php.
1.8) Jak a kam hlsit chyby?
Vyplnte formulr na adrese
http://www.postgresql.org/support/submitbug. Na nasem ftp serveru
ftp://ftp.postgresql.org/pub/ si overte, ze pouzvte aktuln verzi
PostreSQL.
Chyby reportovan prostrednictvm chybovho formulre nebo zaslnm
mailu do PostgreSQL konference obvykle generuje nsledujc odezvu:
* Nejedn se o chybu, a proc
* Jedn se o znmou chybu, kter je jiz v seznamu kolu TODO
* Tato chyba byla opravena v aktuln verzi
* Tato chyba byla jiz opravena ve verzi, kter zatm nebyla
oficilne uvolnena
* Pozadavek na dals doplnujc informace:
+ Operacn systm
+ Verze PostgreSQL
+ Test reprodukujc chybu
+ Ladc informace
+ Backtrace vstup debuggeru
* Jedn se o zatm nezjistenou chybu, pak muzete cekat
+ Zplatu odstranujc chybu, kter bude vlozena do dals velk
nebo mal verze
+ Informaci, ze se jedn o chybu, kterou nelze okamzite resit a
je proto pridna do TODO
1.9) Kde najdu informace o znmch chybch nebo nepodporovanch vlastnostech?
PostgreSQL podporuje rozsrenou podmnozinu SQL:2003. V nasem TODO
naleznete seznam znmch chyb, chybejcch vlastnost, a plny do
budoucna.
Odezva na pozadavek na novou vlastnost PostgreSQL je obvykle:
* Pozadavek je jiz v TODO
* Pozadovan funkce nen chten protoze
+ Duplikuje jiz existujc funkci, kter respektuje SQL
standard
+ Implementac funkce by se prlis zkomplikoval kd bez
relevantnho prnosu
+ Funkce by mohla bt nebezpecn nebo nespolehliv
* Pozadavek je pridn do TODO
PostgreSQL nepozv systm pro sledovn chyb, protoze jsme zjistili,
ze je efektivnejs prmo reagovat na maily a udrzovat aktuln TODO. V
praxi je snaha o co nejrychlejs resen chyb, a chyby, kter by se
mohly projevit u mnoha uzivatelu jsou opravovny velice rychle. Jedin
msto, kde lze dohledat vsechny zmeny, rozsren a opravy v PostgreSQL
je CVS log. Poznmky k verzi "Release notes" nezachycuj vsechny
zmeny, k nemz doslo.
1.10) Jak je dostupn dokumentace?
PostgreSQL obsahuje vynikajc dokumentaci zahrnujc manul,
manulov strnky a testovac prklady. Podvejte se do adresre /doc.
Manul je prstupn online na http://www.postgresql.org/docs.
K dispozici jsou zdarma dve online knihy na adresch
http://www.postgresql.org/docs/books/awbook.html a
http://www.commandprompt.com/ppbook/. Dals literaturu lze zakoupit.
Nejpopulrnejs je od Kerryho Douglase. Seznam dostupn literatury je
na http://techdocs.postgresql.org/techdocs/bookreviews.php. Jeste je
kolekce technicky orientovanch clnku tematicky spojench s
PostgreSQL na adrese http://techdocs.postgresql.org/.
Rdkov klient psql m \d prkazy pro zobrazen informac o typech,
opertorech, funkcch, agregacnch funkc, atd. Pouzijte \? pro
zobrazen dostupnch prkazu.
Dals dokumentaci najdete na nasem webu.
1.11) Jak se mohu naucit SQL?
Podvejte se do vse 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 tutorily jsou dostupn na adresch:
* 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 tmu vvojru?
Prostudujte si Developer's FAQ.
1.13) Jak je na tom PostgreSQL v porovnn s jinmi databzemi?
Software muzeme porovnvat z nekolika ruznch pohledu: vlastnosti,
vkon, spolehlivost, podpora a cena.
Vlastnosti
PostgreSQL nabz vetsinu funkc funkcionality velkch komercnch DBMS
systmu jako jsou: transakce, vnoren dotazy, spouste, referencn
integrita a sofistikovan systm zamykn. Poskytujeme urcit funkce,
kter ostatn systmy bezne nepodporuj. Napr. uzivatelem definovan
typy, dedicnost, pravidla (rules), a MVCC architekturu.
Vkon
Vkon PostgreSQL je srovnateln s ostatnmi komercnmi nebo Open
Source databzemi. V nekterch prpadech je rychlejs, jindy
pomalejs. Ns vkon je obvykle +/-10% vuci ostatnm databzm.
Spolehlivost
Uvedomujeme si, ze databze mus bt stoprocentne spolehliv, jinak je
nepouziteln. Snazme se, aby kazd verze byla dobre otestovna a
obsahovala minimum chyb. Kazd verze je minimlne nekolik mescu v
beta testovacm rezimu. Do produkcnho rezimu se dostane, az kdyz
nedochz k dalsm zmenm nebo opravm. Verme, ze jsem vce nez
srovnateln s ostatnmi databzemi v tto oblasti.
Podpora
Na nasich internetovch konferencch se setkv velk skupina vvojru
a uzivatelu pri resen vyskytujcch se problmu. Nase internetov
konference umoznuj kontakt velk skupiny vvojru a uzivatelu.
Nemuzeme garantovat opravu chyby, ale komercn DBMSs tak vzdy
negarantuj resen problmu. Verme ale, ze dky prmmu kontaktu na
vvojre, nasi uzivatelskou komunitu, manulum, a dostupnm zdrojovm
kdum mme leps podporu nez ostatn DBMSs. Pro ty, kter preferuj
komercn "per-incident" podporu, existuje spolecnost, kter ji
nabzej (FAQ sekce 1.7.)
Cena
PostgreSQL lze pouzvat bezplatne (a to i pro komercn pouzit). Tak
muzete neomezene pouzvat ns kd ve svch produktech s vjimkami
specifikovanmi v nas licenci (prebrme BSD licenci).
1.14) Je PostgreSQL pripraven na aktuln zavden letnho casu v nekterch
zemch?
Pocnaje verz 8.0.[4+] podporuje PostgreSQL letn cas tak pro USA.
Podpora letnho casu (daylight saving time) pro Kanadu a Zpadn
Austrlii je obsazena ve verzch 8.0.[10+] a 8.1.[6+] a vsech
nsledujcch verzch. Stars verze pouzvaly systmovou databzi
casovch zn obsahujc, krome jinho, informaci o tom, zda se pro
danou casovou znu rozlisuje mezi letnm a zimnm casem.
_________________________________________________________________
Dotazy na klientsk rozhran
2.1) Kter rozhran jsou pouziteln pro PostgreSQL?
PostgreSQL se distribuuje pouze s rozhranm pro jazyk C a embedded C.
Vsechna dals rozhran predstavuj nezvisl projekty, kter je treba
sthnout z internetu samostatne. Osamostatnen techto projektu
umoznuje nezvislost vvojovch tmu a moznost vydvat nov verze bez
ohledu na vydn nov verze PostgreSQL.
Nekter programovac jazyky jako je napr. PHP obsahuj rozhran pro
PostgreSQL. Rozhran pro jazyky jako je Perl, Tcl, Python a mnoho
dalsch jsou dostupn na adrese: http://gborg.postgresql.org v sekci
Drivers/Interfaces.
2.2) Jak nstroje lze pouzt pro PostgreSQL a web?
Dobrm vodem do problematiky databz v prostred webovch strnek
muze bt web http://www.webreview.com.
PHP (http://www.php.net) je vynikajcm rozhranm pro tvorbu webu.
Pro slozitejs lohy se casto pouzv 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 grafickch nstroju podporujcch PostgreSQL a to
od komercnch nebo open source vvojru. 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 prstup z jinch stanic?
Ve vchoz konfiguraci, PostgreSQL umoznuje pouze pripojen z
loklnho uzivatele prostrednictvm 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 ostatnch stanic. Zmena vse zmnench parametru vyzaduje
restart databzovho serveru.
3.3) Jak vyladit databzi na vyss vkon?
Vkon systmu muzete ovlivnit ve trech oblastech:
Zmeny dotazu
* Pouzitm indexu vcetne cstecnch a funkcionlnch
* Pouzitm COPY msto opakovanch INSERTu
* Sloucenm mnoha SQL prkazu do jedn transakce snzenm rezie na
commit
* Pouzvnm CLUSTERU, pokud nactte vets pocet rdek podle indexu
* Pouzitm klauzule LIMIT v poddotazech
* Pouzitm predpripravench dotazu
* Pouzvnm ANALYZE. Tento prkaz aktualizuje statistiky, kter se
pouzvaj pri optimalizaci dotazu
* Pravideln pouzit VACUUM nebo pouzvn pg_autovacuum
* Odstranenm indexu pred rozshlmi zmenami v datech
Konfigurace serveru
Urcit parametry v souboru postgresql.conf maj vliv na vkon serveru.
Detaily naleznete v prrucce Administrtora v Server Run-time
Environment/Run-time Configuration. Dals komentre naleznete v
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.ht
ml a http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
Vber hardware
Vliv hardware na vkon serveru je popsn v dokumentech
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html
a http://www.powerpostgresql.com/PerfList/.
3.4) Jak mm ladc prostredky?
Nastavenm log_* promennch v konfiguraci serveru si vynutte logovn
dotazu a procesnch statistik, kter Vm mohou pomoci pri laden a
optimalizaci vkonu.
3.5) Co znamen "Sorry, too many clients", kdyz se zkousm pripojit?
Prekrocil jste vchoz limit, kter je 100 soucasne pripojench
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) databze pri upgradu PostgreSQL?
Zpusob cslovn je popsn v dokumentaci na
http://www.postgresql.org/support/versioning. Instrukce k proveden
migrace na vyss verzi jsou taktz v dokumentaci na adrese
http://www.postgresql.org/docs/current/static/install-upgrading.html.
3.7) Jak hardware bych mel pouzvat?
Jelikoz PC jsou vetsinou kompatibiln, lid maj tendence verit, ze
vsechna PC jsou stejne kvalitn. Coz nen pravda. Pameti ECC, SCSI a
kvalitn zkladn desky jsou mnohem spolehlivejs a vkonnejs nez
lacinejs hardware. PostgreSQL pobez na vetsine hardwaru, nicmne
pokud je pro Vs spolehlivost a vkon systmu dulezit, je dobr
venovat cas nalezen vhodn hardwarov konfigurace. Na nasich
elektronickch konferencch muzete diskutovat o vhodnch konfiguracch
a znackch.
_________________________________________________________________
Provozn dotazy
4.1) Jak zskat pouze prvn rdek dotazu? Nhodn rdek?
Pokud potrebujete pouze nekolik rdku a pokud vte kolik, pouzijte
SELECT LIMIT. Pokud bude mozn pouzt index shodujc se s ORDER BY,
je mozn, ze se nebude provdet cel dotaz. Pokud neznte pocet
zznamu, pouzijte kurzor a prkaz FETCH.
Pro vber nhodnho rdku pouzijte prkaz ve tvaru:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) Jak zskm seznam tabulek, indexu, databz, a definovanch uzivatelu.
Mohu videt dotazy, kter pouzv psql pro zobrazen techto informac?
V psql prkazem \dt zskte seznam tabulek. pln seznam prkazu psql
zskte prkazem \?. Alternativne si muzete prostudovat zdrojov kd
psql - soubor pgsql/src/bin/psql/describe.c, kter obsahuje SQL
prkazy, kter jsou generovny pro zskn vstupu psql "backslash"
prkazu. Tak muzete nastartovat psql s parametrem -E, kter zpusob
zobrazen vsech SQL prkazu, kter se odeslaj na server. PostgreSQL
tak podporuje SQL standard INFORMACN SCHMATA (standardn systmov
tabulky). Klasickm dotazem do systmovch tabulek zskte pozadovan
informace o strukture databze.
Systmov tabulky PostgreSQL (mimo rmec SQL standardu) pouzvaj
prefix pg_. Pro zjisten struktury databze je muzete pouzt tak, i
kdyz preferovny jsou dotazy do informacnho schmatu.
Seznam vsech databz zskte prkazem psql -l
Dals inspiraci najdete v souboru pgsql/src/tutorial/syscat.source.
Obsahuje ilustracn SELECTy potrebn k zskn informac z systmovch
tabulek databze.
4.3) Jak zmenit datov typ sloupce?
Ve verzch 8.0 a pozdejsch jednoduse:
ALTER TABLE ALTER COLUMN TYPE
V starsch verzch:
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 prkaz VACUUM FULL, aby doslo k uvolnen diskovho
prostoru pouzitho v tu chvli jiz neplatnmi zznamy.
4.4) Jak je maximln velikost rdku, tabulky a databze?
PostgreSQL m tato omezen:
Maximln velikost databze: neomezena (existuj 32TB db)
Maximln velikost tabulky: 32 TB
Maximln velikost rdky: 480GB
Maximln velikost polozky 1 GB
Maximln pocet rdku v tabulce: neomezeno
Maximln pocet sloupcu v tabulce: 250-1600 podle typu
Maximln pocet indexu na tabulce: neomezeno
Ve skutecnosti nic nen neomezeno, limitem bv vzdy dostupn diskov
pamet nebo velikost operacn pameti. Pokud mte nekterou z techto
hodnot neobvykle velkou, muze dojt ke snzen vkonu.
Maximln velikost tabulky je 32 TB a nevyzaduje podporu velkch
souboru operacnm systmem. Velk tabulky se ukldaj do nekolika 1 GB
souboru takze limity souborovho systmu nejsou podstatn.
Maximln velikost tabulky a maximln pocet sloupcu muzeme
zectyrnsobit nastavenm velikosti bloku na 32K.
Indexy jsou povolen pouze na sloupcch jejichz dlka je mens nez
2000 znaku. Pokud tuto dlku prekrocme a index potrebujeme pro
zajisten jednoznacnosti, je vhodnejs pouzt funkcionln index nad
MD5 funkc nebo fulltextov index.
4.5) Kolik diskovho prostoru je potreba k ulozen dat z normlnho textovho
souboru?
PostgreSQL vyzaduje az petinsobek diskovho prostoru k ulozen dat z
textovho souboru.
Naprklad, uvazujme soubor se 100 tisci rdky obsahujc na kazd
rdce cel cslo a textov popis. Text je v prumerne dvacet bytu
dlouh. Textov soubor bude 2.8 MB dlouh. Velikost databze
obsahujc odpovdajc data bude zhruba 5.2 MB.
24 bytu: hlavicka rdku (priblizne)
24 bytu: jedna celocseln polozka a jedna textov
+ 4 byty: ukazatel na strnku k entici
------------------------------------------------------
52 bytu na rdek
Velikost datov strnky PostgreSQL je 8192 bytu (8KB)
8192 bytu na strnce
---------------------- = 158 rdek na strnku
52 bytu za rdek
100000 rdek
----------------------- = 633 strnek (zaokrouhleno nahoru)
158 rdek na strnce
633 datovch strnek * 8192 bytu na kazdou strnku = 5,185,536 bytu (5.2 MB)
Indexy nemaj tak velkou rezii, ale mohou bt tak velk, protoze
obsahuj indexovan data.
Hodnoty NULL jsou ulozeny v bitmapch, takze zabraj jen velmi mlo
diskovho prostoru.
4.6) Muj dotaz je pomal a nepouzv vytvoren indexy. Proc?
Kazd dotaz nemus nutne pouzt existujc indexy. Index se pouzije
tehdy, kdyz je tabulka vets nez urcit minimln velikost, a dotaz
vybr pouze procentulne malou cst rdku tabulky. To proto, ze
nhodn prstup k disku dan ctenm indexu muze bt pomalejs nez
linern cten tabulky nebo sekvencn cten.
PostgreSQL rozhoduje o pouzit indexu na zklade statistiky prstupu k
tabulce. Tyto statistiky se shromazduj prkazy VACUUM ANALYZE nebo
ANALYZE. Dky statistikm m optimizer informaci o poctu rdek v
tabulce a muze lpe rozhodnout o pouzit indexu. Statistiky se uplatn
pri urcen optimlnho porad a metody spojen tabulek. Statistiky by
se meli aktualizovat opakovane, tak jak se men obsah tabulek.
Indexy nejsou obycejne pouzity pro setrden nebo spojen tabulek.
Sekvencn zpracovn nsledovan explicitnm trdenm je obycejne
rychlejs nez pouzit indexu na velk tabulce.
Jinak je tomu v prpade pouzit LIMIT a ORDER BY, pri kterm se
vetsinou index pouzije, jelikoz je vsledkem pouze mal cst tabulky.
Pokud si myslte, ze optimizer mylne zvolil sekvencn prohledvn
tabulky, pouzijte prkaz SET enable_seqscan TO 'off' a zkuste zda je
prohledvn s indexem rychlejs.
Pri vyhledvn na zklade vzoru jako je napr. opertor LIKE nebo ~ se
indexy pouzij pouze za urcitch skutecnost:
* zactek hledanho vzoru mus bt ukotven k zactku, tj.
+ vzor LIKE nesm zacnat %
+ ~ regulrn vraz mus zacnat ^
* vzor nesm zacnat intervalem, napr. [a-e]
* vyhledvan, kter nen Case sensitiv jako je ILIKE nebo ~*
nepouzv indexy. Muzete ale pouzt funkcionln indexy, kter
jsou popsny v sekci 4.8
* pri inicializaci databze (initdb) mus bt pouzito C locale nebo
vytvorte speciln text_pattern_index, kter umozn, pri
respektovn zmnench podmnek pouzit indexu operac LIKE. Pro
vyhledvn celch slov je mozn a vhodn pouzt fulltext.
4.7) Jak zjistm, jak se vyhodnocuje muj dotaz?
Podvejte se do npovedy k prkazu EXPLAIN.
4.8) Jak pouzt case-(in)sensitive regulrn vraz? Jak pouzt index pro case
insensitive hledn?
Vyhledvn prostrednictvm regulrnch vzoru zajistuje opertor ~,
kter je case-sensitive. Jeho case-insensitive varianta je opertor
~*. Case-insensitive variac opertoru LIKE je opertor ILIKE.
Case-insensitive vyhledn se res:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Tento dotaz nepouzije standardn index. Muste pouzt tzv.
funkcionln index:
CREATE INDEX tabindex ON tab (lower(col));
Pokud index vytvorme jako uniktn, tak muzeme ukldat retezce
obsahujc mal i velk psmena, ale nikoliv retezce, kter se od sebe
odlisuj jen v malch a velkch psmenech. K zajisten zpisu retezce
obsahujc pouze mal nebo pouze velk psmena 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 trdit podle toho, jestli je polozka
NULL nebo ne?
Pokud chcete testovat hodnotu NULL pouzijte opertor IS:
SELECT *
FROM tab
WHERE col IS NULL;
K spojen retezcu, kter mohou obsahovat hodnotu NULL, pouzvejte
funkci COALESCE(), napr.:
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
Pokud chcete trdit podle hodnoty NULL, pouzijte vraz 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 zznamy s NULL budou na zactku setrdench dat.
4.10) Jak jsou rozdly mezi ruznmi znakovmi typy?
Typ Intern nzev Poznmky
VARCHAR(n) varchar n urcuje maximln dlku
CHAR(n) bpchar retezec je do dan dlky rozsren mezerami
TEXT text bez omezen dlky
BYTEA bytea pole bytu nespecifikovan dlky
"char" char jeden znak
Na intern nzvy muzete narazit v systmovm katalogu nebo v nekterch
chybovch hlsench.
Ctyri prvn typy jsou tzv. varlena typy (prvn ctyri byty na disku
jsou obsahuj dlku, ostatn obsahuj vlastn data). Skutecne obsazen
prostor je tedy o neco mlo vets nez deklarovan velikost. Na druhou
stranu, dels retezce jsou komprimovny, takze obsazen prostor na
disku muze bt mens nez se cek.
VARCHAR(n) je vhodn pro ukldn ruzne dlouhch retezcu u kterch
znme dlkov omezen, TEXT pro retezce bez omezen dlky (maximum je
jeden gigabyte).
CHAR(n) se pouzv pro ulozen stejne dlouhch retezcu. CHAR(n) dopln
mezerami na specifikovanou dlku, VARCHAR(n) hodnoty se ukldaj tak
jak jsou. BYTEA je pro ukldn binrnch dat - non ASCII hodnot.
Vsechny zmnen typy maj podobn vkonov charakteristiky.
4.11.1) Jak vytvorit serial/auto-increment polozku?
V PostgreSQL muzete pouzt datov typ SERIAL. Jeho pouzitm se
automaticky vytvor sekvence. Naprklad:
CREATE TABLE person (
id SERIAL,
name TEXT
);
je automaticky transformovno na:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
Podrobnejs informace najdete v manulu v popisu prkazu
create_sequence.
4.11.2) Jak zskat hodnotu SERIAL po vlozen rdku?
Nejjednodussm zpusob, jak zskat vygenerovanou hodnotu typu SERIAL,
je vyuzt klauzuli RETURNING. Pro tabulku z 4.11.1 vypad takto:
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
Tak muzete pouzt funkci nextvall() a jej vsledek pouzt v prkazu
INSERT, nebo zavolat currval() po proveden prkazu INSERT.
4.11.3) Nezpusob currval() a nextval() problmy ve vce uzivatelskm
prostred?
Ne, currval vrac vzdy hodnotu, kter byla vygenerovna pro vs.
4.11.4) Proc nen vygenerovan cslo pouzito pri prerusen transakce?Proc
vznikaj dry v cslovn prostrednictvm sekvence nebo typu SERIAL?
Pot co sekvence vygeneruje nov cslo, tak se nedochz k zamcen
sekvence a necek se na spesn nebo nespesn dokoncen transakce.
Odvolnm transakce, kter si vyzdala csla sekvence se tato csla
nenvratne ztrat.
4.12) Co to je OID? Co je to CTID?
V prpade, ze tabulku nezalozme s atributem WITHOUT OIDS, tak m
kazd rdek uniktn identifikacn cslo OID. Toto cslo je 4 bajtov
cel cslo, kter je jedinecn v cel instalaci. Pretece po 4
miliardch rdku. PostgreSQL pouzv OIDs jako intern linky v
internch systmovch tabulkch.
K zskn uniktnho csla v nesystmovch tabulkch je vhodnejs
pouzit typu SERIAL nez OID, jelikoz sekvence SERIAL se pouzv pouze
pro jednu tabulku a je tudz mne nchyln na pretecen. Pokud byste
se toho obvali, pouzijte typ SERIAL8.
CTID se pouzv k identifikaci konkrtnho fyzickho rdku. CTID se
men pokud je rdek modifikovn nebo znovu nacten. Pouzvaj ho indexy
jako adresaci fyzickch rdku.
4.13) Co znamen chybov hlsen "ERROR: Memory exhausted in
AllocSetAlloc()"?
Pravdepodobne jste vycerpal dostupnou virtuln pamet, nebo tvuj
kernel m prlis nzk limity u urcitch zdroju. Pred startem
PostgreSQL vyzkousejte:
ulimit -d 262144
limit datasize 256m
Mozn, ze se projde pouze jeden prkaz - zlez to na vasem shellu.
Mel by zvednout limity datovch segmentu vasich procesu na dostatecne
velkou hodnotu a snad umoznit dokoncen dotazu. Zmena limitu se bude
aplikovat pouze na aktuln proces a na vsechny nove vytvoren
procesy. Jestlize mte problm s SQL klientem, protoze vm server
vrtil prlis dat, zkuste to pred startem klienta.
4.14) Jak zjistm, kterou verzi PostgreSQL pouzvm?
V psql napiste:
SELECT version();
4.15) Jak vytvorit sloupec, kter bude implicitne obsahovat aktuln cas?
Pouzijte CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
4.16) Jak provst vnejs spojen (outer join)?
PostgreSQL podporuje standardn SQL syntaxi pro vnejs spojen. Zde
jsou dva prklady:
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
vrt vsechny nesprovan rdky t2 (ty, kter nedohled v t2). RIGHT
JOIN by pripojil vsechny nesprovan rdky z t2. FULL JOIN vrt
vsechny sprovan rdky i vsechny zbvajc rdky z obou tabulek.
Klcov slovo OUTER je voliteln. Bezn operace JOIN se tak oznacuje
jako vnitrn spojen.
4.17) Jak provst dotaz naprc nekolika databzemi?
Neexistuje zdn zpusob, jak se v dotazu odkazovat na tabulky z jin
nez aktuln databze. A to protoze m systmov tabulky ulozen
nezvisle v kazd databzi a nen tak plne zrejm, jak by se dotaz
proveden naprc databzemi mel chovat.
Jeden z doplnku dblink umoznuje dotaz nad nekolika tabulkami pomoc
funkc. Druh zpusob je simultln pripojen klienta ke vsem
relevantnm databzm a sloucen vsledku na strane klienta.
4.18) Muze funkce vrtit vce rdku nebo sloupcu?
Jde to jednoduse pomoc set-returning funkce. Vce na
http://www.postgresql.org/docs/techdocs.17.
4.19) Co je prcinou chyby "relation with OID xxxxx does not exist"?
Nechtenm vedlejsm efektem kesovn SQL dotazu v PL/pgSQL funkci je
problm s neplatnmi odkazy na docasn tabulky, kter byly od prvnho
spusten funkce zruseny a znovu vytvoreny pred dalsm spustenm
PL/pgSQL funkce. Resenm je pouzt prkaz EXECUTE a to proto, ze
provdec pln SQL prkazu spoustenho prkazem EXECUTE se vytvr
pokazd znovu (neukld se do cache).
Tento problm by se nemel vyskytovat u PostgreSQL verze 8.3 a vyssch
verzch.
4.20) Jak jsou moznosti replikace databz?
Replikaci databze umoznuje nekolik technoligi. Kazd m urcit
vhody a nevhody.
Master/Slave replikaci podporuje jeden hlavn server, kter prijm
pozadavky na zpis a cten, a nekolik podrzench serveru, kter
umoznuj pouze cten (SELECT). Nejrozsrenejsm volne dostupnm
resenm tohoto typu je Slony-I.
Replikace typu Multi-master podporuje existenci nekolika serveru s
povolenm zpisem na vce replikovanch serverech. Toto resen zvysuje
ztez serveru, protoze je nutn synchronizace serveru.
Nejrozsrenejsm volne dostupnm resenm je PGCluster.
Jeste existuje nekolik komercnch a hardware resen replikac
podporujcch ruzn modely replikace.
4.21) Proc v dotazu nejsou rozpoznny nzvy mch tabulek nebo funkc? Proc
jsou velk psmena v nzvech automaticky prevedena na mal psmena?
Nejcastejsm duvodem nerozpoznn nzvu objektu bylo pouzit vlozen
nzvu sloupce nebo tabulky mezi uvozovky pri zakldn tabulky. Pokud
se nzev zapse mezi uvozovky, pak je case sensitive, a v dusledku
toho je nutn nzvy techto sloupcu nebo tabulek v SQL prkazech tak
vkldat mezi uvozovky (pokud obsahuj velk psmena). Nekter
programy, jako je naprklad pgAdmin, automaticky pouzvaj uvozovky.
Takze pokud chcete, aby systm identifikoval identifiktor, muste:
* nepouzvat uvozovky v prkazu CREATE TABLE
* v identifiktoru pouzt pouze mal psmena
* v dotazech vkldat identifiktory do uvozovek
This source diff could not be displayed because it is too large. You can view the blob instead.
Foire Aux Questions (FAQ) pour PostgreSQL
Dernière mise à jour : vendredi 14 novembre 2004 16:32:47
Mainteneur actuel : Bruce Momjian (pgman@candle.pha.pa.us)
La plus récente version de ce document est disponible sur
http://www.PostgreSQL.org/docs/faqs/FAQ.html.
Les questions spécifiques à la plateforme sont répondues sur
http://www.PostgreSQL.org/docs/index.html.
_________________________________________________________________
Questions générales
1.1) Qu'est ce que PostgreSQL ? Comment le prononcer ?
1.2) Quelle est la licence de PostgreSQL ?
1.3) Sous quels environnements Unix PostgreSQL tourne-t-il ?
1.4) Sous quels environnements non-Unix PostgreSQL tourne-t-il ?
1.5) Où puis-je me procurer PostgreSQL ?
1.6) Où puis-je obtenir du support ?
1.7) Quelle est la dernière version ?
1.8) Quelle documentation est disponible ?
1.9) Comment savoir quels sont les bogues connus ou les
fonctionnalités manquantes ?
1.10) Comment puis-je apprendre le SQL ?
1.11) PostgreSQL est-il compatible an 2000 ?
1.12) Comment puis-je rejoindre l'équipe de développement ?
1.13) Comment dois-je soumettre un rapport de bogue ?
1.14) Comment PostgreSQL se compare-t'il à d'autres SGBD ?
1.15) Comment puis-je aider financièrement PostgreSQL ?
Questions sur le client utilisateur
2.1) Y a-t-il des pilotes ODBC pour PostgreSQL ?
2.2) Quels outils sont disponibles pour utiliser PostgreSQL avec des
pages Web ?
2.3) PostgreSQL a-t-il une interface graphique ?
2.4) Quels langages sont disponibles pour communiquer avec
PostgreSQL ?
Questions administratives
3.1) Comment installer PostgreSQL ailleurs que sous /usr/local/pgsql ?
3.2) Quand je lance postmaster, j'obtiens un Bad System Call ou un
message core dumped. Pourquoi ?
3.3) Quand je lance postmaster, j'obtiens des erreurs IpcMemoryCreate.
Pourquoi ?
3.4) Quand je lance postmaster, j'obtiens des erreurs
IpcSemaphoreCreate. Pourquoi ?
3.5) Comment contrôler les connexions d'autres machines ?
3.6) Comment règler le moteur de la base de données pour de meilleures
performances ?
3.7) Quelles fonctionalités de déboguage sont disponibles ?
3.8) Pourquoi est-ce que j'obtiens des messages Sorry, too many
clients quand je me connecte ?
3.9) Que contient le répertoire pgsql_tmp ?
3.10) Pourquoi ai-je besoin de faire une sauvegarde des bases et de
restaurer pour mettre a jour les versions de PostgreSQL ?
3.11) Quels matériels dois-je utiliser ?
Questions fonctionnelles
4.1) Quelle est la différence entre curseur binaire et curseur
normal ?
4.2) Comment faire un SELECT seulement sur les premières lignes d'une
requête ? Sur une ligne aléatoire ?
4.3) Comment obtenir une liste des tables ou d'autres choses que je
vois dans psql ?
4.4) Comment supprime-t-on une colonne d'une table, ou comment
change-t-on son type de données ?
4.5) Quelle est la taille maximale pour une ligne, une table et une
base de données ?
4.6) Combien d'espace disque faut-il pour stocker les données d'un
fichier texte typique ?
4.7) Comment puis-je savoir quels index, tables, bases de données et
utilisateurs sont définis ?
4.8) Mes requêtes sont lentes ou ne font pas usage des index.
Pourquoi ?
4.9) Comment puis-je savoir si l'optimiseur évalue mes requêtes ?
4.10) Qu'est-ce qu'un index R-tree ?
4.11) Qu'est-ce que l'optimiseur génétique de requêtes ?
4.12) Comment puis-je réaliser des recherches par des expressions
rationnelles ainsi que des recherches non sensibles à la casse ?
Comment puis-je utiliser un index lors de recherches non sensibles à
la casse ?
4.13) Comment puis-je détecter si un champ est NULL dans une requête ?
4.14) Quelle sont les différences entre les nombreux types de
caractères ?
4.15.1) Comment puis-je créer un champ série, c'est-à-dire
s'incrémentant automatiquement ?
4.15.2) Comment puis-je obtenir la valeur d'un SERIAL suite à une
insertion ?
4.15.3) Est-ce que currval() et nextval() n'amènent pas des problèmes
lorsque plusieurs utilisateurs les lancent en même temps ?
4.15.4) Pourquoi mes numéros de séquences ne sont pas ré-utilisés lors
d'une annulation de transaction ? Pourquoi existe-t'il des trous dans
la numérotation de ma colonne séquentielle (SERIAL) ?
4.16) Qu'est-ce qu'un OID? Qu'est-ce qu'un TID ?
4.17) A quoi correspond certains termes utilisés avec PostgreSQL ?
4.18) Pourquoi ai-je l'erreur ERROR: Memory exhausted in
AllocSetAlloc() ?
4.19) Comment puis-je connaître la version de PostgreSQL que
j'utilise ?
4.20) Pourquoi ai-je invalid large obj descriptor lors d'opérations
avec des gros objets ?
4.21) Comment puis-je créer une colonne qui aura par défaut l'heure
actuelle comme valeur ?
4.22) Pourquoi mes sous-requêtes utilisant IN sont-elles si lentes ?
4.23) Comment puis-je réaliser une jointure externe ?
4.24) Comment puis-je lancer des requêtes utilisant plusieurs bases de
données ??
4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes à partir
d'une fonction ?
4.26) Pourquoi ne puis-je pas créer/supprimer des tables temporaires
dans les fonctions PL/PgSQL de façon stable ?
4.27) Quelles options de cryptage sont disponibles ?
Etendre PostgreSQL
5.1) J'ai écrit une fonction utilisateur. Lorsque je l'exécute avec
psql, pourquoi cela finit-il avec un "dump core" ?
5.2) Comment puis-je contribuer avec de nouveaux types et fonctions
pour PostgreSQL ?
5.3) Comment puis-je écrire une fonction C pour récupérer une ligne ?
5.4) J'ai modifié un fichier source. Pourquoi la modification
n'est-elle pas visible après la recompilation ?
_________________________________________________________________
Questions générales
1.1) Qu'est ce que PostgreSQL ? Comment le prononcer ?
PostgreSQL se prononce Post-Gres-Q-L. Un fichier audio est disponible
sur http://www.postgresql.org/postgresql.mp3 pour ceux souhaitant
entendre la prononciation.
PostgreSQL est une amélioration du système de gestion de bases de
données POSTGRES (et est toujours quelque fois appelé "Postgres"), un
prototype de recherche de SGBD de prochaine génération. PostgreSQL
garde le puissant modèle de données et les types de données riches de
POSTGRES, mais remplace le langage de requêtes PostQuel par un
sous-ensemble étendu de SQL. PostgreSQL est gratuit et les sources
complets sont disponibles.
PostgreSQL est écrit par une équipe de développeurs qui sont tous
inscrits à la liste de diffusion de développement de PostgreSQL. Le
coordinateur actuel est Marc G. Fournier (scrappy@PostgreSQL.org et
voir la section 1.6 pour contacter les développeurs). Cette équipe est
responsable de tout le développement de PostgreSQL. C'est un projet
soutenu par une communauté sans être contrôlé par une société. Pour y
contribuer, voir la FAQ des développeurs sur
http://www.postgresql.org/docs/faqs/FAQ_DEV.html.
Les auteurs de PostgreSQL 1.01 étaient Andrew Yu et Jolly Chen.
Beaucoup d'autres personnes ont contribué au portage, aux tests, au
déboguage et à l'amélioration du code. Le code de Postgres original,
duquel PostgreSQL est dérivé, était le fruit de l'effort de nombreux
étudiants diplômés et non diplômés, et de programmeurs travaillant
sous la direction du Professeur Michael Stonebraker à l'université de
Californie, Berkeley.
Le nom original du logiciel à Berkeley était Postgres. Quand le SQL
fut ajouté en 1995, le nom a dû être changé en Postgres95. Fin 1996,
le nom fut changé en PostgreSQL.
1.2) Quelle est la licence de PostgreSQL ?
PostgreSQL est distribué sous la licence suivante :
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.
La licence ci-dessus est la licence BSD, une licence open-source
classique.
1.3) Sous quels environnements Unix PostgreSQL tourne-t-il ?
En général, tout environnement compatible Unix moderne devrait pouvoir
faire fonctionner PostgreSQL. Les environnements qui ont été testés
explicitement sont listés dans les instructions d'installation.
1.4) Sous quels environnements non Unix PostgreSQL fonctionne-t'il ?
À partir de la version 8.0, PostgreSQL fonctionne nativement sur les
systèmes d'exploitation Microsoft Windows à base NT comme Win2000,
WinXP et Win2003. Un installeur est disponible sur
http://pgfoundry.org/projects/pginstaller.
Il existe aussi un port sur Novell Netware sur
http://forge.novell.com.
1.5) Où puis-je me procurer PostgreSQL ?
Le site FTP anonyme principal de PostgreSQL est
ftp://ftp.PostgreSQL.org/pub. Pour les sites miroirs, voir notre site
web principal.
1.6) Où puis-je obtenir du support ?
La liste de diffusion principale est pgsql-general@PostgreSQL.org.
Elle est disponible pour discuter de sujets en rapport avec
PostgreSQL. Pour s'y inscrire, il faut envoyer un courriel avec les
lignes suivantes dans le corps du message (pas dans la ligne du
sujet) :
subscribe
end
à pgsql-general-request@PostgreSQL.org.
Il existe aussi un recueil de la liste. Pour s'y inscrire, envoyez un
courriel à pgsql-general-digest-request@PostgreSQL.org avec dans le
corps :
subscribe
end
Les recueils sont envoyés aux membres de cette liste dès que la liste
principale a reçu 30 Ko de messages.
Une liste de diffusion de bogues est disponible. Pour s'y inscrire,
envoyer un courriel à pgsql-bugs-request@PostgreSQL.org avec dans le
corps :
subscribe
end
Une liste de diffusion pour les développeurs est aussi disponible.
Pour s'y inscrire, envoyez un courriel à
pgsql-hackers-request@PostgreSQL.org avec dans le corps :
subscribe
end
Vous pouvez trouver d'autres listes et informations sur PostgreSQL sur
le site web de PostgreSQL :
http://www.PostgreSQL.org
Il y a aussi un canal IRC sur Freenode et EFNet, le canal #PostgreSQL.
Vous pouvez utiliser la commande Unix irc -c '#PostgreSQL' "$USER"
irc.phoenix.net ou irc -c '#PostgreSQL' "$USER" irc.freenode.net.
Une liste de sociétés pouvant fournir un support commercial est
disponible sur http://techdocs.postgresql.org/companies.php.
1.7) Quelle est la dernière version ?
La dernière version de PostgreSQL est la version 7.4.5.
Nous projetons de sortir une version majeure tous les six à huit mois.
1.8) Quelle documentation est disponible ?
Plusieurs manuels, pages de manuel ainsi que des petits exemples de
test sont inclus dans la distribution. Voir le répertoire /doc. Vous
pouvez aussi accéder aux manuels en ligne sur
http://www.PostgreSQL.org/docs.
Deux livres sur PostgreSQL sont disponibles en ligne sur
http://www.PostgreSQL.org/docs/awbook.html et
http://www.commandprompt.com/ppbook/. Il y a une liste de livres sur
PostgreSQL pouvant être achetés sur
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Il y a aussi
une collection d'articles techniques sur PostgreSQL sur
http://techdocs.PostgreSQL.org/.
psql possède des commandes \d pratiques montrant des informations sur
les types, opérateurs, fonctions, aggrégats, etc.
Notre site web contient encore plus de documentations.
1.9) Comment savoir quels sont les bogues connus ou les fonctionnalités
manquantes ?
PostgreSQL supporte un sous-ensemble étendu de SQL-92. Voir notre
liste TODO pour les bogues connus, les fonctionnalités manquantes et
les plans pour le futur.
1.10) Comment puis-je apprendre le SQL ?
Le livre PostgreSQL sur http://www.PostgreSQL.org/docs/awbook.html
enseigne le SQL. Il existe un autre livre PostgreSQL sur
http://www.commandprompt.com/ppbook. Il existe de bons tutoriels sur
http://www.intermedia.net/support/sql/sqltut.shtm,
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM
et http://sqlcourse.com.
Un autre (en anglais uniquement) "Teach Yourself SQL in 21 Days,
Second Edition" se trouve sur
http://members.tripod.com/er4ebus/sql/index.htm
Nombre de nos utilisateurs aiment The Practical SQL Handbook, Bowman,
Judith S., et al., Addison-Wesley. D'autres aiment The Complete
Reference SQL, Groff et al., McGraw-Hill.
1.11) PostgreSQL est-il compatible an 2000 ?
Oui, nous manipulons facilement les dates après et avant l'an 2000.
1.12) Comment puis-je rejoindre l'équipe de développement ?
Tout d'abord, téléchargez les derniers sources et lisez la
documentation pour les développeurs sur notre site web ou bien dans la
distribution. Ensuite, inscrivez-vous aux listes de diffusion
pgsql-hackers et pgsql-patches. Et pour finir, soumettez des
correctifs de grande qualité sur pgsql-patches.
Environ une douzaine de personnes ont des droits de modification sur
l'archive CVS de PostgreSQL. Ils ont chacun soumis tellement de
correctifs de qualité qu'il était devenu impossible aux développeurs
de tenir la cadence et nous avions confiance dans le qualité des
correctifs qu'ils soumettaient.
1.13) Comment dois-je soumettre un rapport de bogue ?
Merci de visiter la page PostgreSQL BugTool sur
http://www.PostgreSQL.org/bugs/bugs.php, qui donne des indications sur
la façon de soumettre un rapport de bogue.
De même, vérifiez notre site ftp ftp://ftp.PostgreSQL.org/pub pour
voir s'il existe une version PostgreSQL plus récente ou des
correctifs.
1.14) Comment PostgreSQL se compare-til à d'autres SGBD ?
Il y a plusieurs manières de mesurer un logiciel : les
fonctionnalités, les performances, la fiabilité, le support, et le
prix.
Fonctionnalités
PostgreSQL possède la plupart des fonctionnalités présentes
dans les SGBD commerciaux, comme les transactions, les requêtes
imbriquées, les déclencheurs, les vues, l'intégrité
référentielle par clés étrangères, et le verrouillage
sophistiqué. Nous avons des fonctionnalités qu'ils n'ont pas,
comme les types définis par l'utilisateur, l'héritage, les
règles, et le contrôle de concurrence par multi-versionnage
pour réduire les contentions de verrouillage.
Performances
PostgreSQL a des performances similaires aux autres bases de
données commerciales et open source. Il est plus rapide pour
certaines opérations, plus lent pour d'autres. Par rapport à
MySQL ou d'autres SGBD plus léger, nous sommes plus rapides
pour de nombreux utilisateurs, des requêtes complexes et une
charge pour les requêtes de lecture/écriture. MySQL est plus
rapide pour des requêtes SELECT simples effectuées par quelques
utilisateurs. Bien sûr, MySQL ne possède aucune des
fonctionnalités de la section Fonctionnalités ci-dessus.
PostgreSQL est construit pour la fiabilité et les
fonctionnalités et nous continuons à améliorer les performances
à chaque version. Il y a une page web intéressante qui compare
PostgreSQL à MySQL sur
http://openacs.org/philosophy/why-not-mysql.html. De plus,
MySQL est une société qui distribue son produit via l'open
source et requiert une licence commerciale pour les logiciels
propriétaires, donc pas une communauté de développement open
source comme PostgreSQL.
Fiabilité
Nous somme conscients qu'un SGBD doit être fiable ou bien il
est inutile. Nous faisons le maximum pour sortir des versions
bien testées, du code stable ne contenant qu'un minimum de
bogues. Chaque version a au moins un mois de tests, et notre
historique de versions montre que nous pouvons fournir des
versions stables et robustes, prêtes pour une utilisation en
environnement de production. Nous pensons que nous nous
comparons favorablement aux autres bases de données dans ce
domaine.
Support
Nos listes de diffusion offrent un contact avec un large groupe
de développeurs et d'utilisateurs afin d'aider à la résolution
des problèmes rencontrés. Nous ne pouvons garantir un correctif
mais les SGBD commerciaux ne le garantissent pas toujours non
plus. L'accès direct aux développeurs, à la communauté
d'utilisateurs, aux manuels, et au code source, fait du support
pour PostgreSQL un support supérieur aux autres SGBD. Un
support commercial par incident est disponible pour ceux qui en
ont le besoin (voir la section 1.6 de la FAQ).
Prix
Nous sommes gratuits pour tous les usages, commerciaux et non
commerciaux. Vous pouvez inclure notre code dans vos produits
sans limitation, exceptées celles citées dans notre licence de
type BSD donnée plus haut.
1.15) Comment puis-je aider financièrement PostgreSQL ?
PostgreSQL possède une infrastructure de première classe depuis le
début en 1996. Ceci grâce à Marc Fournier, qui a créé et géré cette
infrastructure des années durant.
Une infrastructure de qualité est importante pour un projet
open-source. Cela permet d'empêcher l'éparpillement qui ralentirait
beaucoup l'avancement du projet.
Bien sûr, cette infrastructure n'est pas donnée. Elle requiert un
certain nombre de dépenses mensuelles ou ponctuelles. Si vous ou votre
société peut donner de l'argent pour soutenir cet effort, merci de
consulter la page web http://store.pgsql.com/shopping/ et de faire une
donation.
Bien que la page web mentionne PostgreSQL, Inc, les contributions sont
exclusivement utilisées pour soutenir le projet PostgreSQL et ne
soutiennent aucune société que ce soit. Si vous le préférez, vous
pouvez aussi envoyer un chèque à l'adresse de contact.
_________________________________________________________________
De plus, si vous avez une histoire de succès avec PostgreSQL, merci de
la soumettre à notre site d'évangélisation sur
http://advocacy.postgresql.org.
Questions sur le client utilisateur
2.1) Existe-t'il des pilotes ODBC pour PostgreSQL ?
Il y a deux pilotes ODBC disponibles, PsqlODBC et OpenLink ODBC.
Vous pouvez télécharger PsqlOBDC depuis
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
OpenLink ODBC peut être obtenu depuis http://www.openlinksw.com. Il
fonctionne avec leur logiciel client ODBC standard, vous aurez donc
PostgreSQL ODBC sur toutes les plateformes client qu'ils supportent
(Win, Mac, Unix, VMS).
Ils vendront probablement ce produit aux gens qui recherchent une
qualité de support professionnelle mais une version freeware sera
toujours disponible. Merci d'envoyer vos questions à
postgres95@openlink.co.uk.
2.2) Quels outils sont disponibles pour utiliser PostgreSQL avec des pages
Web ?
Une bonne introduction aux pages Web adossés à une base de données se
trouve à http://www.webreview.com
Pour l'intégration Web, PHP est une excellente interface. Elle se
trouve à http://www.php.net.
Pour les cas complexes, beaucoup utilisent l'interface Perl et CGI.pm
ou mod_perl.
2.3) PostgreSQL a-t-il une interface graphique ?
Oui, il y a plusieurs interfaces graphiques disponibles pour
PostgreSQL, dont PgAccess http://www.pgaccess.org), PgAdmin III
(http://www.pgadmin.org), RHDB Admin (http://sources.redhat.com/rhdb/
et Rekall ( http://www.thekompany.com/products/rekall/, propriétaire).
Il y a aussi PhpPgAdmin ( http://phppgadmin.sourceforge.net/ ), une
interface Web pour PostgreSQL.
Voir http://techdocs.postgresql.org/guides/GUITools pour une liste
plus détaillée.
2.4) Quels langages sont disponibles pour communiquer avec PostgreSQL ?
La plupart des langages de programmation couramment utilisés ont une
interface pour PostgreSQL. Vérifiez la liste des modules de votre
langage.
Les interfaces ci-dessous sont incluses dans la distribution :
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Interfaces supplémentaires disponibles sur http://gborg.postgresql.org
dans la section Drivers/Interfaces
_________________________________________________________________
Questions Administratives
3.1) Comment installer PostgreSQL ailleurs que sous /usr/local/pgsql ?
Il faut spécifier l'option --prefix lors du lancement de configure.
3.2) Quand je lance postmaster, j'obtiens un Bad System Call ou un message
core dumped . Pourquoi ?
Cela peut être dû à une variété de problèmes mais vérifiez d'abord que
vous avez les extensions System V installées pour votre noyau.
PostgreSQL nécessite le support noyau pour la mémoire partagée et les
sémaphores.
3.3) Quand je lance postmaster, j'obtiens des erreurs IpcMemoryCreate.
Pourquoi ?
Soit vous n'avez pas configuré correctement la mémoire partagée dans
votre noyau, soit vous devez augmenter la mémoire partagée disponible
dans le noyau. Le montant exact dont vous avez besoin dépend de votre
architecture et du nombre de tampons et de processus que vous avez
configuré pour postmaster. Pour la plupart des systèmes avec un nombre
par défaut de tampons et de processus, vous aurez besoin d'un minimum
d'environ 1 Mo. Voir le chapitre Administration du manuel PostgreSQL
pour des informations plus détaillées sur la mémoire partagée et les
sémaphores.
3.4) Quand je lance postmaster, j'obtiens des erreurs IpcSemaphoreCreate.
Pourquoi ?
Si le message d'erreur est IpcSemaphoreCreate: semget failed (No space
left on device) alors votre noyau n'est pas configuré avec
suffisamment de sémaphores. PostgreSQL a besoin d'un sémaphore par
processus serveur potentiel. Une solution provisoire est de lancer
postmaster avec une plus petite limite sur le nombre de processus
serveur. Utilisez l'option -N avec un paramètre inférieur au choix par
défaut de 32. Une solution permanente est d'augmenter les paramètres
SEMMNS et SEMMNI de votre noyau.
Des sémaphores inopérantes peuvent aussi provoquer des plantages
pendant de gros accès à la base de données.
Si le message d'erreur est autre chose, vous n'avez peut-être pas du
tout le support des sémaphores dans votre noyau. Voir le chapitre
Administration du manuel PostgreSQL pour des informations plus
détaillées sur la mémoire partagée et les sémaphores.
3.5) Comment contrôler les connexions d'autres machines ?
Par défaut, PostgreSQL autorise seulement les connexions de la machine
locale en utilisant les sockets de domaine Unix ou les connexions
TCP/IP. D'autres machines ne seront pas capables de se connecter sauf
si vous modifiez listen_addresses dans postgresql.conf et activez une
authentification basée sur l'hôte en modifiant le fichier
$PGDATA/pg_hba.conf en accord.
3.6) Comment régler le moteur de la base de données pour de meilleures
performances ?
Des index accéléreront les requêtes. La commande EXPLAIN ANALYZE vous
permet de voir comment PostgreSQL traite votre requête et quels index
sont utilisés.
Si vous faites beaucoup d'insertions (instruction INSERT), envisagez
de les faire en une fois en utilisant la commande COPY. Ceci est plus
rapide que des commandes INSERTS individuelles. Deuxièment, les
requêtes qui ne sont pas dans des blocs de transaction BEGIN
WORK/COMMIT sont considérés comme étant dans leur propre transaction.
Envisagez de faire plusieurs instructions dans un seul bloc de
transaction. Ceci réduira la surcharge apportée par les transactions.
Aussi, envisagez d'abandonner et de recréer des index lors de grosses
modifications de données.
Il y a plusieurs options d'optimisations. Vous pouvez désactiver
fsync() en lançant postmaster avec l'option -o -F. Ceci empêchera les
fsync()s d'écrire sur disque après toute transaction.
Vous pouvez utiliser l'option -B de postmaster pour augmenter le
nombre de tampons de mémoire partagée utilisés par les processus
serveurs. Si vous fixez ce paramètre trop haut, postmaster ne se
lancera pas car vous avez dépassé la limite de votre noyau sur la
quantité de mémoire partagée. Chaque tampon fait 8 Ko et le choix par
défaut est de 64 tampons.
Vous pouvez utiliser l'option serveur -S pour augmenter la quantité
maximale de mémoire utilisée par les processus serveurs pour des tris
temporaires. La valeur de -S est mesuré en kilooctets et le choix par
défaut est de 512 (c'est-à-dire 512 Ko).
Vous pouvez utiliser la commande CLUSTER pour regrouper vos données en
tables pour correspondre à un index. Voir la page de manual CLUSTER
pour plus de détails.
3.7) Quelles fonctionalités de déboguage sont disponibles ?
PostgreSQL a plusieurs fonctionalités qui permettent de recueillir des
informations de statut qui peuvent être utile pour des intentions de
déboguage.
D'abord, en lançant configure avec l'option --enable-cassert, beaucoup
d'assert()s surveillent le serveur et arrêtent le programme quand
quelque chose d'inattendu arrive.
Postmaster et postgres ont tous deux plusieurs options de déboguage de
disponible. D'abord, quand vous lancez postmaster, vérifiez que vous
envoyez les sorties standard et d'erreur dans un fichier de traces
comme :
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Ceci va créer un fichier server.log dans le répertoire racine de
PostgreSQL. Ce fichier contient des informations utiles sur les
problèmes ou erreurs rencontrés par le serveur. Postmaster dispose
d'une option -d qui permet de rapporter des informations encore plus
détaillées d'être rapportées. L'option -d prend un numéro qui spécifie
le niveau de déboguage. Faites attention au fait que des valeurs
élévées de niveau de déboguage génerent des fichiers de traces
volumineux.
Si postmaster ne tourne pas, vous pouvez lancer le serveur postgres de
la ligne de commande et taper votre requête SQL directement. Ceci est
recommandé seulement pour des fonctions de déboguage. Notez qu'un
retour chariot termine la requête, pas un point-virgule. Si vous
compilez avec les symboles de déboguage, vous pouvez utiliser un
débogueur pour voir ce qui se passe. Parce que le serveur n'a pas été
lancé par postmaster, il ne tourne pas dans un environnement identique
et les problèmes d'interaction de verrouillage/serveur ne peuvent être
dupliqués.
Si postmaster est en train de tourner, lancez psql dans une fenêtre
puis trouvez le PID du processus postgres utilisé par psql. Utilisez
un débogueur pour l'attacher au PID postgres. Vous pouvez mettre un
point d'arrêt dans le débogueur et envoyez des requêtes de psql. Si
vous déboguez le démarrage de postgres, vous pouvez mettre
PGOPTIONS="-W n", puis lancez psql. Ceci va retarder le démarrage de n
secondes pour que vous puissiez attacher un débogueur au processus,
fixer des points d'arrêt et continuer la séquence de démarrage.
Le programme postgres a les options -s, -A et -t qui peuvent être
utile pour des mesures de déboguage et de performance.
Vous pouvez compiler avec les options de performance pour voir quelles
fonctions prennent du temps d'exécution. Les fichiers de gestion du
serveur seront déposés dans le répertoire pgsql/data/base/nom_db. Les
fichiers de gestion clients seront mis dans le répertoire actuel du
client. Linux requiert une compilation avec -DLINUX_PROFILE pour une
meilleure gestion.
3.8) Pourquoi est-ce que j'obtiens des messages Sorry, too many clients
quand je me connecte ?
Vous pouvez augmenter la limite de postmaster sur le nombre de
processus serveur concurrents qu'il peut lancer.
La limite par défaut est de 32 processus. Vous pouvez l'augmenter en
relançant postmaster avec une valeur -N appropriée ou en modifiant
postgresql.conf.
Tenez compte du fait que si vous fixez -N plus grand que 32, vous
devez aussi augmenter -B au-dela de sa valeur par défaut 64 ; -B doit
valoir au moins deux fois -N et probablement plus pour une meilleure
performance. Pour de grand nombres de processus serveurs vous aurez
probablement aussi augmenter plusieurs parametres de configuration du
noyau Unix. Les choses a vérifier incluent la taille maximale des
blocs de mémoire partagée, SHMMAX ; le nombre maximal de sémaphores,
SEMMNS et SEMMNI ; le nombre maximal de processus, NPROC ; le nombre
maximal de processus par utilisateur, MAXUPRC ; et le nombre maximal
de fichiers ouverts, NFILE et NINODE. La raison pour laquelle
PostgreSQL a une limite sur le nombre de processus serveurs autorisés
est pour que votre système ne tombe pas à court de ressources.
3.9) Que contient le répertoire pgsql_tmp ?
Ce répertoire contient des fichiers temporaires générés par le moteur
de requête. Par exemple, si un tri doit être fait pour satisfaire un
ORDER BY et que ce tri requiert plus de place que le paramètre -S du
serveur n'autorise, alors des fichiers temporaires seront créés pour
contenir les données nécessaires.
Les fichiers temporaires sont d'habitude effacés automatiquement mais
peuvent rester si un serveur s'arrête brutalement pendant un tri. Un
arrêt et un redémarrage de postmaster effacera les fichiers dans ces
répertoires.
3.10) Pourquoi est-ce que j'ai besoin de faire une sauvegarde des bases et
de restaurer pour mettre a jour les versions de PostgreSQL ?
L'équipe PostgreSQL ne fait que des changements mineurs entre des
versions mineurs, donc mettre à jour de 7.2 vers 7.2.1 ne nécessitera
pas de sauvegarde et de restauration. Par contre, les sorties majeures
(c'est-à-dire de 7.2 vers 7.3) changent souvent le format interne des
tables systèmes et des fichiers de données. Ces modifications sont
souvent complexes alors nous ne gardons pas de compatibilité
descendante pour les fichiers de données. Une sauvegarde exportera les
données dans un format générique qui peut ensuite être chargé dans le
nouveau format interne.
Dans les sorties où le format sur disque ne change pas, le script
pg_upgrade peut être utilisé pour mettre à jour sans
sauvegarde/restauration. Les notes de sorties précisent si pg_upgrade
est disponible pour la sortie.
3.11) Quels matériels dois-je utiliser ?
Comme le matériel PC est compatible en grosse partie, les gens ont
tendance à croire que tous les matériels PC sont de même qualité. Ce
n'est pas le cas. La RAM ECC, le SCSI et les cartes-mère de qualité
sont plus fiables et ont de meilleurs performances qu'un matériel
moins coûteux. PostgreSQL fonctionnera sur à peu près tout matériel
mais si la fiabilité et la performance sont importantes pour vous, il
est rusé de bien considérer les options matérielles. Nos listes de
diffusion peuvent être utilisées pour discuter des options matériels.
_________________________________________________________________
Questions fonctionnelles
4.1) Quelle est la différence entre curseur binaire et curseur normal ?
Voir la page DECLARE du manuel pour une description.
4.2) Comment faire un SELECT seulement sur les premières lignes d'une
requête ? Sur une ligne aléatoire ?
Voir la page FETCH du manuel ou utiliser SELECT ... LIMIT....
Il se peut que l'intégralité de la requête doive être évaluée, même si
vous voulez seulement les premières lignes. Envisagez d'utiliser une
requête avec une clause ORDER BY. S'il existe un index correspondant à
l'ORDER BY, PostgreSQL peut n'évaluer que les premières lignes, sinon
l'intégralité de la requête peut être évaluée, jusqu'à générer les
lignes désirées.
Pour faire un SELECT sur une ligne aléatoire :
SELECT colonne
FROM table
ORDER BY random()
LIMIT 1;
4.3) Comment obtenir une liste des tables ou d'autres objets que je vois
dans psql ?
Utilisez la commande \dt pour voir les tables dans psql. Pour une
liste complète de commandes à l'intérieur de psql, vous pouvez
utiliser \?. Autrement, vous pouvez lire le code source de psql dans
le fichier pgsql/src/bin/psql/describe.c. Il contient des commandes
SQL qui génèrent le contenu des commandes anti-slash de psql. Vous
pouvez aussi lancer psql avec l'option -E, afin qu'il imprime les
requêtes qu'il utilise pour exécuter les commandes que vous lui
passez. PostgreSQL fournit aussi une interface d'informations sur le
schéma compatible avec SQLi que vous pouvez interroger des
informations sur la base de données.
4.4) Comment supprime-t-on une colonne d'une table, ou comment change-t-on
son type de données ?
La fonction DROP COLUMN a été ajoutée dans la version 7.3 avec ALTER
TABLE DROP COLUMN. Pour les versions précédentes, vous pouvez faire :
BEGIN;
LOCK TABLE ancienne_table;
SELECT ... -- sélectionnez toutes les colonnes sauf celle à supprimer
INTO TABLE nouvelle_table
FROM ancienne_table;
DROP TABLE ancienne_table;
ALTER TABLE nouvelle_table RENAME TO ancienne_table;
COMMIT;
Pour changer le type de données d'une colonne, faites :
BEGIN;
ALTER TABLE table ADD COLUMN nouvelle_colonne nouveau_type_de_donnees;
UPDATE table SET nouvelle_colonne = CAST(ancienne_colonne AS nouveau_type_de_donnees);
ALTER TABLE table DROP COLUMN ancienne_colonne;
COMMIT;
Après, vous pouvez faire VACUUM FULL tab pour récupérer l'espace
disque utilisé par les lignes expirées.
4.5) Quelle est la taille maximale pour une ligne, une table, une base de
données ?
Les limites sont :
Taille maximum pour une base de données illimitée (il existe des basesde 32 To)
Taille maximum pour une table 32 To
Taille maximum pour une ligne 1,6 To
Taille maximum pour un champ 1 Go
Nombre maximum de lignes dans une table illimité
Nombre maximum de colonnes dans une table 250-1600, selon le type de colonnes
Nombre maximum d'index sur une table illimité
Bien sûr, ces valeurs ne sont pas vraiment illimitée, elles sont
limitées par l'espace disque disponible, ainsi que par l'espace de
mémoire et de swap. Les performances peuvent se dégrader si ces
valeurs sont inhabituellement grandes.
La taille maximum des tables (32 To) ne nécessite pas que le système
d'exploitation supporte les grands fichiers. Les grandes tables sont
stockées sous forme de fichiers multiples de 1 Go, donc les limites de
taille du système de fichier ne sont pas importantes.
La taille maximum des tables et le nombre maximum de colonnes peuvent
être quadriplés, si la taille des blocs par défaut est augmentée à
32 Ko.
4.6) Combien d'espace disque faut-il pour stocker les données d'un fichier
texte typique ?
Une base de données PostgreSQL peut utiliser jusqu'à cinq fois
l'espace nécessaire pour stocker les données d'un fichier texte.
A titre d'exemple, considérez un fichier de 100 000 lignes, comportant
un entier et une chaîne de description sur chaque ligne. Supposons que
la chaîne soit longue en moyenne de 20 octets. Le fichier texte serait
de 2,8 Mo. La taille du fichier d'une base de données PostgreSQL peut
être estimée à 6,4 Mo :
32 octets: chaque ligne (approximation)
24 octets: un champ 'entier' et un champ 'texte'
+ 4 octets: pointeur vers le tuple sur la page
----------------------------------------
60 octets par ligne
La taille des pages de données dans PostgreSQL est de 8192 octets (8 KO), donc :
8192 octets par page
---------------------- = 136 lignes par page de base de données (arrondi à l'entier inférieur)
60 octets par ligne
100000 lignes de données
------------------------- = 735 pages de base de données (arrondi à l'entier supérieur)
128 lignes par page
735 pages de base de données * 8192 octets par page = 6 021 120 octets (6,4 Mo)
Les index utilisent moins d'espace, mais ils contiennent les données
indexées, ils peuvent donc également être grands.
Les NULL sont stockés sous forme de bitmap, aussi utilisent-ils très
peu d'espace.
4.7) Comment puis-je savoir quels index, tables, bases de données et
utilisateurs sont définis ?
psql dispose de plusieurs commandes commençant par un anti-slash pour
retrouver ces informations. Utilisez \? pour les connaître. Il existe
aussi des tables systèmes, qui commencent par pg_ et qui les décrivent
également. Aussi, psql -l liste toutes les bases de données.
Essayez également le fichier pgsql/src/tutorial/syscat.source. Il
illustre un grand nombre de commandes SELECT nécessaires pour
récupérer l'information des tables système de la base de données.
4.8) Mes requêtes sont lentes ou ne font pas usage des index. Pourquoi ?
Les index ne sont pas automatiquement utilisés par chaque requête. Ils
sont utilisés uniquement si la table est plus grande qu'une certaine
taille, et si la requête sélectionne seulement un faible pourcentage
des lignes de la table. Ceci est dû au fait qu'un accès disque
aléatoire causé par un parcours d'index peut être plus lent qu'une
simple lecture de la table, ou parcours séquentiel
Pour déterminer si un index devrait être utilisé, PostgreSQL a besoin
des statistiques de la table. Ces statistiques sont collectées en
lançant VACUUM ANALYZE ou simplement ANALYZE. Avec les statistiques,
l'optimiseur sait combien de lignes se trouvent dans la table et peut
mieux déterminer s'il faut utiliser l'index. Les statistiques sont
également utiles pour déterminer l'ordre optimal des opérations de
jointure. La collecte des statistiques devrait être effectuée
régulièrement lorsque le contenu de la table change.
Les index ne sont normalement pas utilisés pour les clauses ORDER BY
ou pour les jointures. Un parcours séquentiel suivi d'un tri explicite
est habituellement plus rapide qu'un parcours d'index pour une table
importante. Toutefois, LIMIT combiné avec ORDER BY utilisera souvent
un index parce que seulement une petite partie de la table est
renvoyée. En fait, bien que MAX() et MIN() n'utilisent pas les index,
il est possible de retrouver ces valeurs en utilisant un index avec
ORDER BY et LIMIT :
SELECT colonne
FROM table
ORDER BY colonne [ DESC ]
LIMIT 1;
Si vous pensez que l'optimiseur choisit par erreur un parcours
sequentiel, utilisez SET enable_seqscan TO 'off' et lancez des tests
pour voir si le parcours d'index est effectivement plus rapide.
Lorsque vous utilisez des caractères joker tels que LIKE ou ~, les
index peuvent seulement être utilisés dans certaines circonstances :
* Le début de la chaîne de recherche doit être ancré au départ de la
chaîne, c'est-à-dire
+ Les modèles pour LIKE ne doivent pas commencer par %.
+ Les modèles d'expression régulière pour ~ doivent commencer
par ^.
* La chaîne de recherche ne peut pas commencer par une classe de
caractères, c'est-à-dire [a-e].
* Les recherches sans casse comme ILIKE et ~* n'utilisent pas les
index. Utilisez plutôt les index fonctionnels, décrit dans la
section 4.12.
* La locale C par défaut doit être utilisée lors de initdb.
Dans les versions antérieures à la 8.0, les indexs ne peuvent souvent
pas être utilisés sauf si les types de données correspondent
exactement au type de la colonne de l'index. Ceci est particulièrement
vrai pour les index de colonnes de type int2, int8 et numeric.
4.9) Comment puis-je savoir si l'optimiseur évalue mes requêtes ?
Voir la page EXPLAIN du manuel.
4.10) Qu'est-ce qu'un index R-tree ?
Un index R-tree est utilisé pour l'indexation des données spatiales.
Un index de hachage ne permet pas les recherches par plage. Un index
B-tree peut seulement faire des recherches sur une dimension. Les
index R-tree peuvent traiter des données multi-dimensionnelles. Par
exemple, si un index R-tree peut être construit sur un attribut de
type point, le système peut plus efficacement gérer les requêtes du
type "Sélection de tous les points d'un rectangle".
L'article de référence qui décrit le système R-tree original est :
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of
Data, 45-57.
Vous pouvez également trouver ce papier dans le livre de Stonebraker
"Readings in Database Systems".
Les index R-tree intégrés peuvent prendre en charge les polygônes et
les boîtes. En théorie, les R-trees peuvent être étendus à un plus
grand nombre de dimensions. En pratique, l'extension des R-trees
requiert pas mal de travail et nous n'avons pour le moment aucune
documentation sur la façon de procéder.
4.11) Qu'est-ce que l'optimiseur génétique de requêtes ?
Le module GEQO (acronyme de GEnetic Query Optimizer) accélère
l'optimisation des requêtes lors de jointures de nombreuses tables par
un algorithme génétique (GA). Il permet la gestion des grosses
requêtes de jointures en utilisant une recherche non exhaustive.
4.12) Comment puis-je réaliser des recherches sur des expressions
rationnelles ainsi que des recherches non sensibles à la casse ? Comment
puis-je utiliser un index lors de recherches non sensibles à la casse ?
L'opérateur ~ réalise des recherches d'expressions rationnelles et ~*
le fait sans tenir compte de la casse. La variante de LIKE non
sensible à la casse est ILIKE.
Des comparaisons d'égalité non sensibles à la casse sont
habituellement exprimées de cette façon :
SELECT *
FROM table
WHERE lower(colonne) = 'abc';
Ceci n'utilisera pas un index standard. Néanmoins, si vous créez un
index fonctionnel, celui-ci sera utilisé :
CREATE INDEX tableindex ON table (lower(colonne));
4.13) Comment puis-je détecter si un champ est NULL dans une requête ?
Il vous suffit de tester la colonne avec IS NULL ou IS NOT NULL.
4.14) Quelle sont les différences entre les nombreux types de caractères ?
Type Nom interne Notes
--------------------------------------------------
VARCHAR(n) varchar n spécifie la taille maximum, sans remplissage
CHAR(n) bpchar des espaces sont ajoutés pour obtenir la
longueur fixe spécifiée
TEXT text pas de limite supérieure pour la taille
BYTEA bytea tableau d'octets (accepte les octets nuls)
"char" char un caractère
Vous verrez le nom interne en examinant les catalogues système et dans
quelques messages d'erreur.
Les quatres premiers types du dessus sont des types "varlena"
(c'est-à-dire que les quatre premiers octets correspondent à la
taille, suivi des données). Donc, l'espace réellement utilisé est
légèrement plus grand que la taille déclarée. Néanmoins, ces types de
données sont aussi sujet à la compression ou à un enregistrement en
dehors de la table avec TOAST, donc l'espace occupé sur disque
pourrait aussi être moindre que ce qu'on pourrait attendre.
VARCHAR(n) est bien mieux pour enregistrer des chaînes de longueurs
variables tout en limitant la taille de cette chaîne. TEXT est utile
pour les chaînes de longueur illimitée, avec malgré tout un maximum de
1 Go.
CHAR(n) est intéressant pour stocker des chaînes de taille identique.
CHAR(n) complète avec des espaces pour arriver à la taille spécifiée
alors que VARCHAR(n) n'enregistre que les caractères donnés. BYTEA
sert à stocker des données binaires, particulièrement les données
incluant des octets NULL. Tous les types décrits ici ont des
performances similaires.
4.15.1) Comment puis-je créer un champ série, c'est-à-dire s'incrémentant
automatiquement ?
PostgreSQL supporte un type de données SERIAL. Il crée automatiquement
une séquence. Par exemple, ceci :
CREATE TABLE personne (
id SERIAL,
nom TEXT
);
est automatiquement traduit en ceci :
CREATE SEQUENCE personne_id_seq;
CREATE TABLE personne (
id INT4 NOT NULL DEFAULT nextval('personne_id_seq'),
nom TEXT
);
Voir la page man de create_sequence pour plus d'informations sur les
séquences. Vous pouvez aussi utiliser le champ OID de chaque ligne
comme valeur unique. Néanmoins, si vous avez besoin de sauvegarder
puis recharger la base de données, vous devrez utiliser l'option -o ou
l'option COPY WITH OIDS de pg_dump pour conserver les OIDs.
4.15.2) Comment puis-je obtenir la valeur d'un SERIAL suite à une
insertion ?
Une approche pour récupérer la prochaine valeur SERIAL à partir de
l'objet séquence est d'utiliser la fonction nextval() avant
l'insertion et de l'insérer ensuite explicitement. En utilisant la
table d'exemple de la section 4.15.1, un exemple dans un
pseudo-langage ressemblerait à ceci :
nouvelle_id = execute("SELECT nextval('personne_id_seq')");
execute("INSERT INTO personne (id, nom) VALUES (nouvelle_id, 'Blaise Pascal')");
Vous pourriez ensuite utiliser la nouvelle valeur stockée dans
nouvelle_id avec d'autres requêtes (c'est-à-dire en tant que clé
étrangère de la table personne). Notez que le nom de la SEQUENCE
automatiquement créée sera <table>_<colonneserial>_seq, où table et
colonneserial sont les noms respectifs de votre table et de votre
colonne SERIAL.
Autrement, vous pouvez récupérer la valeur SERIAL affectée avec la
fonction currval() après qu'elle ait été insérée par défaut,
c'est-à-dire,
execute("INSERT INTO personne (nom) VALUES ('Blaise Pascal')");
nouvelle_id = execute("SELECT currval('personne_id_seq')");
Enfin, vous pouvez utiliser l'OID renvoyé par l'instruction INSERT
pour récupérer la valeur par défaut bien que cela soit l'appoche la
moins portable et la valeur de l'OID se réinitialisera aux environs de
quatre milliards. En Perl, avec DBI et le module DBD:Pg d'Edmund
Mergl, l'ancienne valeur est disponible via $sth->{pg_oid_status}
après un $sth->execute().
4.15.3) Est-ce que currval() et nextval() n'amènent pas des problèmes
lorsque plusieurs utilisateurs les lancent en même temps ?
Non. currval() renvoie la valeur actuelle affectée par votre
processus, et non pas par tous les utilisateurs.
4.15.4) Pourquoi mes numéros de séquences ne sont pas ré-utilisés lors
d'une annulation de transaction ? Pourquoi existe-t'il des trous dans la
numérotation de ma colonne séquentielle (SERIAL) ?
Pour améliorer les accès concurrents, les valeurs de séquences sont
données aux transactions qui en ont besoin et ne sont pas bloquées
jusqu'à la fin de la transaction. Ceci crée des trous dans le
numérotage pour les transactions annulées.
4.16) Qu'est-ce qu'un OID ? Qu'est-ce qu'un TID ?
Les OID sont la réponse de PostgreSQL aux identifiants de lignes
uniques. Chaque ligne créée dans PostgreSQL obtient un OID unique.
Tous les OID générés pendant initdb sont inférieurs à 16384 (voir
include/access/transam.h). Tous les OID créés par un utilisateur sont
supérieurs ou égaux à ceci. Par défaut, tous ces OID sont uniques non
seulement dans une table ou une base mais unique à l'intérieur d'une
installation PostgreSQL entière.
PostgreSQL utilise les OID dans ses tables système interne pour lier
les lignes entre tables. Ces OID peuvent être utilisés pour identifier
des lignes utilisateurs spécifiques et utilisés dans des jointures. Il
est recommandé que vous utilisiez le type de colonne OID pour stocker
des valeurs OID. Vous pouvez créer un index sur le champ OID pour un
accès plus rapide.
Les OID sont attribués pour toute ligne d'un endroit central qui est
utilisé par toutes les bases de données. Si vous voulez changer l'OID
en quelque chose d'autre ou si vous voulez faire une copie de la table
avec les OID originaux, il n'y a pas de raisons pour ne pas le faire :
CREATE TABLE nouvelle_table (macolonne int);
SELECT oid AS ancienne_oid, macolonne INTO table_temporaire FROM ancienne_table;
COPY table_temporaire FROM '/tmp/tablepg';
COPY nouvelle_table WITH OIDS FROM '/tmp/tablepg';
DROP TABLE table_temporaire;
Les OID sont stockés en tant qu'entiers de quatre octets et
déborderont à quatre milliards. Personne n'a jamais rapporté un tel
cas et nous avons prévu de retirer la limite avant que cela ne se
produise.
Les TIDs sont utilisés pour identifier des lignes physiques
spécifiques avec des valeurs de bloc et décalage. Les TID changent
après que les lignes aient été modifiés ou rechargés. Ils sont
utilisés par des entrées d'index pour pointer vers des lignes
physiques.
4.17) A quoi correspond certains termes utilisés avec PostgreSQL ?
Une partie du code source et de l'ancienne documentation utilisent des
termes dont l'usage est plus commun. Voici quelques exemples :
* table, relation, classe
* ligne (row), enregistrement (record), tuple
* colonne (column), champ (field), attribut
* récupère, sélectionne (select)
* remplace (replace), met à jour (update)
* ajoute (append), insère (insert)
* OID, valeur séquentielle (serial value)
* portal, curseur
* range variable, table name, table alias
Une liste des termes généraux pour le domaine des bases de données est
disponible sur :
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
/glossary.html
4.18) Pourquoi ai-je l'erreur ERROR: Memory exhausted in AllocSetAlloc() ?
Vous manquez probablement de mémoire virtuelle sur votre système ou
votre noyau a une limite assez basse pour certaines ressources.
Essayez ceci avant de lancer postmaster :
ulimit -d 262144
limit datasize 256m
Suivant votre shell, seul un d'eux pourrait réussir mais cela
configurera d'une façon plus importante la taille du segment de
données de votre processus. Cette commande s'applique au processus
actuel et à tous les processus lancé par celui-ci. Si vous avez des
problèmes avec le client SQL parce que le processus serveur renvoie
trop de données, essayez ça avant de lancer le client.
4.19) Comment puis-je connaître la version de PostgreSQL que j'utilise ?
A partir de psql, tapez SELECT version();
4.20) Pourquoi ai-je invalid large obj descriptor lors d'opérations sur des
gros objects ?
Vous avez besoin de placer BEGIN WORK et COMMIT autour de chaque
utilisateur de gros objets, c'est-à-dire pour entourer lo_open ...
lo_close.
Actuellement, PostgreSQL force cette règle en fermant les gros objets
lors de la transaction. Donc, le premier essai d'opérations sur ces
objets, fonctionnant habituellement (au moins la plupart du temps)
aura un invalid large obj descriptor. Donc le code, auparavant
fonctionnel (au moins la plupart du temps), génèrera maintenant un
message d'erreur si vous n'utilisez pas de transaction.
Si vous utilisez une interface client interface comme ODBC, vous aurez
peut-être besoin de lancer auto-commit off.
4.21) Comment puis-je créer une colonne qui aura par défaut l'heure
actuelle comme valeur ?
Utilisez CURRENT_TIMESTAMP:
CREATE TABLE test (x int, heuremodif timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Pourquoi mes sous-requêtes utilisant IN sont-elles si lentes ?
Dans les versions précédant la 7.4, les sous-requêtes ont été jointes
avec des jointures externes en parcourant séquentiellement le résultat
de la sous-requête pour chaque ligne de la requête externe. Si la
sous-requête renvoit quelques lignes et que la requête externe en
renvoit plein, IN sera plus rapide. Pour accélérer les autres
requêtes, remplacez IN avec EXISTS :
SELECT *
FROM table
WHERE colonne IN (SELECT souscolonne FROM soustable);
to:
SELECT *
FROM table
WHERE EXISTS (SELECT souscolonne FROM soustable WHERE souscolonne = colonne);
Pour que ceci soit rapide, souscolonne doit être une colonne indexée.
A partir de la version 7.4, IN utilise actuellement les mêmes
techniques sophistiquées de jointures comme des requêtes normales et
est préféré à l'utilisation de EXISTS.
4.23) Comment puis-je réaliser une jointure externe ?
PostgreSQL supporte les jointures externes en utilisant la syntaxe SQL
standard. Voici deux exemples :
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
or
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Ces requêtes identiques joignent t1.col à t2.col et renvoient toute
colonne non jointe de t1 (celles sans correspondance dans t2). Une
jointure droite (RIGHT join) ajoutera les lignes non jointes de t2.
Une jointure complète (FULL join) renverra les lignes correspondantes
ainsi que les lignes non jointes de t1 et t2. Le mot clé OUTER est
optionnelle et assumé dans le cas de jointure LEFT, RIGHT et FULL. Les
jointures ordinaires sont appelées des jointures INNER.
Lors des précédentes versions, les jointures externes peuvent être
simulées en utilisant UNION et NOT IN. Par exemple, lors d'une
jointure de tab1 et tab2, la requête suivante réalise une jointure
externe, outer, des deux tables :
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Comment puis-je lancer des requêtes utilisant plusieurs bases de
données ?
Il n'existe pas de moyens de lancer des requêtes sur une autre base
que la courante. Comme PostgreSQL charge des catalogues systèmes
spécifiques à la base de données, sa réaction aux requêtes inter-base
de données est incertaine.
contrib/dblink permet les requêtes entre bases de données en utilisant
des fonctions. Bien sûr un client peut réaliser des connexions
simultanées à plusieurs bases de données et joindre les résultats du
côté client.
4.25) Comment puis-je renvoyer plusieurs lignes ou colonnes à partir d'une
fonction?
A partir de la 7.3, vous pouvez facilement renvoyer plusieurs lignes
ou colonnes à partir d'une fonction,
http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.26) Pourquoi ne puis-je pas créer/supprimer des tables temporaires dans
les fonctions PL/PgSQL de façon stable ?
PL/PgSQL cache le contenu des fonctions et un effet de bord malheureux
est que si une fonction PL/PgSQL accède à une table temporaire, que
cette table est ensuite supprimée et recréée, et que la fonction est
appelée de nouveau, la fonction échouera car le contenu de la fonction
cachée pointera toujours vers l'ancienne table temporaire. La solution
revient à utiliser EXECUTE pour l'accès aux tables temporaires avec
PL/PgSQL. Ceci obligera l'analyse de la requête à chaque fois.
4.27) Quelles options de cryptage sont disponibles ?
* contrib/pgcrypto contient de nombreuses fonctions de cryptage, à
utiliser dans des requêtes SQL.
* Pour crypter une transmission entre le client et le serveur, le
serveur doit avoir positionné l'option ssl à true dans
postgresql.conf, et un enregistrement applicable host ou hostssl
doit exister dans pg_hba.conf, et le sslmode du client ne doit pas
être désactivée. Notez qu'il est aussi possible d'utiliser un
transport crypté d'une troisième partie, tel que stunnel ou ssh,
plutôt que les connexions SSL natives de PostgreSQL.
* Les mots de passe des utilisateurs sont automatiquement cryptés
depuis la version 7.3. Pour les versions précédentes, vous devez
activer l'option PASSWORD_ENCRYPTION dans postgresql.conf.
* Le serveur peut fonctionner avec un système de fichiers cryptés.
_________________________________________________________________
Etendre PostgreSQL
5.1) J'ai écrit une fonction utilisateur. Lorsque je l'exécute avec psql,
pourquoi cela finit-il avec un dump core ?
Il peut y avoir plusieurs raisons. Essayez tout d'abord votre fonction
utilisateur dans un programme de test.
5.2) Comment puis-je ajouter de bons nouveaux types ou fonctions à
PostgreSQL ?
Envoyez vos extensions à la liste de diffusion pgsql-hackers, elles
atterriront éventuellement dans le sous-répertoire contrib/.
5.3) Comment faire pour écrire une fonction C qui renvoie un tuple ?
Dans les versions de PostgreSQL à partir de 7.3, les fonctions qui
renvoient une table sont totalement supportées en C, PL/PgSQL, et SQL.
Voir le Guide du Programmeur pour plus d'information. Un exemple de
fonction renvoyant une table définie en C se trouve à
contrib/tablefunc.
5.4) J'ai modifié un fichier source. Pourquoi ma recompilation ne voit-elle
pas les modifications ?
Les Makefiles n'ont pas les dépendances adéquates pour les fichiers
d'en-tête. Il vous faut faire make clean puis un autre make. Si vous
utilisez GCC, vous pouvez utiliser l'option --enable-depend de
configure pour que le compilateur calcule les dépendances
automatiquement.
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.
PostgreSQL GyIK
Utolso modosts dtuma: 2005 mjus 9.
Fordts aktualizlsa: 2005 jnius
A GyIK karbantartoja: Bruce Momjian (pgman@candle.pha.pa.us)
Fordto: Hornyk Lszlo
(laszlo.hornyak.nospam@gmail.com)
A legfrissebb verzio itt rhet el (angol):
http://www.PostgreSQL.org/docs/faq-english.html.
Legfrissebb magyar nyelv verzio:
http://hackers.forgeahead.hu/space/PostgreSQL/GYIK
Platform specifikus krdsek:
http://www.PostgreSQL.org/users-lounge/docs/faq.html.
----------------------------------------------------------------------
ltalnos krdsek
1.1 Mi a PostgreSQL? Hogy kell kimondani?
1.2 Mik a PostgreSQL felhasznlsi felttelei?
1.3 Milyen UNIX opercios rendszereken fut PostgreSQL?
1.4 Milyen nem UNIX opercios rendszerek elrhetek?
1.5 Hogyan tudok PostgreSQL-t szerezni?
1.6 Hogyan kapok termktmogatst?
1.7 Melyik a legfrissebb kiads?
1.8 Milyen dokumentcio ll rendelkezsre?
1.9 Hogyan tallok informciot hibkrol vagy hinyzo funkcionaltsrol?
1.10 Hogy tanuljam meg az SQL nyelvet?
1.11 A PostgreSQL 2000. v kompatibilis?
1.12 Hogyan lehet csatlakozni a fejleszt csapathoz?
1.13 Hogyan kldjek hibajelentst?
1.14 Milyen a PostgreSQL ms DBMS-ekkel sszehasonltva?
1.15 Hogyan tudom zletileg segiteni a PostgreSQL-t?
1.16 Ki irnytja a PostgreSQL-t?
Felhasznloi kliens krdsek
2.1 Van ODBC meghajto PostgreSQL-hez?
2.2 Milyen eszkzk llnak rendelkezsre PostgreSQL Web fejlesztsekhez?
2.3 Van a PostgreSQL-hez grafikus felhasznloi fellet ? Riport genertor?
Begyazott lekrdez nyelv fellet?
2.4 Milyen programozsi nyelvekkel lehet elrni a PostgreSQL szervert?
Adminisztrcios krdsek
3.1 Hogyan tudom a PostgreSQL-t /usr/local/pgsql -tl eltr helyre
installlni?
3.2 AMikor elindtom a postmaster-t, egy "Bad System Call"-t vagy core
dump-ot kapok. Mirt?
3.3 Amikor megproblom inditani a postmaster-t, "IpcMemoryCreate" hibkat
kapok. Mirt?
3.4 Amikor megproblom inditani a postmaster-t, "IpcSemaphoreCreate"
hibkat kapok. Mirt?
3.5 Hogyan tudom kontrolllni a ms gpekrl rkez kapcsolat krseket?
3.6 Hogyan tudom nagyobb teljestmnyre hangolni az adatbzisomat?
3.7 Milyen hibakeres lehetsgek rhetek el?
3.8 Mirt kapok "Sorry, too many clients" hibt csatlakozsnl?
3.9 Mi van pgsql_tmp knyvtrban?
3.10 Mirt kell dumpolni s jratlteni PostgreSQL kiads vltsnl?
Mkdtetsi krdsek
4.1 Mi a klnbsg a binris s a norml kurzorok kztt?
4.2 Hogyan tudom select-elni a lekrdezs els pr sort?
4.3 Hogy tudom kilistzni a tblkat vagy ms dolgokat a PostgreSQL-ben?
4.4 Hogyan tudok eltvoltani egy oszlopot egy tblbol?
4.5 Mi a maximlis mrete egy sornak, egy tblnak vagy egy adatbzisnak?
4.6 Mekkora adatbzis lemez terlet szksges egy tipikus szveg llomny
trolshoz?
4.7 Hogy tudhatom meg milyen tblk, indexek, adatbzisok vagy
felhasznlok vannak definilva?
4.8 A lekrdezseim lassak, vagy nem hasznljk az indexeket. Mirt?
4.9 Hogy tudom ellenrizni, hogy optimalizlta a lekrdezs optimalizlo a
lekrdezsem?
4.10 Mi az R-tree index?
4.11 Mi a Genetic Query Optimizer?
4.12 Hogyan tudok regexp keresst s case-insensitive regexp keresst
hasznlni? Hogyan tudok indexet hasznlni case-insensitive keresshez?
4.13 Hogyan tudom szlelni egy lekrdezsban, ha egy mez NULL?
4.14 Mi a klnbsg a klnbz karaktertpusok kztt?
4.15.1 Hogyan tudok ltrehozni automatikusan nvekv rtk mezt?
4.15.2 Hogyan kaphatom meg egy SERIAL beszrs rtkt?
4.15.3 A currval() s a nextval() nem teremt holtpont veszlyes helyzetet
a felhasznlok kztt?
4.15.4 Mirt nem hasznlodnak fel jra a sequence szmok tranzakcio abort
esetn? Mirt vannak problmk a serial oszlopok szmozsval?
4.16 Mi a OID? Mi a TID?
4.17 Mi a PostgreSQL-ben hasznlt kifejezsek jelentse?
4.18 Mirt kapom ezt a hibt: "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.19 Hogyan tudhatom meg PostgreSQL, milyen verziot futtatok?
4.20 Mirt kapok "invalid large obj descriptor" hibt nagy objektumok
kezelsnl?
4.21 Hogy hozhatok ltre olyan oszlopot, aminek alaprtelmezett rtke a
jelenlegi id?
4.22 Mirt olyan lassak az al-lekrdezseim IN-nel?
4.23 Hogyan tudok outer join-t vgrehajtani?
4.24 Hogyan tudok tbb adatbzison vgrehajtani lekrdezst?
4.25 Hogy tudok tbb soros vagy oszlopos eredmnyt visszaadni egy
funkciobol?
4.26 Mirt nem tudom megbizhatoan ltrehozni s trlni az tmeneti
tblkat a PL/pgSQL funkciokban?
4.27 Milyen replikcios lehetsgek vannak?
4.28 Milyen kodolsi lehetsgek vannak?
A PostgreSQL kiterjesztse
5.1) rtam egy felhasznloi funkciot. Mirt core dumpol az adatbzis
amikor hasznlom?
5.2) Hogyan lehet j adattpusokat s funkciokat hozzadni a PostgreSQL
disztribciohoz?
5.3) Hogyan lehet olyan C funkciot rni, ami Tuple-t ad vissza? (tbb
soros tbb oszlopos eredmnyek)
5.4) Megvltoztattam egy forrs llomnyt. Mirt nem vltozik a binris
jrafordts utn?
----------------------------------------------------------------------
ltalnos krdsek
1.1 Mi a PostgreSQL? Hogy kell kimondani?
gy ejstd ki: Post-Gres-Q-L.
(Vagy taln inkbb tltsd le a kis mp3-at a PostgreSQL homepage-rl)
A PostgreSQL a POSTGRES adatbzis management rendszer egy kiegsztse,
ami egy kvetkez genercios DBMS kutatsi prototpus. Megtartja a
POSTGRES adatmodellt s gazdag adattpus vlasztkt, de a PostQuel
lekrdez nyelvet az SQL egy kiterjesztett verziojval helyettesti. A
PostgreSQL szabad s a teljes forrskod hozzfrhet.
A PostgreSQL fejlesztst egy csapat vgzi, amelynek minden tagja
megtallhato a PostgreSQL fejleszti levelezsi listn. A jelenlegi
koordintor Marc G. Fournier (scrappyp@PostgreSQL.org). Ez a csapat
felels minden fejlesztsrt. <>A PostgreSQL 1.01 alkotoi Andrew Yu s
Jolly Chen voltak. Sokan jrultak hozz portolssal, tesztelssel,
hibakeresssel s fejlesztssel. Az eredeti Postgres kod, amibl a
PostgreSQL szrmazik Michael Stonebraker professzor irnytsa alatt
fejlesztettek az egyetem programozoi, tanuloi s vgzett tanuloi. <>
A szoftver eredeti neve Postgres volt. Amikor SQL funkcionaltssal
egsztettk ki 1995-ben, a nevt Postgres95-re vltoztattk. 1996 vgn
kapta mai nevt.
1.2 Mik a PostgreSQL felhasznlsi felttelei?
Az eredeti angol copyright szveg:
--------------------
PostgreSQL is subject to the following COPYRIGHT:
PostgreSQL Data Base Management System
Portions copyright (c) 1996-2002, 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.
--------------------
Ami nagyon leegyszerstve azt jelenti, hogy jogod van hasznlni a
szoftvert mindenfle ellenszolgltats (pnz, stb) nlkl, a forrs kodot
modosthatod, s tovbbadhatod, DE semmilyen, a szoftver hasznlatbol
kvetkez krosodsrt nem vllal garancit a fejleszt. A fenti a BSD
licensz, egy klasszikus nyilt-forrskod licensz. Nem tartalmaz
megszortsokat arra, hogy a forrskodot hogyan hasznlod fel.
Kedveljk ezt a licensz formt s nem ll szndkunkban megvltoztatni.
1.3 Milyen UNIX opercios rendszereken fut PostgreSQL?
ltalban minden UNIX-kompatibilis opercios rendszer kpes arra hogy
futtassa a PostgreSQL-t. Azokat a platformokat, amiken teszteltk a
kiadst megtallhatod a installcios utastsok kztt.
1.4 Milyen nem UNIX opercios rendszerek elrhetek?
Kliens
A libpq C fggvnyknyvtrat, a psql-t s ms felleteket le lehet gy
fordtani, hogy fussanak MS Windows opercios rendszereken. Ebben az
esetben a kliens MS Windows-on fut s TCP/IP segtsgvel kommunikl a
Unixon futo szerverrel. A "win32.mak" llomny a kiads rsze, ennek
segtsgvel lehet Win32 platformokra lefordtani a libpq-t s a psql-t. A
PostgreSQL ODBC kliensekkel is kpes kommuniklni.
Szerver
<>Az adatbzis szerver Cygwin segtsgvel fut Windows NT s Win2k
rendszereken. Tovbbi informcio tallhato a pgsql/doc/FAQ_MSWIN
llomnyban s a MS Windows FAQ-ban a kvetkez helyen:
http://www.PostgreSQL.org/docs/faq-mswin.html. Natv MS Windows
NT/2000/XP portok jelenleg fejleszts alatt llnak.
1.5 Hogyan tudok PostgreSQL-t szerezni?
Az elsdleges anonim ftp oldal: ftp://ftp.PostgreSQL.org/pub.
A tkr oldalak listja megtallhato a f weboldalunkon.
1.6 Hogyan kapok termktmogatst?
Az elsdleges lista a pgsql-general@postgresql.org. Ez hasznlhato a
PostgreSQL-lel kapcsolatos prbeszdekre. Ha fel szeretnl ratkozni,
kldj egy levelet a kvetkez tartalommal (nem trggyal) a
pgsql-general-request@postgresql.org cmre:
subscribe
end
Van egy hibkkal kapcsolatos levelezsi lista is:
pgsql-bugs-request@PostgreSQL.org a kvetkez tartalommal:
subscribe
end
A fejleszto"i levelezsi lista: pgsql-hackers-request@PostgreSQL.org a
kvetkez tartalommal:
subscribe
end
Egyb levelezsi listk tallhatoak a weboldalunkon:
http://www.PostgreSQL.org
Van egy IRC csatorna is #PostgreSQL nven ahol felteheted krdseid. A
kvetkez unix paranccsal csatlakozhatsz:
irc -c '#PostgreSQL' "$USER" irc.phoenix.net.
A kereskedelmi termktmogatst nyjto cgek listja elrhet itt:
http://www.PostgreSQL.org/users-lounge/commercial-support.html
Magyar nyelvu" levelezsi lista nincs, de ha tudok segiteni a fenit e-mail
cimemen elrheto" vagyok.
1.7 Melyik a legfrissebb kiads?
A legfrissebb PostgreSQL kiads a 8.0.
A tervek szerint minden vben lesz egy nagyobb fejlesztseket tartalmazo
kiads, mg a kisebb fejlesztseket nhny havonta adjuk ki.
1.8 Milyen dokumentcio ll rendelkezsre?
Szmos kziknyv, man oldalak s kis teszt pldk tallhatoak a kiadsban
a doc/ knyvtr alatt. Az interneten is olvashatod a dokumentciot a
kvetkez cmen:
http://www.PostgreSQL.org/users-lounge/docs/.
Kt PostgreSQL knyv rhet el az interneten a
http://www.PostgreSQL.org/docs/awbook.html s a
http://www.commandprompt.com/ppbook/ cmeken. A megvsrolhato knyvek
listja itt tallhato: http://www.ca.PostgreSQL.org/books/. A
PostgreSQL-lel kapcsolatos technikai jelleg cikkek gyjtemnye:
http://techdocs.PostgreSQL.org/.
A psql parancs rendelkezik nhny \d utastssal, amellyekkel listzhatoak
az opertorok, a funkciok, stb.
A website is tartalmaz tovbbi dokumentciokat.
1.9 Hogyan tallok informciot hibkrol vagy hinyzo funkcionaltsrol?
A PostgreSQLaz SQL-92 szabvny egy kiegsztse. Nzd meg a TODO listkat
ha rdekelnek az ismert hibk.
1.10 Hogy tanuljam meg az SQL nyelvet?
A PostgreSQL knyv a http://www.PostgreSQL.org/docs/awbook.html cmen
tartalmaz SQL alapokat. Elrhet egy msik SQL knyv is a
http://www.commandprompt.com/ppbook cmen. Egy szp oktato anyag tallhato
a http://www.intermedia.net/support/sql/sqltut.shtm, a
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM s a
http://sqlcourse.com oldalakon.
Egy msik lehetsg a "Tantsd magad 21 nap alatt SQL-re, msodik kiads"
a http://members.tripod.com/er4ebus/sql/index.htm.
Sok felhasznlonak tetszett a gyakorlati SQL knyv ("The Practical SQL
Handbook").
1.11 A PostgreSQL 2000. v kompatibilis?
Igen, knnyedn kezeli a 2000 utni s idszmtsunk eltt 2000 eltti
dtumokat is.
1.12 Hogyan lehet csatlakozni a fejleszt csapathoz?
Elsszr is tltsd le a forrskodot, s olvasd el a PostgreSQL
fejleszti dokumnetciot a web oldalunkon vagy a kiadsban. Ezutn
ratkozz fel a pgsql-hackers s a pgsql-patches levelezsi listkra.
Vgl pedig kldj be magas szinvonal patch-eket a pgsql-patches listra.
Van egy pr ember, akiknek commit privilgiumuk a PostgreSQL CVS fn.
k olyan sok magas szinvonal patch-et kldtek be, hogy az addigi
csapat mr nem tudta kvetni, s nem volt ktsgnk arrol, hogy a
patch-ek amiket k kldenek jo minsg.
1.13 Hogyan kldjek hibajelentst?
Ltogass el a BugTool oldalra:
http://www.PostgreSQL.org/bugs/bugs.php
Itt megtallod kvetend utastsokat.
Ellenrizd az ftp oldalunkon is, hogy nincs-e jabb verzio vagy folt.
ftp://ftp.PostgreSQL.org/pub
1.14 Milyen a PostgreSQL ms DBMS-ekkel sszehasonltva?
Szmos nzpontbol lehet vizsglni a szoftvert: kpessgek, teljestmny
megbzhatosg, tmogatottsg s r.
Kpessgek: A PostgreSQL rendelkezik a nagy, kereskedelmi DBMS-ek
kpessgeivel: tranzakciok, al-lekrdezsek, triggerek, nzetek, kls
kulcsok, integrts s kifinoult zrmechanizmusok. Van nhny kpessge,
ami a kereskedelmi adatbzisokbol hinyzik, mint pldul a felhasznlo
ltal definilt tpusok, rklds, szablyok s verzio kontroll a
zrolsi vitk reduklsrt.
Teljestmny: A PostgreSQL teljestmnye hasonlt a kereskedelmi s ms
nylt adatbzis szerverekhez. Lehet bizonyos esetekben lassabb, msokban
gyorsabb. A MySQL nev tanulo RDBMS pldul gyorsabban hajt vgre
insert/update mveleteket, mivel a tranzakciokat elsumkolja. Persze a
MySQL nem rendelkezik a kpessgek rszben felsoroltak nagy rszvel. Mi a
megbzhatosgra s a kpessgekre ptnk, br a teljestmny is n minden
kiadssal. Van egy rdekes oldal a MySQL s a PostgreSQL
sszehasonltsval a http://openacs.org/philosophy/why-not-mysql.html
cmen.
Megbzhatosg: Tudjuk hogy ha egy DBMS nem megbzhato, akkor teljesen
haszontalan. Igyeksznk jol tesztelt, stabil kodot kiadni, amiben a lehet
legkevesebb hiba van. Minden kiads eltt eltellik legalbb 1 honap bta
teszt, s a kiadsi trtnet is azt mutatja, hogy stabil kodot adunk ki,
ami kszen ll a produktv felhasznlsra. gy gondoljuk, fellmlunk ms
adatbzis szoftvereket ezen a tren.
Tmogats: A levelezsi listink kapcsolatot teremtenek a fejlesztk s
felhasznlok csoportjval , akik segtenek a problmk megoldsban. Br
nem tudjuk garantlni hogy ki tudjuk javtani a hibt, ms, kereskedelmi
adatbzis cgek sem tudjk. A fejleszt csoport kzvetlen elrsi
lehetsge, a kzssg, a dokumentcio s a forrskod gyakran tmogatst
biztost, mint ms adatbzisoknl. Van kereskedelmi, alkalmi tmogats
azoknak, akiknek szksge van r (lsd: 1.6).
r: A PostgreSQL szabad brmilyen felhasznlsra, akr kereskedelmire is.
A termkhez hozzadhatod a sajt forrskodjaidat korltozs nlkl.
1.15 Hogyan tudom zletileg segiteni a PostgreSQL-t?
A PostgreSQL els osztly infrastruktrval rendelkezik, amit 1996-ban
indtottunk el. Mindent Marc Fourniernek ksznhetnk, aki ltrehozta s
karbantartja a rendszert.
A minsgi infrastruktra nagyon fontos egy nyilt forrs szoftver
esetben. Megvd az olyan fennakadsoktol, amelyek komoly ksseket
okoznak a fejlesztsekben. Termszetesen ez az infrastruktra nem olcso.
Szmos havi s llando kiadsunk van. Ha a cgednek van pnze, amivel
tmogatn erfesztseinket, krlek ltogass el a
http://store.pgsql.com/shopping/ oldalra.
Br a weboldal "PostgreSQL, Inc"-knt emlti, a hozzjrulsok kizrolag a
PostgreSQL fejlesztsre rtendoek, s nem egy meghatrozott cgnek. Ha
jobban tetszik, kldhetsz csekket is a kapcsolati cmek brmelyikre.
1.16 Ki irnytja a PostgreSQL-t?
Ha kzponti bizottsgot, ellenrzo" cget keresel a PostgreSQL mgtt, add
fel, nincs ilyesmi. Ltezik egy mag s CVS commiter csoport, de ez inkb
adminisztrativ mint ellenrzo" cl. A projectet fejleszto"k s
felhasznlok kzssge irnytja, amihez brki csatlakozhat. Csupn annyit
kell tenned hogy felratkozol a levelezo"listkra s rszt veszel a
beszlgetsekben.
----------------------------------------------------------------------
Felhasznloi kliens krdsek
2.1 Van ODBC meghajto PostgreSQL-hez?
Kt ODBC meghajto rhet el: PsqlODBC s a OpenLink ODBC.
A PsqlODBC a PostgreSQL kiads rsze. Tovbbi informcio tallhato a
ftp://ftp.PostgreSQL.org/pub/odbc/ oldalon.
Az OpenLink ODBC-t a http://www.openlinksw.com cmrl tltheted le. Ez az
szabvnyos ODBC kliens szoftverkkel mkdik, gy minden
ltaluk tmogatott platformon (Win, Mac, Unix, VMS) elrhet lesz a
PostgreSQL szerver.
Taln olyan vevknek fogjk eladni, akik kereskedelmi minsg termket
szeretnnek kapni, de a freeware verzio mindig elrhet lesz. Krdseidet
a termkkel kapcsolatban a postgres95@openlink.co.uk cmen teheted fel.
Olvasd el az ODBC fejezetet is a programozok kziknyvben!
2.2 Milyen eszkzk llnak rendelkezsre PostgreSQL Web fejlesztsekhez?
Egy szp bemutato olvashato az adatbzissal tmogatott web oldalanrol a
http://www.webreview.com weboldalon.
A web integrciohoz a PHP egy kivllo szoftver. Letlthet a
http://www.php.net cmrl.
Komplexebb esetekre sokan hasznljk a Perl felletet s a CGI.pm vagy a
mod_perl-t.
2.3 Van a PostgreSQL-hez grafikus felhasznloi fellet?
Van egy szp PgAccess nev grafikus felletnk, ami riport genertorknt
is hasznlhato. A weboldalt megtallod a http://www.pgaccess.org/ cmen.
A http://techdocs.postgresql.org/guides/GUITools oldalon tallhatsz egy
pontos s rszltes listt.
2.4 Milyen programozsi nyelvekkel lehet elrni a PostgreSQL szervert?
A kvetkezk:
* C (libpq)
* C++ (libpq++)
* Embedded C (ecpg)
* Java (jdbc)
* Perl (DBD::Pg and perl5)
* ODBC (odbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
* C Easy API (libpgeasy)
* PHP ('pg_' functions, Pear::DB)
Tovbbi programozsi felletek rhetek el a
http://www.PostgreSQL.org/interfaces.html s a
http://gborg.PostgreSQL.org oldalakon.
----------------------------------------------------------------------
Adminisztrcios krdsek
3.1 Hogyan tudom a PostgreSQL-t /usr/local/pgsql -tl eltr helyre
installlni?
A configure script --prefix paramternek hasznlatval.
3.2 AMikor elindtom a postmaster-t, egy "Bad System Call"-t vagy core
dump-ot kapok. Mirt?
Szmos problma lehet, de legelsszr ellenrizd le, hogy a kerneled
System V kiegsztsekkel rendelkezik-e. A PostgreSQL hasznlja a kernel
osztott memoria s szemafor API-jt.
3.3 Amikor megproblom inditani a postmaster-t, "IpcMemoryCreate" hibkat
kapok. Mirt?
Vagy nincs megfelelen konfigurlva a kerneled osztott memoria tmogatsa
vagy meg kell nagyobbtanod a maximlis osztott memoria mretet.
A pontos mret szksglet fgg az architektrdtol s attol hogy hny
buffert s processzt konfigurlsz a postmasternek. Legalbb 1 MB terletre
szksged van. A PostgreSQL Adminisztrcio kziknyvben olvashatsz
rszletesebb informciokat az osztott memorirol s a szemaforokrol.
3.4) Amikor megproblom inditani a postmaster-t, "IpcSemaphoreCreate"
hibkat kapok. Mirt?
Ha a hibazenet ez: " IpcSemaphoreCreate: semget failed (No space left on
device)", akkor a kerneled konfigurcioja nem tesz lehetv elegend
szemafort. A PostgreSQL szerver processzenknt 1 szemafort ignyel. Egy
tmeneti megolds lehet az hogy a postmastert kevesebb maximlis processz
szmmal inditod el. Hasznld a -D paramtert. Egy sokkal megfelelbb
megolds az ha nveled a kerneled SEMMNS s SEMMNI paramtereit.
A hibs szemaforok is adatzis lerobbanshoz is vezethet nagy terhels
esetn.Ha a hibazenet valami ms, lehet hogy nincs szemaforok tmogats
forditva a kerneledbe. Olvasd el a PostgreSQL adminisztrtorok
kziknyvben az osztott memorirol s a szemaforokrol szolo fejezetet.
3.5) Hogyan tudom kontrolllni a ms gpekrl rkez kapcsolat krseket?
Alaprtelmezsben a PostgreSQL a helyi kapcsolatokat Unix socketekkel
valostja meg. Ms gpek nem lesznek kpesek csatlakozni, ha nem
engedlyezed azt -i opcioval a postmasternek, s nem lltod be host a
alap azonostst a pg_hba.conf llomnyban. Ezzel vlnak lehetv a
TCP/IP kapcsolatok.
3.6) Hogyan tudom nagyobb teljestmnyre hangolni az adatbzisomat?
Az indexels felttlenl gyorstja a lekrdezseket. Az EXPLAIN parancs
lehetv teszi hogy lsd, hogy a PostgreSQL miknt interpretlja a
lekrdezst s melyik indexet hasznlja.
Ha sok INSERT mveletet hajtassz vgre, csinld nagy ktegekben a COPY
paranccsal. Ez sokkal gyorsabb mint az egyedi INSERT parancsok. Msodszor:
Azok a mveletek, amelyek nincsenek tranzakcio blokkon bell, azok sajt
tranzakciot indtanak. Sok mveletet rdemes egy tranzakcion bell
vgrehajtani. Ez cskkenti a tranzakcio kezels tbbletidejt. Az
indexeket javasolt a nagy adatvltozsok eltt eltvoltani, majd jra
ltrehozni.
Szmos teljestmny javto lehetsg van. Kikapcsolhatod az fsync()
mveletet a postmaster -o -F opciokval valo indtsakor. gy nem fog az
amugy lass fsync() fggvny meghvodni minden tranzakcio vgn.
Hasznlhatod a postmaster -B opciojt is az osztott memoria szegmens
mretnek nvelshez. Ha az rtket tl magasra lltod, lehet hogy a
postmaster nem indul el, mert tllpted az opercios rendszer ltal
megengedett mretet. Minden buffer 8K mret s alaprtelmezsban 64
buffer van.
A -S opcioval nvelheted a szerver tmeneti rendezsekre fenntartott
memoria terlett. Az rtket kilobyteban add meg. Az alaprtelmezett
rtk 512K.
Hasznlhatod a CLUSTER utastst is, hogy a tblkat egy indexnek
megfelelen csoportostsd. Olvasd el a CLUSTER kziknyv oldalt tovbbi
rszletekrt.
Hardver kivlasztsban segthet:
http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html s
http://www.powerpostgresql.com/PerfList/.
A postgresql.conf bellitsaival kapcsolatos tudnivalok:
http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html
s http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.
3.7) Milyen hibakeres lehetsgek rhetek el?
A PostgreSQL szmos lehetsggel rendelkezik ami rtkes lehet a
hibakeressnl.
Elsszr is, futtathatod a configure scriptet --enable-cassert opcioval,
sok assert() funkciohivs ellenrzi a program futst s megllitja ha
valami vratlan hiba trtnik.
Mind a postmaster s a postgres szmos hibakeres lehetsggel
rendelkezik. Mindig amikor elinditod a postmastert, gyzdj meg rola, hogy
a kimenetet log llomnyba kldd. Igy:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Ez egy server.log llomnyt hoz ltre a fels PostgreSQL knyvtrban. Ez
az llomny tartlamaz majd szmos hasznos informciot a szerverrel
kapcsolatos problmkrol s hibkrol. A postmaster -d opciojval lehet
rszletesebb hibakeres informciot kapni. A -d opciohoz meg kell
hatrozni egy hiba szintet. Vigyzz, a magas hibakeres szint nagy log
llomnyt okozhat.
Ha a postmaster nem fut, akkor futtathatod a postgres szervert
parancssorbol is, s az SQL kifejezst kzvetlenl ennek adhatod t. Ez
csak hibakeress esetben javasolt. Az j sor a kifejezs vgt jelenti,
nem a pontosvessz. Ha hibakeres opciokkal forditottad a szervert,
hasznlhatsz egy debuggert is hogy lsd hogy mi trtnik. Mivel igy a
szervert nem a postmaster inditotta, nem tbbfelhasznlos krnyezetknt
fut, igy a zrolsi s a szerverek kztti kommunikcios hiba jelensgek
nem jelentkeznek.
Ha mr fut a postmaster, indits egy psql-t, s nzd meg a szerver processz
PID-jt! Egy debuggert hasznlhatsz a processzhez csatlakozshoz.
Bellithatsz trspontokat s elindithatsz lekrdezseket. Ha a postgres
inditsban keresel hibt, a PGOPTIONS krnyezeti vltozot llitsd be "-W
n" rtkre. Ez n msodperc vrakozst idz el, igy tudsz csatlakozni a
processzhez, el tdsz hejezni trspontokat, majd folytathatod a indtst.
A postgres program -s, -A s -t opcioi is nagyon hasznosak lehetnek
hibakeressnl s teljestmny mrsnl.
Profiling lehtsggel is fordithatod a szervert, hogy lsd melyik funkciok
foglaljk el a futsi idt. A szerver profile llomnyai a
pgsql/data/base/dbname knzvtrba kerlnek, a kliens profile llomnyok az
aktulis knyvtrba. Linuxon ehhez szksges a -DLINUX_PROFILE fordtsi
direktiva.
3.8) Mirt kapok "Sorry, too many clients" (Tl sok kliens)
hibt csatlakozsnl?
Nvelned kell a postmaster egyidejleg futtatott szerver processz szm
korltjt.
Az alaprtelmezett korlt 32 processz. Ezt nvelhetjed gy, hogy
jrainditod a postmastert s -N opcioval meghatrotod az j rtket, vagy
modositod a postgresql.conf-ot.
Ne felejtsd el, hogy ha nveled a szerver processzek maximlis szmt,
akkor bufferek szmt is nvelned kell, legalbb a processzek szmnak
ktszeresre. Nagy processz szmokesetben valoszinleg a Unix
konfigurcios paramtereken is nvelni kell. Ellenrizd a SHMMAX (az
osztott memoria szegmensek maximlis mrete), a SEMMNS s a SEMMNI (a
szemaforok maximlis szma), az NPROC (a processzek maximlis szma), a
MAXUPRC (felhasznlonknti maximlis processz szm) s a NFILE s NINODE
(a megnzitott llomnzok maximlis szma) paramtereket. A PostgreSQL
azrt korltozza kln a processz szmot, hogy a rendszeredet ne
terhelhesse meg tlsgosan.
A PostgreSQL 6.5 verzioban a maximlis szerver processz szm 64 volt s a
modositshoz bele kellett irni a include/storage/sinvaladt.h llomnyba s
jra kellett forditani a servert.
3.9) Mi van pgsql_tmp knyvtrban?
Ez a knyvtr a lekrdezs vgrehajto ltal ltrehezott tmeneti
llomnyokat tartalmazza. Pldul ha egy rendezst kell vgrehajtani egy
ORDER BY kifejezs miatt s a m?velet tbb memorit vesz ignybe, mint
amennyit a -S paramter megenged, akkor az tmeneti knyvtrban hoz ltre
egy llomnyt a fennmarado adat trolsra.
Az tmeneti llomnyok tbbnyire trl?dnek, de meg is maradhat ha pldul
vratlan hibval lell a szerver egy rendezs kzben. Inditskor s
lellitskor ezeket az llomnyokat trli a postmaster.
3.10) Mirt kell dumpolni s jratlteni PostgreSQL kiads vltsnl?
A PostgreSQL csapat csak aprobb vltoztatsokat hajt vgre a kisebb
kiadsok kztt, igy ha 7.2 verziorol llsz t 7.2.1 verziora, akkor nem
szksges kidumplonod az adatbzist. A nagy kiadsok esetben (pldul
verziorol 7.3-ra ttrsnl) vltozik a belsi adatstruktrk s
adatllomnyok formtuma. Ezek a vltozsok gyakran nagyon sszetettek,
ezrt inkb nem tartunk fenn visszafel kompatibilitst. A dump az adatot
ltalnos formtumban irja ki, majd az j formtumban lehet azt
visszatleni.
Azokban a kiadsokban, amelyek kztt az adat formtum nem vltozik, a
pg_upgrade program hasznlhato dumpols s helyrellits nlkl.
----------------------------------------------------------------------
Mkdtetsi krdsek
4.1) Mi a klnbsg a binris s a norml kurzorok kztt?
Nzd meg a DECLARE dokumentciojt.
4.2) Hogyan tudom select-elni a lekrdezs els pr sort?
Olvasd el a FETCH dokumentciojt, vagy hasznld a SELECT LIMIT-et.
Az egsz lekrdezst vgre kell hajtani, mg akkor is, ha csak az els pr
sort akarod megkapni. Gondolj arra, hogy a lekrdezsben lehet ORDER BY
is. Ha van olyan index, ami megfelel az ORDER BY kifejezsednek, a
PostgreSQL kpes lehet az els nhny rekord visszaadsra, vagy a teljes
lekrdezsnek le kell futnia, amig a krt rekordok le nem generlodnak.
4.3) Hogy tudom kilistzni a tblkat vagy ms dolgokat a PostgreSQL-ben?
Elolvashatod a psql forrs kodjban a pgsql/src/bin/psql/describe.c
llomnyban. Ez SQL parancsokat tartalmaz, amelyek azokat a kimeneteket
llitjk el, amiket a per jellel kezdd parancsok adnak vissza.
4.4) Hogyan tudok eltvoltani egy oszlopot egy tblbol?
Ez a funkcionalits a 7.3 verziotl kezdve rhet el az ALTER TABLE DROP
COLUMN -nal. A rgebbi vertiokban igy lehet vgrehajtani:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- minden oszlopot, kivtel amit trlni szeretnl
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
4.5) Mi a maximlis mrete egy sornak, egy tblnak vagy egy adatbzisnak?
A korltok:
* adatbzis: korltlan (1 TB az ltalunk ismert lagnagyobb)
* tbla: 16 TB
* rekord/sor 1.6TB
* mez 1 GB
* a tbla sorainak szma: korltlan
* a tbla oszlopainak szma: 250-1600 az oszlop nevektl fggen
* A tbla indexeinek szma: korltlan
Termszetesen nem igazn korltlan, de a trterlet, memoria s egyb
kls tnyezk korltozzk. A teljesitmny romolhat, ha ezek az rtkek
szokatlanul nagyok.
A 16 TB-os legnagyobb tbla mret nem ignyel nagy llomny tmogatst. A
nagy tblk tbb 1 GB mret llomnyba kerlnek, igy az llomny rendszer
korltai nem lnyegesek.
A maximlis tbla mret s az oszlopok maximlis oszlop szm nvelhet, ha
az alaprtelmezett blokkmretet 32k-ra nveled.
4.6) Mekkora adatbzis lemez terlet szksges egy tipikus szveg llomny
trolshoz?
A PostgreSQL akr a szveg llomny helyignynek tszrst is
elfoglalhatja.
Kpzelj el pldul, egy 100.000 soros szveget, aminek minde sora egy
szmbol s egy szvegbl ll. Tegyk el, hogy tlagosan 20 byte hossz
szvegek. Ez a szvegllomny krlbell 2.8 MB helyet foglalna el. A
tbla ami a fenti adatszerkezetet eltroln, krlbell 6.4 MB-os lenne.
Ezt a kvetkezkppen szmolhatjuk ki:
36 byte: sor fejlc
24 byte: egy int mez + egy szveg mez
4 byte: mutato
---------------------------------------
64 byte soronkent.
Az adat oldal mrete a PostgreSQL-ben 8192 byte, igy 8192 / 64 = 128
rekord adatbzis oldalanknt (lefel kerekitve).
100000 rekord / 128 rekord oldalanknt = 782 adat oldal
(felel kerekitve).
782 adatbzis oldal * 8192 byte olalanknt = 6,406,144
byte (6.4 MB)
Az indexek nem foglalnak tl sokat, de tartalmazzk az indexelt adatot,
igy ezek is lehetnek nagyok.
A NULL rtkek bittrkpben vannak trolva, igy kevs helyet foglanak.
4.7) Hogy tudhatom meg milyen tblk, indexek, adatbzisok vagy
felhasznlok
vannak definilva?
A psql-ben tallsz szmos '\' karakterrel kezdd utastst az ilyen
informciok listzsra. A '\?' segitsgvel tudot kilistzni ezeketa
parancsokat. Ezen kivl vannak rendszer tblk, amelyek nevei 'pg_'-vel
kezddnek.
Probld ki a pgsql/src/tutorial/syscat.source llomnyt is. Ez sok pldt
tartalmaz az rendszertblkon vgrehajtott SELECT-ekrl.
4.8) A lekrdezseim lassak, vagy nem hasznljk az indexeket. Mirt?
Az indexeket nem hasznlja a szerver minden lekrdezsnl automatikusan.
Csak akkor hasznl indexet, ha a tbla mrete egy megadott also hatr
felett van, s a lekrdezs csak a sorok egy kis rszt rinti. Ez azrt
van, mert a vletlen hozzfrs mg mindig lassabb lehet mint az tbla
szekvencilis olvassa.
Hogy a PostgreSQL meg tudja hatrozni hogy kell-e indexet hasznlni,
lteznie kell egy statisztiknak a tblrol. Ez a statisztikai adatok a
VAACUM ANALYZE vagy az egyszer ANALYZE mveletek sorn jnnek ltre. A
statisztikai adatok felhasznlsval az optimalizlo meg tudja hatrozni,
hogy hny sor van a tblban, s el tudja dnteni, hogy hasznljon-e
indexet. A statisztiaki adatgyjtst idnknt vgre kell hajtani, ahogy a
tbla adatai vltoznak.
Az indexeket normlis esetben nem hasznlja az ORDER BY vagy az OUTER
JOIN. A szekvencilis olvass ltalban gyorsabb, mint az index keress
egy nagy tblban. Br a LIMIT az ORDER BY-val kombinlva hasznlhat
indexet, mert a tbla csak kis rsze rintett. Br a MIN s MAX SQL
funkciok sem hasznljk az indexeket, ezeket az rtkeket egy ORDER BY +
LIMIT lekrdezssel is le lehet krdezni:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Amikor helyettest jel opertorokat hasznlsz, mint a LIKE kulcsszo vagy
a ~, az indexeket csak bizonyos krlmnyek kztt lehet hasznlni:
A keres string kezdete a keressi minta elejn kell hogy legyen. Pldul:
* A LIKE mintk nem kezddhetnek % jellel.
* ~ (regexp) kifejezsek nem kezddhetnek ^ jellel.
* A keressi kifejezs nem kezddhet karakter osztllyal.
* A case-insensitive keress (ILIKE, ~*) nem hasznlnak indexet ehelyett
funkcionlis indexet hasznlnak, amit a 4.12 pontban tallhatsz.
* Az alaprtelmezett C hellyel kell futtatni az initdb-t.
4.9) Hogy tudom ellenrizni, hogy optimalizlta a lekrdezs optimalizlo
a lekrdezsem?
Olvasd el a dokumentcio EXPLAIN-rol szolo rszt.
4.10) Mi az R-tree index?
Az R-tree index a trbeli adat indexelsre alkalmas. Egy hash index nem
kpes tartomny keressekre. A B-tree index csak egy dimenzion kezeli a
tartomny keresseket. Pldul ha az indexet egy pont (point adattpus)
tpus mez.re ptjk, gyorsabban kezeli az olyan jelleg lekrdezseket,
mint egy adott krben
tallhato pontok.
Az R-tree tervezsi mintt eredetileg lero szveg: Guttman, A. "R-trees:
A Dynamic Index Structure for Spatial Searching." Proceedings of the 1984
ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.
Ezt olvashatod Stonebraker "Readings in Database Systems" c. knyvben.
A beptett R-tree kezelni tudjk a sokszgeket (polygon adattpus) s a
dobozokat (box). Elmletileg, az R-tree kiterjeszthet tovbbi dimenziokra
is. Gyakorlatilag ezen dolgoznod kell egy kicsit, s mg nincs
dokumentcionk arrol hogy az hogyan mkdik.
4.11) Mi a Genetic Query Optimizer?
A GEQO modul a lekrdezs optimalizcio sebessgt nveli nagy mennyisg
tbla sszekapcsolsa esetn. Lehetv teszi a nagy lekrdezsek
vgrehajtst nem teljes keresssel.
4.12) Hogyan tudok regexp keresst s case-insensitive regexp keresst
hasznlni? Hogyan tudok indexet hasznlni case-insensitive keresshez?
A ~ opertor hajt vgre regulris kifejezs (regexp) rtelmezst, a ~*
ennek case-insensitive vltozata. A LIKE case-insensitive vltozata az
ILIKE.
A case-insensitive egyenlsg mveleteket ltalban igy hajtjuk vgre:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Ez nem fog indexet hasznlni, br ltrehozhatsz egy funkcio indexet:
CREATE INDEX tabindex ON tab (lower(col));
4.13) Hogyan tudom szlelni egy lekrdezsben, ha egy mez NULL?
Hasznld "IS NULL"-t s az "IS NOT NULL"-t.
4.14) Mi a klnbsg a klnbz karaktertpusok kztt?
* "char" egy karakter hossz string
* CHAR(n) bpchar res hellyel a megadott n hosszsgig
* VARCHAR(n) varchar mret maximlis hossz meghatrozsval, a lefogllat
terlet is vltozo hossz lesz
* TEXT nincs meghatrozott felso" korlt
* BYTEA vltozo hosszsg byte-tmb
Ltni fogod a bels elnevezsket, ha tanulmnyozod a rendszertblkats
nhny hibazenetet.
Az utobbi ngy a "varlena" tpusok, ami a trolsuk modjra utal: az els
4 byte a lemezen a hosszsg, a tbbi az adat. A valodi mret teht
nagyobb mint a deklarlt hosszsg.Ezek azadatok tmritve trolodnak el,
igy kevesebb helyet foglalnek el az elre szmitottnl.
A CHAR(n) a legjobb megolds, ha stabil hosszsg stringet trolsz. A
VARCHAR(n) jo arra az esetekre, ha a hosszsg vltozik, de van fels
korltja. A TEXT tpus korltlan hosszsg (1 GB-ig) szvegek trolsra
alklamas. A BYTEA binris adatok trolsra van. A teljesitmny mutatoi
hasonloak ezenek a tpusoknak.
4.15.1) Hogyan tudok ltrehozni automatikusan nvekv rtk mezt?
A PostgreSQL rendelkezik egy SERIAL adattpussal. Ez egy szekvencit s
egy indexet hoz ltre az oszlopon. Pldul ez:
CREATE TABLE person (
id SERIAL,
name TEXT
);
ugyanezt jelenti:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
A szekvencikkal kapcsolatban olvasd el a create_sequence man oldalt. A
sor OID-jt is hasznlhatod egyedi azonositoknt, br ebben az esetben
figyelj a pg_gump hasznlatnl a -o opciora (COPY WITH OIDS, msols
OID-dal), hogy meg?rizd az rtkeket.
4.15.2) Hogyan kaphatom meg egy SERIAL beszrs rtkt?
Egy megolds erre az, ha a nextval() funkcioval megszerzed az rtket mg
mieltt beszrnd az adatot a tblba. Erre itt lthatsz egy pldt:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise
Pascal')");
Esetleg lekrdezheted a szekvencia llapott a sor beszrsa utn.
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
Vgl pedig, hasznlhatod a visszaadott OID rtket is, br ez a lehet
legkevsb portolhato. Perl DBI-ben, Edmund Mergl DBD::Pg moduljban az
OID rtk hasznlhato a $sth->execute() utn ($sth->{pg_oid_status}).
4.15.3) A currval() s a nextval() nem teremt holtpont veszlyes helyzetet
a felhasznlok kztt?
Nem. A currval() funkcio a szerver processzed ltal adott rtket adja
vissza, nem pedig a tbbi szerver processz ltal adottat.
4.15.4) Mirt nem hasznlodnak fel jra a sequence szmok tranzakcio abort
esetn?
Mirt vannak problmk a serial oszlopok szmozsval?
A prhuzamossg fejlesztse rdekben a sorozat szmokat krsre adja ki a
szerver futo tranzakcioknak, s azokat nem zrja, amig a tranzakcio vget
nem r. Ez jukakat okoz a szmozsokban a visszaforditott tranzakciok
miatt.
4.16) Mi a OID? Mi a TID?
Az OID a PostgreSQL egyedi sor azonositoja. Minden sor, ami ltrejn a
szerveren, kap egy OID-t. Minden OID, amit az initdb alatt jn ltre 16384
alatt van (lsd include/access/transam.h). Minden, felhasznlo ltal
ltrehozott OID legalbb ennyi. Alaprtelmezsben, az OID nem csak a
tblban vagy az adatbzisban egyedi, hanem a teljes PostgreSQL adatbzis
rendszerben.
A PostgreSQL az OID-okat a bels tbliban hasznlja a sorok tblk kztt
sszekapcsolshoz. Ezek az OID-k hasznlhatoak a rekordok azonositsra
is amikor tblkat csatol ssze a szerver (JOIN). Az OID-ot hasznlhatod
mez tpusknt is, s indexelheted is.
Az OID rtk egy kzponti terletrl szrmazik, amit minden szerver
processz hasznl. Ha az OID-ot valami msra szeretnd cserlni:
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
Az OID 4 byte-os integer rtkknt trolodik, igy 4 millirdnl
tlcsordul. Mg soha senki nem jelezte hogy ez trtnt volna, s ezt a
korltot igyeksznk eltvolitani, mg mieltt brki szrevenn.
A TID a fizikai sorok blokk s offszet cmmel valo azonositsra szolgl.
A TID vltozik minden rekord modosits s trls alkalmval. Ezeket az
indexek hasznljk hogy a fizikai sort gyorsan megtalljk.
4.17) Mi a PostgreSQL-ben hasznlt kifejezsek jelentse?
Nhol a forrs kodban s a dokumnetcioban tallhatoak kifejezsek,
amelyek ltalnosabb jelentssel brnak. Itt van nhny:
* tbla (table), relcio (relation), osztly (class)
* sor (row), rekord (record), tuple (nincs magyar jelents)
* oszlop (column), mez (field), attributum (attribute)
* retrieve, select
* helyettesit (replace), modosit (update)
* hozzfz (append), beszr (insert)
* OID, sorozat rtk (serial value)
* portal, cursor
* range variable, tbla nv, tbla alias
Az ltalnos adatbzis kifejezsek sszefoglalojt itt olvashato:
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html
4.18) Mirt kapom ezt a hibt: "ERROR: Memory exhausted in
AllocSetAlloc()"?
Lehet hogy elfogyott a virtulis memorid, vagy a kerneled erforrs
korltai alacsonyak. Probld ki ezt mieltt elinditand a postmastert:
ulimit -d 262144
limit datasize 256m
A shelltl fggen ezek kzl csak az egyik fut majd le, de a processzek
adatszegmenst sokkal magasabbra llitja, ami taln elg lesz a lekrdezs
vgrehajtshoz. Ez az utasts a jelenlegi processzre (a shelled)
rvnyes, s minden ltala ltrehozott processzre. Ha problmd van az SQL
klienssel, mert a szerver tl nagy adatot kld vissza, probld meg e
klienssel is ugyanezt.
4.19) Hogyan tudhatom meg PostgreSQL, milyen verziot futtatok?
A psql programban select version();
4.20) Mirt kapok "invalid large obj descriptor" hibt nagy objektumok
kezelsnl?
A nagy objektumok kezelst egy tranzakcios blokkban helyezd el. (BEGIN s
COMMIT kztt)
Jelenleg a PostgreSQL ezt a szablyt azzal teszi ktelezv, hogy a
tranzakcio vgn a nagy objektumokat lezrja, igy a tranzakcio utn az
els mvelet amit az objektumon vgrahajtanl hibs lesz.
Ha olyan programozsi felletet hasznlsz mint az ODBC vagy a JDBC akkor
valoszinleg ki kell kapcsolnod az auto-commit-ot.
4.21) Hogy hozhatok ltre olyan oszlopot, aminek alaprtelmezett rtke a
jelenlegi id?
Hasznld a CURRENT_TIMESTAMP -ot:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Mirt olyan lassak az al-lekrdezseim IN-nel?
Jelenleg az al-lekrdezseket a kls lekrdezshez csatoljuk. Ha az
allekrdezs csak kevs sort eredmnyez s a kls lekrdezs sokat, akkor
az IN is gyors. Az EXISTS kulcsszo hasznlatval gyorsithatod a
lekrdezseket.
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
EXISTS hasznlatval:
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
Ahhoz hogy ez gyorsan fusson le, a subcol indexelt oszlopnak kell hogy
legyen. Remljk ezt a korltot sikerl hamarosan legyznnk.
4.23) Hogyan tudok outer join-t vgrehajtani?
A PostgreSQL a szabvnyos SQL szintaktikt kveti. Itt van kt plda:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
vagy
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Ezek az identikus lekrdezsek sszekapcsoljk a t1.col s a t2.col
mezket, s a t1 brmelyik kapcsolatlan sort is visszadjk. A RIGHT JOIN
a t2 kapcsolatlan sorait adta volna vissza, a FULL JOIN pedig a kapcsolt,
s mindkt tbla kapcsolatlan sorait adja. Az OUTER kulcsszo opcionlis, a
LEFT, RIGHT s FULL JOIN szintaktikailag helyes. Az tlagos
sszekapcsolsokat INNER JOIN-nak nevezzk.
Az elz kiadsokban a OUTER JOIN lekrdezseket UNION s NOT IN
kulcsszavakkal lehetett szimullni. Pldul a tab1 s a tab2
sszekapcsolsa:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Hogyan tudok tbb adatbzison vgrehajtani lekrdezst?
Arra nincs lehetsg, hogy ms adatbzisbol krdezz le adatot.Mivel a
PostgreSQL adatbzis specifikus rendszer tblkat tltbe, bizonytalan hogy
egy adatbzisok kztti lekrdezsnek hogyankellene viselkednie.
A contrib/dblink knyvtrban tallsz egy megoldst erre, ami funkcio
hivsok segitsgvel mkdik. Persze, a kliens hozhat ltreszimultn
kapcsolatot tbb adatbzissal, s sszefslheti az eredmnyeket.
4.25) Hogy tudok tbb soros vagy oszlopos eredmnyt visszaadni egy
funkciobol?
A PL/pgSQL trolt eljrs nyelvvel refcursor hasznlatval. Rszletesen
itt:
http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html
4.26) Mirt nem tudom megbizhatoan ltrehozni s trlni az tmeneti
tblkat a PL/pgSQL funkciokban?
A PL/pgSQL cacheli a funkciok tartalmt, aminek az a szerencstlen
mellkhatsa, hogy ha egy PL/pgSQL funkcio hasznl egy tmeneti tblt,
ami kso"bb trldik majd ujra ltrejn, akkor az jra lefuto funkcio nem
fogja megtallni a tblt, mert a cache vltozat a rgi tblra tartalmaz
mutatot. A megolds erre az EXECUTE hasznlata az tmeneti tblk
kezelsre PL/pgSQL-ben. Ez a lekrdezs jrafordtst fogja elidzni
minden alkalommal.
4.27) Milyen replikcios lehetsgek vannak?
Br a replikcio egyetlen terlet, tbb technologia ltezik replikciora,
termszetesen mindnek meg vannak a maga elo"nyei s htrnyai.
A master/slave replikcios megoldssal a master adatbzison hajthatunk
vgre modostsokat, mg a slave adatbzisokon csak lekrdezseket. A
PostgreSQL legnpszeru"bb master/slave replikcios megoldsa a Solny-I.
Szmos ms master/slave replikcios lehetsg ltezik.Egy Listt
olvashatsz ezekrl itt:
http://gborg.PostgreSQL.org/genpage?replication_research
A multi-master replikcio leheto"v teszi tbb master adatbzis
hasznlatt, br ez a technologia drasztikusan cskkenti az adatbzis
teljestmnyt a sok szinkornizcio miatt. A PGCluster a legelterjedtebb
ilyen megolds.
Egy tbbfelhasznlos replikcios rendszer kszl itt:
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
4.28) Milyen kodolsi lehetsgek vannak?
* A contrib/pgcrypto tartlamaz szmos SQL lekrdezsben hasznlhato
kodolst.
* A kliens-szerver kommunikcio rejtjelezsre a hostssl hasznlhato.
Ezt a pg_hba.conf-ben engedlyeztheted.
* Az adatbzis felhsznlok jelszavait trolskor kodolja a rendszer.
* Rgebbi verziokban a PASSWORD_ENCRYPTION opcioval lehetett
bekapcsolni.
* A szerveren hasznlhatsz kodolt fjrendszert.
----------------------------------------------------------------------
A PostgreSQL kiterjesztse
5.1) rtam egy felhasznloi funkciot. Mirt core dumpol az adatbzis
amikor hasznlom?
Szmos problma lehet. Elbb probld ki a funkciodat egy klnllo
alkalmazsban.
5.2) Hogyan lehet j adattpusokat s funkciokat hozzadni a PostgreSQL
disztribciohoz?
Kldd el a kiegsztseid a pgsql-hackers levelezsi listra s a
forrskodjaid vgl a contrib-ban ktnek ki.
5.3) Hogyan lehet olyan C funkciot rni, ami Tuple-t ad vissza?
A 7.3 verziotol kezdve a PostgreSQL tmogatja a tblzatokat viszzaado
funkciokat C, PL/pgSQL s SQL nyelveken. Bvebb dokumentciot a Programozo
kziknyvben tallsz. Egy C plda funkcio tallhato a contrib/tablefunc
knyvtrban.
5.4) Megvltoztattam egy forrs llomnyt. Mirt nem vltozik a binris
jrafordts utn?
A Makefile-ok nem ismerik a include llomnyok megfelel fggsgeit.
Vgre kell hajtanod egy make clean-t, majd jra egy make-t. Ha GCC-t
hasznlsz felhasznlhatod a configure script --enable-depend opciojt, gy
a compiler maga fogja ellenrizni a fggsgeket.
PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)
原文最終更新日: Thu Jan 01 14:01:00 EDT 2009
現在の維持管理者: Bruce Momjian (bruce@momjian.us)
Maintainer of Japanese Translation: Jun Kuwamura (juk at postgresql.jp)
この文書の最新版は http://www.postgresql.org/docs/faqs.FAQ.html で見ることがで
きます。
プラットホームに特有の質問については: http://www.postgresql.org/docs/faq/
に解答があります。
(以下、訳者による注釈を [訳注: と ] とで囲んで記します。)
[訳注:
日本語版のFAQは、
http://www.postgresql.org/docs/faqs.FAQ_japanese.html
にあります。
最新の日本語版については、この文書の最後にある「日本語版について」をごらんください。
]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一般的な質問
1.1) PostgreSQLとは何ですか?その呼び方は? Postgresとは?
1.2) 誰が PostgreSQL をコントロールしていますか?
1.3) PostgreSQLの著作権はどうなってますか?
1.4) PostgreSQLをサポートするプラットホームは?
1.5) PostgreSQLはどこから入手できますか?
1.6) 最新のリリースはどれですか?
1.7) サポートはどこで受けられますか?
1.8) バグレポートはどのように発信しますか?
1.9) 既知のバグや未だ無い機能はどうやって見つけますか?
1.10) どのような文書がありますか?
1.11) SQLはどうすれば学べますか?
1.12) パッチを提供したり、開発チーム参加するにはどうすればよいですか?
1.13) 他のDBMSと比べてPostgreSQL はどうなのですか? PostgreSQLを組み込みに使え
ますか?
1.14) PostgreSQLは国毎の最新の夏時間の変更を扱いますか?
1.15) PostgreSQLのメーリングリストの購読をやめるにはどうすればよいですか?また
、電子メールを重複して受け取らないようにするにはどうしますか?
ユーザ・クライアントの質問
2.1) PostgreSQL にはどんなインターフェースが使えますか?
2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか?
2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか?
管理上の質問
3.1) どうすれば、PostgreSQLを/usr/local/pgsql 以外の場所にインストールできます
か?
3.2) 他のホストからの接続はどのように制御しますか?
3.3) より良い性能を得るためには、データベース・エンジンをどのように調整しますか
3.4) どのようなデバグ機能が使えますか?
3.5) 接続しようとするときに 'Sorry, too many clients' が出るのはなぜですか?
3.6) PostgreSQLのアップグレードの手順はどうなりますか?
3.7) ハードウェアにはどのようなコンピュータを使えばよいですか?
操作上の質問
4.1) 最初のいくつかのロウのみを select するにはどうしますか?ランダムなロウ?
4.2) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように
して見つけ出しますか?
4.3) カラムのデータタイプを変更するにはどうしますか?
4.4) ロウ、テーブル、データベースの最大サイズは?
4.5) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量
はどのくらい必要ですか?
4.6) クエリが遅いのはなぜでしょう?なぜ、インデックスが使われないのでしょうか?
4.7) クエリオプティマイザが、どのようにクエリを評価していかを、見るにはどうしま
すか?
4.8) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現
しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使い
ますか?
4.9) クエリの中で、フィールドが NULL であることを検出するにはどうしますか?
NULLの可能性のあるものをどのようすれば連結できますか? フィールドがNULLかどうか
でどのようにソートができますか?
4.10) いろいろな文字型のそれぞれの違いは何ですか?
4.11.1) 通番(serial)/自動増分フィールドはどのようにつくりますか?
4.11.2) SERIALデータ型に挿入される値は、どうすれば得られますか?
4.11.3) currval() は他のユーザとの競合状態に陥ることはないですか?
4.11.4) トランザクションが中断したときにもういちどシーケンス番号が使われないの
はなぜですか?シーケンス/SERIALカラムに空きがあるのはなぜですか?
4.12) OID とは何ですか? TID とは何ですか?
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) テーブルとカラムの名前がクエリーの中で認識されないのはなぜですか?なぜ大
文字化(キャピタライズ)は温存されないのですか?
日本語に関する質問
5.1) 日本語がうまく扱えないのはなぜですか?
5.2) psql でWindowsからアクセスしたときに、日本語が文字化けするのですが?
5.3) PostgreSQLで日本語の全文検索はできますか?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一般的な質問
1.1) PostgreSQLとは何ですか?その呼び方は? Postgresとは?
PostgreSQLはPost-Gres-Q-L(ポスト・グレス・キュー・エル) と発音しますが、会話の
中では単純に Postgres と呼ばれることもあります。("PostgreSQL"をどう発音するか
気になる人のために、音声ファイルを用意してあります。
PostgreSQL はオブジェクト-リレーショナルデータベースシステムで、伝統的な商用デ
ータベースシステムに、次世代DBMSシステムに見られるような改良が施された特徴を有
します。PostgreSQLは、無料で完全なソースコードを手に入れることができます。
PostgreSQL の開発は、ほとんどが、世界中にひろがったボランティアの開発者によって
、インターネットを通したコミュニケーションによって行われています。コミュニティ
によるプロジェクトであるため、どの企業の制御もうけません。開発に参加したければ
、 http://www.postgresql.org/docs/faqs.FAQ_DEV.html にある開発者のFAQを見てくだ
さい。
PostgresはPostgreSQLの広く使われている愛称です。また、バークレーでのプロジェク
トでもともと使われていた名前で、ほかのいずれの愛称に比べても遥かに好ましいです
。'PostgreSQL' の発音が難しいと思うのであれば、そのかわりに 'Postgres' と呼ぶよ
うにしましょう。
1.2) 誰が PostgreSQL をコントロールしていますか?
PostgreSQLの門番、中央委員会、あるいは、コントロールをする会社を探そうとしても
、諦めざるをえず ---- 存在しないのです。我々は、中心となるコミッティとCVSコミッ
タを持ちますが、これらのグループはコントロールするためというよりも、管理上のも
のです。ここでは、プロジェクトは、だれでも参加ができる開発者とユーザのコミュニ
ティにより方向付けられます。読者がやらなければならないことは、メーリングリスト
をサブスクライブして、議論に参加することです。(Developer's FAQには、PostgreSQL
開発に加わり方についての情報があります。)
1.3) PostgreSQL の著作権はどうなってますか?
PostgreSQL は下記の著作権に従います。
PostgreSQLは古くからのBSDライセンスの下で配布されています。それは基本的には、利
用者がそのコードを好き勝手に利用することが許されています。制限があるとすれば、
このソフトウェアに伴ういかなる問題においても法的に責任を我々に負わせることがで
きないということです。また、この著作権表示がこのソフトウェアのすべての複製に表
示することも必要です。以下に、我々が実際に使っているBSD使用許諾書を示します:
[訳注:
正文は英語です。参考として、訳文を併記掲載します。
]
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.
POSTGRESQL データベース管理システム
部分的著作権 (c) 1996-2009, PostgreSQL国際開発グループ
部分的著作権 (c) 1994-1996 カリフォルニア大学本校
本ソフトウェアおよびその文書一式は上記の著作権表示と、この文章
およびこれに続く二つの段落が全ての複製に添付されている限りにおい
て、使用、複製、修正および配付の許可を、いかなる目的であっても、
無償でかつ同意書無しに行なえることをここに認めます。
カリフォルニア大学は、いかなる当事者にたいしても、利益の壊失を
含む、直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた
損害について、たとえカリフォルニア大学がこれらの損害について訴追
を受けていたとしても、一切の責任を負いません。
カリフォルニア大学は、商用目的における暗黙の保証と、特定目的で
の適合性に関してはもとより、これらに限らず、いかなる保証も放棄す
ることを明言します。以下に用意されたソフトウェアは「そのまま」を
基本原理とし、カリフォルニア大学はそれを維持、支援、更新、改良あ
るいは修正する義務を負いません。
[訳注:
著作権に関する正文は上記の英語による表記です。日本語訳はあくまで
参考程度としてください。
]
1.4) PostgreSQLをサポートするプラットホームは?
一般的に、最近のUnix互換プラットホームであればPostgreSQLを稼働させられるはずで
す。リリースの時点で実際にテストを行なったことの報告がなされたプラットホームに
ついてはインストール手引書に列挙してあります。
PostgreSQL は、Win2000 SP4, WinXP, そして、Win2003 など Microsoft Windows NTベ
ースのオペレーティングシステムで、ネイティブに走ります。あらかじめパッケージに
されたインストーラが http://www.postgresql.org/download/windows からダウンロー
ドできます。 MSDOSベースのWindowsのバージョン(Win95, Win98, WinMe)では、Cygwin
を使って PostgreSQL を走らせることができます。
[訳注
日本語での情報は、次の Windows版に関するFAQの和訳をごらんくださ
い(やや古いです)。
http://old.postgresql.jp/wg/jpugdoc/FAQ_windows.ja.html
]
次のサイトに Novell Netware 6 への移植版もあります。 http://
developer.novell.com/wiki/index.php/Postgresql また、OS/2 (eComStation) バージ
ョンは、 http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=
postgreSQL&stype=all&sort=type&dir=%2Fにあります。
1.5) PostgreSQL はどこから入手できますか?
Webブラウザ経由だと、 http://www.postgresql.org/ftp/、それから、ftp経由だと、
ftp://ftp.postgresql.org/pub/ を使います。
1.6) 最新のリリースはどれですか?
PostgreSQL の最新版はバージョン 8.3.5 です。
我々は、1年毎にメジャーリリースを、数ヵ月ごとのマイナーリリースを行なうことを計
画しています。
[訳注
バージョン番号の x.y.z の最初の x.y がメジャーリリースの番号に相
当し、最後の z がマイナーリリースの番号になります。メジャーリリー
スの番号が同じであれば、データベース・クラスタに互換性があります。
]
1.7) サポートはどこで受けられますか?
PostgreSQL コミュニティは多くのユーザのために、電子メール経由の支援を提供してい
ます。電子メールリストをサブスクライブするためのメインとなるウェブサイトは
http://www.postgresql.org/community/lists/です。これから、始めるのであれば
general または、bugs といったリストがよいでしょう。
メジャーなIRC チャンネルは、Freenode (irc.freenode.net)の #postgresql というチ
ャンネルです。UNIX コマンドでは、 irc -c '#PostgreSQL' "$USER" irc.freenode.net
を使って参加できます。同じネットワークに、スペイン語のチャンネル (#
postgresql-es)、フランス語のチャンネル (#postgresqlfr)、ブラジル語チャンネル (#
postgresql-br) もあります。また、EFNetにもPostgreSQLチャンネルがあります。
[訳注:
1999年7月23日、日本ポストグレスユーザー会、略称JPUGが設立されました。
JPUG は非営利組織で、PostgreSQLを利用する人達の相互協力の場となっています。
(2006年 特定非営利活動(NPO)法人日本PostgreSQLユーザ会になりました。
Web会員と正会員の会費は無料ですが、協賛会員の会費と会員の貢献で
会は運営されています。)
詳しくは、JPUG のWeb サイト:
http://www.postgresql.jp/
をごらんください。
日本語のIRCチャンネル '#PostgreSQL:*.jp' も存在します。
]
商用サポート会社のリストは http://www.postgresql.org/support/
professional_supportにあります。
1.8) バグレポートはどのように発信しますか?
http://www.postgresql.org/support/submitbug のPostgreSQL バグフォームを訪れてく
ださい。バグレポートを提出する仕方についての手引と指針があります。
それと同時に ftp サイト ftp://ftp.postgresql.org/pub/ で、最新バージョンの
PostgreSQL を探してみてください。
1.9) 既知のバグや未だ無い機能はどうやって見つけますか?
PostgreSQLは拡張されたSQL:2003のサブセットをサポートします。我々のページの TODO
リストに、既知のバグや欠落機能や将来計画についての記述があります。
特徴の要求は普通次のいずれかの解答の中にあります:
・ 既にここにある機能は、 TODO リストです
・ 次のような機能は目論まれていません。それは:
□ SQL規格に準ずる既存の機能と重複するもの
□ コードの複雑性ばかりを高めて、得るものが少ない機能
□ 安全性が確められない機能
・ 新しい機能は、 TODO のリストに加えられられます。
我々は、PostgreSQL に関して、電子メールで直接対応して TODO リストを最新に更新し
てゆくほうがより効果的であることを知っていますので、バグ追跡システムは使いませ
ん。現実に、このソフトウェアの中でバグはそれほど長くはい続けませんし、多くのユ
ーザに影響するバグは早急に修正されます。PostgreSQLのリリースで、すべての変更点
、改良点、そして、修正点を知りたければ、 CVS のログメッセージを見てください。リ
リースノートにさえ、このソフトウェアに加えられたすべての変更点は網羅されていま
せん。
1.10) どのような文書がありますか?
配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ)お
よびいくつかの小さなテスト例題が含まれます。 /docディレクトリをごらんください。
また、マニュアルは、 http://www.postgresql.org/docs/でオンラインでも閲覧できま
す。
[訳注:
JPUG 文書・書籍関連分科会で翻訳されたマニュアルもあります。
http://www.postgresql.jp/document/pg830doc/
インプレスから、
PostgreSQLオフィシャルマニュアルとして出版されています。
]
オンラインで参照できる PostgreSQL の本も2冊あります。 http://www.postgresql.org
/docs/books/awbook.html
[訳注:
この本は、JPUG「PostgreSQL Book翻訳分科会」
で翻訳され、ピアソンから
「はじめてのPostgreSQL」として出版されています。
]
および、 http://www.commandprompt.com/ppbook/です。
[訳注:
邦訳は「実践 PostgreSQL」
がオライリーから出版されています。
]
購入可能な書籍の目録は、http://www.postgresql.org/docs/books/ にあります。
PostgreSQL 技術情報記事も、http://wiki.postgresql.org/wiki/
Community_Generated_Articles%2C_Guides%2C_and_Documentation にあります。
[訳注:
日本語の書籍等については、日本PostgreSQLユーザ会の、http://www.postgresql.jp/PostgreSQL/references.html
もごらんください。
]
コマンドラインのクライアントプログラムpsql にも、型、演算子、関数、集約、その他
の情報を調べるために、素晴らしい \d コマンドがいくつかあります。 \? を入力する
と利用可能なコマンドが表示されます。
我々の Web サイトには、さらに沢山の文書があります。
[訳注:
2008年11月18日、PostgreSQL普及のために一般向けの情報を扱う
「Let's Postgres」というポータルサイトがオープンしました。http://lets.postgresql.jp/
]
1.11) SQL はどうすれば学べますか?
まず、上記で述べた PostgreSQL についての本を読むことを検討してください。 The
Practical SQL Handbook, Bowman Judith S. et al., Addison-Wesley も多くのユーザ
に好評です。ほかでは、The Complete Reference SQL, Groff et al., 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
http://sqlzoo.net にあります。
[訳注:
日本PostgreSQLユーザ会の日本語の参考文献の紹介ページ
http://www.postgresql.jp/PostgreSQL/references.html
があります。
堀田倫英氏の「PostgreSQL日本語マニュアル」
http://www.net-newbie.com/
ではオンラインマニュアルの検索ができます。
丸山不二夫氏のUNIX データベース入門
http://www.wakhok.ac.jp/DB/DB.html
もオンラインで読むことができます。
Nikkei BP IT Pro にある石井達夫氏の PostgreSQL ウォッチ
では毎回新しい情報をとりあげています。
]
1.12) パッチを提供したり、開発チーム参加するにはどうすればよいですか?
(開発者向けの)Developer's FAQをごらんください。
1.13) 他のDBMSと比べPostgreSQLはどうなのですか? PostgreSQLを組み込みに使えます
か?
ソフトウェアを評価する方法にはいくつかあります。機能と性能と信頼性とサポートと
価格です。
機能(Features)
PostgreSQLは、トランザクション、サブクエリ、トリガー、ビュー、外部キー整合
性参照、および、洗練されたロック機構など、大規模商用 DBMSが持つ機能をほとん
ど持っています。さらに PostgreSQLは、ユーザ定義型、継承、ルール、それから、
ロック競合を縮小するマルチバージョン同時性制御など、商用DBMSも持ち合わせな
いような機能をいくつか持ち合わせています。
性能(Performance)
PostgreSQLは他の商用あるいはオープンソースのデータベースと互角の性能も持ち
ます。ある面ではより早かったり、ほかの面ではより遅かったりします。他のデー
タベースに比べた性能は、ふつう +/-10% くらいでしょう。
信頼性(Reliability)
我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十分テ
ストして、安定したコードをバグを最小にしてからリリースするように努めてます
。それぞれのリリースは少なくとも1 カ月以上のベータ・テストを行ない、これま
でのリリースの履歴が、製品版として安定した堅固なリリースであることを物語っ
ています。この分野では、他のデータベースと比べても遜色がないことに自信を持
っています。
サポート(Support)
我々のメーリングリストは、遭遇するいかなる問題についても解決への手助けをし
てくれる、開発者やユーザの大きな集まりへの接点を提供しています。我々は問題
の解決を保証することはできませんが、商用データベースであっても常に解決され
るわけではありません。開発者や、ユーザ・コミュニティ、マニュアル類、それに
、ソースコードなどへ直接アクセスできることによって、PostgreSQLのサポートは
、他のDBMS サポートよりも優れたものとなっています。御要望に答えて、事柄毎の
商用サポートなどもあります(FAQ1.7節をごらんください)。
価格(Price)
PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示してあるBSD
スタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで商品に組み
込むことができます。
PostgreSQLはクライアント/サーバ・アーキテクチャで設計されていて、クライアント
とサーバおよびそれを補助するいろいろなプロセスが別々に走ることが要求されます。
多くの組み込みアーキテクチャはこのような要求をサポート可能です。しかし、お使い
になっている組み込みアーキテクチャによっては、データベースサーバがアプリケーシ
ョン・プロセスの中で走ることを要求される場合があり、Postgresを使うことはできな
いので、軽量のデータベースソリューションを選択すべきです。
1.14) PostgreSQLは国毎の最新の夏時間の変更を扱いますか?
合州国の夏時間の変更は、PostgreSQLのリリース8.0.4以降[4+]と、その後のメジャーリ
リース、たとえば 8.1 には含まれています。カナダとオー西部ストラリアの変更は、
8.0.[10+], 8.1.[6+] および、その後のメジャーリリースのすべてに含まれます。8.0よ
り前のPosrgreSQLではオペレーティングシステムのタイムゾーンデータベースを夏時間
情報のために使っています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.15) PostgreSQLのメーリングリストの購読をやめるにはどうすればよいですか?また
、電子メールを重複して受け取らないようにするにはどうしますか?
PostgreSQLのMajordomo ページから、PostgreSQLに関する複数のメーリングリストの購
読の開始と中止ができるようになっています。(ログインするためにはMajaordomoから
送られる御本人のパスワードが必要になります。)
PostgreSQLnoすべてのメーリングリストでは、返信はメーリングリストとかつ元のメー
ルの投稿者へ送られるように構成してあります。これにり利用者は、もっとも迅速にメ
ールへの返信を受けられるようになっています。既に直接受け取っているメールを、リ
ストから重複して受け取りたくない場合は、Majordomo のChange Settingsページから、
eliminateccをチェックします。また、selfcopyのチェックをはずすことで、自分の送っ
たメールのコピーを受け取らないようにもできます。
ユーザ・クライアントの質問
2.1) PostgreSQL にはどんなインターフェースが使えますか?
PostgreSQL のインストールに含まれる物はCと組込み Cのインターフェースだけです。
その他のインターフェースは独立したプロジェクトで、別々にダウンロードされます。
分かれることで、それぞれの開発チームが独自のリリーススケジュールを持つことが許
されます。
PHP のようないくつかのプログラミング言語は、 PostgreSQLのインターフェースを含ん
でいます。Perl, TCL, Python, そして、そのほかの利用可能な言語のインターフェース
は、http://pgfoundry.org の Drivers/Interfaces の節の中とインターネットの検索で
みつけられます。
2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか?
データベースを裏に持つ Web ページについての素晴らしい紹介が、
http://www.webreview.comにあります。
Web への拡張のためには、PHP(http://www.php.net/) が卓越したインターフェースとな
っています。
[訳注:
PHPに関する日本語の情報は、2000年4月19日に発足した日本PHPユーザ会のサイト
http://www.php.gr.jp/
あるいは、廣川 類さんのサイト
http://www.geocities.jp/rui_hirokawa/php/
にかなりまとめられています。
]
処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm か mod_perl を使い
ます。
2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか?
商用とオープンソース開発者によるもの両方で、PostgreSQLには多くのGUIツールが利用
可能で、詳細なリストは、 PostgreSQL GUI ツールについてのコミュニティガイドにて
ごらんください。
[訳注:
pgAdmin3 はPostgreSQL標準GUI管理ツールで、Windows版(PostgreSQL
for Windows) に同梱されています。詳しい情報は、
http://www.pgadmin.org/にあります。
]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
管理上の質問
3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか?
簡単な方法は、 configure を走らせるときに --prefix オプションを指定することです
3.2) 他のホストからの接続はどのように制御しますか?
既定値では、PostgreSQL は Unix ドメインソケット、または、TCP/IP接続のローカルマ
シンからの接続しか許しません。postgresql.conf の中の listen_addresses を修正し
、かつ、$PGDATA/pg_hba.conf ファイルを適切に直し、データベースサーバを再起動し
て、ホストベースの認証を有効にしないかぎりは、他のマシンからは接続できないでし
ょう。
3.3) より良い性能を得るためには、データベース・エンジンをどのように調整しますか
性能改善の可能性のありそうな主な領域が3つあります:
クエリの変更
クエリを修正してより良い性能を得ることを含みます:
□ 式および部分インデックスを含む、インデックスを作成
□ 複数のINSERTのかわりにCOPYを使用
□ 複数の文をグループ化し、1つのトランザクションにしてコミットのオーバヘッ
ドを削減
□ インデックスからから沢山のロウを取り出すときはCLUSTERを使用
□ クエリの出力のサブセットを返すためにLIMITを使用
□ 準備されているクエリを使用
□ オプティマイザの正確な統計を維持するためにANALYZEを使用
□ VACUUM または pg_autovacuum の常用
□ 大きなデータ変更のあるときはインデックスを削除
サーバ構成
postgresql.confの設定のいくつかは性能に影響します。詳しくは、
Administration Guide/Server Run-time Environment/Run-time Configuration の
全件リストをごらんください( JPUGサイトの日本語版、サーバの構成)。そして、解
説として、 http://www.varlena.com/varlena/GeneralBits/Tidbits/
annotated_conf_e.html および、 http://www.varlena.com/varlena/GeneralBits/
Tidbits/perf.html をごらんください。
ハードウェアの選定
性能におけるハードウェアの影響は http://www.powerpostgresql.com/PerfList/
と、 http://momjian.us/main/writings/pgsql/hw_performance/index.html (JPUG
サイトの日本語版) に述べられています。
[訳注:
JPUG理事長の片岡裕生氏による、「今すぐできるPostgreSQLチューニング」
というコーナーが ThinkIT サイトにあり、実作業の参考になります。
http://www.thinkit.co.jp/free/tech/10/1/1.html
]
3.4) どのようなデバグ機能が使えますか?
サーバ構成変数については、 href="http://www.postgresql.org/docs/current/
interactive/runtime-config-logging.html">http://www.postgresql.org/docs/current
/interactive/runtime-config-logging.html に示されるように多くの log_* があり、
クエリとプロセスの統計情報を出力することができ、デバグや性能測定にはとても便利
です。
3.5) 接続しようとするときに 'Sorry, too many clients' が出るのはなぜですか?
既定での制限である 100 のデータベースセッションに達してしまっています。サーバー
の同時接続できるバックエンドプロセスの制限値を増やす必要があります。
postgresql.conf の中のmax_connections の値を変更してサーバを再起動することで可
能になります。
3.6) PostgreSQLのアップグレードの手順はどうなりますか?
バージョン番号付けの方針について、更新全般についての解説はhttp://
www.postgresql.org/support/versioning を、そして、アップグレードについての一般
的な説明は http://www.postgresql.org/docs/current/static/install-upgrading.html
をご覧ください。
[訳注:
アップグレードについての和訳版は下記にあります。
http://www.postgresql.jp/document/current/html/install-upgrading.html
]
[訳注:
原文では、下記の内容は独立したページに移され、削除されています。
新しい機能を盛り込むPostgreSQLのメジャーリリースはだいたい年に1回程度行ないます
。メジャーリリースは、たとえば、8.1から8.2へのように、バージョン番号の1番目か2
番目の部分を増やしてゆきます。
PostgreSQLのメジャーリリースは通常、システムテーブルとデータの内部フォーマット
を変更します。これらの変更はたいていは複雑なのでで、データファイルの後方互換性
を維持したりはしません。メジャーアップグレードのためには、データベースのダンプ/
リロードが必要になります。
マイナーリリースは、たとえば、8.1.5 から8.1.6へのように、バージョン番号の3番目
の値を増やします。PostgreSQLチームは、マイナーリリースに対しては、バグフィクス
しか行ないません。すべてのユーザは、できるだけ最新のマイナーリリースに更新すべ
きです。アップグレードには、常にリスクがつきものですから、PostgreSQLのマイナー
修正リリースでは、頻繁に発生したり、セキュリティに関係したり、データがつぶれる
バグだけを修正し、アップグレードのリスクを最小限にとどめます。我々のコミュニテ
ィでは、アップグレードするリスクよりも、アップグレードしないリスクのほうが高い
と考えています。
マイナーリリースのアップグレードにはダンプとリストアの必要はなく、データベース
サーバを停止して、アップデートされたバイナリをインストールし、サーバをリスター
トします。
]
3.7) ハードウェアにはどのようなコンピュータを使えばよいですか?
PCハードウェアはほとんど互換性がありますので、ほとんどの人は、すべてのPCハード
ウェアが同じ品質だと思い込む傾向があります。しかし、それは間違いです。ECC RAM、
SCSI、および、高品質マザーボードは、安いハードウェアに比べると、より信頼性が高
く、より性能も良いのです。 PostgreSQL はほとんどのハードウェアで稼働しますが、
信頼性や性能が重要な場合は、使用中のハードウェアのオプションについて調査するこ
とが賢明です。バッテリーバックアップ付きのキャッシュを持つディスクコントローラ
も役に立ちます。我々のメーリングリスト上でもハードウェアオプションのトレードオ
フについて議論することができます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
操作上の質問
4.1) 最初の数ロウのみを SELECTするにはどうしますか?ランダムなロウ?
取得したいロウがほんの数行で、SELECT の実行時に取得するロウの数が分かっていれば
LIMIT を使いましょう。インデックスが ORDER BY とマッチすれば、クエリ全体を(丸ご
と)実行しなくても済む場合もあります。SELECT する時点でロウの数が不明なら、カー
ソルを使って FETCH しましょう。
ランダムにロウをSELECTするには、次の文を使います:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.2) 定義されたテーブル、インデックス、データベース、および、ユーザをどのように
して見つけ出しますか?psqlで使われているクエリを表示するにはどうしますか?
psql の中で \dtコマンドを使ってテーブルを見ることができます。psqlの中で \? を使
って、コマンドの全リストを調べることができます。一方で、psql のソースコードで、
バックスラッシュコマンドを出力する pgsql/src/bin/psql/describe.c ファイルを読む
こともできます。その中には、 SQL コマンドを生成する部分も含まれます。また、 -E
オプションを付けて psql を開始すると、入力されたコマンドを実行するためのクエリ
を印字出力するようになります。 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) ロウ、テーブル、データベースの最大サイズは?
制限は以下のとおりです:
データベースの最大サイズ? 制限無し (32 TB のデータベースも存在しま
す)
テーブルの最大サイズ? 32 TB
ロウの最大サイズ? 400 GB
フィールドの最大サイズ? 1 GB
テーブル内での最大ロウ数? 制限無し
テーブル内での最大カラム数? カラムの型によって 250-1600
テーブル内での最大インデックス 制限無し
数?
もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペー
スの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを受け
ます。
最大テーブルサイズの32TBはオペレーティングシステムによる巨大ファイルのサポート
は必要としません。巨大なテーブルは複数の1GBのファイルに分けて保存されますので、
ファイルシステムの制限は重要ではありません。
デフォルトのブロックサイズを32kに増加することで、最大テーブルサイズと行サイズと
最大カラム数とを4倍にすることができます。また、最大テーブルサイズはテーブルパー
ティションを使って増やすこともできます。
ひとつの制限は、約2,000文字以上の長さのカラムにインデックスを付けることができな
いことです。幸いにも、そのようなインデックスは実際は必要ありません。長いカラム
のMD5ハッシュの関数インデックスは一意性がなによりの保険で、また、フルテキストの
インデックスではカラム内の単語を検索することができます。
4.5) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量
はどのくらい必要です?
普通のテキストファイルを PostgreSQL のデータベースに保存するには、最大で約5倍の
ディスク容量を必要とします。
例題として、各行に整数とテキスト記述を持つ 100,000行のファイルを考えてみましょ
う。テキストの文字列の平均長さを20バイトと仮定すると、フラットファイルの大きさ
は約2.8MB です。このデータを含む PostgreSQL データベースファイルの大きさは次の
ように約5.2MBと見積もることができます:
24 bytes: 各ロウのヘッダ(概算)
24 bytes: 整数(int)フィールドとテキスト(text)フィールド
+ 4 bytes: ページ上のタップルへのポインタ
----------------------------------------
52 bytes per row
PostgreSQL のデータページサイズは 8192バイト(8KB)なので:
8192 bytes per page
------------------- = 146 rows per database page (切り捨て)
52 bytes per row
100000 data rows
-------------------- = 633 database pages (切り上げ)
158 rows per page
633 database pages * 8192 bytes per page = 5,185,536 bytes (5.2 MB)
インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされる
データを含む以上、それなりに大きくなります。
NULLはビットマップとして保存されていて、それらがわずかにスペースを使います。
4.6) クエリが遅いのはなぜでしょう?なぜ、インデックスが使われないのでしょうか?
インデックスは、すべてのクエリで使われるわけではありません。テーブルが最小サイ
ズより大きく、クエリでそのわずかなパーセンテージのロウを選択する時だけ、インデ
ックスは使われます。これはインデックススキャンにより起こされるランダムなディス
クアクセスは、テーブルをストレートに読む順次走査よりも遅くなることがあるからで
す。
インデックスを使うかを決定するために、PostgreSQL はテーブルについての統計情報を
持たなければなりません。この統計情報は、 VACUUM ANALYZEまたは、単に ANALYZE を
使って収集することができます。統計情報を使ってオプティマイザはテーブルの中にあ
るロウ数を知り、インデックスを使うべきかの決定をより正しくできます。統計情報は
最適な結合順や結合方法を決める上でも貴重なものもあります。統計情報の収集は、テ
ーブルの内容が変わる毎に繰返しなされるべきです。
インデックスは、通常 ORDER BY や結合を行なうためには使われません。順次スキャン
に続く明示的ソートは、巨大なテーブルのインデックススキャンよりも普通は高速です
しかし、ORDER BYと組み合わされたLIMIT は、テーブルの小さな部分を返すためにたび
たびインデックスを使うでしょう。
もし、オプティマイザが間違ってシーケンシャルスキャンを選択したことに疑いがなけ
れば、SET enable_seqscan TO 'off'に設定して、クエリをもう一度実行し、インデック
ススキャンがまちがいなく速くなっているかどうかをみてください。
LIKE あるいは ~ のようなワイルドカード演算子は特別な環境でしか使えません:
・ 検索文字列が文字列の最初にききます。たとえば:
□ LIKE パターンが%で始まらない
□ ~ (正規表現) パターンは^で始まらなければならない
・ 検索文字列を文字クラスから始めることはできません。たとえば、[a-e]。
・ ILIKE や ~* のような大文字と小文字を区別しない検索は使えません。そのかわり
、このFAQの4.8節で説明する式インデックスが使えます。
・ initdb においては、デフォルトでCロケールが使われなくてはなりません。その理
由は、Cロケール以外では次に大きな文字を知ることができないからです。このよう
な場合、
LIKE
インデクシングにだけ働くような、特別な
text_pattern_ops
インデックスを作成することもできます。また、それを全文検索のフルテキストの
インデックス作成に使うことができます。
4.7) 問い合わせオプティマイザがどのように問い合わせを評価するのかを見るにはどう
しますか?
オンラインマニュアルで EXPLAIN を見てください。
4.8) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現
しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使い
ますか?
~演算子は正規表現照合を行ない、~* は大文字と小文字を区別しない
(case-insensitive)正規表現照合を行います。大文字と小文字を区別しない LIKE 演算
子を ILIKE といいます。
大文字と小文字を区別しない等値比較は次のように表現できる:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
標準インデックスでは使われず、しかしながら、もし、式インデックスを作ったならそ
れが使われるでしょう。
CREATE INDEX tabindex ON tab (lower(col));
上記のインデックスがUNIQUEで作成された場合、カラムは大文字と小文字を格納できま
すが、その違いが文字ケースだけであっても同一にはなりません。あえて特定の文字ケ
ースをカラムに格納するには CHECK制約か、トリガーを使ってください。
4.9) クエリの中で、フィールドがNULL であることを検出するにはどうしますか? NULL
であることを検出するにはどうしますか?フィールドがNULLかどうかでどのようにソー
トができますか?
以下のように、IS NULL と IS NOT NULLで、そのカラムをテストしてみます:
SELECT *
FROM tab
WHERE col IS NULL;
NULLの可能性のあるものを連結するには、COALESCE()を次のように使います。
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
NULL状態でソートするには、IS NULL と IS NOT NULL の修飾子を ORDER BY 句の中で使
ってみます。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-byte safe)
"char" char 1文字
内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージを
受け取るときです。
上記の型のうち最初の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バ
イトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言
された大きさよりも少し大きくなります。しかし、長い値は圧縮されるので、ディスク
上の空間は思ったよりも小さくなります。
VARCHAR(n) は可変長の文字列を保存するのに最適ですが、保存できる文字列の長さに制
限があります。TEXT は長さに制限の無い文字列の保存のためのもので、最大で 1ギガバ
イトです。 CHAR(n)は、VARCHAR(n)が与えられた文字だけを保存するのに対し、ブラン
クを詰め込んでいつも同じ長さで文字列を保存するのに最適です。BYTEAは、部分的に
NULL のバイトを含むバイナリデータを保存するためのものです。これらのタイプは同じ
くらいの性能特性をもちます。
4.11.1) 通番(serial)/自動増分フィールドはどのようにつくりますか?
PostgreSQL は SERIAL データ型をサポートします。カラム上にシーケンスを自動作成し
ます。たとえば、
CREATE TABLE person (
id SERIAL,
name TEXT
);
は自動的に次のように翻訳されます:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
[訳注:
CREATE UNIQUE INDEX person_id_key ON person ( id );
は、 7.3 以降は自動的には行なわれなくなりました。
]
自動的につくられる通番は、 <table>_<serialcolumn>_seq と名付けられていて、table
と serialcolumn は、それぞれテーブルと SERIAL カラムの名前です。通番については
、オンラインマニュアルでcreate_sequence をごらんください。
4.11.2) SERIALデータ型に挿入される値は、どうすれば得られますか?
最も簡単な方法は、割り当てられたSERIAL値を RETURNINGとして取得することです。
4.11.1の例題テーブルを使うと次のようになります。
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
4.11.3) currval() は他のユーザとの競合状態に陥ることはないですか?
それはありません。currval() は、すべてのユーザではありませんが、読者のセッショ
ンに与えられた現在の値を返します。
4.11.4) トランザクションが中断したときにもういちどシーケンス番号が使われないの
はなぜですか?シーケンス/SERIALカラムに空きがあるのはなぜですか?
同時性を改善するために、実行中のトランザクションに、必要に応じてトランザクショ
ンが終了するまでロックされないようシーケンス値を与えています。このためトランザ
クションが中断されると番号割り当てにギャップを生じます。
4.12) OID とは何ですか? CTID とは何ですか?
テーブルがWITH OIDSでつくられた場合は、それぞれのロウに一意なOIDが取られます。
OIDは自動的に4バイトの整数で与えられ、それは、全インストレーションを通して一意
な値となります。しかし、約40億でオーバーフローし、そして、OIDは重複をしはじめま
す。PostgreSQLは内部システムテーブルを一緒にリンクするためにOID を使います。
ユーザのテーブルのカラムに一意の番号を付けるためには、 OID ではなく SERIAL を使
うのが最もよいでしょう。SERIALの連番は1つのテーブル内でのみ一意になるからで、オ
ーバーフローを起こしにくいと考えられます。 8バイトのシーケンス値を保存するため
に、SERIAL8があります。
CTID は、特定の物理ロウをブロックとオフセットの値で識別するために使われます。
CTIDは、ロウが修正されたり再読込みされたときに変わります。また、物理ロウを差す
ためにインデックスの記載に使われます。
4.13) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはな
ぜですか?
おそらく、システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、
カーネルがあるリソースについてもつ制限値が低すぎる可能性があります。サーバを始
動する前にこれを試してみてください:
ulimit -d 262144
limit datasize 256m
シェルによって、どちらかひとつが成功するでしょうが、これはプロセスのデータセグ
メント制限をより高く設定し、たぶんクエリが完結するようになるでしょう。このコマ
ンドは現行のプロセスと、このコマンドを走らせた後に作られる全てのサブプロセスに
ついて適用されます。バックエンドがとても多くのデータを返すために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 標準構文を使う外部結合(アウタージョイン)をサポートします。こ
こに 2つの例題があります。
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 結合は t2 の結合されなかったロ
ウを加えるでしょう。FULL 結合は、一致したロウに t1 と t2 からは結合されなかった
ロウを返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または FULL な
どの結合を仮定されています。通常、結合はINNER結合と呼ばれます。
4.17) 複数のデータベースを使う問い合わせはどのようにすればできますか?
現行のデータベース以外への問い合わせの方法はありません。というのもPostgreSQLが
データベース仕様のシステムカタログを読み込むためで、そこには、たとえそのふりを
するだけにしろ、データベースを越えて問い合わせをするすべがありません。
contrib/dblink はデータベース間(cross-database)の問い合わせを関数呼出しにより許
します。もちろん、クライアントは同時に接続を別のデータベースへも張らなくてはな
らず、結果をクライアント側でマージしなくてはなりません。
4.18) 関数から複数のロウまたはカラムを返すにはどうしますか?
集合を返す関数(Set Returning Functions): http://wiki.postgresql.org/wiki/
Return_more_than_one_row_of_data_from_PL/pgSQL_functions を使うと簡単です
4.19) PL/PgSQL の関数の中で一時テーブルにアクセスするとき、どうして "relation
with OID ##### does not exist" というエラーを受け取るのでしょうか?
バージョン8.3より前の PostgreSQL では、PL/PgSQL は関数スクリプトをキャッシュし
たため、運悪くその副作用がありました。PL/PgSQL 関数が一時テーブルにアクセスして
後でそのテーブルを消して作りした場合に、関数がもう一度呼び出されたときは、その
関数のキャッシュしていた内容がまだ古い一時テーブルを指し示したままだったからで
す。この、解決策として、PL/PgSQLの中で EXECUTE を一時テーブルへのアクセスのため
に使います。そうすると、クエリは毎回パースをやり直しされるようになります。
この問題は、 PostgreSQL バージョン8.3 以降では起きません。
4.20) どのようなレプリケーションのソリューションがありますか?
「レプリケーション」と一言でいいますが、レプリケーションをするための技術はいく
つかあり、それぞれ、利点と欠点があります。
マスタ/スレーブのレプリケーションは、読み/書きのクエリを受け取るシングルマス
タが可能で、スレーブでは読み/SELECTの問い合わせだけを受け付けることができます
。最も人気がある、フリーで利用できる、マスタ−スレーブのPostgreSQLレプリケーシ
ョンソリューションは、 Slony-I です。
マルチ−マスタのレプリケーションは、読み/書きのクエリを受けとり、複数のレプリ
ケートさせるコンピュータに送ることができます。この機能は、サーバ間の変更の同期
が必要なため、性能に重大な衝撃を与えます。 PGCluster は、このようなソリューショ
ンとしてPostgreSQLのためにフリーで利用できるものとして、最も人気があります。
この他にも、商用やハードウェア−ベースのレプリケーションソリューションがいろい
ろなレプリケーションモデルをサポートしています。
4.21)テーブルとカラムの名前がクエリーの中で認識されないのはなぜですか?なぜ大文
字化(キャピタライズ)は温存されないのですか?
名前が認識されない、最も一般的な原因は、テーブルを作成する際に、テーブルやカラ
ムを囲う二重引用符の使用です。二重引用符を使うと、テーブルとカラムの名前(識別
子といいます)は大文字と小文字の区別をして格納されます。したがって、pgAdminのよ
うにテーブル作成のときに自動的に二重引用符を使うものはクエリの中でそれらの名前
を使うときに二重引用符を付けなくてはならないことを意味します。このため、識別子
を認識させるためには以下のいずれかを心がけます。
・ テーブルを作成するときに二重引用符で識別子を囲うことを避ける
・ 識別子には小文字だけを使う
・ クエリの中で参照するときは二重引用符で識別子を囲う
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
日本語に関する質問
5.1)日本語がうまく扱えないのはなぜですか?
createdb -Eコマンドオプションに UTF8 あるいは EUC_JP のエンコーディングを指定し
てデータベースを作成するか、次のようにエンコーディングを指定してデータベースを
作成してください。
CREATE DATABASE dbname WITH ENCODING 'UTF8';
もしくは、
CREATE DATABASE dbname WITH ENCODING 'EUC_JP';
5.2) psql でWindowsからアクセスしたときに、日本語が文字化けするのですが?
psqlの中でクライアントのエンコーディングを指定してください。
SET client_encoding TO 'SJIS'
PostgreSQLデータベースのエンコーディングに使える日本語文字コードは EUC_JP か
UTF-8(UNICODE) であるため、Shift-JIS表示のコマンドプロンプトからは、
client_encodingを設定しておかないと、日本語を表示する際に文字化けがおきます。
5.3) PostgreSQLで日本語の全文検索はできますか?
バージョン8.3では、TSearch2全文検索機能が本体に組み込まれましたが、そのままでは
日本語のインデックスを作る事が難しい状況です。これを解決するために、Takahiro
Itagaki氏によって、Mecabという形態素解析プログラムを利用する日本語全文検索モジ
ュール textsearch_ja が開発されました。TSearch2対応の製品をわずかに改修すること
で日本語対応にきます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「日本語版について」
[訳注:
日本語版の製作については以下の通りです。
最終更新日: 2008年10月8日
翻訳者: 桑村 潤 (Jun KUWAMURA <juk at postgresql.jp>)
このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):
田仲 稔(Minoru TANAKA <Tanaka.Minoru at keiken.co.jp>)
石井 達夫(Tatsuo ISHII <ishii at sraoss.co.jp>)
齊藤 知人(Tomohito SAITOH <tomos at elelab.nsc.co.jp>)
馬場 肇(Hajime BABA <baba at kusastro.kyoto-u.ac.jp>)
岡本 一幸(Kazuyuki OKAMOTO <kaz-okamoto at hitachi-system.co.jp>)
小菅 昭一(Shoichi Kosuge <s-kosuge at str.hitachi.co.jp>)
山下 義之(Yoshiyuki YAMASHITA <dica at eurus.dti.ne.jp>)
境 真太郎(Sintaro SAKAI <s_sakai at mxn.mesh.ne.jp>)
生越 昌己(Masami OGOSHI <ogochan at zetabits.com>)
石川 俊行(Toshiyuki ISHIKAWA <tosiyuki at gol.com>)
本田 茂広(Shigehiro HONDA <fwif0083 at mb.infoweb.ne.jp>)
せせ じゅん(Jun SESE <sesejun at linet.gr.jp>)
神谷 英孝(Hidetaka KAMIYA <hkamiya at catvmics.ne.jp>)
菅原 敦(Atsushi SUGAWARA <asugawar at f3.dion.ne.jp>)
稲葉 香理(Kaori Inaba <i-kaori at sraoss.co.jp>)
芳賀 靖史(Yasufumi Haga <yasufumi.haga at nifty.com>)
をはじめ、ポストグレスに関する話題豊富な日本語PostgreSQLメーリングリスト、
和訳のきっかけを作ってくれたり、いつもチェックをしてくれる
JF(Linux Japanese FAQ)プロジェクト、FreeBSD ドキュメンテーションプロジェクト
の方々、それから、直接あるいは間接的にかかわってくださるすべてのオープンソース
コミュニティのみなさまに感謝いたします。
この翻訳文書は 本家 "Frequently Asked Questions" のページに "Japanese FAQ"
という項目であります。
また、最新版は以下のサイトにあります。
http://www.postgresql.jp/wg/jpugdoc/ 「JPUG文書・書籍関連分科会」
http://www.linux.or.jp/JF/JFdocs/INDEX-database.html 「Linux JFプロジェクト」 http://www.linet.gr.jp/~juk/pgsql/ 「PostgreSQL Notes for Japanese」(翻訳者ページ)
なお、この和訳に関するご意見・ご質問は(juk at postgresql.jp)までお寄せください。
(※ メールアドレスの " at " は適切に直してください。半角の "@" です。)
]
Frequently Asked Questions (FAQ) o PostgreSQL
Ostatnia aktualizacja: Sobota Luty 7 22:16:21 EST 2004
Ostatnia aktualizacja tl/umaczenia: Piatek Marzec 5 19:31:12 EST 2004
Obecny maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
Tl/umaczenie: Marcin Mazurek (m.mazurek@netsync.pl)
Najbardziej aktualna wersje tego dokumentu mozna znalezc pod adresem:
http://www.PostgreSQL.org/docs/faqs/FAQ.html.
Odpowiedzi na pytania dotyczace konkretnych systemw operacyjnych
mozna znalezc pod adresem: http://www.PostgreSQL.org/docs/index.html.
_________________________________________________________________
Pytania oglne
1.1) Co to jest PostgreSQL? Jak to wymawiac?
1.2) Jaka licencja chroniony jest PostgreSQL?
1.3) Na jakich systemach Unixowych dzial/a PostreSQL?
1.4) Na jakich nie-Unixowych systemach dzial/a PostgreSQL?
1.5) Skad moge sciagnac PostgreSQL?
1.6) Gdzie mozna szukac wsparcia technicznego?
1.7) Jaka jest ostatnia dostepna wersja?
1.8) Jaka dokumentacja jest dostepna?
1.9) Gdzie moge znalezc informacje o znanych bl/edach czy brakujacych
rozwiazanich?
1.10) Jak moge sie nauczyc SQL?
1.11) Czy PostgreSQL ma rozwiazany problem Y2K?
1.12) Jak moge sie przyl/aczyc do grupy osb bezposrednio pracujacych
nad rozwojem PostgreSQL?
1.13) Jak moge zgl/aszac bl/edy?
1.14) Jak mozna porwnac PostgreSQL w stosunku do innych DBMS?
1.15) W jaki sposb moge wesprzec finansowo PostgreSQL?
Pytania uzytkownikw
2.1) Czy sa jakies driwery ODBC dla PostgreSQL?
2.2) Jakie istnieja narzedzia pozwalajace na dostep do PostgreSQL
przez www?
2.3) Czy istnieje jakies GUI dla PostgreSQL?
2.4) Za pomoca jakich jezykw programowania mozna sie komunikowac z
PostgreSQL?
Pytania dotyczace administracji
3.1) Jak moge zainstalowac PostgreSQL w innej lokalizacji niz
/usr/local/pgsql?
3.2) Podczas startu postmaster'a, otrzymuje komunikat: Bad System Call
lub "core dumped". Dlaczego?
3.3) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcMemoryCreate. Dlaczego?
3.4) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcSemaphoreCreate. Dlaczego?
3.5) W jaki sposb moge kontrolowac pol/aczenia z innych hostw?
3.6) Jak powinienem skonfigurowac system baz danych aby uzyskac lepsza
wydajnosc?
3.7) Jakie sa mozliwosci wyszukiwania bl/edw?
3.8) Skad sie bierze komunikat: "Sorry, too many clients" podczas
prby pol/aczenia sie z baza danych?
3.9) Jakie pliki znajduja sie w pg_temp?
3.10) Dlaczego konieczne jest przy upgradzie PostgreSQL korzystanie ze
skryptw dump i restore?
Pytania dotyczace uzytkowania
4.1) Jaka jest rznica pomiedzy kursorami binarnymi (binary cursors) i
zwykl/ymi kursorami (normal cursors)?
4.2) Jak moge pobrac za pomoca SELECT jedynie kilka pierwszych wynikw
zapytania?
4.3) Jak moge uzyskac liste wszystkich tabel czy innych rzeczy pod
psql?
4.4) Jak usunac kolumne z tabeli lub zmienic jej typ?
4.5) Jaki jest maksymalny rozmiar dla rzedu, tabeli i bazy danych?
4.6) Jak duzo miejsca w bazie danych jest potrzebne aby przechowac
dane ze zwyczajnego pliku tekstowego?
4.7) Jak moge sprawdzic jakie tabele, klucze, bazy danych i
uzytkownicy sa utworzeni?
4.8) Moje zapytania sa wolne lub nie uzywaja kluczy. Dlaczego?
4.9) Jak moge sprawdzic w jakis sposb "query optimizer" wykonuje moje
zapytanie?
4.10) Co to jest "R-tree index"?
4.11) Co to jest "Genetic Query Optimizer"?
4.12) Jak moge uzywac wyrazen regularnych w zapytaniach i zapytan
case-insensitive w wyrazeniach regularnych? Jak korzystac z indeksw
dla zapytan case-insensitive?
4.13) Jak sprawdzic w zapytaniu czy pole ma wartosc NULL?
4.14) Jaka jest rznica pomiedzy rznymi typami tekstowymi (character
types)?
4.15.1) Jak moge utworzyc pole typu int, ktre samo zwieksza swoja
wartosc?
4.15.2) Jak pobrac wartosc pola typu SERIAL po wykonaniu insert'u?
4.15.3) Czy uzycie currval() i nextval() nie doprowadzi do "race
condition" z innymi uzytkownikami?
4.15.4) Dlaczego numery sekwencji nie sa ponownie uzywane przy
przerwaniu transakcji? Skad sie biora luki w numerowaniu kolumny
tabeli sekwencjami/SERIALem?
4.16) Co to jest OID? Co to jest TID?
4.17) Jakie jest znaczenie niektrych terminw w PostgreSQL?
4.18) Skad bierze sie ten bl/ad: "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.19) Jak sprawdzic jakiej wersji PostgreSQL uzywam?
4.20) Dlaczego operacje, ktre wykonuje na duzych obiektach
"large-object" zwracaja komunikat: "invalid large obj descriptor"?
4.21) Jak stworzyc kolumne ktrej domyslna wartoscia bedzie biezacy
czas?
4.22) Dlaczego zapytania uzywajace IN sa takie wolne?
4.23) Jak wykonac "outer join"?
4.24) Jak wykonywac zapytanie uzywajace kilku baz danych jednoczesnie?
4.25) Jak zwrcic w funkcji wiele rzedw lub kolumn?
4.26) Dlaczego nie moge w sposb pewny tworzyc/usuwac tabel
tymczasowych w funkcjach PL/PgSQL?
4.27) Jakie sa mozliwosci replikacji w PostgreSQL?
4.28) Jakie mozliwosci szyfrowania oferuje PostgreSQL?
Rozwijanie PostgreSQL
5.1) Napisal/em wl/asna funkcje. Kiedy uzyje jej w psql, program
zrzuca pamiec (dump core)?
5.2) Jak moge dodac/zgl/osic nowe typy czy funkcje do PostgreSQL?
5.3) Jak napisac funkcje C zwracajaca krotke (tuple)?
5.4) Zmienil/em plik zrdl/owy. Dlaczego po rekompilacji nie widac
zmiany?
_________________________________________________________________
Pytania oglne
1.1) Co to jest PostgreSQL? Jak to wymawiac?
PostgreSQL wymawia sie Post-Gres-kju-el. Czesto podczas rozmw uzywany
jest termin "Postgres"
PostgreSQL jest rozszerzeniem systemu zarzadzania bazami danych -
POSTGRES, kolejna generacja rozwojowego prototypu DBMS. Mimo, ze
PostgreSQL zachowal/ bardzo dobrze zbudowany model danych (data model)
i bogaty zestaw typw danych POSTGRES'a, zastapil/ PostQuel'owy jezyk
zapytan z rozbudowanym podzbiorem jezyka SQL. PostgreSQL jest
oprogramowaniem darmowym z dostepnymi cal/ymi zrdl/ami.
Rozwj PostgreSQL jest prowadzony przez grupe ludzi z Internetu,
komunikujacych sie poprzez mailowe listy dyskusyjne PostgreSQL.
Obecnym koordynatorem jest Marc G. Fournier (scrappy@PostgreSQL.org).
(Zobacz pytanie 1.6 jak sie przyl/aczyc). Ta grupa ludzi jest
odpowiedzialna za cal/y rozwj PostgreSQL. PostgreSQL jest projektem
nie kontrolowanym przez zadna firme, aby wziac udzial/ w jego rozwoju
sprawdz, http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html
Autorami PostgreSQL 1.01 byli Andrew Yu and Jolly Chen. Wiele innych
osb pomogl/o przy portowaniu, testowaniu, debugowaniu i rozwijaniu
kodu. Oryginalny kod Postgresa, na ktrym zostal/ oparty PostgreSQL,
byl/ wysil/kiem studentw oraz pracownikw pracujacych pod
kierownictwem profesora Michael'a Stonebraker'a z University of
California w Berkeley.
Oryginalna nazwa oprogramowania w Berkeley byl/ Postgres. Po dodaniu
obsl/ugi SQL w 1995, nazwa zostal/a zmieniona na Postgres95. Pod
koniec roku 1996 nazwa zostal/a zmieniona na PostgreSQL.
1.2) Jaka licencja chroniony jest PostgreSQL?
PostgreSQL objety jest nastepujaca licencja:
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.
Tekst powyzej, jest klasyczna licencja BSD. Nie posiada ona zadnych
restrykcji co do uzywania kodu zrdl/owego. Podoba nam sie i nie
zamierzamy jej zmieniac.
1.3) Na jakich systemach Unixowych dzial/a PostreSQL?
PostgreSQL powinien dzial/ac na wszystkich nowych Unix-podobnych
systemach. Platformy, ktre zostal/y szczegl/owo przetestowane
podczas publikowania PostgreSQL sa wymienione w dokumentacji
opisujacej instalacje.
1.4) Na jakich nie-Unixowych systemach dzial/a PostgreSQL?
Klient
Mozliwa jest kompilacja bibliteki C libpq, psql oraz innych
interfejsw i uruchamianie ich na platformie MS Windows. W tym wypadku
klient jest uruchamiany na MS Windows a z serwerem komunikuje sie
poprzez TCP/IP. Serwer moze dzial/ac na dowolnej wspieranej platformie
Unixowej. Plik win32.mak jest dol/aczony do zrdel/, aby mozna byl/o
stworzyc biblioteke libpq oraz program psql dzial/ajace w srodowisku
Win32. PostgreSQL moze sie takze komunikowac z klientami ODBC.
Serwer
Serwer moze byc uruchamiany na Windows NT i Win2k uzywajac bibliotek
Cygwin, Cygnus Unix/NT. W pliku pgsql/doc/FAQ_MSWIN znajdujacym sie w
zrdl/ach lub pod adresem:
http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN na naszych
stronach.
Obecnie prowadzone sa prace nad stworzeniem wersji dla MS Win
NT/200/XP. Jesli chcesz sie dowiedziec o obecnym statusie tych prac
zobacz http://techdocs.postgresql.org/guides/Windows and
http://momjian.postgresql.org/main/writings/pgsql/win32.html.
Istnieje takze port pod Novell Netware 6 dostepny pod adresem
http://forge.novell.com.
1.5) Skad mozna sciagnac PostgreSQL?
Gl/wny serwer ftp z dostepem "anonymous" dla PostgreSQL znajduje sie
ftp://ftp.PostgreSQL.org/pub. jesli szukasz mirrorw sprawdz nasza
gl/wna strone www.
1.6) Gdzie mozna szukac wsparcia technicznego?
Adres gl/wnej listy mailowej: pgsql-general@PostgreSQL.org. Jest ona
przeznaczona dyskusjom dotyczacym spraw zwiazanych z PostgreSQL. Zeby
zapisac sie na liste, wyslij email z nastepujacymi liniami w tresci
maila (nie w temacie):
subscribe
end
na adres: pgsql-general-request@PostgreSQL.org.
Dostepna jest takze lista wysyl/ajaca digesty. Aby zapisac sie na nia,
wyslij email na adres: pgsql-general-digest-request@PostgreSQL.org z
trescia maila zawierajaca:
subscribe
end
Digesty sa wysyl/ane do czl/onkw listy, kiedy na gl/wna liste dotrze
ok 30k wiadomosci.
Dostepna jest takze lista poswiecona bl/edom znalezionym w PostgreSQL.
Aby zapisac sie na nia wyslij email na adres:
pgsql-bugs-request@PostgreSQL.org z trescia maila zawierajaca:
subscribe
end
Lista poswiecona dyskusjom developerw jest dostepna pod adresem:
pgsql-hackers-request@PostgreSQL.org Aby sie na nia zapisac wyslij na
jej adres mail z trescia:
subscribe
end
Dodatkowe informacje o listach mailowych dotyczacych PostgreSQL mozna
znalezc na stronach WWW PostgreSQL pod adresem:
http://www.PostgreSQL.org
W sieci EFNet istnieje kanal/ IRC #PostgreSQL. Ja, do pol/aczenia sie
z kanal/em uzywam Unixowego polecenia irc -c '#PostgreSQL' "$USER"
irc.phoenix.net.
Lista firm oferujacych wsparcie na zasadach komercyjnych znajduje sie
pod adresem: http://techdocs.postgresql.org/companies.php.
1.7) Jaka jest ostatnia dostepna wersja?
Ostatnia dostepna wersja PostgreSQL to 7.4.1.
Planujemy publikowanie kolejnych wersji co szesc do osmiu miesiecy.
1.8) Jaka dokumentacja jest dostepna?
Kilka manuali, stron podecznika man, oraz kilka przykl/adw do
testowania sa zal/aczone w samej dystrybucji. Znajduja sie one w
katalogu /doc. Manual moze byc takze przegladany poprzez strony www
pod adresem http://www.PostgreSQL.org/docs.
Istnieja takze dwie ksiazki dostepne online pod adresami
http://www.PostgreSQL.org/docs/awbook.html i
http://www.commandprompt.com/ppbook/. Lista ksiazek o PostgreSQL,
ktre mozna kupic znajduje sie pod adresem
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Zbir
technicznych artykul/w o PostgreSQL znajduje sie pod adresem
http://techdocs.postgresql.org/.
psql posiada kilka wbudowanych polecen \d, za pomoca ktrych mozna
sprawdzic informacje dotyczace typw, operatorw, funkcji, agregatw
itd.
Na naszej stronie mozna znalezc duzo wiecej dokumentacji.
1.9) Gdzie mozna znalezc informacje o znanych bl/edach czy brakujacych
rozwiazanich?
PostgreSQL wspiera rozszerzony podzbir standardu SQL-92. Sprawdz
nasza liste TODO aby znalezc informacje o znanych problemach,
brakujacych rozwiazaniach czy przyszl/ych planach.
1.10) Jak moge sie nauczyc SQL?
Ksiazka o PostgreSQL http://www.PostgreSQL.org/docs/awbook.html uczy
SQL. Jest jeszcze inna ksiazka o PostgreSQL dostepna pod adresem:
http://www.commandprompt.com/ppbook. Dobry tutorial mozesz znalezc pod
adresem: http://www.intermedia.net/support/sql/sqltut.shtm, oraz
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
i http://sqlcourse.com.
Jeszcze inny to "Teach Yourself SQL in 21 Days, Second Edition" pod
adresem: http://members.tripod.com/er4ebus/sql/index.htm
Wielu z naszych uzytkownikw poleca The Practical SQL Handbook,
Bowman, Judith S., et al., Addison-Wesley. Inni polecaja The Complete
Reference SQL, Groff et al., McGraw-Hill.
1.11) Czy PostgreSQL ma rozwiazany problem Y2K?
Tak, bez problemu radzimy sobie z datami po roku 2000 AD, oraz przed
rokiem 2000 BC.
1.12) Jak moge sie przyl/aczyc do grupy osb bezposrednio pracujacych nad
rozwojem PostgreSQL?
Przede wszystkim sciagnij ostatnie dostepne zrdl/a i przeczytaj
dokumentacje przeznaczona dla developerw na naszej stronie www lub
dostepna takze w zrdl/ach PostgreSQL. Nastepnie zapisz sie na listy
mailowe pgsql-hackers i pgsql-patches. I na koniec, wysyl/aj nam
wysokiej jakosci patch'e na liste pgsql-patches.
Jest okol/o 12 osb, ktre maja uprawnienia do commit'owania w CVS
PostgreSQL'a. Kazdy z nich submitowal/ tak wiele wysokiej jakosci
patchy, ze stal/o sie niemozliwe dla obecnych commiterw byc z nimi na
biezaco, wiec musielismy im ufac i miec pewnosc, ze ich poprawki sa
wysokiej jakosci.
1.13) Jak moge zgl/aszac bl/edy?
Zajrzyj na strone PostgreSQL BugTool, na ktrej opisane sa wskazwki
jak zgl/aszac informacje o bl/edach.
Zajrzyj takze na nasz ftp ftp://ftp.PostgreSQL.org/pub, aby sprawdzic
czy nie ma nowszych wersji PostgreSQL czy patchy.
1.14) Jak mozna porwnac PostgreSQL w stosunku do innych DBMS?
Jest kilka sposobw oceny softwaru: mozliwosci, wydajnosc, stabilnosc,
wsparcie i cena.
Mozliwosci
PostgreSQL posiada mozliwosci dostepne w duzych, komercyjnych
systemach DBMS, takie jak transakcje, podzapytania
(subselects), triggery, widoki, klucze obce, referential
integrity, oraz wyrafinowany system blokowania. Mamy takze
wl/asciowsci ktrych inni nie posiadaja, jak typy definiowane
przez uzytkownika, dziedziczenie, rules, multi-version
concurrency control, ktra redukuje problemy z blokowaniem
(lock contention).
Wydajnosc
Wydajnosc PostgreSQL jest podobna do innych komercyjnych i open
source baz danych. W niektrych sytuacjach jest szybszy w
niektrych wolniejszy. W porwnianiu do MySQL lub mniejszych
baz danych jestesmy szybsi przy wielu uzytkownikach,
skomplikowaych zapytaniach i duzym obciazeniu podczas. MySQL
jest szybszy dla prostych SELECTw wykonywanych przez niewielu
uzytkownikw. Spowodowane jest to narzutem, ktry sie pojawia
przy transakcjach. Oczywiscie MySQL nie ma wiekszosci z
rozwiazan opisanych powyzej w sekcji Mozliwosci . PostgreSQL
zostal/ stworzony z mysla o stabilnosci, oraz szerokiej gamie
mozliwosci, ale mimo to staramy sie w kazdej wersji poprawiac
jego wydajnosc. Ciekawe porwnanie PostgreSQL i MySQL mozna
znalezc pod adresem
http://openacs.org/philosophy/why-not-mysql.html Dodatkowo,
MySQL jest firma, ktra dystrybuuje jej produkty poprzez zasade
Open Source i wymaga wykupienia licencji w przypadku tworzenia
close-source software, co ie ma miejsca w przypadku PostgreSQL.
Stabilnosc
Zdajemy sobie sprawe, ze DBMS musi byc stabilny, w przeciwnym
wypadku jest bez wartosci. Staramy sie publikowac kod stabilny,
dobrze przetestowany, z minimum mozliwych bl/edw. Kazde
wydanie poprzedza co najmniej miesiac testw wersji beta.
Patrzac na historie wydan PostgreSQL widac, ze dostarczamy
stabilne, dobrze sprawdzone wersje, ktre sa gotowe do uzycia w
srodowisku produkcyjnym. Myslimy, ze proces publikowania
kolejnych wersji opracowany przez nas jest jednym z lepszych
wsrd innych twrcw oprogramowania bazodanowego.
Wsparcie
Dzieki naszym listom mailowym masz dostep do duzej liczby
programistw i uzytkownikw, ktrzy pomagaja rozwiazac kazdy
napotkany problem. Chociaz nie mozemy gwarantowac znalezienia
rozwiazania danego problemu, nie rznimy sie w tym od innych
komercyjnych systemw DBMS. Bezposredni kontakt z
programistami, uzytkownikami, dokumentacja i kodem zrdl/owym
sprawiaja, ze wsparcie oferowane PostgreSQL niejednokrotnie
jest lepsze niz w innych systemach DBMS. Istnieje takze
mozliwosc skorzystania z komercyjnego wsparcia dla tych,
ktrych takiego rozwiazania potrzebuja. (Sprawdz ten punkt
FAQ.)
Cena
Korzystanie z PostgreSQL jest darmowe, zarwno w przypadku
komercyjnym jak i niekomercyjnym. Mozesz korzystac z naszego
kodu zrdl/owego w Twoim produkcie bez zadnych ograniczen, poza
tymi wymienionymi w licencji BSD przytoczonej powyzej.
1.15) W jaki sposb moge wesprzec finansowo PostgreSQL?
PostgreSQL korzysta z najlepszej infrastruktury od samego poczatku
istnienia projektu, czyli roku 1996 kiedy rozpoczelismy prace.
Wszystko to zawdzieczamy Marc'owi Fournier'owi, ktry stworzyl/ ta
infrastrukture i zarzadza nia od lat.
Wysokiej jakosci infrastruktura jest bardzo wazna dla kazdego projektu
open-source. Zapobiega przerwom w rozwoju projektu i jakimkolwiek
przestojom.
Oczywiscie korzystanie z wysokiej jakosci infrastruktury nie jest
tanie. Istnieje wiele rznych miesiecznych, czy jednorazowych
wydatkw, ktre trzeba ponosic aby wszystko dzial/al/o jak nalezy.
Jesli Ty, badz Twoja firma moze wspomc finansowo rozwj PostgreSQL
odwiedz adres: http://store.pgsql.com/shopping/ gdzie opisane jest jak
to zrobic.
Chociaz na stronie wspomniana jest nazwa PostgreSQL Inc, "datki" sa
przeznaczone jedynie na rozwj projektu PostgreSQL i nie sa
przeznaczane na finansowanie jakiejkolwiek firmy. Jesli wolisz, mozesz
wysl/ac czek na adres kontaktowy.
_________________________________________________________________
Jesli mozesz sie pochwalic udanymi wdrozeniami PostgreSQL, prosimy
abys zgl/osil/ nam to na stronie: http://advocacy.postgresql.org.
User Client Questions
2.1) Czy sa jakies driwery ODBC dla PostgreSQL?
Dostepne sa dwa driwery ODBC: PsqlODBC i OpenLink ODBC.
Mozesz pobrac PsqlODBC z adresu
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php
OpenLink ODBC moze byc pobrany z adresu: http://www.openlinksw.com.
Wspl/pracuje ze standardowym oprogramowaniem klienckim ODBC wiec w
ten sposb mozesz korzystac z PostgreSQL ODBC dostepnego na kazdej
pltaformie ktra wspiera (Win, Mac, Unix, VMS).
Autorzy beda prawdopodobnie sprzedawac ten produkt osobom ktre
wymagaja komercyjnego wsparcia, ale wersja darmowa bedzie zawsze
dostepna. Wszystkie pytania mozesz wysyl/ac na adres:
postgres95@openlink.co.uk.
2.2) Jakie istnieja narzedzia pozwalajace na dostep do PostgreSQL przez
www?
Dobry podrecznik dla poczatkujacych o dostepie do bazy danych przez
www mozesz znalezc pod adresem: http://www.webreview.com
Do integracji z www, swietnym rozwiazaniem jest PHP. Mozesz znalezc
wiecej informacji na ten temat pod adresem http://www.php.net.
Wiele osb w przypadku skomplikowanych rozwiazan uzywa Perl'a i
modul/u CGI.pl lub mod_perl.
2.3) Czy istnieje jakies GUI dla PostgreSQL?
Tak, istnieje kilka interfejsw graficznych dla PostgreSQL. Wsrd nich
PgAccess ( http://www.pgaccess.org), PgAdmin III
(http://www.pgadmin.org), RHDB Admin (http://sources.redhat.com/rhdb/
) oraz Rekall ( http://www.thekompany.com/products/rekall/,
komercyjny). Istnieje takze PHPPgAdmin (
http://phppgadmin.sourceforge.net/ ), webowy interfejs dla PostgreSQL.
Wiecej informacji na ten temat znajduje sie pod adresem See
http://techdocs.postgresql.org/guides/GUITools.
2.4) Za pomoca jakich jezykw programowania mozna sie komunikowac z
PostgreSQL?
Najbardziej popularne jezyki posiiadaja wl/asny interfejs dla
PostgreSQL. Sprawdz liste rozszerzen dla intersujacego Ciebie jezyka
programowania.
Ze zrdl/ami PostreSQL dystrubuowane sa interfejsy dla nastepujacych
jezykw programowania:
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Inne interfejsy sa dostepne pod adresem: http://gborg.postgresql.org w
sekcji Drivers/Interfaces.
_________________________________________________________________
Pytania dotyczace administracji
3.1) Jak moge zainstalowac PostgreSQL w innej lokalizacji niz
/usr/local/pgsql?
Uzyj opcji --prefix podczas uruchamiania skryptu configure.
3.2) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie: Bad
System Call lub "core dumped". Dlaczego?
Ten bl/ad moze byc wynikiem wielu problemw, ale na poczatek sprawdz
czy masz zainstalowane rozszerzenia systemu V w jadrze systemu.
PostgreSQL wymaga do pracy zainstalowanej obsl/ugi pamieci dzielonej i
semaforw.
3.3) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcMemoryCreate. Dlaczego?
Albo nie masz poprawnie skonfigurowanej obsl/ugi pamieci dzielonej w
jadrze systemu, albo musisz zwiekszyc jej dostepny rozmiar. Dokl/adna
ilosc jaka potrzebujesz jest zalezna od architektury systemu na jakim
pracujesz, jak duzo buforw oraz jak duzo procesw backendu
skonfigurowal/es dla postmaster'a. Dla wiekszosci systemw, z domyslna
liczba buforw i procesw potrzebujesz minimum w przyblizeniu 1MB.
Zobacz PostgreSQL Administrator's Guide gdzie szczegl/owo zostal/o
opisane wykorzystanie pamieci dzielonej i semaforw.
3.4) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcSemaphoreCreate. Dlaczego?
Jesli tresc bl/edu brzmi: IpcSemaphoreCreate: semget failed (No space
left on device) oznacza to, ze jadro systemu nie jest skonfigurowane
do obsl/ugi wystarczajacej liczby semaforw. Postgres wymaga jednego
semafor'a na potencjalny jeden proces backend. Tymczasowym
rozwiazaniem jest uruchomienie programu postmaster z mniejsza
maksymalna liczba procesw backend. Uzyj opcji -N z parameterem
mniejszym od domyslnego - 32. Bardziej trwal/ym rozwiazaniem jest
zwiekszenie parametrw SEMMNS i SEMMNI jadra twojego systemu.
Niedzial/ajace semafory moga spowodowac niepoprawne zamkniecie systemu
w czasie intensywnego korzystania z bazy.
Jesli tresc bl/edu jest inna, moze to oznaczac, ze obsl/uga semaforw
nie zostal/a wl/aczona do jadra wcale. Zobacz PostgreSQL
Administrator's Guide po bardziej szczegl/owe informacje o pamieci
dzielonej i semaforach.
3.5) W jaki sposb moge kontrolowac pol/aczenia z innych hostw?
Domyslnie PostgreSQL pozwala jedynie na pol/aczenia za pomoca socketw
Unixowych z lokalnego hosta. Inne hosty nie beda mogl/y sie pol/aczyc
z serwerem dopki nie zostanie dodana opcja -i do postmaster'a, oraz
nie umozliwi sie autoryzacji na podstawie adresu hostw modyfikujac
odpowiednio plik $PGDATA/pg_hba.conf. To zmiany pozwola na pol/aczenia
TCP/IP.
3.6) Jak powinienem skonfigurowac system baz danych aby uzyskac lepsza
wydajnosc?
Indeksy bez watpienia moga przyspieszyc wykonywanie zapytan. Polecenie
EXPLAIN pozwala zobaczyc jak PostgreSQL interpretuje Twoje zapytanie i
ktre indeksy sa uzywane.
Jesli wykonujesz bardzo duzo INSERTw, moze warto je wykonac za pomoca
jednego duzego pliku uzywajac polecenia COPY. Jest to duzo szybsze niz
pojedyncze INSERTy. Po drugie polecenia SQL nie zawarte w bloku
okreslajacym transakcje - BEGIN WORK/COMMIT, sa traktowane jako
pojedyncza transakcja. Rozwaz wykonanie kilku polecen/zdan SQL w
jednym bloku transakcji. To redukuje narzut nakl/adany przez
transakcje. Przy duzych zmianach w danych, warto usunac i stworzyc na
nowo indeksy.
Jest kilka opcji pozwalajacych na poprawienie wydajnosci. Mozesz
wyl/aczyc fsync() poprzez uruchomienie postmaster'a z opcjami -o -F.
To spowoduje, ze fsync() nie bedzie zrzucal/ danych na dysk po kazdej
transakcji.
Mozesz takze uruchomic postmaster'a z opcja -B aby zwiekszyc wielkosc
pamieci dzielonej uzywanej przez procesy backendw. Jesli ustawisz ta
wartosc zbyt wysoko i przekroczysz limity ustawione przez kernel na
pamiec dzielona, postmaster moze sie nie uruchomic. Kazdy bufor
zajmuje 8K a domyslna ilosc buforw to 64.
Mozesz takze uzyc opcji -S dla backendu aby zwiekszyc maksymalna
wartosc pamieci uzywana przez proces backendu podczas sortowania.
Opcja -S jest ustawiana wartoscia podawana w kilobajtach, domyslna
wartosc to 512K.
Mozesz takze uzyc polecenia CLUSTER aby pogrupowac dane w tabelach wg
indeksu. Zobacz opis polecenia CLUSTER w manualu zeby dowiedziec sie
wiecej.
3.7) Jakie sa mozliwosci wyszukiwania bl/edw?
PostgreSQL ma kilka mozliwosci na raportowanie informacji o jego
statusie, ktre moga byc przydatne przy debugowaniu procesu.
Przede wszystkim uruchom skrypt configure z opcja --enable-cassert,
wiele funkcji assert() monitoruja postep procesu backend i zatrzymuja
program kiedy wydarzy sie cos nieoczekiwanego.
Zarwno postmaster jak i postgres maja kilka opcji do debugowania. Za
kazdym razem kiedy uruchamiasz postmaster'a, upewnij sie, ze wysyl/asz
standardowe wyjscie i error do pliku z logami, np. w ten sposb:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
To utworzy plik server.log w gl/wnym katalogu PostgreSQL. Ten plik
zawiera pozyteczne informacje o problemach i bl/edach, ktre
wydarzyl/y sie podczas pracy serwera. Postmaster posiada opcje -d,
ktra pozwala na raportowanie bardzo szczeglowych informacji. Do
opcji -d podajemy liczbe, ktra okresla szczegl/owosc wysyl/anych
informacji. Musisz miec swiadomosc, ze wysoki poziom logowania bedzie
powodowal/ tworzenie bardzo duzych plikw z logami.
Jesli postmaster nie zostal/ uruchomiony, mozesz uruchomic
postgres'owy backend z linii polecen, i uruchomic Twoje polecenie SQL
bezposrednio na nim. Taki sposb jest polecany jedynie w przypadku
debugowania. Zwrc uwage, ze w tym wypadku zapytanie konczy znak nowej
linii a nie srednik. Jesli skompilowal/es z opcjami debugowania mozesz
uzyc debuggera aby sprawdzic co sie dzieje. Poniewz backend nie
zostal/ uruchomiony przez postmaster'a, nie dzial/a w identycznym
srodowisku, co oznacza ze powtrzenie warunkw w jakich wystapil/y
problemy moze byc problemem.
Jesli postmaster dzial/a, uruchom psql w jednym z okien, nastepnie
znajdz PID procesu postgres uzywanego przez psql. Uzyj debuggera aby
do PID'u postgres'a. Mozesz ustawiac pul/apki (breakpoints) w
debuggerze i wykonywac zapytania z psql. Jesli debugujesz uruchamianie
postgres'a, mozesz ustawic zmienna PGOPTIONS="-W n", nastepnie
uruchomic psql. Opcja ta pozwoli spowolnic uruchomienie na n sekund
abys mgl/ sie pol/aczyc z procesem za pomoca debugera, ustawic
jakiekolwiek pul/apki i kontynuowac proces uruchamiania.
postgres moze byc uruchamiany z opcjami -s, -A i -t, ktre moga byc
bardzo przydatne przy debuggowaniu i ocenie wydajnosci.
Mozesz takze skompilowac z profilingiem aby zobaczyc jakie funkcje ile
czasu wykonuja sie. Pliki profilowane dla backendu zostana umieszczone
w katalogu pgsql/data/base/dbname. Pliki profilu klienta zostana
umieszczone w biezacym katalogu klienta. Linux wymaga aby kompilowac z
opcja -DLINUX_PROFILE aby profilowanie odbywal/o sie poprawnie.
3.8) Skad sie bierze komunikat: "Sorry, too many clients" podczas prby
pol/aczenia sie z baza danych?
Musisz zwiekszyc limit ilosci jednoczesnych procesw bacekendu dla
procesu postmaster'a.
Domyslny limit to 32 procesy. Mozesz go zwiekszyc przez restart
postmaster z odpowiednia wartoscia ustawiana opcje -N w pliku
postgresql.conf.
Wez pod uwage, ze jesli zwiekszysz wartosc podana w opcji -N na wiecej
niz 32 musisz takze zwiekszyc wartosc w opcji -B ponad jej domyslna
wartosc 64; wartosc -B musi byc co najmniej dwa razy wieksza od
wartosci podanej w opcji -N, a prawdopodobnie powinna byc w
rzeczywistosci jeszcze wieksza dla optymalnej wydajnosci. Dla duzej
liczby procesw backendu na pewno zauwazysz, ze trzeba zwiekszyc rzne
parametry jadra Unixa. Rzeczy, ktre pownienes sprawdzic to maksymalna
liczba blokw pamieci dzielonej, SHMMAX; maksymalna liczba semaforw,
SEMMNS oraz SEMMNI; maksymalna liczba procesw, NPROC; maksymalna
liczba procesw na jednego uzytkownika, MAXUPRC; i maksymalna liczba
otwartych plikw, NFILE oraz NINODE. Powd dla ktrego PostgreSQL ma
limit na maksymalna liczbe procesw backendu to obawa o wyczerpanie
zasobw systemu.
3.9) Jakie pliki znajduja sie w pg_temp?
Katalog ten zawiera tymczasowe pliki utworzone przez executor. Dla
przykl/adu, jesli jakas operacja sortowania jest wymagana do wykonania
ORDER BY, a samo sortowanie wymaga wiecej miejsca niz parametr
backendu -S ustawil/ do wykorzystania, wtedy tymczasowe pliki sa
uzywane do przechowywania tych danych.
Pliki tymczasowe powinny byc usuniete automatycznie, ale mogl/o sie to
nie stac jesli proces backendu w miedzyczasie nie zakonczyl/ sie
poprawnie podczas operacji sortowania. Jesli w danym momencie nie
dzial/aja zadne procesy backendw mozesz spokojnie usunac pliki
pg_tempNNN.NN.
3.9) Dlaczego konieczne jest przy upgradzie PostgreSQL korzystanie ze
skryptw dump i restore?
Twrcy PostgreSQL dokonuja jedynie mal/ych zmian pomiedzy mal/ymi
upgradami wersji, np z 7.2 do 7.2.1, wtedy upgrade nie wymaga
korzystania z dump i restore. Przy wiekszych zmianach, np. z wersji
7.2 do 7.3, czesto zmianymaja wpl/yw na format przechowywanych danych.
Zmiany te sa na tyle skomplikowane, ze nie utrzymujemy zgodosci z
poprzednimi wersjami PostgreSQL. dump pozwala na wydostanie danych w
takiej postaci, w ktrej l/atwe jest ich zaimportowanie do nowszych
wersji bez kl/opotu.
W wydaniach gdzie zmiany nie dotycza formatu danych na dysku, mozna
wykorzystac skryptu pg_upgrade, do upgradu bez uzycia dump/restore.
Dokumentacja do danego wydania zawiera informacje czy mozliwe jest
uzycie pg_upgrade.
_________________________________________________________________
Pytania dotyczace uzywania
4.1) Jaka jest rznica pomiedzy kursorami binarnymi (binary cursors) i
zwykl/ymi kursorami (normal cursors)?
Zobacz w manualu opis polecenia DECLARE.
4.2) Jak moge pobrac za pomoca SELECT jedynie kilka pierwszych wynikw
zapytania?
Zobacz w manualu opis polecenia FETCH lub uzyj polecenia SELECT ...
LIMIT....
Nawet jesli chesz pobrac kilka pierwszych rzedw z wyniku zapytania,
cal/e zapytanie musi zostac wykonane. Byc moze powinienes skorzystac z
polecenia ORDER BY. Jesli istnieje indeks ktry odpowiada polom
okreslonym przez ORDER BY, PostgreSQL moze wykorzystac jedynie kilka
pierwszych rzedw, byc moze bedzie koniecznosc wykonania zapytania do
momentu az zostana znalezione pozadane wyniki.
Aby otrzymac losowy rzad, uzyj:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.3) Jak moge uzyskac liste wszystkich tabel czy innych rzeczy pod psql?
Mozesz sprawdzic zawartosc zrdel/ psql, a konkretnie plik
pgsql/src/bin/psql/describe.c. Zawiera on polecenia SQL ktre generuja
wyniki komend z backslashem. Mozesz takze uruchomic psql z opcja -E
wtedy po wykonaniu polecenia z backslashem wyswietlane bedzie
zapytanie, ktre w rzeczywistosci jest wykonywane.
4.4) Jak usunac kolumne z tabeli lub zmienic jej typ?
DROP COLUMNT zostal/o dodane w wersji 7.3 przy poleceniu ALTER TABLE
DROP COLUMN. We wczesniejszych wersjach mozesz zrobic tak:
BEGIN;
LOCAL TABLE old_table;
SELECT ... -- wybierz wszystkie kolumny poza ta jedna ktrej chcesz sie pozbyc
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
Aby zmienic typ danych kolumny mozesz zrobic 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.5) Jaki jest maksymalny rozmiar dla rzedu, tabeli i bazy danych?
Oto wszystkie ograniczenia:
Maksymalny rozmiar dla bazdy danych? nieograniczony ( istnieja
bazy danych o wielkosci 32 TB databases )
Maksymalny rozmiar dla tabeli? 32 TB
Maksymalny rozmiar dla rzedu? 1.6 TB
Maksymalny rozmiar pola? 1 GB
Maksymalna liczba rzedw w tabeli? nieograniczona
Maksymalna liczba kolumn w tabeli? 250-1600 w zalezonosci od typw kolumn
Makasymalna liczba indeksw na tabeli? nieograniczona
Oczywiscie "nieograniczony" nie jest prawda tak do konca, istnieja
ograniczenia wynikajace z dostepnego miejsca na dysku, pamieci/swapa.
Kiedy wielkosci te beda bardzo duze moze odbic sie to na wydajnosci.
Maksymalny rozmiar tabeli, czyli 32 TB nie wymaga od systemu
operacyjnego wsparcia dla duzych plikw. Duze tabele sa przechowywane
jako pliki o rozmiarze 1 GB, wiec ograniczenia co do wielkosci plikw
narzucone przez system plikw nie sa istotne.
Masymalny rozmiar tabeli i maksymalna liczba kolumn moze byc
zwiekszona jesli zwiekszymy domyslny rozmiar bloku (block size) do
32k.
4.6) Jak duzo miejsca w bazie danych jest konieczne aby przechowywac dane
ze zwyczajnego pliku tekstowego?
Baza danych PostgreSQL moze potrzebowac do pieciu razy wiecej miejsca
na przechowywanie danych z plikw tekstowych niz ich objetosc.
Jako przykl/ad mozemy rozwazyc plik skl/adajacy sie z 100,000 linii
zbudowanych z liczby cal/kowitej oraz opisu tekstowego w kazdej.
Zal/zmy, ze srednio kazdy l/ancuch tekstu w linii zajmuje 20 bajtw.
Cal/y plik powinien zajmowac ok. 2.8 MB. Rozmiar pliku bazy danych w
PostgreSQL zawierajacego te dane mozna oszacowac na okol/o 6.4MB:
36 bajtw: nagl/wek kazdego rzedu w przyblizeniu)
24 bajty: jedno pole int i jedno pole typu text
+ 4 bajty: wkaznik na stronie do krotki
--------------------------------------------------
64 bajty w jednym rzedzie
Strona danych w PostgreSQL zajmuje 8192 bajtw (8 KB), wiec:
8192 bajtw na strone
--------------------- = 128 rzedw na jedna strone w bazie (zaokraglone w dl/)
64 bajtw na rzad
100000 rzedw danych
----------------------- = 782 stron w bazie danych (zaokraglone w gre)
128 rzedw na strone
782 stron w bazie * 8192 bajtw na strone = 6,406,144 bajtw (6.4 MB)
Indeksy nie powoduja duzego narzutu na zajmowane miejsce, ale
zawieraja pewne dane, wiec w pewnych przypadkach moga byc cal/kiem
duze.
NULLe sa przechowywane jako mapy bitowe, wiec uzywaja bardzo mal/o
miejsca.
4.7) Jak moge sprawdzic jakie tabele, klucze, bazy danych i uzytkownicy sa
utworzeni?
psql ma cal/kiem duza ilosc polecen z backslashem aby wydobyc takie
informacje. Wprowadz \? aby zobaczyc ich spis. Istnieja takze tablice
systemowe rozpoczynajace sie od pg_, zawierajace interesujace Ciebie
informacje. Wykonanie psql -l pokaze spis wszystkich baz danych.
Obejrzyj takze plik pgsql/src/tutorial/syscat.source. Zawiera on wiele
z zapytan typu SELECT, ktre sa potrzebne aby wydobyc informacje z
tablic systemowych.
4.8) Moje zapytania sa wolne lub nie uzywaja kluczy. Dlaczego?
Indeksy nie sa uzywane automatycznie przez kazde z zapytan. Ideksy sa
uzywane jedynie gdy tabela jest odpowiedniego rozmiaru, wiekszego niz
wymagany minimalny, a zapytanie wybiera jedynie mal/y procent
zawartosci tabeli. Wynika to z tego, ze losowy dostep do dysku
powodowany przez ideksowane poszukiwanie jest czasami wolniejsze niz
poszukiwanie sekwencyjne bez uzycia kluczy.
Zeby zdecydowac czy indeks powinien byc uzywany, PostgreSQL musi miec
statystyki dotyczace danej tabeli. Sa one gromadzone przez uzycie
polecenia VACUUM ANALYZE, lub poprostu ANALYZE. uzywajac statystyk,
optymalizator wie ile rzedw jest w tabeli i moze lepiej okreslic czy
indeksy powinny byc uzyte. Statystyki moga byc takze pomocne w
okresleniu najlepszej kolejnosci wykonania zl/aczenia (join) i jego
sposobu. Gromadzenie statystyk powinno sie odbywac w okreslonych
interwal/ach czasu poniewaz dane w tabelach zmieniaja sie.
Indeksy nie sa zazwyczaj uzywane przez ORDER BY lub przy wykonywaniu
zl/aczen (join). Sekwencyjne przeszukiwanie po ktrym nastepuje
sortowanie jest zazwyczaj szybsze nie wyszukiwanie za pomoca indeksu
na duzej tabeli.
Jakkolwiek LIMIT w pol/aczeniu z ORDER BY czesto bedzie wykorzystywal/
indeksy poniewaz jedynie mal/a czesc z tabeli jest zwracana. W
rzeczywistosci, chociaz MAX() i MIN() nie uzywaja indeksw, mozliwe
jest aby zwrcic te wartosci uzywajac indeksw poprzez uzycie ORDER BY
i LIMIT.
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Jesli uwazasz, ze optimizer myli sie wybierajac sequential scan, uzyj
SET enable_seqscan TO 'off' i uruchom testy aby sprawdzic czy wtym
wypadku zapytanie bedzie szybciej wykonywane.
Kiedy uzywa sie operatorw dopasujacych takich jak LIKE lub ~, indeksy
beda uzywane jedynie w pewnych wypadkach:
* Poczatek wyszukiwania jest oparty na poczatku l/ancucha tekstu.
+ wzorce LIKE nie moga sie zaczynac %
+ dopasowania operatorem ~ (dopasowania regularne) musza sie
zaczynac znakiem specjalnym ^.
* Poczatek wyszukiwania nie moze sie zaczynac od klas znakw, np.
[a-e].
* Case-insensitive searches such as ILIKE and ~* do not utilise
indexes. Instead, use functional indexes, which are described in
section 4.12.
* Standardowe locale C musi byc uzyte przy wykonywaniu initdb
4.9) Jak moge sprawdzic w jakis sposb "query optimizer" wykonuje moje
zapytanie?
Zobacz manual dla polecenia EXPLAIN.
4.10) Co to jest "R-tree index"?
Indeks R-tree jest uzywany do indeksowania danych przestrzennych.
Indeks hasuujacy nie nadaje sie do wyszukiwania odlegl/osci. Natomiast
indeks typu B-tree moze wyszukiwac odleglosci jedynie w
jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
przestrzeniami wielo-wymiarowymi. Dla przykl/adu, jesli zostanie
zal/ozony indeks typu R-tree na polu typu point, system moze bardziej
wydajnie odpowiadac na zapytania typu "select all points within a
bounding rectangle."
Zrdl/owym dokumentem opisujacym oryginalnie projektowanie R-tree
indeksw jest:
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of
Data, 45-57.
Ten dokument mozesz znalezc takze w pracy Stonebraker'a "Readings in
Database Systems".
Wbudowane indeksy R-trees radza sobie w wielobokami i boxes.
Teoretycznie, indeksy R-tree moga byc rozszerzone o mozliwosci
indeksowania w wiecej wymiarowych przestrzeniach. W praktyce,
rozbudowa indeksw R-tree wymaga troche pracy, a w tej chwili nie
dysponujemy jakakolwiek dokumentacja jak to zrobic.
4.11) Co to jest "Genetic Query Optimizer"?
Modul/ GEQO ma za zadanie przyspieszenie optymalizacji zapytan l/aczac
wiele tabel za pomoca algorytmw genetycznych (Genetic Algorithm
(GA)). Pozwala na uzywanie duzych zapytan l/aczacych tabele (join
queries) bez wykorzystywania zasobozernego wyszukiwania.
4.12) Jak moge uzywac wyrazen regularnych w zapytaniach i zapytan
case-insensitive w wyrazeniach regularnych? Jak korzystac z indeksw dla
zapytan case-insensitive?
Operator ~ moze byc wykorzystywany do wyszukiwania za pomoca wyrazen
regularnych, a ~* do wyszukiwania case-insensitive z wyrazeniami
regularnymi. Wariant case-insensitive dla LIKE zostal/ nazwany ILIKE.
Porwnania case-insensitive sa zazwyczaj wykonywane w nastepujacy
sposb:
SELECT *
FROM tab
WHERE lower(col) = 'abc'
W tym wypadku standardowe indeksy nie beda uzywane. Mozesz utworzyc
indeks funkcyjny, poprzez:
CREATE INDEX tabindex on tab (lower(col));
4.13) Jak sprawdzic w zapytaniu czy pole ma wartosc NULL?
Mozesz to sprawdzic, testujac wartosc kolumny warunkiem IS NULL albo
IS NOT NULL.
4.14) Jaka jest rznica pomiedzy rznymi typami tekstowymi (character
types)?
Type Nazwa wewnetrzna Uwagi
--------------------------------------------------
VARCHAR(n) varchar rozmiar okresla maksymalna dl/ugosc, nie matutaj wypel/niania
CHAR(n) bpchar wypel/niane pustymi znakami do podanej dl/ugosci
TEXT text bez limitu na dl/ugosc l/ancucha
BYTEA bytea zmiennej dl/ugosci tablica bajtw (null-byte safe)
"char" char 1 znak
Jesli bedziesz przegladac katalogi systemowe lub komunikaty o bl/edach
czesto spotkasz sie z podanymi powyzej nazwami wewnetrznymi.
Pierwsze cztery typy powyzej to tzw typy "varlena" (np. pierwsze
cztery bajty na dysku to dl/ugosc, po ktrych jest data). Dlatego
faktyczna dl/ugosc takiego l/ancucha jest troche wieksza niz
zadeklarowany rozmiar. Te typy takze podlegaja kompresji lub moga byc
przechowywane out-of-line jako TOAST, wiec faktyczne zuzycie miejsca
na dysku moze byc mniejsze niz oczekiwane.
VARCHAR(n) jest najodpowiedniejszy do przechowywania l/ancuchw o
rznej dl/ugosci ale okresla on maksymalna jego dl/ugosc. TEXT jest
najlepszy dla l/ancuchw o dowolnej dl/ugosci, nie przekraczajacej
1GB.
CHAR(n) jast najlepszym typem do przechowywania l/ancuchw o tej samej
dl/ugosci. CHAR(n) wypel/nia dane do zadanej dl/ugosci, podczas gdy
VARCHAR(n) przechowuje jedynie dane dostarczone. BYTEA sl/uzy do
przechowywania danych binarnych, w szczeglnosci dla danych
zawierajacych NULL bajty. Wszystkie typy opisane tutaj maja podobne
charakterystyki jesli chodzi o wydajnosc.
4.15.1) Jak moge utworzyc pole ktre samo zwieksza swoja wartosc?
PostgreSQL ma zaimplementowany typ SERIAL. Automatycznie tworzy
sekwencje i indeks na tej kolumnie. Dla przykladu:
CREATE TABLE person (
id SERIAL,
name TEXT
);
zostanie automatycznie prztl/umaczone na:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
Wiecej informacji o sekwencjach znajdziesz w manualu o
create_sequence. Mozesz takze uzyc pola OID jako unikalnej wartosci
dla kazdego rzedu danych. Jesli bedziesz potrzebowal/ z backupowac
dane robiac dump bazy i odtworzyc ja, musisz uzyc pg_dump z opcja -o
lub polecenia COPY WITH OIDS aby zachowac OIDy.
4.15.2) Jak pobrac wartosc pola typu SERIAL po wykonaniu insert'u?
Jednym z podejsc jest pobranie kolejnej wartosci typu SERIAL z
sekwencji za pomoca funkcji nextval() zanim zostanie wstawiona, a
pzniej nalezy jej uzyc. Uzywajac przykl/adu z tabeli z punktu 4.15.1,
moze to wygladac w Perlu na przykl/ad w ten sposb:
new_id = output of "SELECT nextval('person_id_seq')"
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
Bedziesz mial/ wtedy ta wartosc przechowana w zmiennej new_id do
uzytku w innych zapytaniach (np. jako klucz obcy do tabeli person).
Warto zwrcic uwage, ze nazwa automatycznie utworzonej sekwencji
SEQUENCE bedzie nastepujaca: <tabela>_<kolumnatypuserial>_seq, gdzie
tabela i kolumnatypuserial sa nazwami Twojej tabeli i Twojej kolumny
typu SERIAL.
Inne rozwiazanie to uzycie funkcji currval() na pola typu SERIAL po
dodaniu nowej wartosci do rzedu zawierajacego kolumne typu SERIAL z
wstawiona domyslnie wartoscia, np.
INSERT INTO person (name) VALUES ('Blaise Pascal');
new_id = output of "SELECT currval('person_id_seq')";
Ostatecznie mozesz uzyc OID zwracanej po wykonaniu INSERT, chociaz to
jest najmniej przenosne rozwiazanie. W Perlu, wykorzystujac biblioteke
DBI z modul/em Edmunda Mergla DBD::Pg, oid jest dostepny poprzez
$sth->{pg_oid_status} po wykonaniu $sth->execute().
4.15.3) Czy uzycie currval() i nextval() nie doprowadzi do race condition z
innymi uzytkownikami?
Nie. currval() zwraca biezaca wartosc przypisana przez Twj backend, a
nie przez wszystkich uzytkownikw.
4.15.4) Dlaczego numery sekwencji nie sa ponownie uzywane przy przerwaniu
transakcji? Skad sie biora luki w numerowaniu kolumny tabeli
sekwancjami/SERIALem?
Aby poprawic zbieznosc (concurrency), wartosci sekwencji sa podawane
dzial/ajacym transakcjom kiedy tego potrzebuja i nie sa blokowane
dopki transakcja sie nie zakonczy. To spowoduje przerwy w numerowaniu
z przerwanych transakcji.
4.16) Co to jest OID? Co to jest TID?
OID sa PostgreSQL'owym rozwiazaniem problemu unikalnych numerw
rzedw. Kazdy rzad tworzony przez PostgreSQL otrzymuje unikalny OID.
Wszystkie OIDy generowane podczas procesu uruchamianego przez skrypt
initdb maja mniejsza wartosc niz 16384 (na podstawie pliku
backend/access/transam.h). Wszystkie OIDy tworzone przez uzytkownika
sa rwne lub wieksze podanej wczesniej wartosci. Domyslnie wszystkie
OIDy sa unikalne nie tylko w pojedynczej tabeli czy bazie danych ale w
cal/ej instalacji PostgreSQL.
PostgreSQL uzywa OIDw w swoim wewnetrznym systemie tabel, aby mozna
byl/o je l/aczyc. Te OIDy moga byc uzywane aby identyfikowac rzedy w
tabelach i wykorzystywac je w zl/aczeniach tych tabel. Zaleca sie abys
uzywal/ typu OID aby przechowywac wartosci OID. Mozesz utworzyc indeks
na polu OID aby dostep do niego byl/ szybszy.
OID sa przypisane do wszystkich rzedw z jednego gl/wnego miejsca i
uzywane sa przez wszystkie bazy danych. Jesli chcial/bys zmienic OID
na cos innego, lub jesli chcial/bys zrobic kopie tabeli, z orginalnymi
OIDami nie ma zadnego przeciwwskazania abys to zrobil/:
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
OIDy sa przechowywane jako cztero-bajtowe liczby cal/kowite i skoncza
sie po osiagnieciu czterech miliardw. Nikt jak dotad nie zgl/osil/
aby cos takiego sie stalo, ale mamy zamiar pozbyc sie tego
ograniczenia zanim ktos to zgl/osi.
TID sa uzywane aby zidentyfikowac konkretne rzedy z blokami i
wartoscia ofsetw. TIDy zmieniaja sie wraz ze zmianami rzedw. Sa
uzywane przez indeksy, aby wskazywac do fizycznych rzedw.
4.17) Jakie jest znaczenie niektrych terminw w PostgreSQL?
W czesci kodu zrdl/owego i starszej dokumentacji uzywamy terminw,
ktre maja bardziej oglne znaczenie. Oto niektre z nich:
* table, relation, class
* row, record, tuple
* column, field, attribute
* retrieve, select
* replace, update
* append, insert
* OID, serial value
* portal, cursor
* range variable, table name, table alias
Liste terminw zwiazanych z bazami danych mozesz znalezc pod tym
adresem:http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/
glossary/glossary.html.
4.18) Skad bierze sie ten bl/ad "ERROR: Memory exhausted in
AllocSetAlloc()"?
Prawdopodobnie wyczerpal/a Ci sie pamiec wirtualna (virtual memory) w
systemie lub Twj kernel ma zbyt nisko ustawione limity dla pewnych
zasobw. Sprbuj wykonac nastepujace polecenia zanim uruchomisz
postmaster'a:
ulimit -d 262144
limit datasize 256m
W zaleznosci od shell'a jakiego uzywasz jedno z tych polecen moze nie
zadzial/ac, ale to ustawienie pozwoli ustawic segment danych dla
procesu znacznie wiekszy i byc moze pozwoli wykonac zapytanie. To
polecenie zadzial/a dla biezacego procesu oraz wszytkich podprocesw
utworzonych po wykonaniu polecenia. Jesli ten problem wystepuje z
klientem SQL, poniewaz backend zwraca zbyt duzo danych, sprbuj
wykonac to polecenie przed uruchomieniem klienta.
4.19) Jak sprawdzic jakiej wersji PostgreSQL uzywam?
W psql, wpisz select version();
4.20) Dlaczego operacje, ktre wykonuje na duzych obiektach "large-object"
zwracaja komunikat: "invalid large obj descriptor"?
Musisz uzyc BEGIN WORK i COMMIT przed i po uzyciu uchwytu do duzego
obiektu, tzn. musisz nimi otoczyc funkcje lo_open ... lo_close.
Obecnie PostgreSQL uzywjac "rule" zamyka uchwyt do duzego obiektu przy
kazdym wywol/aniu "commit". Wiec pierwsze prba zrobienia czegokolwiek
z uchwytem spowoduje wypisanie: invalid large obj descriptor. Kod,
ktry do tej pory dzial/al/ (przynajmniej wiekszosc razy) bedzie teraz
generowal/ informacje o bl/edzie jesli nie bedziesz korzystal/ z
transakcji.
Jesli uzywasz interfejsu klienta jak ODBC byc moze bedziesz musial/
ustawic auto-commit off.
4.21) Jak stworzyc kolumne ktrej domyslna wartoscia bedzie biezacy czas?
Uzyj CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Dlaczego zapytania uzywajace IN sa takie wolne?
W wersjach wczesniejszych niz 7.4 l/aczymy podzapytania w outer
queries poprzez sekwencyjne przeszukiwanie wynikw podzapytania dla
kazdego rzedu z outer query. Jesli podzapytanie zwraca jedynie kilka
rzedw a zewnetrzne zapytanie zwraca ich wiele, IN jest najszybsze.
Aby przyspieszyc inne zapytania mozna zastapic IN przez EXISTS:
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab)
na:
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col)
Aby to rozwiazanie byl/o szybkie, subcol powinna byc kolumna
indeksowana.
W wersji 7.4 i pzniejszych, IN w rzeczywistosci uzywa tej samej
wyrafinowanej techniki l/aczenia jak normalne zapytania i jest
preferowane nad uzywaniem EXISTS.
4.23) Jak wykonac "outer join"?
PostgreSQL ma zaimplementowane outer join wykorzystujac standardowa
skl/adnie SQL. Ponizej dwa przykl/ady:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
or
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Te dwa identyczne zapytania l/acza kolumne t1.col z kolumna t2.col,
ale takze zwrca niepol/aczone rzedy w t1 (te, ktre nie pasuja w t2).
RIGHT join dodal/by niepol/aczone rzedy z tabeli t2. FULL join
zwrcil/by rzedy plus dodatkowo wszystkie rzedy z tabel t1 i t2.
Sl/owo OUTER jest opcjonalne i jest dodawane domyslnie przy LEFT,
RIGHT, i FULL join'ach. Zwykl/e join'y sa nazywane INNER joins.
W poprzednich wersjach "outer joins" moga byc zasymulowane poprzez
uzycie slowa kluczowego UNION i NOT IN. Dla przykl/adu, l/aczac tabele
tab1 i tab2, nastepujace zapytanie wykonuje outer join:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Jak wykonywac zapytanie uzywajace kilku baz danych jednoczesnie?
Nie ma takiej mozliwosci aby w zapytaniu odpytawac inna baze danych
poza biezaca. Poniewaz PostgreSQL l/aduje specyficzne dla bazy danych
katalogi systemowe, nie jest do konca jasne jak zapytanie pomiedzy
rznymi bazami danych powinno sie zachowywac.
contrib/dblink pozwala na wykonywanie zapytan poprzez rzne bazy
danych wywol/ujac odpowiednie funkcje. Oczywiscie klient moze l/aczyc
sie z rznymi bazami danych i l/aczyc informacje w ten sposb uzyskana
po stronie klienta.
4.25) Jak zwrcic w funkcji wiele rzedw lub kolumn?
Mozesz w l/atwy sposb zwracac wiele rzedw lub kolumn uzywajac
funkcji z:
http://techdocs.postgresql.org/guides/SetReturningFunctions.
4.26) Dlaczego nie moge w sposb pewny tworzyc/usuwac tabel tymczasowych w
funkcjach PL/PgSQL?
PL/PgSQL przechowuje w cache zawartosc funkcji, niepozadanym efektem
tego jest to, ze gdy taka funkcja korzysta z tabel tymczasowych, ktre
sa pzniej kasowane i odtwarzane, a funkcja wywol/ywana jest
ponownie,jej wywol/anie nie powiedzie sie poniewaz cachowana funkcja
wciaz bedzie wskazywac na stara tablice tymczasowa. Rozwiazaniem tego
problemu jest uzywanie EXECUTE aby korzystac z tabel tymczasowych w
PL/PgSQL. To spowoduje, ze zapytanie bedzie parsowane przy kazdym
wywol/aniu funkcji.
4.27) Jakie sa mozliwosci replikacji w PostgreSQL?
Jest kilka opcji aby stosowac replikacje typu master/slave. Ten typ
pozwala jedynie masterowi na dokonywanie zmian w bazie danych, a slave
moze jedynie te zmiany odczytywac. Na stronie
http://gborg.PostgreSQL.org/genpage?replication_research znajduje sie
ich lista. Replikacja typu multi-master jest w trakcie prac, opis
projektu znajduje sie pod adresem:
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
4.28) Jakie mozliwosci szyfrowania oferuje PostgreSQL?
* contrib/pgcrypto zawiera wiele funkcji za pomoca, ktrych mozemy
uzywac kryptografii w zapytaniach SQL.
* Aby szyfrowac transmisje od klienta do serwera, ten musi miec
ustawiona opcje ssl na true w pliku postgresql.conf, odpowiedni
wpis host lub hostssl musi wystepowac w pliku pg_hba.conf, oraz
sslmode nie moze byc wyl/aczone w kliencie. (Warto zwrcic uwage,
ze mozliwe jest takze uzywanie transportw szyfrujacw przez
strony trzecie, takie jak stunnel lub ssh, poza natywnym wsparciem
dla SSL przez PostgreSQL).
* Hasl/a uzytkownikw bazy danych sa automatycznie szyfrowane od
wersji 7.3. W poprzednich wersjach, nalezy ta funkcjonalnosc
poprzez wl/aczenie opcji PASSWORD_ENCRYPTION w postgresql.conf.
* Serwer moze dzial/ac uzywajac szyfrowanego systemu plikw.
Rozwijanie PostgreSQL
5.1) Napisal/em wl/asna funkcje. Kiedy uzyje jej w psql, program zrzuca
pamiec (dump core)?
Problem moze byc spowodowany przez bardzo wiele rzeczy. Sprbuj
najpierw przetestowac Twoja funkcje w samodzielnie dzial/ajacym
programie.
5.2) Jak moge dodac/zgl/osic nowe typy czy funkcje do PostgreSQL?
Wyslij Twoje propozycje na liste mailowa pgsql-hackers, wtedy
prawdopodobnie Twj kod znajdzie sie w katalogu contrib/.
5.3) Jak napisac funkcje C zwracajaca krotke (tuple)?
W wersjach PostgreSQL od numeru 7.3, funckje zwracajace tabele sa w
pelni wspierane w C, PL/PgSQL i SQL. Sprawdz w Programmer's Guide aby
uzyskac wiecej informacji. Przykl/ad funkcji napisanej w C zwracajacej
tabele zostal/ umieszczony w contrib/tablefunc.
5.4) Zmienil/em plik zrdl/owy. Dlaczego po rekompilacji nie widac zmiany?
Pliki Makefiles nie maja dorzuconych odpowiednich zaleznosci dla
plikw nagl/wkowych (include files). Wykonaj najpierw make clean, a
nastepnie ponownie make. Jesli uzywasz GCC mozesz uzyc opcji
--enable-depend przy wykonywaniu configure aby kompilator mgl/
okreslic zaleznosci samodzielnie.
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
PostgreSQL iin Ska Sorulan Sorular (SSS)
Son gncelleme : 15 Kasm 2004 Pazartesi - 15:03:23
Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
evirenler : Devrim Gndz (devrim@tdmsoft.com)
Nicolai Tufar (ntufar@tdmsoft.com)
Volkan YAZICI (volkany@phreaker.net)
Bu belgenin en gncel hali,
http://www.PostgreSQL.org/docs/faqs/FAQ_turkish.html ve
http://www.gunduz.org/seminer/pg/FAQ_turkish.html adreslerinde
grlebilir.
Platforma zel sorularnz, http://www.PostgreSQL.org/docs/index.html
adresinde yantlanr.
_________________________________________________________________
Genel Sorular
1.1) PostgreSQL nedir? Nasl okunur?
1.2) PostgreSQL'in haklar nedir?
1.3) PostgreSQL, hangi Unix platformlarnda alr?
1.4) Hangi Unix olmayan uyarlamalar bulunmaktadr?
1.5) PostgreSQL'i nereden indirebilirim?
1.6) Destei nereden alabilirim?
1.7) En son srm nedir?
1.8) Hangi belgelere ulaabilirim?
1.9) Bilinen hatalar ya da eksik zelliklere nereden ulasabilirim?
1.10) Nasl SQL renebilirim?
1.11) PostgreSQL 2000 ylna uyumlu mudur?
1.12) Gelitirme takmna nasl katlabilirim??
1.13) Bir hata raporunu nasl gnderebilirim?
1.14) PostgreSQL, dier VTYS(DBMS) lerle nasl karlatrlabilir?
1.15) PostgreSQL'e maddi adan nasl destek olabilirim?
Kullanc/istemci Sorular
2.1) PostgreSQL iin ODBC srcleri var m?
2.2) PostgreSQL'i web sayfalarnda kullanabilmek iin hangi aralar
bulunmaktadr?
2.3) PostgreSQL'in grafik kullanc arabirimi var mdr?
2.4) PostgreSQL ile iletiimi kurabilmek iin hangi dilleri
kullanabilirim?
Ynetimsel Sorular
3.1) PostgreSQL'i /usr/local/pgsql dizininden baka dizinlere nasl
kurabilirim?
3.2) Postmaster' balattmda Bad System Call ya da core dumped
mesaj alyorum. Neden?
3.3) Postmaster' balattmda, IpcMemoryCreate hatas alyorum.
Neden?
3.4) Postmaster', balattmda, IpcSemaphoreCreate hatas alyorum.
Neden?
3.5) Dier bilgisayarlarn benim PostgreSQL veritaban sunucuma
balantlarn nasl kontrol edebilirim?
3.6) Veritaban motorunu daha iyi baarm icin nasl ayarlayabilirim?
3.7) Hangi hata ayklama zellikleri bulunmaktadr?
3.8) Balanmaya alrken, neden "Sorry, too many clients" hatasn
alyorum. Neden?
3.9) pgsql_tmpdizinin iindeki dosyalar nelerdir?
3.10) PostgreSQL srmlerini ykseltmek iin neden bir dump/reload
ilemi gerekletirmek zorundaym?
3.11) Nasl bir donanm kullanmalym?br>
letimsel Sorular
4.1) Binary cursor ve normal cursor arasndaki fark nedr?
4.2) Sorgunun sadece ilk birka satrn nasl SELECT edebilirim?
4.3) psql'in iinde grdgm tablolarn ya da dier eylerin listesini
nasl alabilirim?
4.4) Bir tablodan bir kolonu nasl kaldrabilirim?
4.5) Bir satr, tablo ve veritaban iin en fazla byklk nedir?
4.6) Tipik bir metin dosyasndaki veriyi saklamak iin ne kadar disk
alan gereklidir?
4.7) Veritabannda hangi tablo ya da index'lerin tanmlandn nasl
grebilirim?
4.8) Sorgularm cok yava, ya da index'lerimi kullanmyorlar. Neden?
4.9) Query-optimizer'n sorgularm nasl deerlendirdiini, ileme
soktuunu nasl grebilirim?
4.10) R-tree index nedir?
4.11) Genetic Query Optimizer nedir?
4.12) Dzenli ifade (Regular Expression) aramalarn ve byk/kk
harfe duyarsz aramalar nasl yapabilirim? Bu byk/kk harfe
duyarl aramalar iin index'i nasl kullanabilirim?
4.13) Bir sorguda, bir alann NULL olduunu nasl ortaya
karabilirim?
4.14) esitli karakter tipleri arasndaki farklar nelerdir?
4.15.1) Nasl serial/otomatik artan (auto-incrementing) bir alan
yaratabilirim?
4.15.2) Serial giriinin deerini nasl alabilirim?
4.15.3) currval() ve nextval() dier kullanclara sorun yaratmaz m?
4.15.4) Neden sequence saylarn transaction ileminin iptalinden
sonra yeniden kullanlyor? Neden sequence/SERIAL kolonumdaki
saylarda atlamalar oluyor?
4.16) OID nedir? TID nedir?
4.17) PostgreSQL' de kullanlan baz terimlerin anlamlar nelerdir?
4.18) Neden "ERROR: Memory exhausted in AllocSetAlloc()" hatasn
alyorum?
4.19) Hangi PostgreSQL srmn alstrdm nasl grebilirim?
4.20) Neden large-object ilemlerim, "invalid large obj descriptor"
hatasn veriyor?
4.21) u andaki zaman ntanml deer olarak kabul eden kolonu nasl
yaratrm?
4.22) Neden IN kullanan subquery'lerim ok yava?
4.23) Outer join ilemini nasl yapabilirim?
4.24) Ayn anda birden fazla veritabannda nasl ilem yapabilirim?
4.25) Bir fonksiyondan nasl oklu satr ya da kolon dndrebilirim?
4.26) Neden Pl/PgSQL fonksiyonlar iinden gvenli bir ekilde tablo
yaratma/kaldrma ilemlerini yapamyoruz?
4.27) Hangi ifreleme seenekleri bulunmaktadr?
PostgreSQL zelliklerini Geniletmek
5.1) Kullanc-tanml bir fonksiyon yazdm. psql'de altrdm
zaman neden core dump ediyor?
5.2) PostgreSQL'e nasl yeni veri tipleri/fonksiyonlar ekleyebilirim?
5.3) Bir tuple dndrmek iin bir C fonksiyonunu nasl yazarm?
5.4) Bir kaynak dosyasnda deiiklik yaptm. Yeniden derlememe ramen
deiiklik geerli olmuyor. Neden?
_________________________________________________________________
Genel Sorular
1.1) PostgreSQL nedir? Nasl okunur?
PostgreSQL, Post-Gres-Q-L. olarak okunur
PostgreSQL, yeni-nesil VTYS aratrma prototipi olan POSTGRES
veritaban ynetim sisteminin gelitirilmesidir. POSTGRES'in zengin
veri tiplerini ve gl veri modelini tutarken, SQL'in gelitirilmi
alt kmesi olan PostQuel dilini kullanr. PostgreSQL cretsizdir ve
kaynak kodu ak datlr.
PostgreSQL, PostgreSQL gelitirme listesine ye olan bir Internet
gelitirici takm tarafndan gelitirilir. u andaki koordinatr,
Marc G. Fournier (scrappy@PostgreSQL.org). (Bu takma nasl
katlacagnz renmek iin 1.6 numaral maddeyi okuyunuz.) Bu takm,
tm PostgreSQL geliiminden sorumludur.
PostgreSQL 1.01 srmnn yazarlar Andrew Yu ve Jolly Chen idi.
Bunlarn dnda bir ka kisi de uyarlama, hata ayklama ve kodun
gelitirilmesi iin alsmt. PostgreSQL'in tredii orijinal
Postgres kodu, lisans, lisansst ve akademisyenler tarafndan,
Professor Michael Stonebraker (University of California, Berkeley)
koordinatrlgnde yazlmtr.
Berkley'deki yazlmn ad Postgres idi. SQL uyumluluu 1995'te
eklenince, ad Postgres 95 oldu. 1996 ylnn sonlarnda ad
PostgreSQL olarak deitirildi.
1.2) PostgreSQL'in haklar nedir?
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.
stteki metin klasik ak-kod lisans olan BSD lisansdr. Kaynak
kodun nasl kullanlabileceine dair snrlamalar yoktur. Bu lisans
seviyoruz. Deitirme niyetimiz bulunmamaktadr.
1.3) PostgreSQL, hangi Unix platforlarnda alr?
Genel olarak, modern bir Unix-uyumlu platform PostgreSQL'i
altracaktr. Ayrntl bilgi iin kurulum belgelerine
bakabilirsiniz.
1.4) Hangi Unix olmayan uyarlamalar bulunmaktadr?
PostgreSQL 8.0 srm ile , PostgreSQL artk Win2000, WinXP ve Win2003
gibi Microsoft Windows NT tabanl iletim sistemlerinde doal olarak
almaya balamtr. Paketlenmi bir kurulum program,
http://pgfoundry.org/projects/pginstaller. adresinden indirilebilir.
Ayrca, http://forge.novell.com adresinde Novell Netware 6 portu
bulunmaktadr.
1.5) PostgreSQL'i nereden indirebilirim?
PostgreSQL iin ana anonim ftp sitesi ftp://ftp.PostgreSQL.org/pub
adresidir. Yanslar iin, ana web sayfamza bakabilirsiniz.
1.6) Nereden destek alabilirim?
Ana e-posta listesi : pgsql-general@PostgreSQL.org. PostgreSQL
konusundaki tartmalara aktr. ye olmak iin, aadaki satrlar
e-postanzn body ksmna (konu ksmna deil) yazp,
pgsql-general-request@PostgreSQL.org adresine gnderin:
subscribe
end
Ayn zamanda, bir digest listesi bulunmaktadr. Bu listeye ye olmak
iin, pgsql-general-digest-request@PostgreSQL.org adresine, body
ksmnda
subscribe
end
yazan bir e-posta atmanz yeterli olacaktr.
Digest postalar, ana liste 30k civarnda e-postaya ulatnda yelere
gnderilmektedir.
Bug'lar iin bir e-posta listesi bulunmaktadr. Bu listeye ye olmak
iin, pgsql-bugs-request@PostgreSQL.org adresine, body ksmnda
subscribe
end
yazan bir e-posta atmanz yeterli olacaktr.
Ayn zamanda, gelitiriciler iin tartma listesi bulunmaktadr. Bu
listeye ye olmak iin, pgsql-hackers-request@PostgreSQL.org adresine,
body ksmnda
subscribe
end
yazan bir e-posta atmanz yeterli olacaktr.
Bunun dndaki e-posta listelerine ve PostgreSQL hakknda bilgiye,
PostgreSQL WWW ana sayfasndan ulasabilirsiniz:
http://www.PostgreSQL.org
Ayn zamanda, EFNet zerinde, #PostgreSQL adl bir IRC kanal
bulunmaktadr. Bunun iin, irc -c '#PostgreSQL' "$USER"
irc.phoenix.net Unix komutunu kullanabilirsiniz.
Ticari destek veren firmalarn listesine
http://www.postgresql.org/users-lounge/commercial-support.html
adresinden ulabilirsiniz.
1.7) En son srm nedir?
PostgreSQL'in son srm 7.4.6'dr.
Her 6-8 ayda ana srm karlmas planlanmaktadr.
1.8) Hangi belgelere ulaabilirim?
Datmn iinde, kitapklar, kitapk sayfalar ve baz kk
rnekler verilmektedir. /doc dizinine baknz. Ayrca, bu el
kitapklarn online olarak http://www.PostgreSQL.org/docs/
adresinden inceleyebilirsiniz.
http://www.PostgreSQL.org/docs/awbook.html ve
http://www.commandprompt.com/ppbook adreslerinde PostgreSQL kitaplar
bulunmaktadr. PostgreSQL kitablarnn listesine,
http://www.ca.PostgreSQL.org/books/ adresinden ulaaiblirsiniz.
Ayrca, PostgreSQL konusundaki teknik makalelere de
http://techdocs.PostgreSQL.org/ adresinden ulaabilirsiniz.
psql'in, \d ile baslayan veri tipler, operatorler, fonksiyonlar,
aggregate'ler, vb. ile ilgili gzel komutlar vardr.
Web sitemiz daha fazla belgeyi iermektedir.
1.9) Bilinen hatalar ya da eksik zelliklere nereden ulaabilirim?
PostgreSQL SQL-92 uyumluluu iindedir, standartlardan fazla da
zellikleri bulunmaktadr. Bilinen hatalar, eksik zellikler ve
gelecek ile ilgili planlar iin TODO listesine baknz.
1.10) Nasl SQL renebilirim?
http:/www.PostgreSQL.org/docs/awbook.html adresindeki kitap SQL
gretecektir. http://www.commandprompt.com/ppbook adresinde de bir
baska PostgreSQL kitab bulunmaktadr.
http://www.intermedia.net/support/sql/sqltut.shtm,
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM
http://sqlcourse.com ve http://sqlcourse2.com adreslerinde de gzel
belgeler bulunmaktadr.
Bir bakas da, http://members.tripod.com/er4ebus/sql/index.htm
adresinde bulunan "Teach Yourself SQL in 21 Days, Second Edition"
kitabdr.
Baz kullanclarmz da u kitab nermektedirler: "The Practical SQL
Handbook, Bowman, Judith S., et al.,Addison-Wesley". Bazlar ise "The
Complete Reference SQL, Groff et al., McGraw-Hill" kitabn
nermektedirler.
1.11) PostgreSQL 2000 ylna uyumlu mudur?
Evet.
1.12) Gelitirme takmna nasl katlabilirim?
ncelikle, en son kaynak kodunu indirin ve web sitemizdeki ya da
datmn iindeki PostgreSQL Developer belgesini okuyun. Ardndan,
pgsql-hackers ve pgsql-patches listelerine ye olun. nc olarak da,
pgsql-pacthes listesine yksek kalitede yamalar gnderin.
PostgreSQL CVS arivine eriim izni olan, 10 kadar gelitirici
bulunmaktadr. Hepsi defalarca, dier kiilerin yaptndan ok daha
yksek-kaliteli yamalar gndermilerdir. Ayrca biz de bu
gelitiricilerin ekledikleri yamalarn yksek kalitede olduuna
gveniyoruz.
1.13) Bir hata raporunu nasl gnderebilirim?
PostgreSQL BugTool sayfasna gidiniz. O sayfada bir bug bildirmek iin
neleri yapmanz gerektii anlatlmtr.
Ayrca, ftp://ftp.PostgreSQL.org/pub ftp adresimizde, yeni bir
PostgreSQL srm ya da yamas olup olmadni kontrol ediniz.
1.14) PostgreSQL, diger DBMS'lerle nasl karlastrlabilir?
Bir yazlmn gcn lmek iin eitli yollar vardr: Yazlmn
zellikleri, baarm, gvenilirlii, destei ve creti.
zellikler:
PostgreSQL mevcut byk ticari veritabanlarnn, transaction,
subselect, trigger, view, foreign key referential integrity ve
sophisticated locking gibi (user-defined types), rules, inheritance ve
lock cakmalarn drmek iin multi-version uyumluluk zellikleri
bulunmaktadr.
Performans (Baarm):
PostgreSQL, dier ticari ve ak kaynak kodlu veritabanlaryla yakn
baarm salar. Baz alardan daha hzldr, dier alardan da
yavatr. MySQL ya da daha zayf veritabanlar ile
karlatrldnda, INSERT/UPDATE ilemlerinde, transaction bazl
alstmz iin daha yavaz. MySQL, yukardaki "zellikler"
ksmnda belirtilenlerden hi birine sahip deildir. Biz, baarmmz
her srmde arttrsak da, esneklik ve gelimi zellikler iin
yaplanm durumdayz. PostgreSQL'i MySQL ile karlatran u web
sitesine bakabilirsiniz: http://openacs.org/why-not-mysql.html
Gvenilirlik:
DBMS'lerin gvenilir olmas gerketii, yoksa deerleri olmayacan
dnyoruz. ok iyi test edilmi, dengeli alsan minimum sayda hata
ieren kod sunmaya alyoruz. Her bir srm en az 1 aylk beta
testlerinden geirilmektedir. Srm gemiine bakarsanz, retime
hazr, dengeli ve kararl kodlar sunduumuzu grebilirsiniz. Bu
alanda, dier veritaban yazlmlarna stnlmz olduuna
inanmaktayz.
Destek:
E-posta listemiz, oluan herhangi bir sorunu zebilecek byk sayda
kullanc ve gelitirici grubunu ierir. Sorununuz iin, en az bir
ticari veritaban kadar rahat zm bulabilirsiniz. Gelistiricilere,
kullanc grubuna, belgelere ve kaynak koda direk olarak eriebilme,
PostgreSQL desteini, dier DBMS'lere gre daha nemli klar.
Gereksinimi olanlara, ticari destek verilebilir. (Destek iin 1.6
blmne baknz.)
Fiyat:
Ticari ve ticari olmayan tm kullanmlarnz iin PostgreSQL
cretsizdir. Kodumuzu, yukarda belirtilen BSD-stili lisanstaki
snrlamalar hari, rnnzn iine ekleyebilirsiniz.
1.15) PostgreSQL'e maddi adan nasl destek olabilirim?
PostgreSQL, 1996 ylndan beri 1. snf altyapya sahiptir. Bunun
iin, yllar boyu alp bu altyapy oluturup yneten Marc
Fournier'e teekkrler.
Bir ak kaynak kodlu proje iin, kaliteli altyap ok nemlidir. Bu
altyap, projenin kesilmesini nler ve projenin ilerlemesini
hzlandrr.
Tabii ki bu altyap ucuz deildir. lerin yrmesi iin eitli ylk
ve anlk harcamalarmz olmaktadr. Eer siz ya da irketinizin bu
abamza bata bulunabilecek paras varsa, ltfen
http://store.pgsql.com/ adresine gidiniz ve bata, hibede bulununuz.
Web sayfasnn 'PostgreSQL Inc.' den bahsetmesine ramen, "katkda
bulunanlar" (contributors) maddesi sadece PostgreSQL projesini
desteklemek iindir ve belirli bir irketin para kayna deildir.
isterseniz, balant adresine bir ek gnderebilirsiniz.
_________________________________________________________________
Kullanc/stemci Sorular
2.1) PostgreSQL icin ODBC srcleri var m?
iki tane ODBC srcs bulunmaktadr: PsqlODBC ve OpenLink ODBC.
PsqlODBC'i
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php
adresinden indirebilirsiniz.
OpenLink ODBC http://www.openlinksw.com adresinden alnabilir.Bu
src, kendi standart ODBC istemci yazlm ile alstndan,
destekledikleri her platformda (Win, Mac, Unix, VMS) PostgreSQL ODBC
bulunmalidir.
cretsiz srm olmakla beraber, ticari kalitede destek almak
isteyenlere satmak isteyeceklerdir. Sorularnz ltfen
postgres95@openlink.co.uk adresine gnderiniz.
2.2) PostgreSQL'i web sayfalarnda kullanabilmek iin hangi aralar
bulunmaktadr?
http://www.webreview.com/ adresinde, arka planda veritaban alstran
Web sayfalar iin giri seviyesinde bilgi bulunmaktadr.
Web ile btnleme iin, PHP () mkemmel bir arabirim sunar.
Karmak sorunlar iin, ou kisi Perl arabirimini ve CGI.pm ya da
mod_perl kullanr.
2.3) PostgreSQL'in grafik kullanc arabirimi var mdr?
eitli grafik arabirimlerimiz bulunmaktadr. Bunlarn arasnda,
PgAccess (http://www.pgaccess.org/), PgAdmin II
(http://www.pgadmin.org/, sadece Win32 iin), RHDB Admin
(http://sources.redhat.com/rhdb/) ve Rekall
(http://www.thekompany.com/products/rekall/) bulunmaktadr. Ayrca,
PostgreSQL iin web tabanl bir arabirim olan PHPPgAdmin
(http://phppgadmin.sourceforge.net/) bulunmaktadr.
Daha ayrntl liste iin
http://techdocs.postgresql.org/guides/GUITools adresine
bakabilirsiniz.
2.4) PostgreSQL ile iletiimi kurabilmek iin hangi dilleri kullanabilirim?
* C (libpq)
* Embedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Dierleri iin, http://gborg.postgresql.org adresindeki
Drivers/Interfaces blmne bakabilirsiniz.
_________________________________________________________________
Ynetimsel Sorular
3.1) PostgreSQL'i, /usr/local/pgsql dizininden baka dizinlere nasl
kurabilirim?
configure betiini alstrrken, --prefix seeneini veriniz.
3.2) postmaster'i baslattgmda, a Bad System Call ya da core dumped mesaj
alyorum. Neden?
Bunun birok nedeni olabilir. Ancak ilk kontrol edilmesi gereken sey,
ekirdeginize System V uzantlarnn kurulu olup olmadgn kontrol
etmek olabilir. PostgreSQL shared memory ve semaphores iin ekirdek
destegine gereksinim duyar.
3.3) postmaster'i balattmda, pcMemoryCreate hatas alyorum. Neden?
Ya ekirdeinizde shared memory desteiniz dzgnce
yaplandrlmamtr, ya da ekirdeinizdeki mevcut shared memory
miktarn bytmeniz gerekecektir. Gereksinim duyacanz miktar,
mimarinize ve postmaster iin ayarladgnz tampon ile backend ilemi
saysna baldr. Tm sistemler iin, tamponlar ve ilemlerde
ntanml saylarla, ~ 1MB kadar yere gereksinmeniz olacaktr.
PostgreSQL 7.3.2 Sistem Yneticileri Rehberi'ne, shared memory ve
semaphorelar hakkndaki ayrntl bilgi iin bakabilirsiniz.
3.4) postmaster' balattmda, pcSemaphoreCreate hatas alyorum. Neden?
Eer hata, "pcSemaphoreCreate: semget failed (No space left on
device)" ise, ekirdeiniz yeterli semaphore ile yaplandrlmam
demektir. Postgres, her bir potansiyel backend iin bir semaphore
gereksinimi duyar. Geici bir zm, postmaster backend ilemleri
iin daha az miktarda snrla balatmak olabilir. -N'i varsaylan
deer olan 32'den kk bir deerle balatnz. Daha kalc bir zm,
ekirdeinizin SEMMNS ve SEMMNI parametrelerini ykseltmek olacaktr.
almayan semaphore'lar ar veritaban ilemlerinde kme
yaratabilirler.
Eer hata mesajnz baka bir ey ise, ekirdeinizde semaphore
desteini yaplandrmam olabilirsiniz. Shared memory ve
semaphore'lar hakkndaki daha ayrntl bilgi iin PostgreSQL 7.3.2
Sistem Yneticileri Rehberi'ne bakabilirsiniz.
3.5) Diger bilgisayarlarn benim PostgreSQL veritaban sunucuma
balantlarn nasl kontrol edebilirim?
n tanml olarak, PostgreSQL sadece yerel makineden Unix domain
sockets kullanarak balanlmasna izin verir. Diger makineler,
postmaster'a -i etiketini geirmezseniz ve $PGDATA/pg_hba.conf
dosyasn dzenleyerek host-based authentication'a olanak vermezseniz,
balant yapamayacaklardr.
3.6) Veritabani motorunu daha iyi baarm iin nasl ayarlayabilirim?
Index'ler sorgular hzlandrabilir. EXPLAIN komutu, PostgreSQL'in
sorgunuzu nasl yorumladn ve hangi index'leri kullandn
grmenize izin verir.
Eer cok fazla INSERT ilemi yapyorsanz, bunlar byk bir toplu
ilem dosyaskullanp COPY komutu ile veritabanna girmeyi deneyiniz.
Bu, tekil INSERT'lerden daha hzldr. kinci olarak, BEGIN
WORK/COMMIT transaction blou iinde olmayan ifadeler kendi
transaction'larndaym gibi dnlr. oklu ifadeleri tek bir
transaction blou iinde yapabilirsiniz. Bu, transaction overhead'ini
drecektir. Tek bir transaction blou iinde birden ok ifadeyi
altrmay deneyebilirsiniz. Bu da ayn ekilde, transaction
overhead'ini drr.
eitli ayarlama seenekleri mevcuttur. fsync() ilemini, postmaster'
-o -F seenei ile balatarak devre d brakabilirsiniz. Bu ilem,
fsync()'lerin her transactiondan sonra diski flush etmesini
engelleyecektir.
Ayn zamanda, postmaster'i -B seenei ile balatp, backend ilemleri
tarafndan kullanlan shared memory buffers saylarn
arttrabilirsiniz. Eer bu parametreyi ok yksek tutarsanz,
ekirdeinizin shared memory blgesindeki limiti ama olaslnz
yznden postmaster balayamayabilir. Her bir tampon (buffer) 8K'dr.
ntanml say ise 64 tampondur.
Ayn ekilde, backend'in -S seeneini geici sralamalar iin backend
sreleri tarafndan kullanlacak hafzay arttrmak amacyla
kullanabilirsiniz. -S seenei kilobayt cinsinden deer alr ve n
tanml deeri 512'dir (512 K)
Tablolardaki veriyi bir index'e elemek amacyla gruplama iin CLUSTER
komutunu kullanabilirsiniz. Ayrntl bilgi iin CLUSTER komutunun
yardm sayfasna bakabilirsiniz.
3.7) Hangi hata ayklama zellikleri bulunmaktadr?
PostgreSQL, hata ayklama amacyla kullanlabilecek durum bilgisi
rapor eden eitli zeliklere sahiptir.
ncelikle, configure betiini --enable-cassert seeneiyle
altrrsanz, bir ok assert() backend calmasn gzlemler ve
beklenmeyen bir durumda program durdurur.
Postmaster ve postgres eitli hata ayklama seeneklerine sahiptir.
ncelikle, postmaster' balattnzda, standart kty ve hatalar
bir log dosyasna ynlendirdiinize emin olun:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Bu ilem PostgreSQL ana dizinine server.log dosyas yerletirecektir.
Bu dosya sunucunun yaad sorunlar ya da hatalar hakknda yararl
bilgiler ierir. -d seenei, hata ayklama seviyesini belirten bir
rakam ile kullanlr. Yksek hata ayklama seviyelerinin byk log
dosyalar oluturacan unutmaynz.
Eer postmaster almyorsa, postgres backend'ini komut satrndan
altrabilir ve SQL ifadenizi direk olarak yazabilirsiniz. Bu sadece
hata ayklama amacyla nerilir. Burada, noktal virgln deil de
yeni bir satrn sorguyu sonlandrdn unutmaynz. Eer hata
ayklama sembolleri ile derlediyseniz, ne olduunu grmek iin bir
hata ayklayc kullanabilirsiniz. backend postmaster'dan
balatlmadndan, edeer bir ortamda almamaktadr ve
locking/backend etkileim sorunlar artabilir.
Eer postmaster alyorsa, bir pencerede psql'i altrn ve psql
tarafndan kullanlan postgres srecinin sre numarasn (PID) bulun.
Postgres sreci ile ilikilendirmek iin bir hata ayklarc kullann.
Sorgular psql aracl ile altrabilirsiniz. Eer postgres
balangcnda hata ayklamak istiyorsanz, PGOPTIONS="-W n" seeneini
ayarlayabilir ve psql'i balatabilirsiniz. Bu ilem, balangcn n
saniye kadar gecikmesini salayacaktr; bylece hata ayklaycy
srece ilikilendirdikten sonra balang srecinin devam etmesini
salayabilirsiniz.
postgres program hata ayklama ve baarm lmleri iin -s, -A ve -t
seeneklerine sahiptir.
3.8) Balanmaya alrken, neden "Sorry, too many clients" hatasn
alyorum?
Postmaster'n ezamanl olarak balatabilecei backend sreleri
snrlarn arttrmanz gerekmektedir.
n tanml deer 32 sretir. Bunu, postmaster' uygun -N deeri ile
ya da postgresql.conf dosyasn dzenleyerek yeniden balatmakla
arttrabilirsiniz.
Eer -N deerini 32'den byk yapacaksanz, ayn zamanda -B deerini
de deitirmeniz gerektiini unutmayn. -B, -N'nin en az 2 kat kadar
olmaldr; daha iyi baarm iin bu sayy daha da arttrmalsnz.
Yksek saydaki backend sreleri iin, eitli ekirdek yaplandrma
parametrelerini arttrmanz gerekecektir. Yaplmas gerekenler,
SHMMAX, SEMMNS, SEMMNI, NPROC, MAXUPRC ve alabilecek dosyalarn
maksimum says olan NFILE ve NINODE deerlerini kartrmaktr. Bunun
nedeni, PostgreSQL'in izin verilen backend srelerinin says
zerinde bir snr olmasdr. Bylelikle sistem kaynaklarnn dna
klmayacaktr.
PostgreSQL'in 6.5 srmne kadar, en fazla backend says 64 idi ve
bunu deitirmek iin include/storage/sinvaladt.h dosyas iindeki
MaxBAckendid sabitini deitirdek sonra yazlm yeniden derlemek
gerekiyordu.
3.9) pgsql_tmp dizinin iindeki dosyalar nelerdir?
Sorgu alstrc (query executer) tarafndan yaratlan geici
dosyalardr. rnegin, bir sralama ORDER BY ile yaplacaksa ve
sralama backend'in -s parametresinin izin verdiinden daha fazla
alana gereksinim duyuyorsa, ekstra veriyi tutmak iin geici dosyalar
yaratlr.
Geici dosyalar, eer sralama srasnda backend gmezse otomatik
olarak silinecektir. Eer alan durumda bir backend'iniz yoksa,
pg_tempNNN.NN dosyalarn silmeniz gvenlidir.
3.10) PostgreSQL srmlerini ykseltmek iin neden bir dump/reload ilemi
gerekletirmek zorundaym?
PostgreSQL takm ara srmlerde sadece kk deiiklikler
yapmaktadr; bu yzden 7.2 srmnden 7.2.1'e ykseltmek dump/restore
ilemi gerekmemektedir. Ancak, esas srmlerde (rnek: 7.2'den 7.3'e)
ounlukla sistem tablolarnn ve veri dosyalarnn i yaps
deitirilir. Bu deiiklikler ounlukla karmaktr; dolaysyla
veri dosyalarnn geriye dnk uyumluluu ilemlerini yapmyoruz. Dump
ilemi, veriyi genel biimde alacandan yeniden ykleme esnasnda
veri, yeni i biime uygun ekilde yerletirilecektir.
Disk biiminin deimedii srmlerde, pg_upgrade betii gncellemenin
bir dump/restore gerektirmeden yaplmasn salayacaktr. pg_upgrade
betiinin o srm iin bulunup bulunmadn srm notlar iinde
bulabilirsiniz.
3.11) Nasl bir donanm kullanmalym?
PC donanm tamamen uyumlu olduu iin, insanlar tm PC donanmlarnn
ayn kalitede olduunu dnrler. Oysa byle deildir. ECC RAM, SCSI
ve kaliteli anakartlar daha ucuz donanmlara gre daha ok
gvenilirlerdir ve baarmlar daha yksektir. PostgreSQL hemen hemen
tm donanmda alabilmektedir, ancak gvenilirlik ve baarm nemli
ise donanm seeneklerini ok iyi aratrmak gereklidir. E-posta
listelerimi donanmlarla ilgili sorular ve de ticaret iin
kullanlabilir.
_________________________________________________________________
letimsel Sorular
4.1) Binary cursor ve normal cursor arasndaki fark nedir?
DECLARE yardm sayfasna baknz.
4.2) Sorgunun sadece ilk birka satrn nasl SELECT edebilirim?
FETCH yardm sayfasna baknz, ya da SELECT ... LIMIT ... kullannz.
lk birka satr almak isteseniz bile, tm sorgu deerlendirilmek
durumunda kalnabilir. ORDER BY ieren bir sorgu dnn. Eer ORDER
BY ie eleen bir index varsa, PostgreSQL istenen ilk birka satr
ileyebilir, ya da tm sorgu istenen satrlar retilene kadar
ilenebilir.
4.3) psql'in iinde grdgm tablolarn ya da dier eylerin listesini
nasl alabilirim?
pgsql/src/bin/psql/describe.c iindeki psql kaynak kodunu
okuyabilirsiniz. Bu kod, psql'in \ ile balayan komutlarnn ktsn
olusturan SQL komutlarn ierir. Ayn zamanda, psql'i -E seenei ile
balatp, verdiiniz komutlar altrmak iin yapt sorgularn
ktlarn grebilirsiniz.
4.4) Bir tablodan bir kolonu nasl kaldrabilirim?
Bu zellik (ALTER TABLE DROP COLUMN) 7.3 srm ile gelmitir. Eski
srmlerde aadakileri uygulamalsnz:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- select all columns but the one you want to remove
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
4.5) Bir satr, tablo ve veritaban iin en fazla byklk nedir?
Snrlar:
Veritaban iin en fazla byklk nedir?
Snrsz (32 TB'lk veritaban bulunmaktadr)
Bir tablo iin en fazla byklk nedir?
32 TB
Bir satr iin en fazla byklk nedir?
1.6 TB
Bir alan iin en fazla byklk nedir?
1 GB
Tabloda en fazla satr says katr?
Snrsz
Bir tabloda olabilecek en fazla kolon says katr?
Kolon tiplerine bal olarak 250-1600
Bir tabloda olabilecek en fazla index says katr?
Snrsz
Tabii ki bunlar aslnda snrsz degildir. Burada belirtilen snrlar,
fiziksel snrlarn haricindeki snrlardr. Bo disk alan,
hafza/takas alan na bal snrlamalar vardr. Baarm, snr
deerlere yaklatka, ya da deerler ok byk olduunda debilir.
Bir tablo iin byklk snr olan 32 TB, iletim sisteminin byk
dosya destei olup olmamasndan bamszdr. Byk tablolar, 1 GB'lik
dosyalarda sakland iin, dosya sistemi snrlarnin bir nemi
yoktur.
Tablo ve kolon says byklkleri, n tanml blok bykl 32k ya
karlarak arttrlabilir.
4.6) Tipik bir metin dosyasndaki veriyi saklamak iin ne kadar disk alan
gereklidir?
Bir PostgreSQL veritaban, veriyi "flat" metin dosyasnda saklamak
iin gereken alann 5 kat fazla disk alanna gereksinim duyabilir.
Her satrnda bir tamsay ve metin (text) ieren, 100.000 satrlk bir
dosya dnn. Her satrn ortalama 20 byte olduunu farzedelim. Metin
dosyas 2.8 MB olacaktr. Bu veriyi tutan PostgreSQL veritaban
yaklak 6.4 MB yer kaplayacaktr.
36 byte: Her bir satr bal (yaklak)
+ 24 byte: Bir tamsay (int) alan ve bir metin (text) alan
+ 4 byte: Sayfada tuple a pointer
----------------------------------------
64 byte -> kayt bana
PostgreSQL'de veri sayfas (data page) bykl 8192 byte (8k)dr,
dolaysyla:
8192 byte -> page bana
------------------------- = Her bir veritaban page' bana 128 satr (yaklak)
Satr bana 64 byte
100000 veri satr
-------------------- = 782 veritaban sayfas
128 satr
782 veritaban sayfas * sayfa bana 8192 byte = 6,406,144 bytes (6.4
MB)
Index'ler ok fazla yere gereksinim duymazlar, ama index'lenmi veriyi
tutacaklarndan byk olabilirler.
NULL deerler bitmapler iinde tutulur; dolaysyla ok az yer
kaplarlar.
4.7) Veritabannda hangi tablo ya da index'lerin tanmlandn nasl
grebilirim?
psql, bu tr bilgileri gstermek iin, \ ile balayan bir ok komut
sunmaktadr. \? komutu ile bu komutlar grebilirsiniz. Ayrca,
bunlar aklayan ve pg_ ile balayan ok sayda sistem tablosu
bulunmaktadr. Ayn zamanda, psql -l ile tm veritabanlarn
listeyelebirsiniz.
Ayrca, pgsql/src/tutorial/syscat.source kodunu inceleyebilirsiniz. Bu
dosya, veritaban sistem dosyalarndan bilgiyi almak iin gereksinim
duyulan bir ok SELECT'leri gsterir.
4.8) Sorgularm cok yava, ya da index'lerimi kullanmyorlar. Neden?
Indexler her sorgu tarafndan otomatik olarak kullanlmazlar. Indexler
eer bir tablonun bykl minimum bir byklkten fazla ise ve sorgu
tablodaki satrlarn sadece kk bir yzdesini seiyorsa kullanlr.
Bunun nedeni, index eriiminin neden olduu raslansal disk eriimi nin
diskin ya da tablonun sral okunmasndan daha yavas olabilmesidir.
Bir index'in kullanlp kullanlmayacan belirlemek iin, PostgreSQL
tablo hakkndaki istatistiklere gereksinmesi vardr. Bu istatistikler,
VACUUM ANALYZE kullanlarak toplanrlar. Optimizer, istatistikleri
kullanarak, tabloda ka satr olduunu ve bilir ve indexin kullanlp
kullanlmayacana daha iyi karar verir. Istatistikler, ayn zamanda
en uygun join srasn ve yntemini belirlemekte ok nemlidir.
statistik toplanmas, tablo ierikleri deitike periyodik olarak
yaplmaldr.
Indexler normalde ORDER BY sorgular ya da join ilemlerini
gerekletirmek iin kullanlmazlar. Ak bir sralamay takip eden
sral bir arama (sequential scan), byk bir tabloda index aramas
yapmaktan genelde daha hzldr.
Ancak, ORDER BY ile birlemi LIMIT genellikle bir index
kullanacaktr; nk tablonun sadece belirli bir miktar
dndrlecektir. Aslnda, MAX() ve MIN() fonksiyonlarnn index
kullanmamalarndan dolay, bu gibi deerleri ORDER BY ve LIMIT
kullanarak da almak olasdr:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Eer optimizer'n sral arama yapmasnn yanl olduuna
inanyorsanz, SET enable_seqscan TO 'off' kullann ve index kullanan
aramalarn hala daha hzl olup olmadn grn.
LIKE ya da ~ gibi operatrler kullanyorsanz, index'ler sadece
aadaki koullarda kullanlabilir:
* Arama dizininin ba, dizinin ba ile balanmaldr. Yani,
+ LIKE sorgular % ile balamamaldr.
+ Dzenli ifade sorgular ^ ie balamamaldr.
* Arama metni bir karakter snf ile balayamaz. rnek: [a-e]
* ILIKE ve ~* gibi byk/kk harfe duyarsz aramalar index'lerden
yararlanmazlar. Onun yerine, blm 4.12'de anlatlan fonksiyonel
index'leri kullanabilirsiniz.
* initdb srasnda ntanml C locale'i kullanlmaldr.
4.9) query-optimizer'n sorgularm nasl deerlendirdiini, ileme
soktuunu nasl grebilirim?
EXPLAIN yardm sayfasna baknz.
4.10) R-tree index nedir?
R-tree index, uzaysal (spatial) verileri indexlemek iin kullanlr.
Bir hash index, dizi aramalarnda (range search) kullanlamaz. B-tree
index dizi aramalarnda sadece tek boyutlu almaktadr. R-tree, ok
boyutlu veriyi destekler. rnein, eer bir R-tree index point veri
tipi zerinde ina edililebilirse, sistem "select all points within a
bounding rectangle" gibi sorgulara daha verimli yantlar verecektir.
Orijinal R-tree tasarmn aklayan belge:
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of
Data, 45-57.
Bu belgeyi, Stonebraker'n "Readings in Database Systems" kitabnda
bulabilirsiniz.
Gml R-tree indexleri poligon ve boxlar kullanabilir. Teorik
olarak, R-tree indexlerin zelliklerini geniletmek bir miktar aba
gerektirir ve bunun nasl yaplacana dair bir belgemiz henz
bulunmamaktadr.
4.11) Genetic Query Optimizer nedir?
GEQO modl, Genetic Algorithm(GA) kullanlarak tablolar
birletirildiinde sorgu optimizasyonunu hzlandrr.
4.12) Dzenli ifade (Regular Expression) aramalarn ve byk/kk harfe
duyarsz aramalar nasl yapabilirim? Bu byk(kk harfe duyarl aramalar
iin index'i nasl kullanabilirim?
~ operatr dzenli ifade elemesi ve ~* byk/kk harfe duyarsz
dzenli ifade elemesi yapar. Byk/kk harfe duyarl olan LIKE'n
byk/kk harfe duyarsz olan biimi ILIKE'tr ve PostgreSQL 7.1
srm ile birlikte gelmitir.
Byk-kk harfe duyarsz eitlik karlatrmalar aadaki gibi
ifade edilir:
SELECT *
FROM tab
WHERE lower(col) = 'abc'
Bu standart bir index yaratmayacaktr. Ancak eer fonksiyonel bir
index yaratrsanz; o kullanlacaktr:
CREATE INDEX tabindex on tab (lower(col));
4.13) Bir sorguda, bir alanin "NULL" olduunu nasl ortaya karabilirim?
Kolonu, IS NULL ve IS NOT NULL ile test edebilirsiniz.
4.14) esitli karakter tipleri arasndaki farklar nelerdir?
Veri Tipi Ad Not
--------------------------------------------------
VARCHAR(n) varchar boyut en byk uzunluu verir; sadece verilen kadar veri tutulur.
CHAR(n) bpchar belirtilen uzunlua kadar sonuna boluk eklenir.
TEXT text uzunlukta herhangi bir st snr yoktur.
BYTEA bytea variable-length byte array (null-byte safe)
"char" char bir karakter
adlar (internal name) sistem kataloglarn ve baz hata
mesajlarn incelerken greceksiniz.
lk drt veri tipi "varlena" tipidir (yani, diskteki ilk 4 bayt
uzunluktur; devam da veridir.) Dolaysyla, kullanlan gerek alan,
belirtilen alandan biraz daha byktr. Ancak, bu veri tipleri,
sktrlmaya tabi tutulabilir; dolaysyla disk alan beklenilenden
kk olabilir. VARCHAR(n) bykl artabilen ama en byk uzunluu
snrl olan verileri saklamak iin en uygun yntemdir. TEXT, 1 GB
bykle kadar olan verileri tutmak iin kullanlr.
CHAR(n), ayn uzunluktaki dizilerin saklanmas iin kullanmr.
CHAR(n) belirtilen uzunlua kadar boluk ile doldurur; ancak
VARCHAR(n) sadece verilen karakterleri saklar. BYTEA binary veri
saklamak iindir; ayrca "NULL" bayt ieren deerleri de saklar.
Burada anlatlan veri tipi de benzer baarm karakteristiklere
sahiptir.
4.15.1) Nasl serial/otomatik artan (auto-incrementing) bir alan
yaratabilirim?
PostgreSQL'de SERIAL veri tipi vardr. Bu veri tipi bir sequence ve
kolon zerinde bir index yaratr.
rnek, aadaki sorgu:
CREATE TABLE person (
id SERIAL,
name TEXT
);
buna evrilir:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
Sequenceler hakknda daha fazla bilgi iin create_sequence yardm
sayfasna bakabilirsiniz. Her satrn OID alann tekil bir say
olarak alabilirsiniz. Ancak, veritabannzn dump'n alp yeniden
yklerseniz, OID deerlerini koruyabilmek iin pg_dump'n -o
parametresini ya da "COPY WITH OIDS" seeneini kullanmanz
gerekecektir.
4.15.2) SERIAL giriinin degerini nasl alabilirim?
Bir yaklam, sequence nesnesindeki SERIAL deerini, veriyi girmeden
nce nextval() ile alp, aldnz deeri kendinizin girmesidir.
4.15.1'deki rnek tabloyu kullanarak bir rnek verelim:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Dier sorgular iin new_id'de yeni deerin saklanmas gerekir.
Otomatik olarak yaratlan SEQUENE nesnesinin ad, <tablo ad>_<serial
kolonu ad>_seq eklinde olacaktr (< > iaretleri olmadan).
Alternatif olarak, atanm SERIAL deerini, deer girildikten sonra
currval() fonksiyonu ile alabilirsiniz:
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
Son olarak, n tanml deeri bulmak iin INSERT ifadesinden dnen OID
deerini kullanabilirsiniz; ancak bu en az tanabilir zm
olacaktr. Perl'de, Edmund Mergl'in DBD:Pg mdl ile birlikte DBI
kullanarak, OID deeri $sth->execute() altrldktan sonra
$sth->(pg_oid_status) ile alnabilir.
4.15.3) currval() ve nextval() dier kullanclara sorun yaratmaz m?
Hayr. curval(), tm kullanclar deil, backend tarafndan atanan
geerli deeri dndrr.
4.15.4) Neden sequence saylar transaction ileminin iptalinden sonra
yeniden kullanlyor? Neden sequence/SERIAL kolonumdaki saylarda atlamalar
oluyor?
Uyumluluu arttrmak iin, sequence deerleri alan transaction'lara
gerektii ekilde aktarlr ve transaction bitene kadar o deer
kilitlenmez. Bu, iptal edilen transaction ilemleri nedeniyle
boluklara neden olur.
4.16) OID nedir? TID nedir?
OIDler, tekil satr numaralarna PostgreSQL'in yantdr.
PostgreSQL'de yaratlan her say, tekil bir OID alr. initdb ilemi
srasnda yaratlan tm OID'ler 16384'ten kktr
(backend/access/transam.h). Kullanclar tarafndan yaratlan tm
OID'ler bu sayya eit ya da bu saydan byktr. Varsaylan durumda,
tm bu OIDler sadece bir tablo ya da veritabannda deil, tm
PostgreSQL kurulumunda tekildir.
PostgreSQL OIDleri, tablolar arasnda satrlar ilikilendirmek iin
kendi i tablolarnda kullanr. Bu OIDler belirli kullanc
satrlarn belirtmek iin kullanabilir ve join ilemlerinde
kullanlr. OID deerlerini saklamak iin OID kolon tipini kullanmanz
nerinir. Daha hzl bir eriim iin, OID alannda bir index
yaratabilirsiniz.
OID'ler yeni satrlara, tm veritabanlar tarafnda kullanlan ortak
bir alandan atanrlar. Eer OID'i baka bir deere eitlemek
isterseniz ya da tablonun bir kopyasn orijinal OIDler ile karmak
isterseniz, bu mmkndr:
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
OIDler 4-bit tamsay olarak saklanrlar ve 4 milyarda overflow
olacaktr. Kimse bu sayya ulatna dair bir bilgi iletmedi ve bu
snr kimse bu snra ulamadan kaldracaz.
TIDler, belirli fiziksel satrlar block ve offset deerleri ile
belirtmekte kullanlr. TIDler, satrlar deitiinde ya da yeniden
yklendiinde deiirler. Index girdileri tarafndan fiziksel
satrlar gstermek iin kullanlrlar.
4.17) PostgreSQL'de kullanlan baz terimlerin anlamlar nelerdir?
Kaynak kodun bir ksm ve eski belgeler, daha geni kullanm alan
olan terimleri kullanrlar. Bunlarn bazlar:
* table, relation, class
* row, record, tuple
* column, field, attribute
* retrieve, select
* replace, update
* append, insert
* OID, serial value
* portal, cursor
* range variable, table name, table alias
Genel veritaban terimleri,
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
/glossary.html adresinde bulunabilir.
4.18) Neden "ERROR: Memory exhausted in AllocSetAlloc()" hatasn alyorum?
Sisteminizde sanal belleinizi tketmi olabilirsiniz, ya da
ekirdeiniz belli kaynaklar icin dk bir snra sahip olabilir.
postmaster' balatmadan nce aadakileri deneyebilirsiniz:
ulimit -d 262144
limit datasize 256m
Kabuunuza bal olarak, bunlardan sadece biri olumlu sonu
verecektir, ama bu ilem veri segment snrnz arttracak, ve belki
de sorgunuzun tamamlanmasn salayacaktr. Bu komut, varolan ileme
(current process) ve komut altrldktan sonraki tm alt ilemlere
uygulanr. Eer SQL istemcinizle, backend'in ok fazla veri dndrmesi
nedeniyle bir sorun yayorsanz, bunu istemciyi balatmadan nce
deneyiniz.
4.19) Hangi PostgreSQL srmn altrdm nasl grebilirim?
psql arabiriminde, select version(); yaznz.
4.20) Neden large-object ilemlerim, "invalid large obj descriptor"
hatasn veriyor?
Large object ilemlerinizin ularna, yani lo_open ... lo_close
komutlarnn evresine, BEGIN WORK ve COMMIT koymanz gerekmektedir;
u anda, PostgreSQL kurallar large objectleri transaction commit
edildiinde kapatarak uygulamaktadr. Dolaysyla handle ile yaplacak
ilk ey invalid large obj descriptor hatas ile
sonulanacaktr.Dolaysyla alan kodunuz eer transaction
kullanmazsanz hata mesajlar retecektir.
Eer ODBC gibi bir istemci arabirimi kullanyorsanz, auto-commit'i
kapatmanz gerekebilir.
4.21) u andaki zaman ntanml deer olarak kabul eden How do I create a
column that will default to the current time?
Alttakini kullanabilirsiniz:
CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Neden IN kullanan subquery'lerim ok yavas?
7.4 srmnden nce, subqueryler. Eer subquery sadece birka satr ve
outer query bol sayda satr dndryorsa, IN en hzlsdr. Sorgular
hzlandrmak iin IN yerine EXISTS kullann:
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
sorgusunu, aadaki ile deitirin:
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
Bu ilemin hzl olmas iin, subcol'un indexlenmi bir kolon olmas
gerekmektedir.
7.4 srm ve sonrasnda, IN aslnda normal sorgularla ayn karmak
join tekniklerini kullanr ve EXISTS'e tercih edilir.
4.23) Outer join ilemini nasl yapabilirim?
PostgreSQL outer joins islemlerini SQL standartlarn kullanarak
gerekletirmektedir. Aada 2 rnek bulunmaktadr:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
ya da
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
Bu zde sorgular t1.col' i t2.col'ye join ederler ve ayn zamanda
t1'deki unjoined satrlar (t2'de elenmemi olanlarla) dndrrler.
RIGHT JOIN t2'nin unjoined satrlarn ekleyecektir. Bir FULL join,
elemi btn satrlar ve t1 ile t2'den tm balanmam (unjoined)
satrlar alr. OUTER szc seimseldir ve LEFT, RIGHT ve FULL join
ilemlerinde olduu kabul edilir. Sradan join ilemleri INNER JOIN
olarak adlandrlr.
nceki srmlerde, OUTER JOINler UNION ve NOT IN kullanlarak simle
edilebiliyordu. rnein, tab1 ve tab2'yi birletirirken, aadaki
sorgu iki tablonun dtan balanmasn salar:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Ayn andan birden fazla veritabannda nasl ilem yapabilirim?
Mevcut veritabannz dndaki baka bir veritabannz sorgulamanzn
bir yolu bulunmamaktadr. Bunun nedeni, PostgreSQL'in veritabanna
zel sistem kataloglar yklemesidir. Bu nedenle, cross-database bir
sorgunun nasl davranacan kestirmek zordur.
contrib/dblink fonksiyon arlarn kullanarak cross-database
sorgulara izin verir. Tabii ki, bir istemci deiik veritabanlarna
ayn anda eriim salayabilir ve bilgiyi bu ekilde birletirebilir.
4.25) Bir fonksiyondan nasl oklu satr ya da kolon dndrebilirim?
7.3 srmnde, bir fonksiyondan kolaylkla oklu satr ya da stun
dndrebilirsiniz.
(http://techdocs.postgresql.org/guides/SetReturningFunctions)
4.26) Neden Pl/PgSQL fonksiyonlar iinden gvenli bir ekilde tablo
yaratma/kaldrma ilemlerini yapamyoruz?
PL/PgSQL fonksiyon ierikleri cache'ler. Bunun istenmeyen bir taraf,
eer bir PL/PgSQL fonksiyonu geici bir tabloya eriiyorsa ve bu tablo
ileride kaldrlp yeniden oluturulduktan sonra fonksiyon yeniden
arlrsa, fonksiyon almayacaktr; nk cache'lenmi fonksiyon
hala eski geici tabloyu gsteriyor olacaktr. zm, geici tablo
eriimleri iin PL/PgSQL'de EXECUTE kullanmaktr. Bu, sorgunun her
seferinde yeniden ilenmesini salayacaktr.
4.27) 4.28) Hangi ifreleme seenekleri bulunmaktadr?
* contrib/pgcrypto SQL sorgularnda kullanlabilmesi iin ifreleme
fonksiyonlar iermektedir.
* stemciden sunucuya iletiimi ifrelemek iin, sunucuda ssl
seenei postgresql.conf iinde ak olmaldr. Ayrca,pg_hba.conf
dosyas iinde host ya da hostssl kayd mutlaka olmaldr ve
istemci sslmode kapatlmamaldr. (Ayn zamanda,PostgreSQL'in
doal SSL balantlar dnda ssh ya da ssl gibi 3.parti
ifrelenmi veri iletimi de mmkndr.)
* Veritaban kullanc ad ve ifreleri 7.3 srm ile birlikte
otomatik olarak ifrelenirler. nceki srmlerde, postgresql.conf
iindeki PASSWORD_ENCRYPTION seeneini aktif hale getirmeniz
gerekmektedir.
* Sunucunun kendisini ifreli dosya sistemi zerinde
altrabilirsiniz.
_________________________________________________________________
PostgreSQL zelliklerini Geniletmek
5.1) Kullanc-tanml bir fonksiyon yazdm. psql'de altrdm zaman
neden core dump ediyor?
Sorunun nedeni birden fazla ey olabilir. Kullanc-tanml
fonksiyonunuzu stand-alone bir programda altrmay deneyiniz.
5.2) PostgreSQL'e nasl yeni tipler/fonksiyonlar ekleyebilirim?
almalarnz pgsql-hackers e-posta listesine gnderiniz. Kodunuz
incelendikten sonra contrib dizinine konacaktr.
5.3) Bir tuple dondrmek icin bir C fonksiyonunu nasil yazarm?
PostgreSQL 7.3 srm ile birlikte, C, PL/PgSQL ve SQL kullanlarak
tablo-dndren fonksiyonlar tamamen desteklenmektedir. Ayrntl bilgi
iin PostgreSQL 7.3.2 Kullanc Rehberi'ne bakabilrisiniz. Bir rnei
contrib/tablefunc iinde bulabilirsiniz.
5.4) Bir kaynak dosyasnda deiiklik yaptm. Yeniden derlememe ramen
deiiklik geerli olmuyor. Neden?
Makefile'lar include dosyalar iin tam bir bamllk iermezler.
ncelikle make clean, ardndan da baska bir make ilemi yapmanz
gerekir. GCC kullanyorsanz, configure betiinin --enable-depend
seeneini, derleyicinin bamllklar otomatik olarak hesaplamas
iin kullanabilirsiniz.
<!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>
<!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>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>PostgreSQL 常见问题(FAQ)</title>
</head>
<body>
<h1> PostgreSQL 常见问题(FAQ) </h1>
<p> 最近更新:2007 年 1 月 30 日 星期二 17:37:01 EST <br/>
中文版最近更新:2007 年 2 月 1 日 星期四 12:55:04 CST
</p>
<p> 目前维护人员:Bruce Momjian (<a href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)<br/>
中文版维护人员:Daojing.Zhou(<a href="mailto:doudou586@gmail.com">doudou586@gmail.com</a>
</p>
<p>
本文档的最新版本可以在
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</a>查看。
</p>
<p>
与操作系统平台相关的问题可在<a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>里找到答案。<br/>
</p>
<hr/>
<h2><a name="常见问题"></a> 常见问题 </h2>
<p>
<a href="#1.1">1.1</a>)PostgreSQL 是什么?该怎么发音?<br/>
<a href="#1.2">1.2</a>)谁控制和管理PostgreSQL ?<br/>
<a href="#1.3">1.3</a>)PostgreSQL的版权是什么?<br/>
<a href="#1.4">1.4</a>)PostgreSQL可以运行在哪些操作系统平台上?<br/>
<a href="#1.5">1.5</a>)我从哪里能得到PostgreSQL?<br/>
<a href="#1.6">1.6</a>)最新版的PostgreSQL 是什么?<br/>
<a href="#1.7">1.7</a>)我从哪里能得到对PostgreSQL 的支持?<br/>
<a href="#1.8">1.8</a>)我如何提交一个BUG报告?<br/>
<a href="#1.9">1.9</a>)我如何了解已知的 BUG 或暂缺的功能?<br/>
<a href="#1.10">1.10</a>)能够获取的最新文档有哪些?<br/>
<a href="#1.11">1.11</a>)我应该怎样学习 SQL ?<br/>
<a href="#1.12">1.12</a>)如何提交补丁或是加入开发队伍?<br/>
<a href="#1.13">1.13</a>)PostgreSQL 和其他数据库系统比起来如何?<br/>
<a href="#1.14">1.14</a>)PostgreSQL 可以处理最近各个国家夏时制的变化吗?<br/>
</p>
<h2><a name="用户客户端问题"></a> 用户客户端问题 </h2>
<p>
<a href="#2.1">2.1</a>)我们可以用什么语言和PostgreSQL 打交道?<br/>
<a href="#2.2">2.2</a>)有什么工具可以把PostgreSQL 用于 Web 页面?<br/>
<a href="#2.3">2.3</a>)PostgreSQL 拥有图形用户界面吗?<br/>
</p>
<h2><a name="系统管理问题"></a> 系统管理问题 </h2>
<p>
<a href="#3.1">3.1</a>)我怎样才能把PostgreSQL 装在 /usr/local/pgsql 以外的地方?<br/>
<a href="#3.2">3.2</a>)我如何控制来自其他电脑的连接?<br/>
<a href="#3.3">3.3</a>)我怎样调整数据库服务器以获得更好的性能?<br/>
<a href="#3.4">3.4</a>)PostgreSQL 里可以获得什么样的调试特性?<br/>
<a href="#3.5">3.5</a>)为什么在试图连接登录时收到“Sorry, too many clients” 消息?<br/>
<a href="#3.6">3.6</a>)PostgreSQL的升级过程有哪些内容?<br/>
<a href="#3.7">3.7</a>)(使用PostgreSQL)我需要使用什么计算机硬件 ?<br/>
</p>
<h2><a name="操作问题"></a> 操作问题 </h2>
<p>
<a href="#4.1">4.1</a>) 如何只选择一个查询结果的头几行?或是随机的一行?<br/>
<a href="#4.2">4.2</a>) 如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们?<br/>
<a href="#4.3">4.3</a>) 如何更改一个字段的数据类型?<br/>
<a href="#4.4">4.4</a>) 单条记录,单个表,一个数据库的最大限制是多少?<br/>
<a href="#4.5">4.5</a>) 存储一个典型的文本文件里的数据需要多少磁盘空间?<br/>
<a href="#4.6">4.6</a>) 为什么我的查询很慢?为什么这些查询没有利用索引?<br/>
<a href="#4.7">4.7</a>) 我如何才能看到查询优化器是怎样评估处理我的查询的?<br/>
<a href="#4.8">4.8</a>) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找?<br/>
<a href="#4.9">4.9</a>) 在一个查询里,我怎样检测一个字段是否为 NULL?我如何才能准确排序而不论某字段是否含NULL值?<br/>
<a href="#4.10">4.10</a>) 各种字符类型之间有什么不同?<br/>
<a href="#4.11.1">4.11.1</a>) 我怎样创建一个序列号型或是自动递增的字段?<br/>
<a href="#4.11.2">4.11.2</a>) 我如何获得一个插入的序列号的值?<br/>
<a href="#4.11.3">4.11.3</a>) 同时使用 currval() 会导致和其他用户的冲突情况吗?<br/>
<a href="#4.11.4">4.11.4</a>) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢?<br/>
<a href="#4.12">4.12</a>) 什么是 OID?什么是 CTID ?<br/>
<a href="#4.13">4.13</a>) 为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”?<br/>
<a href="#4.14">4.14</a>) 我如何才能知道所运行的 PostgreSQL 的版本?<br/>
<a href="#4.15">4.15</a>) 我如何创建一个缺省值是当前时间的字段?<br/>
<a href="#4.16">4.16</a>) 如何执行外连接(outer join)查询?<br/>
<a href="#4.17">4.17</a>) 如何执行涉及多个数据库的查询?<br/>
<a href="#4.18">4.18</a>) 如何让函数返回多行或多列数据?<br/>
<a href="#4.19">4.19</a>) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”?<br/>
<a href="#4.20">4.20</a>) 目前有哪些数据复制方案可用?<br/>
<a href="#4.21">4.21</a>) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留?<br/>
</p>
<hr/>
<h2><a name="常见问题"></a> 常见问题 </h2>
<h3> <a name="1.1"></a>1.1)PostgreSQL 是什么?该怎么发音? </h3>
<p>PostgreSQL 读作 <i>Post-Gres-Q-L</i>,有时候也简称为<i>Postgres</i> 。想听一下其发音的人员可从这里下载声音文件:
<a href="http://www.postgresql.org/files/postgresql.mp3">MP3 格式</a>
</p>
<p>PostgreSQL 是面向目标的关系数据库系统,它具有传统商业数据库系统的所有功能,同时又含有将在下一代 DBMS 系统的使用的增强特性。PostgreSQL 是自由免费的,并且所有源代码都可以获得。
</p>
<p>PostgreSQL 的开发队伍主要为志愿者,他们遍布世界各地并通过互联网进行联系,这是一个社区开发项目,它不被任何公司控制。
如想加入开发队伍,请参见开发人员常见问题(FAQ)
<a href="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="1.2"></a>1.2) 谁控制PostgreSQL ? </h3>
<p>
如果你在寻找PostgreSQL的掌门人,或是什么中央委员会,或是什么所属公司,你只能放弃了---因为一个也不存在,但我们的确有一个
核心委员会和CVS管理组,但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行独占式控制,PostgreSQL项目是由任何人均
可参加的开发人员社区和所有用户控制的,你所需要做的就是订阅邮件列表,参与讨论即可(要参与PostgreSQL的开发详见
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> 开发人员常问题 (Developer's FAQ) </a>获取信息)。
</p>
<h3> <a name="1.3"></a>1.3)PostgreSQL的版权是什么? </h3>
<p>PostgreSQL的发布遵从经典的BSD版权。它允许用户不限目的地使用PostgreSQL,甚至你可以销售PostgreSQL而不含源代码也可以,唯一的限制就是你不能因软件自身问题而向我们追诉法律责任,另外就是要求所有的软件拷贝中须包括以下版权声明。下面就是我们所使用的BSD版权声明内容:</p>
<p>PostgreSQL数据库管理系统</p>
<p> 部分版权(c)1996-2005,PostgreSQL 全球开发小组,部分版权(c)1994-1996 加州大学董事</p>
<p> (Portions copyright (c) 1996-2005,PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California)</p>
<p>
允许为任何目的使用,拷贝,修改和分发这个软件和它的文档而不收取任何费用,
并且无须签署因此而产生的证明,前提是上面的版权声明和本段以及下面两段文字出现在所有拷贝中。
</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>
在任何情况下,加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的,
间接的,特殊的,附加的或者相伴而生的损坏,包括利益损失的责任,即使加州大学已经建议了这些损失的可能性时也是如此。
</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>
加州大学明确放弃任何保证,包括但不局限于某一特定用途的商业和利益的隐含保证。
这里提供的这份软件是基于“当作是”的基础的,因而加州大学没有责任提供维护,支持,更新,增强或者修改的服务。
</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.)<br/>
</p>
<h3> <a name="1.4"></a>1.4)PostgreSQL 可以运行在哪些操作系统平台上? </h3>
<p> 一般说来,任何现在对 UNIX 兼容的操作系统之上都能运行PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。</p>
<p>PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统,如Win2000 SP4,WinXP 和 Win2003,已制作完成的安装包可从
<a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>下载,基于MSDOS的Windows操作系统
(Win95,Win98,WinMe)需要通过Cygwin模拟环境运行PostgreSQL。
</p>
<p>
同时也有一个为Novell Netware 6开发的版本可从 <a href="http://forge.novell.com" target="_top">http://forge.novell.com</a>获取,为OS/2(eComStation)开发的版本可从
<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" target="_top">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> <a name="1.5"></a>1.5) 我从哪里能得到PostgreSQL? </h3>
<p>
通过浏览器可从<a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a>下载,也可通过FTP,从
<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a>站点下载。
</p>
<h3> <a name="1.6"></a>1.6) 最新版的PostgreSQL是什么? </h3>
<p>PostgreSQL 最新的版本是版本 8.2.1 。</p>
<p>我们计划每年发布一个主要升级版本,每几个月发布一个小版本。</p>
<h3> <a name="1.7"></a>1.7) 我从哪里能得到对PostgreSQL的支持? </h3>
<p>PostgreSQL社区通过邮件列表为其大多数用户提供帮助,订阅邮件列表的主站点是 <a href="http://www.postgresql.org/community/lists/" target="_top">http://www.postgresql.org/community/lists/</a>,一般情况下,先加入<i>General</i><i>Bug</i>邮件列表是一个较好的开始。
</p>
<p>
主要的IRC频道是在FreeNode(<i>irc.freenode.net</i>)的<i>#postgresql</i>,为了连上此频道,可以使用UNIX程序irc,其指令格式:
irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(<i>#postgersql-es</i>)和法语频道
(<i>#postgresql-fr</i>)。同样地,在EFNET上也有一个PostgreSQL的交流频道。
</p>
<p>
可提供商业支持的公司列表可在<a href="http://techdocs.postgresql.org/companies.php" target="_top">http://techdocs.postgresql.org/companies.php</a>浏览。
</p>
<h3> <a name="1.8"></a>1.8) 我如何提交一个BUG报告? </h3>
<p>
可访问 <a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>,填写Bug上报表格即可,同样也可访问ftp站点<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a> 检查有无更新的PostgreSQL版本或补丁。
</p>
<p>
通过使用Bug提交表格或是发往PostgreSQL邮件列表的Bug通常会有以下之一回复:
</p>
<ul>
<li>所提交内容不是一个Bug及其不是Bug的原因。</li>
<li>所提交内容是一个已知的Bug并且已经加入TODO待处理任务列表。</li>
<li>所提交的Bug已在当前版本中被修正。</li>
<li>所提交的Bug已修正但尚未将补丁加入现在的发布软件包。</li>
<li>请求提交者提供更详细的信息:
<ul>
<li>操作系统</li>
<li>PostgreSQL版本</li>
<li>可重现Bug的测试案例</li>
<li>调试信息</li>
<li>调试跟踪输出</li>
</ul>
</li>
<li>所提交内容是一个新Bug,将执行以下工作:
<ul>
<li>创建一个新补丁并将其加入下一个主要版本或是小的改进版本中。</li>
<li>此Bug暂时不能修正,将被加至TODO待处理任务列表。</li>
</ul>
</li>
</ul>
<h3> <a name="1.9"></a>1.9) 我如何了解已知的 BUG 或暂缺的功能? </h3>
<p>PostgreSQL 支持一个扩展的 SQL:2003 的子集。参阅我们的<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a> 列表,了解已知Bug列表、暂缺的功能和将来的开发计划。
</p>
<p>要求增加新功能的申请通常会收到以下之一的回复:</p>
<ul>
<li>该功能已加入TODO待处理任务列表。</li>
<li>该功能不是必须的,因为:
<ul>
<li>它是现有的且符合SQL标准的某功能的重复。</li>
<li>该功能性会大大增加代码的复杂程序,而带来的好处是微不足道的。</li>
<li>该功能是不安全或是不可靠的。</li>
</ul>
</li>
<li>该功能将被加入TODO待处理任务列表。</li>
</ul>
<p>
PostgreSQL不使用Bug跟踪系统,因为我们发现在邮件列表中直接回复以及保证TODO任务列表总是处于最新状态的方式工作效率会更高一些。事实上,Bug不会在我们的软件中存在很长时间,
对影响很多用户的Bug也总是很快会被修正。唯一能找到所有改进、提高和修正的地方是CVS的日志信息,即使是在软件新版本的发布信息中也不会列出每一处的软件更新。
</p>
<h3> <a name="1.10"></a>1.10) 能够获取的最新文档有哪些? </h3>
<p>PostgreSQL包含大量的文档,主要有详细的参考手册,手册页和一些的测试例子。参见 /doc 目录(译注:应为 $PGHOME/doc)。
你还可以在线浏览PostgreSQL的手册,其网址是:<a href="http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</a>
</p>
<p>
有两本关于PostgreSQL的书在线提供,在
<a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a>
<a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>
也有大量的PostgreSQL书籍可供购买,其中最为流行的一本是由Korry Douglas编写的。在
<a href="http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</a>
上有大量有关PostgreSQL书籍的简介。
<a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a>上收集了有关PostgreSQL的大量技术文章。
</p>
<p>
客户端的命令行程序<i>psql</i>有一些以 \d 开头的命令,可显示关于类型,操作符,函数,聚合等信息,使用 \? 可以显示所有可用的命令。
</p>
<p>
我们的 web 站点包含更多的文档。
</p>
<h3> <a name="1.11"></a>1.11) 我应该怎样学习 SQL ? </h3>
<p>
首先考虑上述提到的与PostgreSQL相关的书籍,另外一本是<i>Teach Yourself SQL in 21 Days, Second Edition</i>,其详细介绍的网址是
<a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a>
我们的许多用户喜欢<i>The Practical SQL Handbook</i>, Bowman, Judith S. 编写,Addison-Wesley公司出版,其他的则喜欢
<i>The Complete Reference SQL</i>, Groff 编写,McGraw-Hill公司出版。
</p>
<p>在下列网址上也有很好的教程,他们是</p>
<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> <a name="1.12"></a>1.12)如何提交补丁或是加入开发队伍? </h3>
<p>
详见<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> 开发人员常见问题 (Developer's FAQ) </a>
</p>
<h3> <a name="1.13"></a>1.13)PostgreSQL和其他数据库系统比起来如何? </h3>
<p>
评价软件有好几种方法:功能,性能,可靠性,支持和价格。
</p>
<dl>
<dt><b>功能</b></dt>
<dd>PostgreSQL 拥有大型商用数据库最多的功能,例如:事务,子查询,触发器,视图,外键参考完整性和复杂的锁定等。
我们还有一些它们没有的特性,如用户定义类型,继承,规则和多版本并行控制以减少锁的争用等。<br/>
</dd>
<dt><b>性能</b></dt>
<dd>PostgreSQL和其他商用和开源的数据库具有类似的性能。对某些处理它比较快,对其他一些处理它比较慢。
与其他数据库相比,我们的性能优劣通常在 +/- 10%之间。<br/>
</dd>
<dt><b>可靠性</b></dt>
<dd>
我们都知道数据库必须是可靠的,否则它就一点用都没有。我们努力做到发布经过认真测试的,缺陷最少的稳定代码。每个版本至少有一个月的 beta
测试时间,并且我们的发布历史显示我们可以提供稳定的,牢固的,可用于生产使用的版本。我们相信在这方面我们与其他的数据库软件是相当的。<br/>
</dd>
<dt><b>支持</b></dt>
<dd>
我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。我们不能保证总是能解决问题,相比之下,商用数据库软件也并不是总能够提供解决方法。
直接与开发人员,用户群,手册和源程序接触使PostgreSQL的支持比其他数据库还要好。还有一些商业性的全面技术支持,可以给提供给那些需要的人。(参阅1.7 小节)<br/>
</dd>
<dt><b>价格</b></dt>
<dd>
我们对任何用途都免费,包括商用和非商用目的。
你可以不加限制地向你的产品里加入我们的代码,除了那些我们在上面的版权声明里声明的 BSD版权之外的内容。
</dd>
</dl>
<h3><a name="1.14"></a>1.14) PostgreSQL可以处理最近各个国家夏时制的变化吗?</h3>
<p>PostgreSQL 8.0之前的版本是使用操作系统中的时区数据库来处理夏时制的信息,自8.0版及以后的版本PostgreSQL会自身含有最新的时区信息。</p>
<hr/>
<h2><a name="用户客户端问题"></a> 用户客户端问题 </h2>
<h3> <a name="2.1"></a>2.1) 我们可以用什么语言和PostgreSQL打交道? </h3>
<p>PostgreSQL(缺省情况)只安装有C和内嵌式C的接口,其他的接口都是独立的项目,能够分别下载,这些接口项目独立的好处
是他们可以有各自的发布计划和各自独立的开发组。
</p>
<p>
一些编程语言如PHP都有访问PostgreSQL的接口,Perl、TCL、Python以及很多其他语言的接口在
<a href="http://gborg.postgresql.org" target="_top">http://gborg.postgresql.org</a>网站上的<i>Drivers/Interfaces</i>小节可找到,
并且通过Internet很容易搜索到。
</p>
<h3> <a name="2.2"></a>2.2) 有什么工具可以把PostgreSQL用于 Web 页面? </h3>
<p>
一个介绍以数据库为后台的挺不错的站点是:<a href="http://www.webreview.com">http://www.webreview.com</a>
</p>
<p>
对于 Web 集成,PHP 是一个极好的接口。它在<a href="http://www.php.net/">http://www.php.net/</a>
</p>
<p>
对于复杂的任务,很多人采用 Perl 接口和 使用CGI.pm的DBD::Pg 或 mod_perl 。
</p>
<h3> <a name="2.3"></a>2.3)PostgreSQL拥有图形用户界面吗? </h3>
<p>
商业用户或是开源开发人员能找到很多的有关PostgreSQL的GUI图形工具软件,在 <a href="http://www.postgresql.org/docs/techdocs.54">PostgreSQL社区文档</a>有一个详细的列表。
</p>
<hr/>
<h2><a name="系统管理问题"></a> 系统管理问题 </h2>
<h3> <a name="3.1"></a>3.1)我怎样能把PostgreSQL装在 /usr/local/pgsql 以外的地方? </h3>
<p>
在运行 configure 时加上 --prefix 选项。
</p>
<h3> <a name="3.2"></a>3.2) 我如何控制来自其他电脑的连接? </h3>
<p>
缺省情况下,PostgreSQL只允许来自本机且通过 unix 域套接字或TCP/IP方式的连接。
你只有在修改了配置文件<i>postgresql.conf</i>中的<i>listen_addresses</i>,且也在配置文件<i>$PGDATA/pg_hba.conf</i>中打开了
基于远程电脑( host-based )的身份认证,并重新启动PostgreSQL,否则其他电脑是不能与你的PostgreSQL服务器进行连接的。
</p>
<h3> <a name="3.3"></a>3.3) 我怎样调整数据库引擎以获得更好的性能? </h3>
<p>
有三个主要方面可以提升PostgreSQL的潜能。
</p>
<dl>
<dt><b>查询方式的变化</b></dt>
<dd>
这主要涉及修改查询方式以获取更好的性能:
<ul>
<li>创建索引,包括表达式和部分索引;</li>
<li>使用COPY语句代替多个Insert语句;</li>
<li>将多个SQL语句组成一个事务以减少提交事务的开销;</li>
<li>从一个索引中提取多条记录时使用CLUSTER;</li>
<li>从一个查询结果中取出部分记录时使用LIMIT;</li>
<li>使用预编译式查询(Prepared Query);</li>
<li>使用ANALYZE以保持精确的优化统计;</li>
<li>定期使用 VACUUM 或 <i>pg_autovacuum</i></li>
<li>进行大量数据更改时先删除索引(然后重建索引)</li>
</ul>
</dd>
<dt><b>服务器的配置</b></dt>
<dd>
配置文件<i>postgres.conf</i>中的很多设置都会影响性能,所有参数的列表可见:
<a href="http://www.postgresql.org/docs/current/static/runtime.html">管理员指南/数据库服务器运行环境/数据库服务器运行配置</a>
有关参数的解释可见:<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html" target="_top">http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>
</dd>
<dt><b>硬件的选择</b></dt>
<dd>
计算机硬件对性能的影响可浏览
<a href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html" target="_top">http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</a>
<a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a>
</dd>
</dl>
<h3> <a name="3.4"></a>3.4)PostgreSQL里可以获得什么样的调试特性? </h3>
<p>PostgreSQL 有很多类似<code> log_* </code>的服务器配置变量可用于查询的打印和进程统计,而这些工作对调试和性能测试很有帮助。
</p>
<h3> <a name="3.5"></a>3.5) 为什么在试图连接时收到“Sorry, too many clients(已有太多用户连接)”消息? </h3>
<p>
这表示你已达到缺省100个并发后台进程数的限制,你需要通过修改<i>postgresql.conf</i>文件中的<i>max_connections</i>值来
增加postmaster的后台并发处理数,修改后需重新启动<i>postmaster</i>
</p>
<h3> <a name="3.6"></a>3.6)PostgreSQL的升级过程有哪些内容 ? </h3>
<p>
PostgreSQL 开发组对每次小版本的升级主要只做了一些Bug修正工作,因此从 7.4.8 升级到 7.4.9 不需要 dump 和 restore,仅需要停止数据库服务器,安装更新后的软件包,然后重启服务器即可。
</p>
<p>
所有PostgreSQL的用户应该在最接近(你所使用的主版本)的小改进版本发布尽快升级。尽管每次升级可能都有一点风险,PostgreSQL的小改进版仅仅是设计用来修正一些Bug的,代码改动较少,所以风险还是很小的。PostgreSQL社区认为一般情况下不升级的风险还是多于升级的。
</p>
<p>
主版本的升级(例如从 7.3 到 7.4)通常会修改系统表和数据表的内部格式。
这些改变一般比较复杂,因此我们不维持数据文件的向后兼容性。因此从老版本中进行数据导出(dump)/然后在新版本中进行数据导入(reload)对主版本的升级是必须的。
</p>
<h3> <a name="3.7"></a>3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ? </h3>
<p>
由于计算机硬件大多数是兼容的,人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是,
ECC RAM(带奇偶校验的内存),SCSI (硬盘)和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上,
但如果可靠性和性能对你的系统很重要,你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于
硬件配置和性价比的讨论。
</p>
<hr/>
<h2><a name="操作问题"></a> 操作问题 </h2>
<h3> <a name="4.1"></a>4.1) 如何只选择一个查询结果的头几行?或是随机的一行? </h3>
<p>
如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。
如果有一个索引与 <i> ORDER BY</i>中的条件匹配,PostgreSQL 可能就只处理要求的头几条记录,
(否则将对整个查询进行处理直到生成需要的行)。如果在执行查询功能时不知道确切的记录数,
可使用游标(cursor)和FETCH功能。
</p>
<p>
可使用以下方法提取一行随机记录的:
</p>
<pre>
SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;
</pre>
<h3> <a name="4.2"></a>4.2) 如何查看表、索引、数据库以及用户的定义?如何查看<i>psql</i>里用到的查询指令并显示它们? </h3>
<p>
<i>psql</i>中使用 \dt 命令来显示数据表的定义,要了解<i>psql</i>中的完整命令列表可使用\? ,另外,你也可以阅读 <i>psql</i> 的源代码
文件<i>pgsql/src/bin/psql/describe.c</i>,它包括为生成<i>psql</i>反斜杠命令的输出的所有 SQL 命令。你还可以带 <i>-E</i> 选项启动 <i>psql</i>
这样它将打印出你在<i>psql</i>中所给出的命令执行时的内部实际使用的SQL查询语句。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口,
你可以从这里获取关于数据库的信息。
</p>
<p>
在系统中也有一些以<i>pg_</i> 打头的系统表也描述了表的定义。
</p>
<p>
使用 <i>psql -l</i> 指令可以列出所有的数据库。
</p>
<p>
也可以浏览一下 <i>pgsql/src/tutorial/syscat.source</i>文件,它列举了很多可从数据库系统表中获取信息的SELECT语法。
</p>
<h3> <a name="4.3"></a>4.3) 如何更改一个字段的数据类型? </h3>
<p>
在8.0版本里更改一个字段的数据类型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。
</p>
<p>
在以前的版本中,可以这样做:
</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>
你然后可以使用<i>VACUUM FULL tab </i>指令来使系统收回无效数据所占用的空间。
</p>
<h3> <a name="4.4"></a>4.4) 单条记录,单个表,单个数据库的最大限制是多少? </h3>
<p>
下面是一些限制:
</p>
<blockquote>
<table>
<tbody>
<tr><td>单个数据库最大尺寸?</td><td>无限制(已存在有 32TB 的数据库)</td></tr>
<tr><td>单个表的最大尺寸?</td><td>32 TB</td></tr>
<tr><td>一行记录的最大尺寸?</td><td>1.6 TB</td></tr>
<tr><td>一个字段的最大尺寸?</td><td>1 GB</td></tr>
<tr><td>一个表里最大行数?</td><td>无限制</td></tr>
<tr><td>一个表里最大列数?</td><td>250-1600 (与列类型有关)</td></tr>
<tr><td>一个表里的最大索引数量?</td><td>无限制</td></tr>
</tbody>
</table>
</blockquote>
<p>
当然,实际上没有真正的无限制,还是要受可用磁盘空间、可用内存/交换区的制约。
事实上,当上述这些数值变得异常地大时,系统性能也会受很大影响。
</p>
<p>
单表的最大大小 32 TB 不需要操作系统对单个文件也需这么大的支持。大表用多个 1 GB 的文件存储,因此文件系统大小的限制是不重要的。
</p>
<p>
如果缺省的块大小增长到 32K ,最大的单表大小和最大列数还可以增加到四倍。
</p>
<p>
有一个限制就是不能对大小多于2000字节的列创建索引。幸运地是这样的索引很少用到。通过对多字节列的内容进行MD5哈稀运算结果进行函数索引可对列的唯一性得到保证,
并且全文检索允许对列中的单词进行搜索。
</p>
<h3> <a name="4.5"></a>4.5) 存储一个典型的文本文件里的数据需要多少磁盘空间? </h3>
<p>
一个 Postgres 数据库(存储一个文本文件)所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。
</p>
<p>
例如,假设有一个 100,000 行的文件,每行有一个整数和一个文本描述。
假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的PostgreSQL数据库文件大约是 6.4 MB:
</p>
<pre>
28 字节: 每行的头(大约值)
24 字节: 一个整数型字段和一个文本型字段
+ 4 字节: 页面内指向元组的指针
----------------------------------------
56 字节每行
PostgreSQL 数据页的大小是 8192 字节 (8 KB),则:
8192 字节每页
------------------- = 146 行/数据页(向下取整)
56 字节每行
100000 数据行
-------------------- = 685 数据页(向上取整)
146 行/数据页
685 数据页 * 8192 字节/页 = 5,611,520 字节(5.6 MB)
</pre>
<p>
索引不需要这么多的额外消耗,但也确实包括被索引的数据,因此它们也可能很大。
</p>
<p>
空值<i>NULL</i>存放在位图中,因此占用很少的空间。
</p>
<h3> <a name="4.6"></a>4.6) 为什么我的查询很慢?为什么这些查询没有利用索引? </h3>
<p>
并非每个查询都会自动使用索引。只有在表的大小超过一个最小值,并且查询只会选中表中较小比例的记录时才会采用索引。
这是因为索引扫描引起的随即磁盘存取可能比直接地读取表(顺序扫描)更慢。
</p>
<p>
为了判断是否使用索引,PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE,或 ANALYZE 获得。
使用统计值,优化器知道表中有多少行,就能够更好地判断是否利用索引。
统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时,应定期进行统计值的更新收集。
</p>
<p>
索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描再做一次排序通常比索引扫描要快。然而,如果将 LIMIT 和 ORDER BY
结合在一起使用的话,通常将会使用索引,因为这时仅返回表中的一小部分记录。
</p>
<p>
如果你确信PostgreSQL的优化器使用顺序扫描是不正确的,你可以使用<code>SET enable_seqscan TO 'off'</code>指令来关闭顺序扫描,
然后再次运行查询,你就可以看出使用一个索引扫描是否确实要快一些。
</p>
<p>
当使用通配符操作,例如 <i>LIKE</i><i>~</i> 时,索引只能在特定的情况下使用:
</p>
<ul>
<li>字符串的开始部分必须是普通字符串,也就是说:
<ul>
<li> <i>LIKE</i> 模式不能以 <i>%</i> 打头。</li>
<li> <i>~</i> (正则表达式)模式必须以 <i>^</i> 打头。</li>
</ul>
</li>
<li>字符串不能以匹配多个字符的模式类打头,例如 [a-e]。</li>
<li>大小写无关的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 <a href="#4.8">4.8</a> 节描述的表达式索引。</li>
<li>在做 initdb 时必须采用缺省的本地设置 C locale,因为系统不可能知道在非C locale情况时下一个最大字符是什么。
在这种情况下,你可以创建一个特殊的<code>text_pattern_ops</code>索引来用于<small>LIKE</small>的索引。
</li>
</ul>
<p>
在8.0之前的版本中,除非要查询的数据类型和索引的数据类型相匹配,否则索引经常是未被用到,特别是对int2,int8和数值型的索引。
</p>
<h3> <a name="4.7"></a>4.7) 我如何才能看到查询优化器是怎样评估处理我的查询? </h3>
<p>参考 <small>EXPLAIN</small> 手册页。</p>
<h3> <a name="4.8"></a>4.8) 我怎样做正则表达式搜索和大小写无关的正则表达式查找?怎样利用索引进行大小写无关查找? </h3>
<p>
操作符 <i> ~ </i> 处理正则表达式匹配,而 <i>~*</i> 处理大小写无关的正则表达式匹配。大小写无关的 LIKE 变种成为 ILIKE。
</p>
<p>
大小写无关的等式比较通常写做:
</p>
<pre>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</pre>
<p>
这样将不会使用标准的索引。但是可以创建一个在这种情况下使用的表达式索引:
</p>
<pre>
CREATE INDEX tabindex ON tab (lower(col));
</pre>
<p>
如果上述索引在创建时加入UNIQUE约束,虽然索引字段自身内容可以存储大小写不限的内容,但如果有UNIQUE约束后,这些内容不能仅仅是大小写不同(否则会造成冲突)。为了保证不发生这种情况,可以使用CHECK约束条件或是触发器在录入时进行限制。
</p>
<h3> <a name="4.9"></a>4.9) 在一个查询里,我怎样检测一个字段是否为 <i>NULL</i> ?我如何才能准确排序而不论某字段是否含 <i>NULL</i> 值? </h3>
<p>
<small>IS NULL</small><small>IS NOT NULL</small> 测试这个字段,具体方法如下:
</p>
<pre> SELECT *
FROM tab
WHERE col IS NULL;
</pre>
<p>为了能对含 <small>NULL</small>字段排序,可在 <small>ORDER BY</small> 条件中使用 <small>IS NULL</small>
<small>IS NOT NULL</small> 修饰符,条件为真 <i>true</i> 将比条件为假<i>false</i> 排在前面,下面的例子就会将含
NULL 的记录排在结果的上面部分:
</p>
<pre> SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
</pre>
<h3> <a name="4.10"></a>4.10) 各种字符类型之间有什么不同? </h3>
<blockquote>
<table>
<tbody>
<tr><th>类型</th><th>内部名称</th><th>说明</th></tr>
<tr><td>VARCHAR(n)</td><td>varchar</td><td>指定了最大长度,变长字符串,不足定义长度的部分不补齐</td></tr>
<tr><td>CHAR(n)</td><td>bpchar</td><td>定长字符串,实际数据不足定义长度时,以空格补齐</td></tr>
<tr><td>TEXT</td><td>text</td><td>没有特别的上限限制(仅受行的最大长度限制)</td></tr>
<tr><td>BYTEA</td><td>bytea</td><td>变长字节序列(使用NULL字符也是允许的)</td></tr>
<tr><td>"char"</td><td>char</td><td>单个字符</td></tr>
</tbody>
</table>
</blockquote>
<p>
在系统表和在一些错误信息里你将看到内部名称。
</p>
<p>
上面所列的前四种类型是"varlena"(变长)类型(也就是说,开头的四个字节是长度,后面才是数据)。
于是实际占用的空间比声明的大小要多一些。
然而这些类型如定义很长时都可以被压缩存储,因此磁盘空间也可能比预想的要少。
</p>
<p>
<small>VARCHAR(n)</small> 在存储限制了最大长度的变长字符串是最好的。
<small>TEXT</small> 适用于存储最大可达 1G左右但未定义限制长度的字符串。
</p>
<p>
<small>CHAR(n)</small> 最适合于存储长度相同的字符串。 <small>CHAR(n)</small>会根据所给定的字段长度以空格补足(不足的字段内容),
<small>VARCHAR(n)</small> 只存储所给定的数据内容。
<small>BYTEA</small> 用于存储二进制数据,尤其是包含 NULL 字节的值。这些类型具有差不多的性能。
</p>
<h3> <a name="4.11.1"></a>4.11.1) 我怎样创建一个序列号或是自动递增的字段? </h3>
<p>PostgreSQL 支持 SERIAL 数据类型。(字段定义为SERIAL后)将自动创建一个序列生成器,例如:
</p>
<pre>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</pre>
<p>
会自动转换为以下SQL语句:
</p>
<pre>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</pre>
<p>
参考 create_sequence 手册页获取关于序列生成器的更多信息。
</p>
<h3> <a name="4.11.2"></a>4.11.2) 我如何获得一个插入的序列号的值? </h3>
<p>
一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再用此值精确地插入。使用
<a href="#4.11.1"> 4.11.1</a> 里的例表,可用伪码这样描述:
</p>
<pre>
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</pre>
<p>
这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为参照 person 表的外键)。
注意自动创建的 SEQUENCE 对象的名称将会是 &lt;<i>table</i>&gt;_&lt;<i>serialcolumn</i>&gt;_<i>seq</i>
这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。
</p>
<p>
类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值,例如:
</p>
<pre>
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
</pre>
<h3> <a name="4.11.3"></a>4.11.3) 同时使用 <i>currval()</i> 会导致和其他用户的冲突情况吗? </h3>
<p>
不会。<i>currval()</i> 返回的是你本次会话进程所赋的值而不是所有用户的当前值。<br/>
</p>
<h3> <a name="4.11.4"></a>4.11.4) 为什么不在事务异常中止后重用序列号呢?为什么在序列号字段的取值中存在间断呢? </h3>
<p>
为了提高并发性,序列号在需要的时候赋予正在运行的事务,并且在事务结束之前不进行锁定,
这就会导致异常中止的事务后,序列号会出现间隔。
</p>
<h3> <a name="4.12"></a>4.12) 什么是 <small>OID</small> ?什么是 <small>CTID</small></h3>
<p>PostgreSQL 里创建的每一行记录都会获得一个唯一的<small>OID</small>,除非在创建表时使用<small>WITHOUT OIDS</small>选项。
<small>OID</small>创建时会自动生成一个4字节的整数,所有 OID 在相应PostgreSQL服务器中均是唯一的。 然而,它在超过40亿时将溢出,
<small>OID</small>此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。
</p>
<p>
在用户的数据表中,最好是使用<small>SERIAl</small>来代替<small>OID</small>
因为<small>SERIAL</small>只要保证在单个表中的数值是唯一的就可以了,这样它溢出的可能性就非常小了,
<small>SERIAL8</small>可用来保存8字节的序列数值。
</p>
<p>
<small>CTID</small> 用于标识带着数据块(地址)和(块内)偏移的特定的物理行。
<small>CTID</small> 在记录被更改或重载后发生改变。索引数据使用它们指向物理行。
</p>
<h3> <a name="4.13"></a>4.13) 为什么我收到错误信息“<i>ERROR: Memory exhausted in AllocSetAlloc()</i>”? </h3>
<p>
这很可能是系统的虚拟内存用光了,或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令:
</p>
<pre>
ulimit -d 262144
limit datasize 256m
</pre>
<p>
取决于你用的 shell,上面命令只有一条能成功,但是它将把你的进程数据段限制设得比较高,
因而也许能让查询完成。这条命令应用于当前进程,以及所有在这条命令运行后创建的子进程。
如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题,请在运行客户端之前执行上述命令。
</p>
<h3> <a name="4.14"></a>4.14) 我如何才能知道所运行的PostgreSQL的版本? </h3>
<p>
从 psql 里,输入 <code>SELECT version();</code>指令。
</p>
<h3> <a name="4.15"></a>4.15) 我如何创建一个缺省值是当前时间的字段? </h3>
<p>
使用 CURRENT_TIMESTAMP:
</p>
<pre>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</pre>
<h3> <a name="4.16"></a>4.16) 我怎样进行 outer join (外连接)? </h3>
<p>PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子:</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre>
<p>或是</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</pre>
<p>
这两个等价的查询在 t1.col 和 t2.col 上做连接,并且返回 t1 中所有未连接的行(那些在 t2 中没有匹配的行)。
右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。
完全外连接(FULL OUTER JOIN)将返回 t1 和 t2 中未连接的行。
关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的,普通连接被称为内连接(INNER JOIN)。
</p>
<h3> <a name="4.17"></a>4.17) 如何使用涉及多个数据库的查询? </h3>
<p>
没有办法查询当前数据库之外的数据库。
因为PostgreSQL要加载与数据库相关的系统目录(系统表),因此跨数据库的查询如何执行是不定的。
</p>
<p>
附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。
</p>
<h3> <a name="4.18"></a>4.18) 如何让函数返回多行或多列数据? </h3>
<p>
在函数中返回数据记录集的功能是很容易使用的,详情参见:
<a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</a>
</p>
<h3> <a name="4.19"></a>4.19) 为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”? </h3>
<p>
PL/PgSQL会缓存函数的脚本内容,由此带来的一个不好的副作用是若一个 PL/PgSQL
函数访问了一个临时表,然后该表被删除并重建了,则再次调用该函数将失败,
因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用<small>EXECUTE</small>
对临时表进行访问。这样会保证查询在执行前总会被重新解析。
</p>
<h3> <a name="4.20"></a>4.20) 目前有哪些数据复制方案可用? </h3>
<p>
“复制”只是一个术语,有好几种复制技术可用,每种都有优点和缺点:
</p>
<p>
主/从复制方式是允许一个主服务器接受读/写的申请,而多个从服务器只能接受读/<small>SELECT</small>查询的申请,
目前最流行且免费的主/从PostgreSQL复制方案是
<a href="http://gborg.postgresql.org/project/slony1/projdisplay.php">Slony-I </a>
</p>
<p>
多个主服务器的复制方式允许将读/写的申请发送给多台的计算机,这种方式由于需要在多台服务器之间同步数据变动
可能会带来较严重的性能损失,<a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a>是目前这种方案
中最好的,而且还可以免费下载。
</p>
<p>
也有一些商业需付费和基于硬件的数据复制方案,支持上述各种复制模型。
</p>
<h3> <a name="4.21">4.21</a>) 为何查询结果显示的表名或列名与我的查询语句中的不同?为何大写状态不能保留? </h3>
<p>
最常见的原因是在创建表时对表名或是列名使用了双引号“”,当使用了双引号后,表名或列名(称为标识符)存储时是区分
<a href="http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">大小写的</a>
这意谓着你在查询时表名或列名也应使用双引号,一些工具软件,像pgAdmin会在发出创建表的指令时自动地在每个标识符上加双引号。
因此,为了标识符的统一,你应该:
</p>
<ul>
<li>在创建表时避免将标识符使用双引号引起来。</li>
<li>在标识符中只使用小写字母。</li>
<li>(为了与已存在的标识符相同)在查询中使用双引号将标识符引起来。</li>
</ul>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>PostgreSQL 常见问题(FAQ)</title>
</head>
<body>
<h1> PostgreSQL 常見問題(FAQ) </h1>
<p> 最近更新:2007 年 2 月 8 日 星期二 22:43:13 EST <br/>
中文版最近更新:2007 年 2 月 12 日 星期一 12:00:04 CST
</p>
<p> 當前維護人員:Bruce Momjian (<a href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)<br/>
正體中文版維護人員:郭朝益(ChaoYi, Kuo)(<a href="mailto:kuo.chaoyi@gmail.com">kuo.chaoyi@gmail.com</a></p>
<p>
本文檔的最新版本可以在
<a href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</a> 查看。
</p>
<p>
與作業系統平台相關的問題可在 <a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a> 裡找到答案。<br/>
</p>
<hr/>
<h2><a name="常見問題"> 常見問題 </a></h2>
<p>
<a href="#1.1">1.1</a>)PostgreSQL 是什麼?該怎麼發音?<br/>
<a href="#1.2">1.2</a>)誰控制和管理PostgreSQL ?<br/>
<a href="#1.3">1.3</a>)PostgreSQL的版權是什麼?<br/>
<a href="#1.4">1.4</a>)PostgreSQL可以運行在哪些作業系統平台上?<br/>
<a href="#1.5">1.5</a>)我從哪裡能得到PostgreSQL?<br/>
<a href="#1.6">1.6</a>)最新版的 PostgreSQL 是什麼?<br/>
<a href="#1.7">1.7</a>)我從哪裡能得到對 PostgreSQL 的支持?<br/>
<a href="#1.8">1.8</a>)我如何提交一個 BUG 報告?<br/>
<a href="#1.9">1.9</a>)我如何瞭解已知的 BUG 或暫缺的功能?<br/>
<a href="#1.10">1.10</a>)能夠獲取的最新文檔有哪些?<br/>
<a href="#1.11">1.11</a>)我應該怎樣學習 SQL ?<br/>
<a href="#1.12">1.12</a>)如何提交補丁或是加入開發隊伍?<br/>
<a href="#1.13">1.13</a>)PostgreSQL 和其他資料庫系統比起來如何?<br/>
<a href="#1.14">1.14</a>)PostgreSQL 可以處理最近各個國家夏時制的變化嗎?<br/>
</p>
<h2><a name="用戶客戶端問題"> 用戶客戶端問題 </a></h2>
<p>
<a href="#2.1">2.1</a>)我們可以用什麼語言和 PostgreSQL 進行溝通?<br/>
<a href="#2.2">2.2</a>)有什麼工具可以把 PostgreSQL 用於 Web 頁面?<br/>
<a href="#2.3">2.3</a>)PostgreSQL 擁有圖形用戶界面(GUI)嗎?<br/>
</p>
<h2><a name="系統管理問題"> 系統管理問題 </a></h2>
<p>
<a href="#3.1">3.1</a>)我怎樣才能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方?<br/>
<a href="#3.2">3.2</a>)我如何控制來自其他電腦的連接?<br/>
<a href="#3.3">3.3</a>)我怎樣調整資料庫伺服器以獲得更好的性能?<br/>
<a href="#3.4">3.4</a>)PostgreSQL 裡可以獲得什麼樣的調試特性?<br/>
<a href="#3.5">3.5</a>)為什麼在試圖連接登錄時收到「Sorry, too many clients」 訊息?<br/>
<a href="#3.6">3.6</a>)PostgreSQL 的升級過程有哪些內容?<br/>
<a href="#3.7">3.7</a>)(使用 PostgreSQL )我需要使用什麼電腦硬體?<br/>
</p>
<h2><a name="操作問題"> 操作問題 </a></h2>
<p>
<a href="#4.1">4.1</a>) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行?<br/>
<a href="#4.2">4.2</a>) 如何查看表、索引、資料庫以及用戶的定義?如何查看<i> psql</i> 裡用到的查詢指令並顯示它們?<br/>
<a href="#4.3">4.3</a>) 如何更改一個欄位的資料類型?<br/>
<a href="#4.4">4.4</a>) 單筆記錄,單一表,一個資料庫的最大限制是多少?<br/>
<a href="#4.5">4.5</a>) 存儲一個典型的文本文件裡的資料需要多少磁碟空間?<br/>
<a href="#4.6">4.6</a>) 為什麼我的查詢很慢?為什麼這些查詢沒有利用索引?<br/>
<a href="#4.7">4.7</a>) 我如何才能看到查詢優化器是怎樣評估處理我的查詢的?<br/>
<a href="#4.8">4.8</a>) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找?<br/>
<a href="#4.9">4.9</a>) 在一個查詢裡,我怎樣檢測一個欄位是否為 NULL?我如何才能準確排序而不論某欄位是否含NULL值?<br/>
<a href="#4.10">4.10</a>) 各種字符類型之間有什麼不同?<br/>
<a href="#4.11.1">4.11.1</a>) 我怎樣創建一個序列號型或是自動遞增的欄位?<br/>
<a href="#4.11.2">4.11.2</a>) 我如何獲得一個插入的序列號的值?<br/>
<a href="#4.11.3">4.11.3</a>) 同時使用 currval() 會導致和其他用戶的衝突情況嗎?<br/>
<a href="#4.11.4">4.11.4</a>) 為什麼不在事務異常中止後重用序列號呢?為什麼在序列號欄位的取值中存在間斷呢?<br/>
<a href="#4.12">4.12</a>) 什麼是 OID?什麼是 CTID ?<br/>
<a href="#4.13">4.13</a>) 為什麼我收到錯誤資訊「<i>ERROR: Memory exhausted in AllocSetAlloc()</i>」?<br/>
<a href="#4.14">4.14</a>) 我如何才能知道所運行的 PostgreSQL 的版本?<br/>
<a href="#4.15">4.15</a>) 我如何創建一個預設值是當前時間的欄位?<br/>
<a href="#4.16">4.16</a>) 如何執行外連接(outer join)查詢?<br/>
<a href="#4.17">4.17</a>) 如何執行涉及多個資料庫的查詢?<br/>
<a href="#4.18">4.18</a>) 如何讓函數返回多行或多列資料?<br/>
<a href="#4.19">4.19</a>) 為什麼我在使用 PL/PgSQL 函數存取臨時表時會收到錯誤資訊「relation with OID ##### does not exist」?<br/>
<a href="#4.20">4.20</a>) 目前有哪些資料複寫(replication)方案可用?<br/>
<a href="#4.21">4.21</a>) 為何查詢結果顯示的表名或欄名與我的查詢語句中的不同?為何大寫狀態不能保留?<br/>
</p>
<hr/>
<h2><a name="常見問題"> 常見問題 </a></h2>
<h3><a name="常見問題"> </a><a name="1.1">1.1) PostgreSQL 是什麼?該怎麼發音? </a></h3>
<p><a name="1.1">PostgreSQL 讀作 <i>Post-Gres-Q-L</i>,有時候也簡稱為<i>Postgres</i> 。想聽一下其發音的人員可從這裡下載聲音文件:
</a><a href="http://www.postgresql.org/files/postgresql.mp3">MP3 格式</a>
</p>
<p>PostgreSQL 是面向目標的關係資料庫系統,它具有傳統商業資料庫系統的所有功能,同時又含有將在下一代 DBMS 系統的使用的增強特性。PostgreSQL 是自由免費的,並且所有源代碼都可以獲得。
</p>
<p>PostgreSQL 的開發隊伍主要為志願者,他們遍佈世界各地並通過互聯網進行聯繫,這是一個社區開發項目,它不被任何公司控制。
如想加入開發隊伍,請參見開發人員常見問題(FAQ)
<a href="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="1.2">1.2) 誰控制 PostgreSQL ? </a></h3>
<p>
<a name="1.2"> 如果你在尋找PostgreSQL的掌門人,或是什麼中央委員會,或是什麼所屬公司,你只能放棄了---因為一個也不存在,但我們的確有一個
核心委員會和CVS管理組,但這些工作組的設立主要是為了進行管理工作而不是對PostgreSQL進行獨佔式控制,PostgreSQL項目是由任何人均
可參加的開發人員社區和所有用戶控制的,你所需要做的就是訂閱郵件列表,參與討論即可(要參與PostgreSQL的開發詳見
</a><a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html"> 開發人員常問題 (Developer's FAQ) </a>獲取資訊)。
</p>
<h3> <a name="1.3">1.3) PostgreSQL 的版權是什麼? </a></h3>
<p><a name="1.3">PostgreSQL的發布遵從經典的 BSD 版權。它允許用戶不限目的地使用 PostgreSQL,甚至你可以銷售
PostgreSQL 而不含源代碼也可以,唯一的限制就是你不能因軟體自身問題而向我們追訴法律責任,另外就是要求所有的軟體拷貝中須包括以下版權聲明。
下面就是我們所使用的BSD版權聲明內容:</a></p>
<p><a name="1.3">PostgreSQL 資料庫管理系統</a></p>
<p><a name="1.3"> 部分版權(c)1996-2005,PostgreSQL 全球開發小組,部分版權(c)1994-1996 加州大學董事</a></p>
<p><a name="1.3"> (Portions copyright (c) 1996-2005,PostgreSQL Global
Development Group Portions Copyright (c) 1994-6 Regents of the
University of California)</a></p>
<p>
<a name="1.3"> 允許為任何目的使用,拷貝,修改和分發這個軟體和它的文檔而不收取任何費用,
並且無須簽署因此而產生的證明,前提是上面的版權聲明和本段以及下面兩段文字出現在所有拷貝中。
</a></p>
<p>
<a name="1.3"> (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.)
</a></p>
<p>
<a name="1.3"> 在任何情況下,加州大學都不承擔因使用此軟體及其文檔而導致的對任何當事人的直接的,
間接的,特殊的,附加的或者相伴而生的損壞,包括利益損失的責任,即使加州大學已經建議了這些損失的可能性時也是如此。
</a></p>
<p>
<a name="1.3"> (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.)
</a></p>
<p>
<a name="1.3"> 加州大學明確放棄任何保證,包括但不局限於某一特定用途的商業和利益的隱含保證。
這裡提供的這份軟體是基於「當作是」的基礎的,因而加州大學沒有責任提供維護,支持,更新,增強或者修改的服務。
</a></p>
<p>
<a name="1.3"> (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.)<br/>
</a></p>
<h3><a name="1.3"> </a><a name="1.4">1.4) PostgreSQL 可以運行在哪些作業系統平台上? </a></h3>
<p><a name="1.4"> 一般說來,任何現在對 UNIX 相容的作業系統之上都能運行 PostgreSQL 。在安裝指南裡列出了發佈時經過明確測試的平台。</a></p>
<p><a name="1.4">PostgreSQL 也可以直接運行在基於微軟 Windows-NT 的作業系統,如 Win2000 SP4,WinXP 和 Win2003,已製作完成的安裝包可從
</a><a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>下載,基於MSDOS的Windows作業系統
(Win95,Win98,WinMe)需要通過Cygwin模擬環境運行PostgreSQL。
</p>
<p>
同時也有一個為 Novell Netware 6 開發的版本可從 <a href="http://forge.novell.com" target="_top">http://forge.novell.com</a> 獲取,為OS/2(eComStation)開發的版本可從
<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" target="_top">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> <a name="1.5">1.5) 我從哪裡能得到 PostgreSQL? </a></h3>
<p>
<a name="1.5"> 通過瀏覽器可從 </a><a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a> 下載,也可通過FTP,從
<a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a> 站點下載。
</p>
<h3> <a name="1.6">1.6) 最新版的 PostgreSQL 是什麼? </a></h3>
<p><a name="1.6">PostgreSQL 最新的版本是版本 8.2.3 。</a></p>
<p><a name="1.6">我們計劃每年發佈一個主要升級版本,每幾個月發佈一個小版本。</a></p>
<h3><a name="1.6"> </a><a name="1.7">1.7) 我從哪裡能得到對 PostgreSQL 的支持? </a></h3>
<p><a name="1.7">PostgreSQL社區通過郵件列表為其大多數用戶提供幫助,訂閱郵件列表的主站點是 </a><a href="http://www.postgresql.org/community/lists/" target="_top">http://www.postgresql.org/community/lists/</a>,一般情況下,先加入<i>General</i><i>Bug</i>郵件列表是一個較好的開始。
</p>
<p>
主要的IRC頻道是在FreeNode(<i>irc.freenode.net</i>)的<i>#postgresql</i>,為了連上此頻道,可以使用 UNIX 程序 irc,其指令格式:
irc -c '#postgresql' "$USER" irc.freenode.net ,或者使用其他IRC客戶端程序。在此網絡中還存在一個 PostgreSQL 的西班牙頻道(<i>#postgersql-es</i>)和法語頻道
(<i>#postgresql-fr</i>)。同樣地,在 EFNET 上也有一個 PostgreSQL 的交流頻道。
</p>
<p>
可提供商業支持的公司列表可在 <a href="http://techdocs.postgresql.org/companies.php" target="_top">http://techdocs.postgresql.org/companies.php</a> 瀏覽。
</p>
<h3> <a name="1.8">1.8) 我如何提交一個 BUG 報告? </a></h3>
<p>
<a name="1.8"> 可訪問 </a><a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>,填寫 Bug 上報表格即可,同樣也可訪問 ftp 站點 <a href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.PostgreSQL.org/pub/</a> 檢查有無更新的PostgreSQL 版本或補丁。
</p>
<p>
通過使用 Bug 提交表格或是發往 PostgreSQL 郵件列表的 Bug 通常會有以下之一回覆:
</p>
<ul>
<li>所提交內容不是一個 Bug 及其不是 Bug 的原因。</li>
<li>所提交內容是一個已知的 Bug 並且已經加入 TODO 待處理任務列表。</li>
<li>所提交的 Bug 已在當前版本中被修正。</li>
<li>所提交的 Bug 已修正但尚未將補丁加入現在的發布軟體包。</li>
<li>請求提交者提供更詳細的資訊:
<ul>
<li>作業系統</li>
<li>PostgreSQL 版本</li>
<li>可重現 Bug 的測試案例</li>
<li>調試資訊</li>
<li>調試跟蹤輸出</li>
</ul>
</li>
<li>所提交內容是一個新 Bug,將執行以下工作:
<ul>
<li>創建一個新補丁並將其加入下一個主要版本或是小的改進版本中。</li>
<li>此 Bug 暫時不能修正,將被加至 TODO 待處理任務列表。</li>
</ul>
</li>
</ul>
<h3> <a name="1.9">1.9) 我如何瞭解已知的 BUG 或暫缺的功能? </a></h3>
<p><a name="1.9">PostgreSQL 支持一個擴展的 SQL:2003 的子集。參閱我們的</a><a href="http://www.postgresql.org/docs/faqs.TODO.html"> TODO</a> 列表,瞭解已知 Bug 列表、暫缺的功能和將來的開發計劃。
</p>
<p>要求增加新功能的申請通常會收到以下之一的回覆:</p>
<ul>
<li>該功能已加入 TODO 待處理任務列表。</li>
<li>該功能不是必須的,因為:
<ul>
<li>它是現有的且符合 SQL 標準的某功能的重複。</li>
<li>該功能性會大大增加代碼的複雜程序,而帶來的好處是微不足道的。</li>
<li>該功能是不安全或是不可靠的。</li>
</ul>
</li>
<li>該功能將被加入 TODO 待處理任務列表。</li>
</ul>
<p>
PostgreSQL 不使用 Bug 跟蹤系統,因為我們發現在郵件列表中直接回覆以及保證 TODO 任務列表總是處於最新狀態的方式工作效率會更高一些。事實上,Bug不會在我們的軟體中存在很長時間,
對影響很多用戶的Bug也總是很快會被修正。唯一能找到所有改進、提高和修正的地方是 CVS 的日誌資訊,即使是在軟體新版本的發布資訊中也不會列出每一處的軟體更新。
</p>
<h3> <a name="1.10">1.10) 能夠獲取的最新文檔有哪些? </a></h3>
<p><a name="1.10">PostgreSQL 包含大量的文檔,主要有詳細的參考手冊,手冊頁和一些的測試例子。參見 /doc 目錄(譯註:應為 $PGHOME/doc)。
你還可以在線瀏覽 PostgreSQL 的手冊,其網址是:</a><a href="http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</a>
</p>
<p>
有兩本關於PostgreSQL的書在線提供,在
<a href="http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</a>
<a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>
也有大量的 PostgreSQL 書籍可供購買,其中最為流行的一本是由 Korry Douglas 編寫的。在
<a href="http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</a>
上有大量有關 PostgreSQL 書籍的簡介。
<a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a> 上收集了有關 PostgreSQL 的大量技術文章。</p>
<p>
客戶端的命令行程序<i>psql</i>有一些以 \d 開頭的命令,可顯示關於類型,操作符,函數,聚合等資訊,使用 \? 可以顯示所有可用的命令。
</p>
<p>
我們的 web 站點包含更多的文檔。
</p>
<h3> <a name="1.11">1.11) 我應該怎樣學習 SQL ? </a></h3>
<p>
<a name="1.11"> 首先考慮上述提到的與PostgreSQL相關的書籍,另外一本是 <i>Teach Yourself SQL in 21 Days, Second Edition</i>,其詳細介紹的網址是
</a><a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a>
我們的許多用戶喜歡<i>The Practical SQL Handbook</i>, Bowman, Judith S. 編寫,Addison-Wesley公司出版,其他的則喜歡
<i>The Complete Reference SQL</i>, Groff 編寫,McGraw-Hill 公司出版。
</p>
<p>在下列網址上也有很好的教程,他們是</p>
<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> <a name="1.12">1.12)如何提交補丁或是加入開發隊伍? </a></h3>
<p>
<a name="1.12"> 詳見</a><a href="http://www.PostgreSQL.org/docs/awbook.html"> 開發人員常見問題 (Developer's FAQ) </a></p>
<h3> <a name="1.13">1.13) PostgreSQL 和其他資料庫系統比起來如何? </a></h3>
<p>
<a name="1.13">評價軟體有好幾種方法:功能,性能,可靠性,支持和價格。
</a></p>
<dl>
<a name="1.13"> <dt><b>功能</b></dt>
<dd>PostgreSQL 擁有大型商用資料庫最多的功能,例如:事務,子查詢,觸發器,視圖,外鍵參考完整性和複雜的鎖定等。
我們還有一些它們沒有的特性,如用戶定義類型,繼承,規則和多版本並行控制以減少鎖的爭用等。<br/>
</dd>
<dt><b>性能</b></dt>
<dd>PostgreSQL和其他商用和開源的資料庫具有類似的性能。對某些處理它比較快,對其他一些處理它比較慢。
與其他資料庫相比,我們的性能優劣通常在 +/- 10%之間。<br/>
</dd>
<dt><b>可靠性</b></dt>
<dd>
我們都知道資料庫必須是可靠的,否則它就一點用都沒有。我們努力做到發佈經過認真測試的,缺陷最少的穩定代碼。每個版本至少有一個月的 beta
測試時間,並且我們的發布歷史顯示我們可以提供穩定的,牢固的,可用於生產使用的版本。我們相信在這方面我們與其他的資料庫軟體是相當的。<br/>
</dd>
<dt><b>支持</b></dt>
<dd>
我們的郵件列表提供一個非常大的開發人員和用戶的組以幫助解決所碰到的任何問題。我們不能保證總是能解決問題,相比之下,商用資料庫軟體也並不是總能夠提供解決方法。
直接與開發人員,用戶群,手冊和源程序接觸使PostgreSQL的支持比其他資料庫還要好。還有一些商業性的全面技術支持,可以給提供給那些需要的人。(參閱1.7 小節)<br/>
</dd>
<dt><b>價格</b></dt>
<dd>
我們對任何用途都免費,包括商用和非商用目的。
你可以不加限制地向你的產品裡加入我們的代碼,除了那些我們在上面的版權聲明裡聲明的 BSD版權之外的內容。
</dd>
</a></dl>
<h3><a name="1.14">1.14) PostgreSQL 可以處理最近各個國家夏時制的變化嗎?</a></h3>
<a name="1.14">
</a>
<p><a name="1.14">PostgreSQL 8.0之前的版本是使用作業系統中的時區資料庫來處理夏時制的資訊,自 8.0 版及以後的版本 PostgreSQL 會自身含有最新的時區資訊。</a></p>
<hr/>
<h2><a name="用戶客戶端問題"> 用戶客戶端問題 </a></h2>
<h3><a name="用戶客戶端問題"> </a><a name="2.1">2.1) 我們可以用什麼語言和 PostgreSQL 進行溝通? </a></h3>
<p><a name="2.1">PostgreSQL (預設情況)只安裝有 C 和內嵌式 C 的接口,其他的接口都是獨立的項目,能夠分別下載,這些接口項目獨立的好處
是他們可以有各自的發布計劃和各自獨立的開發組。
</a></p>
<p>
<a name="2.1"> 一些編程語言如 PHP 都有訪問 PostgreSQL 的接口,Perl、TCL、Python 以及很多其他語言的接口在
</a><a href="http://gborg.postgresql.org" target="_top">http://gborg.postgresql.org</a> 網站上的<i> Drivers/Interfaces</i> 小節可找到,
並且通過 Internet 很容易搜索到。
</p>
<h3> <a name="2.2">2.2) 有什麼工具可以把 PostgreSQL 用於 Web 頁面? </a></h3>
<p>
<a name="2.2"> 一個介紹以資料庫為後台的挺不錯的站點是:</a><a href="http://www.webreview.com">http://www.webreview.com</a>
</p>
<p>
對於 Web 集成,PHP 是一個極好的接口。它在 <a href="http://www.php.net/">http://www.php.net/</a>
</p>
<p>
對於複雜的任務,很多人採用 Perl 接口和 使用 CGI.pm 的 DBD::Pg 或 mod_perl 。
</p>
<h3> <a name="2.3">2.3)PostgreSQL 擁有圖形用戶界面嗎? </a></h3>
<p>
<a name="2.3"> 商業用戶或是開源開發人員能找到很多的有關 PostgreSQL的GUI 圖形工具軟體,在 </a><a href="http://www.postgresql.org/docs/techdocs.54">PostgreSQL社區文檔</a> 有一個詳細的列表。
</p>
<hr/>
<h2><a name="系統管理問題"> 系統管理問題 </a></h2>
<h3><a name="系統管理問題"> </a><a name="3.1">3.1)我怎樣能把 PostgreSQL 裝在 /usr/local/pgsql 以外的地方? </a></h3>
<p>
<a name="3.1"> 在運行 configure 時加上 --prefix 選項。
</a></p>
<h3><a name="3.1"> </a><a name="3.2">3.2) 我如何控制來自其他電腦的連接? </a></h3>
<p>
<a name="3.2"> 預設情況下,PostgreSQL 只允許來自本機且通過 unix 域套接字或 TCP/IP 方式的連接。
你只有在修改了配置文件 <i>postgresql.conf</i> 中的 <i>listen_addresses</i>,且也在配置文件 <i>$PGDATA/pg_hba.conf</i> 中打開了
基於遠程電腦( host-based )的身份認證,並重新啟動 PostgreSQL,否則其他電腦是不能與你的 PostgreSQL 伺服器進行連接的。
</a></p>
<h3><a name="3.2"> </a><a name="3.3">3.3) 我怎樣調整資料庫引擎以獲得更好的性能? </a></h3>
<p>
<a name="3.3"> 有三個主要方面可以提升 PostgreSQL 的潛能。
</a></p>
<dl>
<a name="3.3"> <dt><b>查詢方式的變化</b></dt>
<dd>
這主要涉及修改查詢方式以獲取更好的性能:
<ul>
<li>創建索引,包括表達式和部分索引;</li>
<li>使用 COPY 語句代替多個 Insert 語句;</li>
<li>將多個SQL語句組成一個事務以減少提交事務的開銷;</li>
<li>從一個索引中提取多條記錄時使用 CLUSTER;</li>
<li>從一個查詢結果中取出部分記錄時使用 LIMIT;</li>
<li>使用預編譯式查詢(Prepared Query);</li>
<li>使用 ANALYZE 以保持精確的優化統計;</li>
<li>定期使用 VACUUM 或 <i>pg_autovacuum</i></li>
<li>進行大量資料更改時先刪除索引(然後重建索引)</li>
</ul>
</dd>
<dt><b>伺服器的配置</b></dt>
<dd>
配置文件 <i>postgres.conf</i> 中的很多設置都會影響性能,所有參數的列表可見:
</dd>
</a><a href="http://www.postgresql.org/docs/current/static/runtime.html">管理員指南/資料庫伺服器運行環境/資料庫伺服器運行配置</a>
有關參數的解釋可見:<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html" target="_top">http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>
<dt><b>硬體的選擇</b></dt>
<dd>
電腦硬體對性能的影響可瀏覽
<a href="http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html" target="_top">http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html</a>
<a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a>
</dd>
</dl>
<h3> <a name="3.4">3.4)PostgreSQL 裡可以獲得什麼樣的調試特性? </a></h3>
<p><a name="3.4">PostgreSQL 有很多類似<code> log_* </code>的伺服器配置變量可用於查詢的列印和進程統計,而這些工作對調試和性能測試很有幫助。
</a></p>
<h3><a name="3.4"> </a><a name="3.5">3.5) 為什麼在試圖連接時收到「Sorry, too many clients(已有太多用戶連接)」消息? </a></h3>
<p>
<a name="3.5"> 這表示你已達到預設 100 個並發(同作)後台進程數的限制,你需要通過修改 <i>postgresql.conf</i> 文件中的 <i>max_connections</i> 值來
增加 postmaster 的後台併發處理數,修改後需重新啟動 <i>postmaster</i>
</a></p>
<h3><a name="3.5"> </a><a name="3.6">3.6)PostgreSQL 的升級過程有哪些內容 ? </a></h3>
<p>
<a name="3.6"> PostgreSQL 開發組對每次小版本的升級主要只做了一些 Bug 修正工作,因此從 7.4.8 升級到 7.4.9 不需要 dump 和 restore,僅需要停止資料庫伺服器,安裝更新後的軟體包,然後重啟伺服器即可。
</a></p>
<p>
<a name="3.6">
所有PostgreSQL的用戶應該在最接近(你所使用的主版本)的小改進版本發佈盡快升級。儘管每次升級可能都有一點風險,PostgreSQL的小改
進版僅僅是設計用來修正一些 Bug 的,程式碼改動較少,所以風險還是很小的。PostgreSQL社區認為一般情況下不升級的風險還是多於升級的。
</a></p>
<p>
<a name="3.6"> 主版本的升級(例如從 7.3 到 7.4)通常會修改系統表和資料表的內部格式。
這些改變一般比較複雜,因此我們不維持資料文件的向後兼容性。因此從老版本中進行資料導出(dump)/然後在新版本中進行資料導入(reload)對主版本的升級是必須的。
</a></p>
<h3><a name="3.6"> </a><a name="3.7">3.7)(使用 PostgreSQL )我需要使用什麼電腦硬體 ? </a></h3>
<p>
<a name="3.7"> 由於電腦硬體大多數是相容的,人們總是傾向於相信所有電腦硬體質量也是相同的。事實上不是,
ECC RAM(帶奇偶校驗的記憶體),SCSI (硬碟)和優質的主機板比一些便宜貨要更加可靠且具有更好的性能。 PostgreSQL 幾乎可以運行在任何硬體上,
但如果可靠性和性能對你的系統很重要,你就需要全面的研究一下你的硬體組態了。在我們的郵件列表上也有關於
硬體配置和性價比的討論。
</a></p>
<hr/>
<h2><a name="操作問題"> 操作問題 </a></h2>
<h3><a name="操作問題"> </a><a name="4.1">4.1) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行? </a></h3>
<p>
<a name="4.1"> 如果你只是要提取幾行資料,並且你在執行查詢中知道確切的行數,你可以使用 LIMIT 功能。
如果有一個索引與 <i> ORDER BY</i> 中的條件匹配,PostgreSQL 可能就只處理要求的頭幾條記錄,
(否則將對整個查詢進行處理直到生成需要的行)。如果在執行查詢功能時不知道確切的記錄數,
可使用游標(cursor)和FETCH功能。
</a></p>
<p>
<a name="4.1"> 可使用以下方法提取一行隨機記錄的:
</a></p>
<pre><a name="4.1"> SELECT cols
FROM tab
ORDER BY random()
LIMIT 1 ;
</a></pre>
<h3><a name="4.1"> </a><a name="4.2">4.2) 如何查看表、索引、資料庫以及用戶的定義?如何查看<i>psql</i>裡用到的查詢指令並顯示它們? </a></h3>
<p>
<a name="4.2"><i>psql</i>中使用 \dt 命令來顯示資料表的定義,要瞭解 <i>psql</i> 中的完整命令列表可使用 \? ,另外,你也可以閱讀 <i>psql</i> 的源代碼
文件<i> pgsql/src/bin/psql/describe.c</i>,它包括為生成 <i>psql</i> 反斜槓命令的輸出的所有 SQL 命令。你還可以帶 <i>-E</i> 選項啟動 <i>psql</i>
這樣它將列印出你在 <i>psql</i> 中所給出的命令執行時的內部實際使用的 SQL 查詢語句。PostgreSQL也提供了一個兼容 SQL的 INFORMATION SCHEMA 接口,
你可以從這裡獲取關於資料庫的資訊。
</a></p>
<p>
<a name="4.2"> 在系統中也有一些以 <i>pg_</i> 打頭的系統表也描述了表的定義。
</a></p>
<p>
<a name="4.2"> 使用 <i>psql -l</i> 指令可以列出所有的資料庫。
</a></p>
<p>
<a name="4.2"> 也可以瀏覽一下 <i>pgsql/src/tutorial/syscat.source </i>文件,它列舉了很多可從資料庫系統表中獲取資訊的SELECT語法。
</a></p>
<h3><a name="4.2"> </a><a name="4.3">4.3) 如何更改一個欄位的資料類型? </a></h3>
<p>
<a name="4.3"> 在8.0版本裡更改一個欄位的資料類型很容易,可使用 ALTER TABLE ALTER COLUMN TYPE 。
</a></p>
<p>
<a name="4.3"> 在以前的版本中,可以這樣做:
</a></p>
<pre><a name="4.3"> 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;
</a></pre>
<p>
<a name="4.3"> 你然後可以使用<i> VACUUM FULL tab </i>指令來使系統收回無效資料所佔用的空間。
</a></p>
<h3><a name="4.3"> </a><a name="4.4">4.4) 單條記錄,單個表,單個資料庫的最大限制是多少? </a></h3>
<p>
<a name="4.4"> 下面是一些限制:
</a></p>
<blockquote>
<a name="4.4"> </a><table>
<tbody>
<tr><td>單個資料庫最大尺寸?</td><td>無限制(已存在有 32TB 的資料庫)</td></tr>
<tr><td>單個表的最大尺寸?</td><td>32 TB</td></tr>
<tr><td>一行記錄的最大尺寸?</td><td>1.6 TB</td></tr>
<tr><td>一個欄位的最大尺寸?</td><td>1 GB</td></tr>
<tr>
<td>一個表裡最大列數?</td>
<td>無限制</td></tr>
<tr>
<td>一個表裡最大欄位數?</td>
<td>250-1600 (與列類型有關)</td></tr>
<tr><td>一個表裡的最大索引數量?</td><td>無限制</td></tr>
</tbody>
</table>
</blockquote>
<p>
<a name="4.4"> 當然,實際上沒有真正的無限制,還是要受可用磁盤空間、可用記憶體/交換區的制約。
事實上,當上述這些數值變得異常地大時,系統性能也會受很大影響。
</a></p>
<p>
<a name="4.4"> 單表的最大大小 32 TB 不需要作業系統對單個文件也需這麼大的支持。大表用多個 1 GB 的文件存儲,因此文件系統大小的限制是不重要的。
</a></p>
<p>
<a name="4.4"> 如果預設的塊大小增長到 32K ,最大的單表大小和最大列數還可以增加到四倍。
</a></p>
<p>
<a name="4.4"> 有一個限制就是不能對大小多於2000字節的列創建索引。幸運地是這樣的索引很少用到。通過對多字節列的內容進行MD5哈稀運算結果進行函數索引可對列的唯一性得到保證,
並且全文檢索允許對列中的單詞進行搜索。
</a></p>
<h3><a name="4.4"> </a><a name="4.5">4.5) 存儲一個典型的文本文件裡的資料需要多少磁盤空間? </a></h3>
<p>
<a name="4.5"> 一個 Postgres 資料庫(存儲一個文本文件)所佔用的空間最多可能需要相當於這個文本文件自身大小5倍的磁盤空間。
</a></p>
<p>
<a name="4.5"> 例如,假設有一個 100,000 行的文件,每行有一個整數和一個文本描述。
假設文本串的平均長度為20位元組(Byte)。文本文件佔用 2.8 MB。存放這些資料的PostgreSQL資料庫文件大約是 5.2 MB:
</a></p>
<pre><a name="4.5"> 24 字元組: 每行的頭(大約值)
24 字元組節: 一個整數型欄位和一個文本型欄位
+ 4 字元組節: 頁面內指向元組的指針
----------------------------------------
52 字元組每行
PostgreSQL 資料頁的大小是 8192 位元組 (8 KB),則:
8192 字元組每頁
------------------- = 158 行/資料頁(向下取整)
52 字元組每行
100000 資料行
-------------------- = 633 資料頁(向上取整)
146 行/資料頁
633 資料頁 * 8192 字節/頁 = 5,185,536 字節(5.2 MB)
</a></pre>
<p>
<a name="4.5"> 索引不需要這麼多的額外消耗,但也確實包括被索引的資料,因此它們也可能很大。
</a></p>
<p>
<a name="4.5"> 空值<i> NULL </i>存放在位圖中,因此佔用很少的空間。
</a></p>
<h3><a name="4.5"> </a><a name="4.6">4.6) 為什麼我的查詢很慢?為什麼這些查詢沒有利用索引? </a></h3>
<p>
<a name="4.6"> 並非每個查詢都會自動使用索引。只有在表的大小超過一個最小值,並且查詢只會選中表中較小比例的記錄時才會採用索引。
這是因為索引掃瞄引起的隨即磁盤存取可能比直接地讀取表(順序掃瞄)更慢。
</a></p>
<p>
<a name="4.6"> 為了判斷是否使用索引,PostgreSQL 必須獲得有關表的統計值。這些統計值可以使用 VACUUM ANALYZE,或 ANALYZE 獲得。
使用統計值,優化器知道表中有多少行,就能夠更好地判斷是否利用索引。
統計值對確定優化的連接順序和連接方法也很有用。在表的內容發生變化時,應定期進行統計值的更新收集。
</a></p>
<p>
<a name="4.6"> 索引通常不用於 ORDER BY 或執行連接。對一個大表的一次順序掃瞄再做一次排序通常比索引掃瞄要快。然而,如果將 LIMIT 和 ORDER BY
結合在一起使用的話,通常將會使用索引,因為這時僅返回表中的一小部分記錄。
</a></p>
<p>
<a name="4.6"> 如果你確信PostgreSQL的優化器使用順序掃瞄是不正確的,你可以使用<code>SET enable_seqscan TO 'off'</code>指令來關閉順序掃瞄,
然後再次運行查詢,你就可以看出使用一個索引掃瞄是否確實要快一些。
</a></p>
<p>
<a name="4.6"> 當使用通配符操作,例如 <i>LIKE</i><i>~</i> 時,索引只能在特定的情況下使用:
</a></p>
<ul>
<a name="4.6"> </a><li><a name="4.6">字符串的開始部分必須是普通字符串,也就是說:
</a><ul>
<a name="4.6"> </a><li><a name="4.6"> <i>LIKE</i> 模式不能以 <i>%</i> 打頭。</a></li>
<a name="4.6"> </a><li><a name="4.6"> <i>~</i> (正則表達式)模式必須以 <i>^</i> 打頭。</a></li>
<a name="4.6"> </a></ul>
<a name="4.6"> </a></li>
<a name="4.6"> </a><li><a name="4.6">字符串不能以匹配多個字符的模式類打頭,例如 [a-e]。</a></li>
<a name="4.6"> </a><li><a name="4.6">大小寫無關的查找,如 ILIKE 和 ~* 等不使用索引,但可以用 </a><a href="#4.8">4.8</a> 節描述的表達式索引。</li>
<li>在做 initdb 時必須採用預設的本地設置 C locale,因為系統不可能知道在非 C locale 情況時下一個最大字符是什麼。
在這種情況下,你可以創建一個特殊的 <code>text_pattern_ops</code> 索引來用於 <small>LIKE</small> 的索引。
</li>
</ul>
<p>
在 8.0 之前的版本中,除非要查詢的資料類型和索引的資料類型相匹配,否則索引經常是未被用到,特別是對 int2, int8 和數值型的索引。
</p>
<h3> <a name="4.7">4.7) 我如何才能看到查詢優化器是怎樣評估處理我的查詢? </a></h3>
<p><a name="4.7">參考 <small>EXPLAIN</small> 手冊頁。</a></p>
<h3><a name="4.7"> </a><a name="4.8">4.8) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找? </a></h3>
<p>
<a name="4.8"> 操作符 <i> ~ </i> 處理正則表達式匹配,而 <i>~*</i> 處理大小寫無關的正則表達式匹配。大小寫無關的 LIKE 變種成為 ILIKE。
</a></p>
<p>
<a name="4.8"> 大小寫無關的等式比較通常寫做:
</a></p>
<pre><a name="4.8"> SELECT *
FROM tab
WHERE lower(col) = 'abc';
</a></pre>
<p>
<a name="4.8"> 這樣將不會使用標準的索引。但是可以創建一個在這種情況下使用的表達式索引:
</a></p>
<pre><a name="4.8"> CREATE INDEX tabindex ON tab (lower(col));
</a></pre>
<p>
<a name="4.8"> 如果上述索引在創建時加入 UNIQUE 約束,雖然索引欄位自身內容可以存儲大小寫不限的內容,但如果有 UNIQUE 約束後,這些內容不能僅僅是大小寫不同(否則會造成衝突)。為了保證不發生這種情況,可以使用 CHECK 約束條件或是觸發器在錄入時進行限制。
</a></p>
<h3><a name="4.8"> </a><a name="4.9">4.9) 在一個查詢裡,我怎樣檢測一個欄位是否為 <i>NULL</i> ?我如何才能準確排序而不論某欄位是否含 <i>NULL</i> 值? </a></h3>
<p>
<a name="4.9"><small>IS NULL</small><small>IS NOT NULL</small> 測試這個欄位,具體方法如下:
</a></p>
<pre><a name="4.9"> SELECT *
FROM tab
WHERE col IS NULL;
</a></pre>
<p><a name="4.9">為了能對含 <small>NULL </small>欄位排序,可在 <small>ORDER BY</small> 條件中使用 <small>IS NULL</small>
<small>IS NOT NULL</small> 修飾符,條件為真 <i>true</i> 將比條件為假 <i>false</i> 排在前面,下面的例子就會將含
NULL 的記錄排在結果的上面部分:
</a></p>
<pre><a name="4.9"> SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
</a></pre>
<h3><a name="4.9"> </a><a name="4.10">4.10) 各種字符類型之間有什麼不同? </a></h3>
<blockquote>
<a name="4.10"> </a><table width="614">
<tbody>
<tr><th width="104">類型</th>
<th width="77">內部名稱</th>
<th width="417">說明</th>
</tr>
<tr><td>VARCHAR(n)</td><td>varchar</td><td>指定了最大長度,變長字符串,不足定義長度的部分不補齊</td></tr>
<tr><td>CHAR(n)</td><td>bpchar</td><td>定長字符串,實際資料不足定義長度時,以空格補齊</td></tr>
<tr><td>TEXT</td><td>text</td><td>沒有特別的上限限制(僅受行的最大長度限制)</td></tr>
<tr><td>BYTEA</td><td>bytea</td><td>變長字節序列(使用NULL字符也是允許的)</td></tr>
<tr><td>"char"</td><td>char</td><td>單個字符</td></tr>
</tbody>
</table>
</blockquote>
<p>
<a name="4.10"> 在系統表和在一些錯誤資訊裡你將看到內部名稱。
</a></p>
<p>
<a name="4.10"> 上面所列的前四種類型是 "varlena"(變長)類型(也就是說,開頭的四個字節是長度,後面才是資料)。
於是實際佔用的空間比聲明的大小要多一些。
然而這些類型如定義很長時都可以被壓縮存儲,因此磁盤空間也可能比預想的要少。
</a></p>
<p>
<a name="4.10"> <small>VARCHAR(n)</small> 在存儲限制了最大長度的變長字符串是最好的。
<small>TEXT</small> 適用於存儲最大可達 1G 左右但未定義限制長度的字符串。
</a></p>
<p>
<a name="4.10"> <small>CHAR(n)</small> 最適合於存儲長度相同的字符串。 <small>CHAR(n)</small>會根據所給定的欄位長度以空格補足(不足的欄位內容),
<small>VARCHAR(n)</small> 只存儲所給定的資料內容。
<small>BYTEA</small> 用於存儲二進制資料,尤其是包含 NULL 字節的值。這些類型具有差不多的性能。
</a></p>
<h3><a name="4.10"> </a><a name="4.11.1">4.11.1) 我怎樣創建一個序列號或是自動遞增的欄位? </a></h3>
<p><a name="4.11.1">PostgreSQL 支持 SERIAL 資料類型。(欄位定義為SERIAL後)將自動創建一個序列生成器,例如:
</a></p>
<pre><a name="4.11.1"> CREATE TABLE person (
id SERIAL,
name TEXT
);
</a></pre>
<p>
<a name="4.11.1"> 會自動轉換為以下SQL語句:
</a></p>
<pre><a name="4.11.1"> CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</a></pre>
<p>
<a name="4.11.1"> 參考 create_sequence 手冊頁獲取關於序列生成器的更多資訊。
</a></p>
<h3><a name="4.11.1"> </a><a name="4.11.2">4.11.2) 我如何獲得一個插入的序列號的值? </a></h3>
<p>
<a name="4.11.2"> 一種方法是在插入之前先用函數 nextval() 從序列對象裡檢索出下一個 SERIAL 值,然後再用此值精確地插入。使用
</a><a href="#4.11.1"> 4.11.1</a> 裡的例表,可用偽碼這樣描述:
</p>
<pre> new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</pre>
<p>
這樣還能在其他查詢中使用存放在 new_id 裡的新值(例如,作為參照 person 表的外鍵)。
注意自動創建的 SEQUENCE 對象的名稱將會是 &lt;<i>table</i>&gt;_&lt;<i>serialcolumn</i>&gt;_<i>seq</i>
這裡 table 和 serialcolumn 分別是你的表的名稱和你的 SERIAL 欄位的名稱。
</p>
<p>
類似的,在 SERIAL 對象預設插入後你可以用函數 currval() 檢索剛賦值的 SERIAL 值,例如:
</p>
<pre> execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
</pre>
<h3> <a name="4.11.3">4.11.3) 同時使用 <i>currval()</i> 會導致和其他用戶的衝突情況嗎? </a></h3>
<p>
<a name="4.11.3"> 不會。<i>currval()</i> 返回的是你本次會話進程所賦的值而不是所有用戶的當前值。<br/>
</a></p>
<h3><a name="4.11.3"> </a><a name="4.11.4">4.11.4) 為什麼不在事務異常中止後重用序列號呢?為什麼在序列號欄位的取值中存在間斷呢? </a></h3>
<p>
<a name="4.11.4"> 為了提高併發性,序列號在需要的時候賦予正在運行的事務,並且在事務結束之前不進行鎖定,
這就會導致異常中止的事務後,序列號會出現間隔。
</a></p>
<h3><a name="4.11.4"> </a><a name="4.12">4.12) 什麼是 <small>OID</small> ?什麼是 <small>CTID</small></a></h3>
<p><a name="4.12">PostgreSQL 裡創建的每一行記錄都會獲得一個唯一的 <small>OID</small>,除非在創建表時使用 <small>WITHOUT OIDS</small> 選項。
<small>OID </small>創建時會自動生成一個 4位元組的整數,所有 OID 在相應 PostgreSQL 伺服器中均是唯一的。 然而,它在超過 40億時將溢出,
<small>OID</small> 此後會出現重複。PostgreSQL 在它的內部系統表裡使用 OID 在表之間建立聯繫。
</a></p>
<p><a name="4.12">
在用戶的資料表中,最好是使用 <small>SERIAl</small> 來代替 <small>OID</small>
因為<small> SERIAL</small> 只要保證在單個表中的數值是唯一的就可以了,這樣它溢出的可能性就非常小了,
<small>SERIAL8</small> 可用來保存8字元組的序列數值。
</a></p>
<p>
<a name="4.12"> <small>CTID</small> 用於標識帶著資料塊(地址)和(塊內)偏移的特定的物理行。
<small>CTID</small> 在記錄被更改或重載後發生改變。索引資料使用它們指向物理行。
</a></p>
<h3><a name="4.12"> </a><a name="4.13">4.13) 為什麼我收到錯誤資訊「<i>ERROR: Memory exhausted in AllocSetAlloc()</i>」? </a></h3>
<p>
<a name="4.13"> 這很可能是系統的虛擬內存用光了,或者內核對某些資源有較低的限制值。在啟動 postmaster 之前試試下面的命令:
</a></p>
<pre><a name="4.13"> ulimit -d 262144
limit datasize 256m
</a></pre>
<p>
<a name="4.13"> 取決於你用的 shell,上面命令只有一條能成功,但是它將把你的進程資料段限制設得比較高,
因而也許能讓查詢完成。這條命令應用於當前進程,以及所有在這條命令運行後創建的子進程。
如果你是在運行SQL客戶端時因為後台返回了太多的資料而出現問題,請在運行客戶端之前執行上述命令。
</a></p>
<h3><a name="4.13"> </a><a name="4.14">4.14) 我如何才能知道所運行的PostgreSQL的版本? </a></h3>
<p>
<a name="4.14"> 從 psql 裡,輸入 <code>SELECT version();</code>指令。
</a></p>
<h3><a name="4.14"> </a><a name="4.15">4.15) 我如何創建一個預設值是當前時間的欄位? </a></h3>
<p>
<a name="4.15"> 使用 CURRENT_TIMESTAMP:
</a></p>
<pre><a name="4.15"> CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</a></pre>
<h3><a name="4.15"> </a><a name="4.16">4.16) 我怎樣進行 outer join (外連接)? </a></h3>
<p><a name="4.16">PostgreSQL 採用標準的 SQL 語法支持外連接。這裡是兩個例子:</a></p>
<pre><a name="4.16"> SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</a></pre>
<p><a name="4.16">或是</a></p>
<pre><a name="4.16"> SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</a></pre>
<p>
<a name="4.16"> 這兩個等價的查詢在 t1.col 和 t2.col 上做連接,並且返回 t1 中所有未連接的行(那些在 t2 中沒有匹配的行)。
右[外]連接(RIGHT OUTER JOIN)將返回 t2 中未連接的行。
完全外連接(FULL OUTER JOIN)將返回 t1 和 t2 中未連接的行。
關鍵字 OUTER 在左[外]連接、右[外]連接和完全[外]連接中是可選的,普通連接被稱為內連接(INNER JOIN)。
</a></p>
<h3><a name="4.16"> </a><a name="4.17">4.17) 如何使用涉及多個資料庫的查詢? </a></h3>
<p>
<a name="4.17"> 沒有辦法查詢當前資料庫之外的資料庫。
因為PostgreSQL要加載與資料庫相關的系統目錄(系統表),因此跨資料庫的查詢如何執行是不定的。
</a></p>
<p>
<a name="4.17"> 附加增值模塊 contrib/dblink 允許採用函數調用實現跨庫查詢。當然用戶也可以同時連接到不同的資料庫執行查詢然後在客戶端合併結果。
</a></p>
<h3><a name="4.17"> </a><a name="4.18">4.18) 如何讓函數返回多行或多列資料? </a></h3>
<p>
<a name="4.18"> 在函數中返回資料記錄集的功能是很容易使用的,詳情參見:
</a><a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</a>
</p>
<h3> <a name="4.19">4.19) 為什麼我在使用 PL/PgSQL 函數存取臨時表時會收到錯誤資訊「relation with OID ##### does not exist」? </a></h3>
<p>
<a name="4.19"> PL/PgSQL 會緩存函數的腳本內容,由此帶來的一個不好的副作用是若一個 PL/PgSQL
函數訪問了一個臨時表,然後該表被刪除並重建了,則再次調用該函數將失敗,
因為緩存的函數內容仍然指向舊的臨時表。解決的方法是在 PL/PgSQL 中用<small>EXECUTE</small>
對臨時表進行訪問。這樣會保證查詢在執行前總會被重新解析。
</a></p>
<h3><a name="4.19"> </a><a name="4.20">4.20) 目前有哪些資料複寫(replication)方案可用? </a></h3>
<p>
<a name="4.20"> 「複寫」只是一個術語,有好幾種複寫技術可用,每種都有優點和缺點:
</a></p>
<p>
<a name="4.20"> 主/從式複寫方式是允許一個主伺服器接受讀/寫的申請,而多個從伺服器只能接受讀/<small>SELECT</small>查詢的申請,
目前最流行且免費的主/從PostgreSQL複寫方案是
</a><a href="http://gborg.postgresql.org/project/slony1/projdisplay.php">Slony-I </a>
</p>
<p>
多個主伺服器的複寫方式允許將讀/寫的申請發送給多台的主機,這種方式由於需要在多台伺服器之間同步資料變動
可能會帶來較嚴重的性能損失,<a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a> 是目前這種方案中最好的,並且還可以免費下載。
</p>
<p>
也有一些商業需付費和基於硬體的資料複寫方案,支持上述各種複寫模型。
</p>
<h3> <a name="4.21">4.21</a>) 為何查詢結果顯示的表名或欄名與我的查詢語句中的不同?為何大寫狀態不能保留? </h3>
<p>
最常見的原因是在創建表時對表名或是欄名使用了雙引號( ' ' ),當使用了雙引號後,表名或欄名(稱為標識符)存儲時是區分
<a href="http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">大小寫的</a>
這意謂著你在查詢時表名或欄名也應使用雙引號,一些工具軟體,像 pgAdmin 會在發出創建表的指令時自動地在每個標識符上加雙引號。
因此,為了標識符的統一,你應該:</p>
<ul>
<li>在創建表時避免將標識符使用雙引號引起來。</li>
<li>在標識符中只使用小寫字母。</li>
<li>(為了與已存在的標識符相同)在查詢中使用雙引號將標識符引起來。</li>
</ul>
</body>
</html>
\ No newline at end of file
<!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>
This source diff could not be displayed because it is too large. You can view the blob instead.
<!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>PostgreSQL FAQ</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
alink="#0000ff">
<H1>Foire Aux Questions (FAQ) pour PostgreSQL</H1>
<P>Dernière mise à jour&nbsp;: vendredi 14 novembre 2004 16:32:47</P>
<P>Mainteneur actuel&nbsp;: Bruce Momjian (<A href=
"mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
</P>
<P>La plus récente version de ce document est disponible sur <A
href=
"http://www.PostgreSQL.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html</A>.</P>
<P>Les questions spécifiques à la plateforme sont répondues sur <A href=
"http://www.PostgreSQL.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html</A>.</P>
<HR>
<H2 align="center">Questions générales</H2>
<A href="#1.1">1.1</A>) Qu'est ce que PostgreSQL&nbsp;? Comment le prononcer&nbsp;?<BR>
<A href="#1.2">1.2</A>) Quelle est la licence de PostgreSQL&nbsp;?<BR>
<A href="#1.3">1.3</A>) Sous quels environnements Unix PostgreSQL tourne-t-il&nbsp;?<BR>
<A href="#1.4">1.4</A>) Sous quels environnements non-Unix PostgreSQL tourne-t-il&nbsp;?<BR>
<A href="#1.5">1.5</A>) Où puis-je me procurer PostgreSQL&nbsp;?<BR>
<A href="#1.6">1.6</A>) Où puis-je obtenir du support&nbsp;?<BR>
<A href="#1.7">1.7</A>) Quelle est la dernière version&nbsp;?<BR>
<A href="#1.8">1.8</A>) Quelle documentation est disponible&nbsp;?<BR>
<A href="#1.9">1.9</A>) Comment savoir quels sont les bogues connus ou les fonctionnalités manquantes&nbsp;?<BR>
<A href="#1.10">1.10</A>) Comment puis-je apprendre le <SMALL>SQL</SMALL>&nbsp;?<BR>
<A href="#1.11">1.11</A>) PostgreSQL est-il compatible an 2000&nbsp;?<BR>
<A href="#1.12">1.12</A>) Comment puis-je rejoindre l'équipe de développement&nbsp;?<BR>
<A href="#1.13">1.13</A>) Comment dois-je soumettre un rapport de
bogue&nbsp;?<BR>
<A href="#1.14">1.14</A>) Comment PostgreSQL se compare-t'il à d'autres
<SMALL>SGBD</SMALL>&nbsp;?<BR>
<A href="#1.15">1.15</A>) Comment puis-je aider financièrement PostgreSQL&nbsp;?<BR>
<H2 align="center">Questions sur le client utilisateur</H2>
<A href="#2.1">2.1</A>) Y a-t-il des pilotes <SMALL>ODBC</SMALL> pour
PostgreSQL&nbsp;?<BR>
<A href="#2.2">2.2</A>) Quels outils sont disponibles pour utiliser
PostgreSQL avec des pages Web&nbsp;?<BR>
<A href="#2.3">2.3</A>) PostgreSQL a-t-il une interface graphique&nbsp;?<BR>
<A href="#2.4">2.4</A>) Quels langages sont disponibles pour
communiquer avec PostgreSQL&nbsp;?<BR>
<H2 align="center">Questions administratives</H2>
<A href="#3.1">3.1</A>) Comment installer PostgreSQL ailleurs que sous <I>/usr/local/pgsql</I>&nbsp;?<BR>
<A href="#3.2">3.2</A>) Quand je lance <I>postmaster</I>, j'obtiens un <I>Bad System Call</I> ou un message <I>core dumped</I>. Pourquoi&nbsp;?<BR>
<A href="#3.3">3.3</A>) Quand je lance <I>postmaster</I>, j'obtiens des erreurs <I>IpcMemoryCreate</I>. Pourquoi&nbsp;?<BR>
<A href="#3.4">3.4</A>) Quand je lance <I>postmaster</I>, j'obtiens des erreurs <I>IpcSemaphoreCreate</I>. Pourquoi&nbsp;?<BR>
<A href="#3.5">3.5</A>) Comment contrôler les connexions d'autres machines&nbsp;?<BR>
<A href="#3.6">3.6</A>) Comment règler le moteur de la base de données pour de meilleures performances&nbsp;?<BR>
<A href="#3.7">3.7</A>) Quelles fonctionalités de déboguage sont disponibles&nbsp;?<BR>
<A href="#3.8">3.8</A>) Pourquoi est-ce que j'obtiens des messages <I>Sorry, too many clients</I> quand je me connecte&nbsp;?<BR>
<A href="#3.9">3.9</A>) Que contient le répertoire <I>pgsql_tmp</I>&nbsp;?<BR>
<A href="#3.10">3.10</A>) Pourquoi ai-je besoin de faire une sauvegarde des bases et de restaurer pour mettre a jour les versions de PostgreSQL&nbsp;?<BR>
<A href="#3.11">3.11</A>) Quels matériels dois-je utiliser&nbsp;?<BR>
<H2 align="center">Questions fonctionnelles</H2>
<A href="#4.1">4.1</A>) Quelle est la différence entre curseur binaire
et curseur normal&nbsp;?<BR>
<A href="#4.2">4.2</A>) Comment faire un <SMALL>SELECT</SMALL> seulement
sur les premières lignes d'une requête&nbsp;? Sur une ligne aléatoire&nbsp;?<BR>
<A href="#4.3">4.3</A>) Comment obtenir une liste des tables ou
d'autres choses que je vois dans <I>psql</I>&nbsp;?<BR>
<A href="#4.4">4.4</A>) Comment supprime-t-on une colonne d'une table,
ou comment change-t-on son type de données&nbsp;?<BR>
<A href="#4.5">4.5</A>) Quelle est la taille maximale pour une ligne,
une table et une base de données&nbsp;?<BR>
<A href="#4.6">4.6</A>) Combien d'espace disque faut-il pour stocker
les données d'un fichier texte typique&nbsp;?<BR>
<A href="#4.7">4.7</A>) Comment puis-je savoir quels index, tables,
bases de données et utilisateurs sont définis&nbsp;?<BR>
<A href="#4.8">4.8</A>) Mes requêtes sont lentes ou ne font pas usage
des index. Pourquoi&nbsp;?<BR>
<A href="#4.9">4.9</A>) Comment puis-je savoir si l'optimiseur évalue
mes requêtes&nbsp;?<BR>
<A href="#4.10">4.10</A>) Qu'est-ce qu'un index R-tree&nbsp;?<BR>
<A href="#4.11">4.11</A>) Qu'est-ce que l'optimiseur génétique de
requêtes&nbsp;?<BR>
<A href="#4.12">4.12</A>) Comment puis-je réaliser des recherches par des
expressions rationnelles ainsi que des recherches non sensibles à la
casse&nbsp;? Comment puis-je utiliser un index lors de recherches non
sensibles à la casse&nbsp;?<BR>
<A href="#4.13">4.13</A>) Comment puis-je détecter si un champ est
<SMALL>NULL</SMALL> dans une requête&nbsp;?<BR>
<A href="#4.14">4.14</A>) Quelle sont les différences entre les nombreux
types de caractères&nbsp;?<BR>
<A href="#4.15.1">4.15.1</A>) Comment puis-je créer un champ série,
c'est-à-dire s'incrémentant automatiquement&nbsp;?<BR>
<A href="#4.15.2">4.15.2</A>) Comment puis-je obtenir la valeur d'un
<SMALL>SERIAL</SMALL> suite à une insertion&nbsp;?<BR>
<A href="#4.15.3">4.15.3</A>) Est-ce que <I>currval()</I> et
<I>nextval()</I> n'amènent pas des problèmes lorsque plusieurs utilisateurs
les lancent en même temps&nbsp;?<BR>
<A href="#4.15.4">4.15.4</A>) Pourquoi mes numéros de séquences ne sont pas
ré-utilisés lors d'une annulation de transaction&nbsp;? Pourquoi
existe-t'il des trous dans la numérotation de ma colonne séquentielle
(SERIAL)&nbsp;?<BR>
<A href="#4.16">4.16</A>) Qu'est-ce qu'un <SMALL>OID</SMALL>? Qu'est-ce qu'un <SMALL>TID</SMALL>&nbsp;?<BR>
<A href="#4.17">4.17</A>) A quoi correspond certains termes utilisés avec
PostgreSQL&nbsp;?<BR>
<A href="#4.18">4.18</A>) Pourquoi ai-je l'erreur <I>ERROR:
Memory exhausted in AllocSetAlloc()</I>&nbsp;?<BR>
<A href="#4.19">4.19</A>) Comment puis-je connaître la version de
PostgreSQL que j'utilise&nbsp;?<BR>
<A href="#4.20">4.20</A>) Pourquoi ai-je <I>invalid large obj
descriptor</I> lors d'opérations avec des gros objets&nbsp;?<BR>
<A href="#4.21">4.21</A>) Comment puis-je créer une colonne qui aura par
défaut l'heure actuelle comme valeur&nbsp;?<BR>
<A href="#4.22">4.22</A>) Pourquoi mes sous-requêtes utilisant
<CODE><SMALL>IN</SMALL></CODE> sont-elles si lentes&nbsp;?<BR>
<A href="#4.23">4.23</A>) Comment puis-je réaliser une jointure
externe&nbsp;?<BR>
<A href="#4.24">4.24</A>) Comment puis-je lancer des requêtes utilisant
plusieurs bases de données&nbsp;??<BR>
<A href="#4.25">4.25</A>) Comment puis-je renvoyer plusieurs lignes ou
colonnes à partir d'une fonction&nbsp;?<BR>
<A href="#4.26">4.26</A>) Pourquoi ne puis-je pas créer/supprimer des
tables temporaires dans les fonctions PL/PgSQL de façon stable&nbsp;?<BR>
<A href="#4.27">4.27</A>) Quelles options de cryptage sont
disponibles&nbsp;?<BR>
<H2 align="center">Etendre PostgreSQL</H2>
<A href="#5.1">5.1</A>) J'ai écrit une fonction utilisateur. Lorsque je l'exécute avec
<I>psql</I>, pourquoi cela finit-il avec un "dump core"&nbsp;?<BR>
<A href="#5.2">5.2</A>) Comment puis-je contribuer avec de nouveaux types et fonctions
pour PostgreSQL&nbsp;?<BR>
<A href="#5.3">5.3</A>) Comment puis-je écrire une fonction C pour récupérer une
ligne&nbsp;?<BR>
<A href="#5.4">5.4</A>) J'ai modifié un fichier source. Pourquoi la modification
n'est-elle pas visible après la recompilation&nbsp;?<BR>
<HR>
<H2 align="center">Questions générales</H2>
<H4><A name="1.1">1.1</A>) Qu'est ce que PostgreSQL&nbsp;? Comment
le prononcer&nbsp;?</H4>
<P>PostgreSQL se prononce <I>Post-Gres-Q-L</I>. Un fichier audio est
disponible sur <A
href="http://www.postgresql.org/postgresql.mp3">http://www.postgresql.org/postgresql.mp3</A>
pour ceux souhaitant entendre la prononciation.</P>
<P>PostgreSQL est une amélioration du système de gestion de bases
de données POSTGRES (et est toujours quelque fois appelé "Postgres"),
un prototype de recherche de
<SMALL>SGBD</SMALL> de prochaine génération. PostgreSQL garde le
puissant modèle de données et les types de données riches de
POSTGRES, mais remplace le langage de requêtes PostQuel par un
sous-ensemble étendu de <SMALL>SQL</SMALL>. PostgreSQL est gratuit
et les sources complets sont disponibles.</P>
<P> PostgreSQL est écrit par une équipe de développeurs qui sont
tous inscrits à la liste de diffusion de développement de
PostgreSQL. Le coordinateur actuel est Marc G. Fournier (<A href=
"mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A> et voir
la section <a href="#1.6">1.6</a> pour contacter les
développeurs). Cette équipe est responsable de tout le
développement de PostgreSQL. C'est un projet soutenu par une
communauté sans être contrôlé par une société. Pour y contribuer,
voir la FAQ des développeurs sur <A
href="http://www.postgresql.org/docs/faqs/FAQ_DEV.html">http://www.postgresql.org/docs/faqs/FAQ_DEV.html</A>.</P>
<P>Les auteurs de PostgreSQL 1.01 étaient Andrew Yu et Jolly Chen.
Beaucoup d'autres personnes ont contribué au portage, aux tests,
au déboguage et à l'amélioration du code. Le code de Postgres
original, duquel PostgreSQL est dérivé, était le fruit de
l'effort de nombreux étudiants diplômés et non diplômés, et de
programmeurs travaillant sous la direction du Professeur Michael
Stonebraker à l'université de Californie, Berkeley.</P>
<P>Le nom original du logiciel à Berkeley était Postgres. Quand le
<SMALL>SQL</SMALL> fut ajouté en 1995, le nom a dû être changé en
Postgres95. Fin 1996, le nom fut changé en PostgreSQL.</P>
<H4><A name="1.2">1.2</A>) Quelle est la licence de PostgreSQL&nbsp;?</H4>
<P>PostgreSQL est distribué sous la licence suivante&nbsp;:</P>
<P>PostgreSQL Data Base Management System</P>
<P>Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 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>
<P>La licence ci-dessus est la licence BSD, une licence open-source
classique.</P>
<H4><A name="1.3">1.3</A>) Sous quels environnements Unix PostgreSQL tourne-t-il&nbsp;?</H4>
<P>En général, tout environnement compatible Unix moderne devrait
pouvoir faire fonctionner PostgreSQL. Les environnements qui ont été
testés explicitement sont listés dans les instructions
d'installation.</P>
<H4><A name="1.4">1.4</A>) Sous quels environnements non Unix PostgreSQL fonctionne-t'il&nbsp;?</H4>
<p>À partir de la version 8.0, PostgreSQL fonctionne nativement sur les
systèmes d'exploitation Microsoft Windows à base NT comme Win2000, WinXP et Win2003.
Un installeur est disponible sur
<a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>.</p>
<p>Il existe aussi un port sur Novell Netware sur
<a href="http://forge.novell.com">http://forge.novell.com</a>.</p>
<H4><A name="1.5">1.5</A>) Où puis-je me procurer PostgreSQL&nbsp;?</H4>
<P>Le site FTP anonyme principal de PostgreSQL est <A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
Pour les sites miroirs, voir notre site web principal.</P>
<H4><A name="1.6">1.6</A>) Où puis-je obtenir du support&nbsp;?</H4>
<P>La liste de diffusion principale est <A href=
"mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org</A>.
Elle est disponible pour discuter de sujets en rapport avec
PostgreSQL. Pour s'y inscrire, il faut envoyer un courriel avec
les lignes suivantes dans le corps du message (pas dans la ligne
du sujet)&nbsp;:</P>
<PRE>
subscribe
end
</PRE>
<P>à <A href=
"mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</A>.</P>
<P>Il existe aussi un recueil de la liste. Pour s'y inscrire,
envoyez un courriel à <A href=
"mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</A>
avec dans le corps&nbsp;:</P>
<PRE>
subscribe
end
</PRE>
Les recueils sont envoyés aux membres de cette liste dès que la
liste principale a reçu 30&nbsp;Ko de messages.
<P>Une liste de diffusion de bogues est disponible. Pour s'y inscrire,
envoyer un courriel à <A href=
"mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org</A>
avec dans le corps&nbsp;:</P>
<PRE>
subscribe
end
</PRE>
Une liste de diffusion pour les développeurs est aussi disponible. Pour s'y
inscrire, envoyez un courriel à <A href=
"mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org</A>
avec dans le corps&nbsp;:
<PRE>
subscribe
end
</PRE>
<P>Vous pouvez trouver d'autres listes et informations sur
PostgreSQL sur le site web de PostgreSQL&nbsp;:</P>
<BLOCKQUOTE>
<p><A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A></p>
</BLOCKQUOTE>
<P>Il y a aussi un canal IRC sur Freenode et EFNet, le canal
<I>#PostgreSQL</I>. Vous pouvez utiliser la commande Unix
<CODE>irc -c '#PostgreSQL' "$USER" irc.phoenix.net</CODE> ou
<CODE>irc -c '#PostgreSQL' "$USER" irc.freenode.net</CODE>.</P>
<P>Une liste de sociétés pouvant fournir un support commercial
est disponible sur <A href=
"http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</A>.</P>
<H4><A name="1.7">1.7</A>) Quelle est la dernière version&nbsp;?</H4>
<P>La dernière version de PostgreSQL est la version 7.4.5.</P>
<P>Nous projetons de sortir une version majeure tous les six à huit
mois.</P>
<H4><A name="1.8">1.8</A>) Quelle documentation est disponible&nbsp;?</H4>
<P>Plusieurs manuels, pages de manuel ainsi que des petits exemples de
test sont inclus dans la distribution. Voir le répertoire
<I>/doc</I>. Vous pouvez aussi accéder aux manuels en ligne sur <A href=
"http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</A>.</P>
<P>Deux livres sur PostgreSQL sont disponibles en ligne sur <A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
et <A href=
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
Il y a une liste de livres sur PostgreSQL pouvant être achetés sur <A
href=
"http://techdocs.postgresql.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</A>.
Il y a aussi une collection d'articles techniques sur PostgreSQL sur <A
href=
"http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</A>.</P>
<P><I>psql</I> possède des commandes \d pratiques montrant des
informations sur les types, opérateurs, fonctions, aggrégats, etc.</P>
<P>Notre site web contient encore plus de documentations.</P>
<H4><A name="1.9">1.9</A>) Comment savoir quels sont les bogues connus ou les fonctionnalités manquantes&nbsp;?</H4>
<P>PostgreSQL supporte un sous-ensemble étendu de <SMALL>SQL</SMALL>-92.
Voir notre liste <A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
pour les bogues connus, les fonctionnalités manquantes et les
plans pour le futur.</P>
<H4><A name="1.10">1.10</A>) Comment puis-je apprendre le <SMALL>SQL</SMALL>&nbsp;?</H4>
<P>Le livre PostgreSQL sur <A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
enseigne le <SMALL>SQL</SMALL>. Il existe un autre livre PostgreSQL sur <A
href=
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook.</A>
Il existe de bons tutoriels sur <A href=
"http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
<A href=
"http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM</A>
et <A href=
"http://sqlcourse.com/">http://sqlcourse.com.</A></P>
<P>Un autre (en anglais uniquement) "Teach Yourself SQL in 21 Days, Second Edition"
se trouve sur <A href=
"http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A></P>
<P>Nombre de nos utilisateurs aiment <I>The Practical SQL Handbook</I>,
Bowman, Judith S., et al., Addison-Wesley. D'autres aiment <I>The
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
<H4><A name="1.11">1.11</A>) PostgreSQL est-il compatible an 2000&nbsp;?</H4>
<P>Oui, nous manipulons facilement les dates après et avant l'an 2000.</P>
<H4><A name="1.12">1.12</A>) Comment puis-je rejoindre l'équipe de développement&nbsp;?</H4>
<P>Tout d'abord, téléchargez les derniers sources et lisez la
documentation pour les développeurs sur notre site web ou bien
dans la distribution. Ensuite, inscrivez-vous aux listes de
diffusion <I>pgsql-hackers</I> et <I>pgsql-patches</I>. Et pour finir,
soumettez des correctifs de grande qualité sur <i>pgsql-patches</i>.</P>
<P>Environ une douzaine de personnes ont des droits de modification
sur l'archive <SMALL>CVS</SMALL> de PostgreSQL. Ils ont chacun
soumis tellement de correctifs de qualité qu'il était devenu
impossible aux développeurs de tenir la cadence et nous avions
confiance dans le qualité des correctifs qu'ils soumettaient.</P>
<H4><A name="1.13">1.13</A>) Comment dois-je soumettre un rapport de
bogue&nbsp;?</H4>
<P>Merci de visiter la page PostgreSQL BugTool sur <A href=
"http://www.PostgreSQL.org/bugs/bugs.php">http://www.PostgreSQL.org/bugs/bugs.php</A>,
qui donne des indications sur la façon de soumettre un rapport de bogue.</P>
<P>De même, vérifiez notre site ftp <A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A> pour
voir s'il existe une version PostgreSQL plus récente ou des
correctifs.</P>
<H4><A name="1.14">1.14</A>) Comment PostgreSQL se compare-til à
d'autres <SMALL>SGBD</SMALL>&nbsp;?</H4>
<P>Il y a plusieurs manières de mesurer un logiciel&nbsp;: les fonctionnalités,
les performances, la fiabilité, le support, et le prix.</P>
<DL>
<DT><B>Fonctionnalités</B></DT>
<DD>PostgreSQL possède la plupart des fonctionnalités présentes
dans les <SMALL>SGBD</SMALL> commerciaux, comme les
transactions, les requêtes imbriquées, les déclencheurs,
les vues, l'intégrité référentielle par clés étrangères, et le
verrouillage sophistiqué. Nous avons des fonctionnalités qu'ils
n'ont pas, comme les types définis par l'utilisateur,
l'héritage, les règles, et le contrôle de concurrence par
multi-versionnage pour réduire les contentions de verrouillage.<BR>
<BR>
</DD>
<DT><B>Performances</B></DT>
<DD>PostgreSQL a des performances similaires aux autres bases de
données commerciales et open source. Il est plus rapide pour
certaines opérations, plus lent pour d'autres. Par rapport à
MySQL ou d'autres <SMALL>SGBD</small> plus léger, nous sommes
plus rapides pour de nombreux utilisateurs, des requêtes complexes et
une charge pour les requêtes de lecture/écriture. MySQL est plus rapide
pour des requêtes SELECT simples effectuées par quelques utilisateurs.
Bien sûr, MySQL ne possède aucune des fonctionnalités de la section
<I>Fonctionnalités</I> ci-dessus. PostgreSQL est construit pour la
fiabilité et les fonctionnalités et nous continuons à améliorer les
performances à chaque version. Il y a une page web intéressante
qui compare PostgreSQL à MySQL sur <A
href="http://openacs.org/philosophy/why-not-mysql.html">
http://openacs.org/philosophy/why-not-mysql.html</A>. De plus, MySQL
est une société qui distribue son produit via l'open source et requiert
une licence commerciale pour les logiciels propriétaires, donc pas une
communauté de développement open source comme PostgreSQL.<BR>
<BR>
</DD>
<DT><B>Fiabilité</B></DT>
<DD>Nous somme conscients qu'un <SMALL>SGBD</SMALL> doit être
fiable ou bien il est inutile. Nous faisons le maximum pour
sortir des versions bien testées, du code stable ne contenant qu'un
minimum de bogues. Chaque version a au moins un mois de tests,
et notre historique de versions montre que nous pouvons
fournir des versions stables et robustes, prêtes pour une
utilisation en environnement de production. Nous pensons que
nous nous comparons favorablement aux autres bases de données
dans ce domaine.<BR>
<BR>
</DD>
<DT><B>Support</B></DT>
<DD>Nos listes de diffusion offrent un contact avec un large
groupe de développeurs et d'utilisateurs afin d'aider à la
résolution des problèmes rencontrés. Nous ne pouvons garantir
un correctif mais les <SMALL>SGBD</SMALL> commerciaux ne le
garantissent pas toujours non plus. L'accès direct aux
développeurs, à la communauté d'utilisateurs, aux manuels, et
au code source, fait du support pour PostgreSQL un support
supérieur aux autres <SMALL>SGBD</SMALL>. Un support commercial par
incident est disponible pour ceux qui en ont le besoin (voir
la <A
href="#1.6">section 1.6 de la FAQ</A>).<BR>
<BR>
</DD>
<DT><B>Prix</B></DT>
<DD>Nous sommes gratuits pour tous les usages, commerciaux et
non commerciaux. Vous pouvez inclure notre code dans vos
produits sans limitation, exceptées celles citées dans notre
licence de type BSD donnée plus haut.<BR>
<BR>
</DD>
</DL>
<H4><A name="1.15">1.15</A>) Comment puis-je aider financièrement
PostgreSQL&nbsp;?</H4>
<P>PostgreSQL possède une infrastructure de première classe depuis
le début en 1996. Ceci grâce à Marc Fournier, qui a créé et géré
cette infrastructure des années durant.</P>
<P>Une infrastructure de qualité est importante pour un projet
open-source. Cela permet d'empêcher l'éparpillement qui ralentirait
beaucoup l'avancement du projet.</P>
<P>Bien sûr, cette infrastructure n'est pas donnée. Elle requiert
un certain nombre de dépenses mensuelles ou ponctuelles. Si vous
ou votre société peut donner de l'argent pour soutenir cet effort,
merci de consulter la page web <A
href="http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</A>
et de faire une donation.</P>
<P>Bien que la page web mentionne PostgreSQL, Inc, les
contributions sont exclusivement utilisées pour soutenir le
projet PostgreSQL et ne soutiennent aucune société que ce soit. Si
vous le préférez, vous pouvez aussi envoyer un chèque à l'adresse
de contact.</P>
<HR>
<P>De plus, si vous avez une histoire de succès avec PostgreSQL,
merci de la soumettre à notre site d'évangélisation sur <a
href="http://advocacy.postgresql.org">
http://advocacy.postgresql.org</a>.</P>
<H2 align="center">Questions sur le client utilisateur</H2>
<H4><A name="2.1">2.1</A>) Existe-t'il des pilotes <SMALL>ODBC</SMALL> pour
PostgreSQL&nbsp;?</H4>
<P>Il y a deux pilotes <SMALL>ODBC</SMALL> disponibles, PsqlODBC
et OpenLink <SMALL>ODBC</SMALL>.</P>
<P>Vous pouvez télécharger PsqlOBDC depuis <A href=
"http://gborg.postgresql.org/project/psqlodbc/projdisplay.php">
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php</A>.</P>
<P>OpenLink <SMALL>ODBC</SMALL> peut être obtenu depuis <A href=
"http://www.openlinksw.com/">http://www.openlinksw.com</A>. Il fonctionne
avec leur logiciel client <SMALL>ODBC</SMALL> standard, vous aurez
donc PostgreSQL <SMALL>ODBC</SMALL> sur toutes les plateformes
client qu'ils supportent (Win, Mac, Unix, VMS).</P>
<P>Ils vendront probablement ce produit aux gens qui recherchent
une qualité de support professionnelle mais une version freeware sera
toujours disponible. Merci d'envoyer vos questions à <A href=
"mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</A>.</P>
<H4><A name="2.2">2.2</A>) Quels outils sont disponibles pour utiliser
PostgreSQL avec des pages Web&nbsp;?</H4>
<P>Une bonne introduction aux pages Web adossés à une base de données se
trouve à <A href="http://www.webreview.com">http://www.webreview.com</A></P>
<P>Pour l'intégration Web, PHP est une excellente interface. Elle se trouve à <A
href="http://www.php.net">http://www.php.net</A>.</P>
<P>Pour les cas complexes, beaucoup utilisent l'interface Perl et CGI.pm ou mod_perl.</P>
<H4><A name="2.3">2.3</A>) PostgreSQL a-t-il une interface graphique&nbsp;?</H4>
<P>Oui, il y a plusieurs interfaces graphiques disponibles pour PostgreSQL,
dont PgAccess <a href="http://www.pgaccess.org">
http://www.pgaccess.org</a>), PgAdmin III (<a
href="http://www.pgadmin.org">http://www.pgadmin.org</a>),
RHDB Admin (<a
href="http://sources.redhat.com/rhdb/">http://sources.redhat.com/rhdb/
</a> et Rekall (<a href="http://www.thekompany.com/products/rekall/">
http://www.thekompany.com/products/rekall/</a>, propriétaire). Il y a
aussi PhpPgAdmin (<a href="http://phppgadmin.sourceforge.net/">
http://phppgadmin.sourceforge.net/ </a>), une interface Web pour
PostgreSQL.</P>
<P>Voir <a href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</a> pour une liste plus détaillée.</P>
<H4><A name="2.4">2.4</A>) Quels langages sont disponibles pour
communiquer avec PostgreSQL&nbsp;?</H4>
<P>La plupart des langages de programmation couramment utilisés ont
une interface pour PostgreSQL. Vérifiez la liste des modules de votre
langage.</P>
<P>Les interfaces ci-dessous sont incluses dans la distribution&nbsp;:</P>
<UL>
<LI>C (libpq)</LI>
<LI>Embedded C (ecpg)</LI>
<LI>Java (jdbc)</LI>
<LI>Python (PyGreSQL)</LI>
<LI>TCL (libpgtcl)</LI>
</UL>
<P>Interfaces supplémentaires disponibles sur
<a href="http://gborg.postgresql.org">http://gborg.postgresql.org</A>
dans la section <I>Drivers/Interfaces</I>
</P>
<HR>
<H2 align="center">Questions Administratives</H2>
<H4><A name="3.1">3.1</A>) Comment installer PostgreSQL ailleurs que sous <I>/usr/local/pgsql</I>&nbsp;?</H4>
<P>Il faut spécifier l'option <I>--prefix</I> lors du lancement de <I>configure</I>.</P>
<H4><A name="3.2">3.2</A>) Quand je lance <I>postmaster</I>, j'obtiens un <I>Bad System Call</I> ou un message <i>core dumped</i> . Pourquoi&nbsp;?</H4>
<P>Cela peut être dû à une variété de problèmes mais vérifiez d'abord que
vous avez les extensions System V installées pour votre noyau. PostgreSQL
nécessite le support noyau pour la mémoire partagée et les sémaphores.</P>
<H4><A name="3.3">3.3</A>) Quand je lance <I>postmaster</I>, j'obtiens des erreurs <I>IpcMemoryCreate</I>. Pourquoi&nbsp;?</H4>
<P>Soit vous n'avez pas configuré correctement la mémoire partagée dans
votre noyau, soit vous devez augmenter la mémoire partagée disponible dans
le noyau. Le montant exact dont vous avez besoin dépend de votre
architecture et du nombre de tampons et de processus que vous avez
configuré pour <I>postmaster</I>. Pour la plupart des systèmes avec un
nombre par défaut de tampons et de processus, vous aurez besoin d'un minimum
d'environ 1&nbsp;Mo. Voir le chapitre <A href=
"http://www.PostgreSQL.org/docs/view.php?version=current&amp;idoc=1&amp;file=kernel-resources.html">Administration
du manuel PostgreSQL</A> pour des informations plus détaillées sur la mémoire partagée et les sémaphores.</P>
<H4><A name="3.4">3.4</A>) Quand je lance <I>postmaster</I>, j'obtiens des erreurs <I>IpcSemaphoreCreate</I>. Pourquoi&nbsp;?</H4>
<P>Si le message d'erreur est <I>IpcSemaphoreCreate: semget failed (No
space left on device)</I> alors votre noyau n'est pas configuré avec
suffisamment de sémaphores. PostgreSQL a besoin d'un sémaphore par processus
serveur potentiel. Une solution provisoire est de lancer <I>postmaster</I>
avec une plus petite limite sur le nombre de processus serveur. Utilisez l'option
<I>-N</I> avec un paramètre inférieur au choix par défaut de 32. Une
solution permanente est d'augmenter les paramètres
<SMALL>SEMMNS</SMALL> et <SMALL>SEMMNI</SMALL> de votre noyau.</P>
<P>Des sémaphores inopérantes peuvent aussi provoquer des plantages pendant de gros accès à la base de données.</P>
<P>Si le message d'erreur est autre chose, vous n'avez peut-être pas du tout le support des
sémaphores dans votre noyau. Voir le
chapitre <A href=
"http://www.PostgreSQL.org/docs/view.php?version=current&amp;idoc=1&amp;file=kernel-resources.html">Administration
du manuel PostgreSQL</A> pour des informations plus détaillées sur la mémoire partagée et les sémaphores.</P>
<H4><A name="3.5">3.5</A>) Comment contrôler les connexions d'autres machines&nbsp;?</H4>
<p>Par défaut, PostgreSQL autorise seulement les connexions de la machine
locale en utilisant les sockets de domaine Unix ou les connexions TCP/IP.
D'autres machines ne seront pas capables de se connecter sauf si vous modifiez
listen_addresses dans postgresql.conf et activez une authentification basée
sur l'hôte en modifiant le fichier <i>$PGDATA/pg_hba.conf</i> en accord.</p>
<H4><A name="3.6">3.6</A>) Comment régler le moteur de la base de données pour de meilleures performances&nbsp;?</H4>
<P>Des index accéléreront les requêtes. La commande
<SMALL>EXPLAIN ANALYZE</SMALL> vous permet de voir comment PostgreSQL traite
votre requête et quels index sont utilisés.</P>
<P>Si vous faites beaucoup d'insertions (instruction <SMALL>INSERT</SMALL>),
envisagez de les faire en une fois en utilisant la commande <SMALL>COPY</SMALL>. Ceci
est plus rapide que des commandes <SMALL>INSERTS</SMALL> individuelles. Deuxièment,
les requêtes qui ne sont pas dans des blocs de transaction <SMALL>BEGIN WORK/COMMIT</SMALL>
sont considérés comme étant dans leur propre transaction. Envisagez de faire
plusieurs instructions dans un seul bloc de transaction. Ceci réduira la
surcharge apportée par les transactions. Aussi, envisagez d'abandonner et
de recréer des index lors de grosses modifications de données.</P>
<P>Il y a plusieurs options d'optimisations. Vous pouvez désactiver
<I>fsync()</I> en lançant <I>postmaster</I> avec l'option <I>-o -F</I>.
Ceci empêchera les <I>fsync()</I>s d'écrire sur disque après toute
transaction.</P>
<P>Vous pouvez utiliser l'option <I>-B</I> de <I>postmaster</I> pour
augmenter le nombre de tampons de mémoire partagée utilisés par les
processus serveurs. Si vous fixez ce paramètre trop haut,
<I>postmaster</I> ne se lancera pas car vous avez dépassé la limite de
votre noyau sur la quantité de mémoire partagée. Chaque tampon fait 8&nbsp;Ko et
le choix par défaut est de 64 tampons.</P>
<P>Vous pouvez utiliser l'option serveur <I>-S</I> pour augmenter la
quantité maximale de mémoire utilisée par les processus serveurs pour des
tris temporaires. La valeur de <I>-S</I> est mesuré en kilooctets et le
choix par défaut est de 512 (c'est-à-dire 512&nbsp;Ko).</P>
<P>Vous pouvez utiliser la commande <SMALL>CLUSTER</SMALL> pour regrouper
vos données en tables pour correspondre à un index. Voir la page de manual
<SMALL>CLUSTER</SMALL> pour plus de détails.</P>
<H4><A name="3.7">3.7</A>) Quelles fonctionalités de déboguage sont disponibles&nbsp;?</H4>
<P>PostgreSQL a plusieurs fonctionalités qui permettent de recueillir des
informations de statut qui peuvent être utile pour des intentions de
déboguage.</P>
<P>D'abord, en lançant <I>configure</I> avec l'option --enable-cassert,
beaucoup d'<I>assert()</I>s surveillent le serveur et arrêtent le programme
quand quelque chose d'inattendu arrive.</P>
<P><I>Postmaster</I> et <I>postgres</I> ont tous deux plusieurs options de
déboguage de disponible. D'abord, quand vous lancez <I>postmaster</I>,
vérifiez que vous envoyez les sorties standard et d'erreur dans un fichier
de traces comme&nbsp;:</P>
<PRE>
cd /usr/local/pgsql
./bin/postmaster &gt;server.log 2&gt;&amp;1 &amp;
</PRE>
<P>Ceci va créer un fichier server.log dans le répertoire racine de
PostgreSQL. Ce fichier contient des informations utiles sur les problèmes
ou erreurs rencontrés par le serveur. <I>Postmaster</I> dispose d'une
option <I>-d</I> qui permet de rapporter des informations encore plus
détaillées d'être rapportées. L'option <I>-d</I> prend un numéro qui
spécifie le niveau de déboguage. Faites attention au fait que des valeurs
élévées de niveau de déboguage génerent des fichiers de traces volumineux.</P>
<P>Si <I>postmaster</I> ne tourne pas, vous pouvez lancer le serveur
<I>postgres</I> de la ligne de commande et taper votre requête
<SMALL>SQL</SMALL> directement. Ceci est recommandé <B>seulement</B> pour
des fonctions de déboguage. Notez qu'un retour chariot termine la requête,
pas un point-virgule. Si vous compilez avec les symboles de déboguage, vous
pouvez utiliser un débogueur pour voir ce qui se passe. Parce que le serveur
n'a pas été lancé par <I>postmaster</I>, il ne tourne pas dans un environnement
identique et les problèmes d'interaction de verrouillage/serveur ne peuvent
être dupliqués.</P>
<P>Si <I>postmaster</I> est en train de tourner, lancez <I>psql</I> dans
une fenêtre puis trouvez le <SMALL>PID</SMALL> du processus <I>postgres</I>
utilisé par <I>psql</I>. Utilisez un débogueur pour l'attacher au
<SMALL>PID</SMALL> <I>postgres</I>. Vous pouvez mettre un point d'arrêt
dans le débogueur et envoyez des requêtes de <I>psql</I>. Si vous déboguez
le démarrage de <I>postgres</I>, vous pouvez mettre PGOPTIONS="-W n", puis
lancez <I>psql</I>. Ceci va retarder le démarrage de <I>n</I> secondes
pour que vous puissiez attacher un débogueur au processus, fixer des points
d'arrêt et continuer la séquence de démarrage.</P>
<P>Le programme <I>postgres</I> a les options <I>-s, -A</I> et <I>-t</I>
qui peuvent être utile pour des mesures de déboguage et de performance.</P>
<P>Vous pouvez compiler avec les options de performance pour voir quelles
fonctions prennent du temps d'exécution. Les fichiers de gestion du serveur
seront déposés dans le répertoire <I>pgsql/data/base/nom_db</I>. Les
fichiers de gestion clients seront mis dans le répertoire actuel du client.
Linux requiert une compilation avec <I>-DLINUX_PROFILE</I> pour une
meilleure gestion.</P>
<H4><A name="3.8">3.8</A>) Pourquoi est-ce que j'obtiens des messages <I>Sorry, too many clients</I> quand je me connecte&nbsp;?</H4>
<P>Vous pouvez augmenter la limite de <I>postmaster</I> sur le nombre de
processus serveur concurrents qu'il peut lancer.</P>
<P>La limite par défaut est de 32 processus. Vous pouvez l'augmenter en
relançant <I>postmaster</I> avec une valeur <I>-N</I> appropriée ou
en modifiant <I>postgresql.conf</I>.</P>
<P>Tenez compte du fait que si vous fixez <I>-N</I> plus grand que 32, vous
devez aussi augmenter <I>-B</I> au-dela de sa valeur par défaut 64&nbsp;;
<I>-B</I> doit valoir au moins deux fois <I>-N</I> et probablement plus pour
une meilleure performance. Pour de grand nombres de processus serveurs vous
aurez probablement aussi augmenter plusieurs parametres de configuration du
noyau Unix. Les choses a vérifier incluent la taille maximale des blocs de
mémoire partagée, <SMALL>SHMMAX</SMALL>&nbsp;; le nombre maximal de
sémaphores, <SMALL>SEMMNS</SMALL> et <SMALL>SEMMNI</SMALL>&nbsp;; le
nombre maximal de processus, <SMALL>NPROC</SMALL>&nbsp;; le nombre maximal
de processus par utilisateur, <SMALL>MAXUPRC</SMALL>&nbsp;; et le nombre
maximal de fichiers ouverts, <SMALL>NFILE</SMALL> et <SMALL>NINODE</SMALL>.
La raison pour laquelle PostgreSQL a une limite sur le nombre de processus
serveurs autorisés est pour que votre système ne tombe pas à court de
ressources.</P>
<H4><A name="3.9">3.9</A>) Que contient le répertoire <I>pgsql_tmp</I>&nbsp;?</H4>
<P>Ce répertoire contient des fichiers temporaires générés par le moteur de
requête. Par exemple, si un tri doit être fait pour satisfaire un
<SMALL>ORDER BY</SMALL> et que ce tri requiert plus de place que le paramètre
<I>-S</I> du serveur n'autorise, alors des fichiers temporaires seront créés
pour contenir les données nécessaires.</P>
<P>Les fichiers temporaires sont d'habitude effacés automatiquement mais
peuvent rester si un serveur s'arrête brutalement pendant un tri. Un arrêt
et un redémarrage de <I>postmaster</I> effacera les fichiers dans ces
répertoires.</P>
<H4><A name="3.10">3.10</A>) Pourquoi est-ce que j'ai besoin de faire une
sauvegarde des bases et de restaurer pour mettre a jour les versions de
PostgreSQL&nbsp;?</H4>
<P>L'équipe PostgreSQL ne fait que des changements mineurs entre des
versions mineurs, donc mettre à jour de 7.2 vers 7.2.1 ne nécessitera pas
de sauvegarde et de restauration. Par contre, les sorties majeures
(c'est-à-dire de 7.2 vers 7.3) changent souvent le format interne des tables
systèmes et des fichiers de données. Ces modifications sont souvent
complexes alors nous ne gardons pas de compatibilité descendante pour les
fichiers de données. Une sauvegarde exportera les données dans un format
générique qui peut ensuite être chargé dans le nouveau format interne.</P>
<P>Dans les sorties où le format sur disque ne change pas, le script
<I>pg_upgrade</I> peut être utilisé pour mettre à jour sans
sauvegarde/restauration. Les notes de sorties précisent si <I>pg_upgrade</I>
est disponible pour la sortie.</P>
<H4><A name="3.11">3.11</A>) Quels matériels dois-je utiliser&nbsp;?</H4>
<P>Comme le matériel PC est compatible en grosse partie, les gens ont
tendance à croire que tous les matériels PC sont de même qualité. Ce n'est
pas le cas. La RAM ECC, le SCSI et les cartes-mère de qualité sont plus
fiables et ont de meilleurs performances qu'un matériel moins coûteux.
PostgreSQL fonctionnera sur à peu près tout matériel mais si la fiabilité et
la performance sont importantes pour vous, il est rusé de bien considérer
les options matérielles. Nos listes de diffusion peuvent être utilisées pour
discuter des options matériels.</P>
<HR>
<H2 align="center">Questions fonctionnelles</H2>
<H4><A name="4.1">4.1</A>) Quelle est la différence entre curseur binaire
et curseur normal&nbsp;?</H4>
<P>Voir la page <SMALL>DECLARE</SMALL> du manuel pour une description.</P>
<H4><A name="4.2">4.2</A>) Comment faire un <SMALL>SELECT</SMALL> seulement
sur les premières lignes d'une requête&nbsp;? Sur une ligne aléatoire&nbsp;?</H4>
<P>Voir la page <SMALL>FETCH</SMALL> du manuel ou utiliser
<SMALL>SELECT</SMALL> ... <SMALL>LIMIT</SMALL>....</P>
<P>Il se peut que l'intégralité de la requête doive être évaluée,
même si vous voulez seulement les premières lignes. Envisagez
d'utiliser une requête avec une clause <SMALL>ORDER
BY</SMALL>. S'il existe un index correspondant à l'<SMALL>ORDER
BY</SMALL>, PostgreSQL peut n'évaluer que les premières lignes, sinon
l'intégralité de la requête peut être évaluée, jusqu'à générer les lignes
désirées.</P>
<P>Pour faire un <SMALL>SELECT</SMALL> sur une ligne aléatoire&nbsp;:</P>
<PRE>
SELECT colonne
FROM table
ORDER BY random()
LIMIT 1;
</PRE>
<H4><A name="4.3">4.3</A>) Comment obtenir une liste des tables ou
d'autres objets que je vois dans <I>psql</I>&nbsp;?</H4>
<P>Utilisez la commande \dt pour voir les tables dans <I>psql</I>. Pour
une liste complète de commandes à l'intérieur de psql, vous pouvez utiliser
\?. Autrement, vous pouvez lire le code source de <I>psql</I> dans le fichier
<I>pgsql/src/bin/psql/describe.c</I>. Il contient des commandes
<SMALL>SQL</SMALL> qui génèrent le contenu des commandes anti-slash de
psql. Vous pouvez aussi lancer <I>psql</I> avec l'option
<I>-E</I>, afin qu'il imprime les requêtes qu'il utilise pour exécuter
les commandes que vous lui passez. PostgreSQL fournit aussi une interface
d'informations sur le schéma compatible avec <I>SQLi</I> que vous pouvez
interroger des informations sur la base de données.</P>
<H4><A name="4.4">4.4</A>) Comment supprime-t-on une colonne d'une table,
ou comment change-t-on son type de données&nbsp;?</H4>
<P>La fonction <SMALL>DROP COLUMN</SMALL> a été ajoutée dans la version 7.3
avec <SMALL>ALTER TABLE DROP COLUMN</SMALL>. Pour les versions précédentes,
vous pouvez faire&nbsp;:</P>
<PRE>
BEGIN;
LOCK TABLE ancienne_table;
SELECT ... -- sélectionnez toutes les colonnes sauf celle à supprimer
INTO TABLE nouvelle_table
FROM ancienne_table;
DROP TABLE ancienne_table;
ALTER TABLE nouvelle_table RENAME TO ancienne_table;
COMMIT;
</PRE>
<P>Pour changer le type de données d'une colonne, faites&nbsp;:</P>
<PRE>
BEGIN;
ALTER TABLE table ADD COLUMN nouvelle_colonne <i>nouveau_type_de_donnees</i>;
UPDATE table SET nouvelle_colonne = CAST(ancienne_colonne AS <i>nouveau_type_de_donnees</i>);
ALTER TABLE table DROP COLUMN ancienne_colonne;
COMMIT;
</PRE>
<P>Après, vous pouvez faire <I>VACUUM FULL tab</I> pour récupérer l'espace
disque utilisé par les lignes expirées.</P>
<H4><A name="4.5">4.5</A>) Quelle est la taille maximale pour une ligne,
une table, une base de données&nbsp;?</H4>
<P>Les limites sont&nbsp;:</P>
<PRE>
Taille maximum pour une base de données illimitée (il existe des bases de 32&nbsp;To)
Taille maximum pour une table 32&nbsp;To
Taille maximum pour une ligne 1,6&nbsp;To
Taille maximum pour un champ 1&nbsp;Go
Nombre maximum de lignes dans une table illimité
Nombre maximum de colonnes dans une table 250-1600, selon le type de colonnes
Nombre maximum d'index sur une table illimité
</PRE>
<P>Bien sûr, ces valeurs ne sont pas vraiment illimitée, elles sont limitées
par l'espace disque disponible, ainsi que par l'espace de mémoire et de swap.
Les performances peuvent se dégrader si ces valeurs sont inhabituellement
grandes.</P>
<P>La taille maximum des tables (32&nbsp;To) ne nécessite pas que le système
d'exploitation supporte les grands fichiers. Les grandes tables sont stockées
sous forme de fichiers multiples de 1&nbsp;Go, donc les limites de taille du
système de fichier ne sont pas importantes.</P>
<P>La taille maximum des tables et le nombre maximum de colonnes peuvent
être quadriplés, si la taille des blocs par défaut est augmentée à 32&nbsp;Ko.</P>
<H4><A name="4.6">4.6</A>) Combien d'espace disque faut-il pour stocker
les données d'un fichier texte typique&nbsp;?</H4>
<P>Une base de données PostgreSQL peut utiliser jusqu'à cinq fois
l'espace nécessaire pour stocker les données d'un fichier texte.</P>
<P>A titre d'exemple, considérez un fichier de 100 000 lignes, comportant
un entier et une chaîne de description sur chaque ligne. Supposons que la
chaîne soit longue en moyenne de 20 octets. Le fichier texte serait de 2,8&nbsp;Mo.
La taille du fichier d'une base de données PostgreSQL peut être
estimée à 6,4&nbsp;Mo&nbsp;:</P>
<PRE>
32 octets: chaque ligne (approximation)
24 octets: un champ 'entier' et un champ 'texte'
+ 4 octets: pointeur vers le tuple sur la page
----------------------------------------
60 octets par ligne
La taille des pages de données dans PostgreSQL est de 8192 octets (8 KO), donc :
8192 octets par page
---------------------- = 136 lignes par page de base de données (arrondi à l'entier inférieur)
60 octets par ligne
100000 lignes de données
------------------------- = 735 pages de base de données (arrondi à l'entier supérieur)
128 lignes par page
735 pages de base de données * 8192 octets par page = 6&nbsp;021&nbsp;120&nbsp;octets (6,4&nbsp;Mo)
</PRE>
<P>Les index utilisent moins d'espace, mais ils contiennent les données indexées,
ils peuvent donc également être grands.</P>
<P>Les <SMALL>NULL</SMALL> sont stockés sous forme de bitmap, aussi
utilisent-ils très peu d'espace.</P>
<H4><A name="4.7">4.7</A>) Comment puis-je savoir quels index, tables,
bases de données et utilisateurs sont définis&nbsp;?</H4>
<P><I>psql</I> dispose de plusieurs commandes commençant par un anti-slash
pour retrouver ces informations. Utilisez \? pour les connaître. Il existe
aussi des tables systèmes, qui commencent par <I>pg_</I> et qui les
décrivent également. Aussi, <I>psql -l</I> liste toutes les bases de
données.</P>
<P>Essayez également le fichier <I>pgsql/src/tutorial/syscat.source</I>. Il
illustre un grand nombre de commandes <SMALL>SELECT</SMALL> nécessaires pour
récupérer l'information des tables système de la base de données.</P>
<H4><A name="4.8">4.8</A>) Mes requêtes sont lentes ou ne font pas usage
des index. Pourquoi&nbsp;?</H4>
<P>Les index ne sont pas automatiquement utilisés par chaque requête. Ils
sont utilisés uniquement si la table est plus grande qu'une certaine taille,
et si la requête sélectionne seulement un faible pourcentage des lignes de la
table. Ceci est dû au fait qu'un accès disque aléatoire causé par un parcours
d'index peut être plus lent qu'une simple lecture de la table, ou parcours
séquentiel</P>
<P>Pour déterminer si un index devrait être utilisé, PostgreSQL a besoin
des statistiques de la table. Ces statistiques sont collectées en lançant
<SMALL>VACUUM ANALYZE</SMALL> ou simplement <SMALL>ANALYZE</SMALL>.
Avec les statistiques, l'optimiseur sait combien de lignes se trouvent
dans la table et peut mieux déterminer s'il faut utiliser l'index.
Les statistiques sont également utiles pour déterminer l'ordre optimal
des opérations de jointure. La collecte des statistiques devrait être
effectuée régulièrement lorsque le contenu de la table change.</P>
<P>Les index ne sont normalement pas utilisés pour les clauses <SMALL>ORDER BY</SMALL>
ou pour les jointures. Un parcours séquentiel suivi d'un tri explicite est
habituellement plus rapide qu'un parcours d'index pour une table importante.
Toutefois, <SMALL>LIMIT</SMALL> combiné avec <SMALL>ORDER BY</SMALL>
utilisera souvent un index parce que seulement une petite partie de la table est
renvoyée. En fait, bien que MAX() et MIN() n'utilisent pas les index,
il est possible de retrouver ces valeurs en utilisant un index avec
ORDER BY et LIMIT&nbsp;:</P>
<PRE>
SELECT colonne
FROM table
ORDER BY colonne [ DESC ]
LIMIT 1;
</PRE>
<P>Si vous pensez que l'optimiseur choisit par erreur un parcours sequentiel,
utilisez <CODE>SET enable_seqscan TO 'off'</CODE> et
lancez des tests pour voir si le parcours d'index est effectivement plus rapide.</P>
<P>Lorsque vous utilisez des caractères joker tels que <SMALL>LIKE</SMALL> ou
<I>~</I>, les index peuvent seulement être utilisés dans certaines circonstances&nbsp;:</P>
<UL>
<LI>Le début de la chaîne de recherche doit être ancré au départ de la chaîne, c'est-à-dire
<UL>
<LI>Les modèles pour <SMALL>LIKE</SMALL> ne doivent pas commencer par <I>%</I>.</LI>
<LI>Les modèles d'expression régulière pour <I>~</I> doivent commencer par
<I>^</I>.</LI>
</UL></LI>
<LI>La chaîne de recherche ne peut pas commencer par une classe de caractères, c'est-à-dire
[a-e].</LI>
<LI>Les recherches sans casse comme <SMALL>ILIKE</SMALL> et
<I>~*</I> n'utilisent pas les index. Utilisez plutôt les index fonctionnels,
décrit dans la section <a href="#4.12">4.12</a>.</LI>
<LI>La locale <I>C</I> par défaut doit être utilisée lors de
<i>initdb</i>.</LI>
</UL>
<p>Dans les versions antérieures à la 8.0, les indexs ne peuvent souvent
pas être utilisés sauf si les types de données correspondent exactement au
type de la colonne de l'index. Ceci est particulièrement vrai pour les
index de colonnes de type int2, int8 et numeric.</p>
<H4><A name="4.9">4.9</A>) Comment puis-je savoir si l'optimiseur évalue
mes requêtes&nbsp;?</H4>
<P>Voir la page <SMALL>EXPLAIN</SMALL> du manuel.</P>
<H4><A name="4.10">4.10</A>) Qu'est-ce qu'un index R-tree&nbsp;?</H4>
<P>Un index R-tree est utilisé pour l'indexation des données spatiales. Un
index de hachage ne permet pas les recherches par plage. Un index B-tree peut
seulement faire des recherches sur une dimension. Les index R-tree
peuvent traiter des données multi-dimensionnelles. Par exemple, si un index
R-tree peut être construit sur un attribut de type <I>point</I>,
le système peut plus efficacement gérer les requêtes du type
"Sélection de tous les points d'un rectangle".</P>
<P>L'article de référence qui décrit le système R-tree original est&nbsp;:</P>
<P>Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt
of Data, 45-57.</P>
<P>Vous pouvez également trouver ce papier dans le livre de Stonebraker
"Readings in Database Systems".</P>
<P>Les index R-tree intégrés peuvent prendre en charge les polygônes et les boîtes.
En théorie, les R-trees peuvent être étendus à un plus grand nombre de dimensions.
En pratique, l'extension des R-trees requiert pas mal de travail et nous
n'avons pour le moment aucune documentation sur la façon de procéder.</P>
<H4><A name="4.11">4.11</A>) Qu'est-ce que l'optimiseur génétique de
requêtes&nbsp;?</H4>
<P>Le module <SMALL>GEQO</SMALL> (acronyme de <i>GEnetic Query
Optimizer</i>) accélère l'optimisation des requêtes lors de jointures de
nombreuses tables par un algorithme génétique (GA). Il permet la
gestion des grosses requêtes de jointures en utilisant une recherche non
exhaustive.</P>
<H4><A name="4.12">4.12</A>) Comment puis-je réaliser des recherches sur des
expressions rationnelles ainsi que des recherches non sensibles à la
casse&nbsp;? Comment puis-je utiliser un index lors de recherches non
sensibles à la casse&nbsp;?</H4>
<P>L'opérateur <I>~</I> réalise des recherches d'expressions rationnelles
et <I>~*</I> le fait sans tenir compte de la casse. La variante de
<SMALL>LIKE</SMALL> non sensible à la casse est
<SMALL>ILIKE</SMALL>.</P>
<P>Des comparaisons d'égalité non sensibles à la casse sont habituellement
exprimées de cette façon&nbsp;:</P>
<PRE>
SELECT *
FROM table
WHERE lower(colonne) = 'abc';
</PRE>
<P>Ceci n'utilisera pas un index standard. Néanmoins, si vous créez un index
fonctionnel, celui-ci sera utilisé&nbsp;:</P>
<PRE>
CREATE INDEX tableindex ON table (lower(colonne));
</PRE>
<H4><A name="4.13">4.13</A>) Comment puis-je détecter si un champ est
<SMALL>NULL</SMALL> dans une requête&nbsp;?</H4>
<P>Il vous suffit de tester la colonne avec <SMALL>IS NULL</SMALL> ou <SMALL>IS
NOT NULL</SMALL>.</P>
<H4><A name="4.14">4.14</A>) Quelle sont les différences entre les nombreux
types de caractères&nbsp;?</H4>
<PRE>
Type Nom interne Notes
--------------------------------------------------
VARCHAR(n) varchar n spécifie la taille maximum, sans remplissage
CHAR(n) bpchar des espaces sont ajoutés pour obtenir la
longueur fixe spécifiée
TEXT text pas de limite supérieure pour la taille
BYTEA bytea tableau d'octets (accepte les octets nuls)
"char" char un caractère
</PRE>
<P>Vous verrez le nom interne en examinant les catalogues système et dans
quelques messages d'erreur.</P>
<P>Les quatres premiers types du dessus sont des types "varlena"
(c'est-à-dire que les quatre premiers octets correspondent à la taille,
suivi des données). Donc, l'espace réellement utilisé est légèrement plus
grand que la taille déclarée. Néanmoins, ces types de données sont aussi
sujet à la compression ou à un enregistrement en dehors de la table avec
<SMALL>TOAST</SMALL>, donc l'espace occupé sur disque pourrait aussi être
moindre que ce qu'on pourrait attendre.</P>
<P><SMALL>VARCHAR(n)</SMALL> est bien mieux pour enregistrer des chaînes de
longueurs variables tout en limitant la taille de cette chaîne.
<SMALL>TEXT</SMALL> est utile pour les chaînes de longueur illimitée, avec
malgré tout un maximum de 1&nbsp;Go.</P>
<P><SMALL>CHAR(n)</SMALL> est intéressant pour stocker des chaînes de taille
identique. <SMALL>CHAR(n)</SMALL> complète avec des espaces pour arriver à
la taille spécifiée alors que <SMALL>VARCHAR(n)</SMALL> n'enregistre que les
caractères donnés. <SMALL>BYTEA</SMALL> sert à stocker des données binaires,
particulièrement les données incluant des octets <SMALL>NULL</SMALL>. Tous
les types décrits ici ont des performances similaires.</P>
<H4><A name="4.15.1">4.15.1</A>) Comment puis-je créer un champ série,
c'est-à-dire s'incrémentant automatiquement&nbsp;?</H4>
<P>PostgreSQL supporte un type de données <SMALL>SERIAL</SMALL>. Il crée
automatiquement une séquence. Par exemple,
ceci&nbsp;:</P>
<PRE>
CREATE TABLE personne (
id SERIAL,
nom TEXT
);
</PRE>
est automatiquement traduit en ceci&nbsp;:
<PRE>
CREATE SEQUENCE personne_id_seq;
CREATE TABLE personne (
id INT4 NOT NULL DEFAULT nextval('personne_id_seq'),
nom TEXT
);
</PRE>
Voir la page man de <I>create_sequence</I> pour plus d'informations
sur les séquences. Vous pouvez aussi utiliser le champ <I>OID</I> de chaque
ligne comme valeur unique. Néanmoins, si vous avez besoin de sauvegarder
puis recharger la base de données, vous devrez utiliser l'option
<I>-o</I> ou l'option <SMALL>COPY WITH OIDS</SMALL> de
<I>pg_dump</I> pour conserver les <SMALL>OID</SMALL>s.
<H4><A name="4.15.2">4.15.2</A>) Comment puis-je obtenir la valeur d'un
<SMALL>SERIAL</SMALL> suite à une insertion&nbsp;?</H4>
<P>Une approche pour récupérer la prochaine valeur <SMALL>SERIAL</SMALL> à
partir de l'objet séquence est d'utiliser la fonction <I>nextval()</I>
<I>avant</I> l'insertion et de l'insérer ensuite explicitement. En utilisant
la table d'exemple de la section <A href="#4.15.1">4.15.1</A>, un exemple
dans un pseudo-langage ressemblerait à ceci&nbsp;:</P>
<PRE>
nouvelle_id = execute("SELECT nextval('personne_id_seq')");
execute("INSERT INTO personne (id, nom) VALUES (nouvelle_id, 'Blaise Pascal')");
</PRE>
Vous pourriez ensuite utiliser la nouvelle valeur stockée dans
<CODE>nouvelle_id</CODE> avec d'autres requêtes (c'est-à-dire en tant que
clé étrangère de la table <CODE>personne</CODE>). Notez que le nom de la
<SMALL>SEQUENCE</SMALL> automatiquement créée sera
&lt;<I>table</I>&gt;_&lt;<I>colonneserial</I>&gt;_<I>seq</I>, où
<I>table</I> et <I>colonneserial</I> sont les noms respectifs de votre table
et de votre colonne <SMALL>SERIAL</SMALL>.
<P>Autrement, vous pouvez récupérer la valeur <SMALL>SERIAL</SMALL> affectée
avec la fonction <I>currval()</I> <I>après</I> qu'elle ait été insérée par
défaut, c'est-à-dire,</P>
<PRE>
execute("INSERT INTO personne (nom) VALUES ('Blaise Pascal')");
nouvelle_id = execute("SELECT currval('personne_id_seq')");
</PRE>
Enfin, vous pouvez utiliser l'<A href="#4.16"><SMALL>OID</SMALL></A> renvoyé
par l'instruction <SMALL>INSERT</SMALL> pour récupérer la valeur par défaut
bien que cela soit l'appoche la moins portable et la valeur de l'OID se
réinitialisera aux environs de quatre milliards. En Perl, avec DBI et le
module DBD:Pg d'Edmund Mergl, l'ancienne valeur est disponible via
<I>$sth-&gt;{pg_oid_status}</I> après un <I>$sth-&gt;execute()</I>.
<H4><A name="4.15.3">4.15.3</A>) Est-ce que <I>currval()</I> et
<I>nextval()</I> n'amènent pas des problèmes lorsque plusieurs utilisateurs
les lancent en même temps&nbsp;?</H4>
<P>Non. <I>currval()</I> renvoie la valeur actuelle affectée par votre
processus, et non pas par tous les utilisateurs.</P>
<H4><A name="4.15.4">4.15.4</A>) Pourquoi mes numéros de séquences ne sont pas
ré-utilisés lors d'une annulation de transaction&nbsp;? Pourquoi
existe-t'il des trous dans la numérotation de ma colonne séquentielle
(SERIAL)&nbsp;?</H4>
<P>Pour améliorer les accès concurrents, les valeurs de séquences sont
données aux transactions qui en ont besoin et ne sont pas bloquées jusqu'à
la fin de la transaction. Ceci crée des trous dans le numérotage pour les
transactions annulées.</P>
<H4><A name="4.16">4.16</A>) Qu'est-ce qu'un <SMALL>OID</SMALL>&nbsp;?
Qu'est-ce qu'un <SMALL>TID</SMALL>&nbsp;?</H4>
<P>Les <SMALL>OID</SMALL> sont la réponse de PostgreSQL aux identifiants de
lignes uniques. Chaque ligne créée dans PostgreSQL obtient un
<SMALL>OID</SMALL> unique. Tous les <SMALL>OID</SMALL> générés pendant
<I>initdb</I> sont inférieurs à 16384 (voir <I>include/access/transam.h</I>).
Tous les <SMALL>OID</SMALL> créés par un utilisateur sont supérieurs ou
égaux à ceci. Par défaut, tous ces <SMALL>OID</SMALL> sont uniques non
seulement dans une table ou une base mais unique à l'intérieur d'une
installation PostgreSQL entière.</P>
<P>PostgreSQL utilise les <SMALL>OID</SMALL> dans ses tables système interne
pour lier les lignes entre tables. Ces <SMALL>OID</SMALL> peuvent être
utilisés pour identifier des lignes utilisateurs spécifiques et utilisés dans
des jointures. Il est recommandé que vous utilisiez le type de colonne
<SMALL>OID</SMALL> pour stocker des valeurs <SMALL>OID</SMALL>.
Vous pouvez créer un index sur le champ <SMALL>OID</SMALL> pour un accès
plus rapide.</P>
<P>Les <SMALL>OID</SMALL> sont attribués pour toute ligne d'un endroit
central qui est utilisé par toutes les bases de données. Si vous voulez
changer l'<SMALL>OID</SMALL> en quelque chose d'autre ou si vous voulez
faire une copie de la table avec les <SMALL>OID</SMALL> originaux, il
n'y a pas de raisons pour ne pas le faire&nbsp;:</P>
<PRE>
CREATE TABLE nouvelle_table (macolonne int);
SELECT oid AS ancienne_oid, macolonne INTO table_temporaire FROM ancienne_table;
COPY table_temporaire FROM '/tmp/tablepg';
COPY nouvelle_table WITH OIDS FROM '/tmp/tablepg';
DROP TABLE table_temporaire;
</PRE>
<P>Les <SMALL>OID</SMALL> sont stockés en tant qu'entiers de quatre octets
et déborderont à quatre milliards. Personne n'a jamais rapporté un tel cas
et nous avons prévu de retirer la limite avant que cela ne se produise.</P>
<P>Les <SMALL>TID</SMALL>s sont utilisés pour identifier des lignes
physiques spécifiques avec des valeurs de bloc et décalage. Les
<SMALL>TID</SMALL> changent après que les lignes aient été modifiés ou
rechargés. Ils sont utilisés par des entrées d'index pour pointer vers des
lignes physiques.</P>
<H4><A name="4.17">4.17</A>) A quoi correspond certains termes utilisés avec
PostgreSQL&nbsp;?</H4>
<P>Une partie du code source et de l'ancienne documentation utilisent des
termes dont l'usage est plus commun. Voici quelques exemples&nbsp;:</P>
<UL>
<LI>table, relation, classe</LI>
<LI>ligne (row), enregistrement (record), tuple</LI>
<LI>colonne (column), champ (field), attribut</LI>
<LI>récupère, sélectionne (select)</LI>
<LI>remplace (replace), met à jour (update)</LI>
<LI>ajoute (append), insère (insert)</LI>
<LI><SMALL>OID</SMALL>, valeur séquentielle (serial value)</LI>
<LI>portal, curseur</LI>
<LI>range variable, table name, table alias</LI>
</UL>
<P>Une liste des termes généraux pour le domaine des bases de données est
disponible sur&nbsp;: <A href=
"http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</A></P>
<H4><A name="4.18">4.18</A>) Pourquoi ai-je l'erreur <I>ERROR:
Memory exhausted in AllocSetAlloc()</I>&nbsp;?</H4>
<P>Vous manquez probablement de mémoire virtuelle sur votre système ou votre
noyau a une limite assez basse pour certaines ressources. Essayez ceci avant
de lancer <I>postmaster</I>&nbsp;:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
Suivant votre shell, seul un d'eux pourrait réussir mais cela configurera
d'une façon plus importante la taille du segment de données de votre
processus. Cette commande s'applique au processus actuel et à tous les
processus lancé par celui-ci. Si vous avez des problèmes avec le client
<SMALL>SQL</SMALL> parce que le processus serveur renvoie trop de données,
essayez ça avant de lancer le client.
<H4><A name="4.19">4.19</A>) Comment puis-je connaître la version de
PostgreSQL que j'utilise&nbsp;?</H4>
<P>A partir de <I>psql</I>, tapez <CODE>SELECT version();</CODE></P>
<H4><A name="4.20">4.20</A>) Pourquoi ai-je <I>invalid large obj
descriptor</I> lors d'opérations sur des gros objects&nbsp;?</H4>
<P>Vous avez besoin de placer <CODE>BEGIN WORK</CODE> et <CODE>COMMIT</CODE>
autour de chaque utilisateur de gros objets, c'est-à-dire pour entourer
<CODE>lo_open</CODE> ... <CODE>lo_close.</CODE></P>
<P>Actuellement, PostgreSQL force cette règle en fermant les gros objets
lors de la transaction. Donc, le premier essai d'opérations sur ces objets,
fonctionnant habituellement (au moins la plupart du temps) aura un
<I>invalid large obj descriptor</I>. Donc le code, auparavant fonctionnel
(au moins la plupart du temps), génèrera maintenant un message d'erreur si
vous n'utilisez pas de transaction.</P>
<P>Si vous utilisez une interface client interface comme
<SMALL>ODBC</SMALL>, vous aurez peut-être besoin de lancer
<CODE>auto-commit off.</CODE></P>
<H4><A name="4.21">4.21</A>) Comment puis-je créer une colonne qui aura par
défaut l'heure actuelle comme valeur&nbsp;?</H4>
<P>Utilisez <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
<CODE>CREATE TABLE test (x int, heuremodif timestamp DEFAULT CURRENT_TIMESTAMP );
</CODE>
</PRE>
<H4><A name="4.22">4.22</A>) Pourquoi mes sous-requêtes utilisant
<CODE><SMALL>IN</SMALL></CODE> sont-elles si lentes&nbsp;?</H4>
<P>Dans les versions précédant la 7.4, les sous-requêtes ont été jointes avec
des jointures externes en parcourant séquentiellement le résultat de la
sous-requête pour chaque ligne de la requête externe. Si la sous-requête
renvoit quelques lignes et que la requête externe en renvoit plein,
<CODE><SMALL>IN</SMALL></CODE> sera plus rapide. Pour accélérer les autres
requêtes, remplacez <CODE>IN</CODE> avec <CODE>EXISTS</CODE>&nbsp;:</P>
<PRE> SELECT *
FROM table
WHERE colonne IN (SELECT souscolonne FROM soustable);
</PRE>
to:
<PRE> SELECT *
FROM table
WHERE EXISTS (SELECT souscolonne FROM soustable WHERE souscolonne = colonne);
</PRE>
Pour que ceci soit rapide, <CODE>souscolonne</CODE> doit être une colonne
indexée.
<P>A partir de la version 7.4, <CODE>IN</CODE> utilise actuellement les mêmes
techniques sophistiquées de jointures comme des requêtes normales et est
préféré à l'utilisation de <CODE>EXISTS</CODE>.</P>
<H4><A name="4.23">4.23</A>) Comment puis-je réaliser une jointure
externe&nbsp;?</H4>
<P>PostgreSQL supporte les jointures externes en utilisant la syntaxe SQL
standard. Voici deux exemples&nbsp;:</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>Ces requêtes identiques joignent t1.col à t2.col et renvoient toute
colonne non jointe de t1 (celles sans correspondance dans t2). Une jointure
droite (<SMALL>RIGHT join</SMALL>) ajoutera les lignes non jointes de t2.
Une jointure complète (<SMALL>FULL join</SMALL>) renverra les lignes
correspondantes ainsi que les lignes non jointes de t1 et t2. Le mot clé
<SMALL>OUTER</SMALL> est optionnelle et assumé dans le cas de jointure
<SMALL>LEFT</SMALL>, <SMALL>RIGHT</SMALL> et <SMALL>FULL</SMALL>. Les
jointures ordinaires sont appelées des jointures <SMALL>INNER</SMALL>.</P>
<P>Lors des précédentes versions, les jointures externes peuvent être
simulées en utilisant <SMALL>UNION</SMALL> et <SMALL>NOT IN</SMALL>. Par
exemple, lors d'une jointure de <I>tab1</I> et <I>tab2</I>, la requête
suivante réalise une jointure externe, <I>outer</I>, des deux tables&nbsp;:<BR>
<BR>
</P>
<PRE>
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
</PRE>
<H4><A name="4.24">4.24</A>) Comment puis-je lancer des requêtes utilisant
plusieurs bases de données&nbsp;?</H4>
<P>Il n'existe pas de moyens de lancer des requêtes sur une autre base que
la courante. Comme PostgreSQL charge des catalogues systèmes spécifiques à
la base de données, sa réaction aux requêtes inter-base de données est
incertaine.</P>
<P><I>contrib/dblink</I> permet les requêtes entre bases de données en
utilisant des fonctions. Bien sûr un client peut réaliser des connexions
simultanées à plusieurs bases de données et joindre les résultats du côté
client.</P>
<H4><A name="4.25">4.25</A>) Comment puis-je renvoyer plusieurs lignes ou
colonnes à partir d'une fonction?</H4>
<P>A partir de la 7.3, vous pouvez facilement renvoyer plusieurs lignes ou
colonnes à partir d'une fonction,
<a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">
http://techdocs.postgresql.org/guides/SetReturningFunctions</a>.</P>
<H4><A name="4.26">4.26</A>) Pourquoi ne puis-je pas créer/supprimer des
tables temporaires dans les fonctions PL/PgSQL de façon stable&nbsp;?</H4>
<P>PL/PgSQL cache le contenu des fonctions et un effet de bord malheureux est
que si une fonction PL/PgSQL accède à une table temporaire, que cette table
est ensuite supprimée et recréée, et que la fonction est appelée de nouveau,
la fonction échouera car le contenu de la fonction cachée pointera toujours
vers l'ancienne table temporaire. La solution revient à utiliser
<SMALL>EXECUTE</SMALL> pour l'accès aux tables temporaires avec PL/PgSQL.
Ceci obligera l'analyse de la requête à chaque fois.</P>
<H4><A name="4.27">4.27</A>) Quelles options de cryptage sont
disponibles&nbsp;?
</H4>
<UL>
<LI><I>contrib/pgcrypto</I> contient de nombreuses fonctions de cryptage, à
utiliser dans des requêtes <SMALL>SQL</SMALL>.</LI>
<LI>Pour crypter une transmission entre le client et le serveur, le serveur
doit avoir positionné l'option <I>ssl</I> à <I>true</I> dans <I>postgresql.conf,
</I> et un enregistrement applicable <I>host</I> ou <I>hostssl</I> doit
exister dans <I>pg_hba.conf</I>, et le <I>sslmode</I> du client ne doit pas
être <I>désactivée</I>. Notez qu'il est aussi possible d'utiliser un
transport crypté d'une troisième partie, tel que stunnel ou ssh, plutôt que
les connexions SSL natives de PostgreSQL.</LI>
<LI>Les mots de passe des utilisateurs sont automatiquement cryptés depuis
la version 7.3. Pour les versions précédentes, vous devez activer l'option
<I>PASSWORD_ENCRYPTION</I> dans <I>postgresql.conf</I>.</LI>
<LI>Le serveur peut fonctionner avec un système de fichiers cryptés.</LI>
</UL>
<HR>
<H2 align="center">Etendre PostgreSQL</H2>
<H4><A name="5.1">5.1</A>) J'ai écrit une fonction utilisateur. Lorsque je l'exécute avec
<I>psql</I>, pourquoi cela finit-il avec un <I>dump core</I>&nbsp;?</H4>
<P>Il peut y avoir plusieurs raisons. Essayez tout d'abord votre fonction utilisateur
dans un programme de test.</P>
<H4><A name="5.2">5.2</A>) Comment puis-je ajouter de bons nouveaux
types ou fonctions à PostgreSQL&nbsp;?</H4>
<P>Envoyez vos extensions à la liste de diffusion <I>pgsql-hackers</I>,
elles atterriront éventuellement dans le sous-répertoire <I>contrib/</I>.</P>
<H4><A name="5.3">5.3</A>) Comment faire pour écrire une fonction C
qui renvoie un tuple&nbsp;?</H4>
<P>Dans les versions de PostgreSQL à partir de 7.3, les fonctions qui
renvoient une table sont totalement supportées en C, PL/PgSQL, et SQL. Voir
le Guide du Programmeur pour plus d'information. Un exemple de fonction
renvoyant une table définie en C se trouve à
<I>contrib/tablefunc</I>.</P>
<H4><A name="5.4">5.4</A>) J'ai modifié un fichier source. Pourquoi
ma recompilation ne voit-elle pas les modifications&nbsp;?</H4>
<P>Les <I>Makefiles</I> n'ont pas les dépendances adéquates pour les
fichiers d'en-tête. Il vous faut faire <I>make clean</I> puis un autre
<I>make</I>. Si vous utilisez <SMALL>GCC</SMALL>, vous pouvez utiliser
l'option <I>--enable-depend</I> de <I>configure</I> pour que le
compilateur calcule les dépendances automatiquement.</P>
</BODY>
</HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PostgreSQL FAQ</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF0000" vlink="#A00000" alink="#0000FF">
<h1>Häufig gestellte Fragen (FAQ) zu PostgreSQL</h1>
<p>Current maintainer: Bruce Momjian (<a href="mailto:bruce@momjian.us">bruce@momjian.us</a>).</p>
<p>Deutsche Übersetzung von Ian Barwick (<a href="mailto:barwick@gmail.com">barwick@gmail.com</a>).</p>
<p>Letzte Aktualisierung der deutschen Übersetzung: Fr., den 19.10.2007, 17:00 MEZ</p>
<p>Die aktuellste Version dieses Dokuments liegt auf der PostgreSQL-Website:</p>
<ul>
<li><a href="http://www.postgresql.org/docs/faqs.FAQ.html">http://www.postgresql.org/docs/faqs.FAQ.html</a> (engl.)</li>
<li><a href="http://www.postgresql.org/docs/faqs.FAQ_german.html">http://www.postgresql.org/docs/faqs.FAQ_german.html</a> (dt.)</li>
</ul>
<p>Übersetzungen dieses Dokuments in anderen Sprachen sowie plattform-
spezifische FAQs können unter
<a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>
eingesehen werden.</p>
<hr />
<h2 align="center">Allgemeine Fragen</h2>
<a href="#1.1">1.1</a>) Was ist PostgreSQL? Wie wird es ausgesprochen?<br />
<a href="#1.2">1.2</a>) Wer kontrolliert PostgreSQL?<br />
<a href="#1.3">1.3</a>) Welchem Copyright unterliegt PostgreSQL?<br />
<a href="#1.4">1.4</a>) Auf welchen Plattformen läuft PostgreSQL?<br />
<a href="#1.5">1.5</a>) Woher bekomme ich PostgreSQL?<br />
<a href="#1.6">1.6</a>) Was ist die neueste Version von PostgreSQL?<br />
<a href="#1.7">1.7</a>) Wo bekomme ich Support für PostgreSQL?<br />
<a href="#1.8">1.8</a>) Wie kann ich einen Fehlerbericht abgeben?<br />
<a href="#1.9">1.9</a>) Wie erfahre ich von bekannten Bugs oder fehlenden Features?<br />
<a href="#1.10">1.10</a>) Welche Dokumentation ist für PostgreSQL verfügbar?<br />
<a href="#1.11">1.11</a>) Wie kann ich SQL lernen?<br />
<a href="#1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?<br />
<a href="#1.13">1.13</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?<br />
<a href="#1.14">1.14</a>) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar?<br />
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
<a href="#2.1">2.1</a>) Welche Schnittstellen gibt es für PostgreSQL?<br />
<a href="#2.2">2.2</a>) Wie kann man PostgreSQL mit einer Website nutzen?<br />
<a href="#2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle?<br />
<h2 align="center">Administrative Fragen</h2>
<a href="#3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?<br />
<a href="#3.2">3.2</a>) Wie regle ich Zugriffe von anderen Rechnern?<br />
<a href="#3.3">3.3</a>) Wie kann ich eine bessere Performanz erreichen?<br />
<a href="#3.4">3.4</a>) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?<br />
<a href="#3.5">3.5</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine Verbindung aufzubauen versuche. Warum?<br />
<a href="#3.6">3.6</a>) Wie wird PostgreSQL aktualisiert?<br />
<a href="#3.7">3.7</a>) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?<br />
<h2 align="center">Fragen zum Betrieb</h2>
<a href="#4.1">4.1</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die ersten paar
Zeilen bzw. eine beliebige Zeile in einer Abfrage aus?<br />
<a href="#4.2">4.2</a>) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder
Benutzer in der Datenbank definiert sind? Wie bekomme ich die von <em>psql</em> verwendeten
Abfragen?<br />
<a href="#4.3">4.3</a>) Wie ändere ich den Datentyp einer Spalte?<br />
<a href="#4.4">4.4</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?<br />
<a href="#4.5">4.5</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
Textdatei abzuspeichern?<br />
<a href="#4.6">4.6</a>) Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum?<br />
<a href="#4.7">4.7</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
Abfrage auswertet?<br />
<a href="#4.8">4.8</a>) 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?<br />
<a href="#4.9">4.9</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?<br />
<a href="#4.10">4.10</a>) Was ist der Unterschied zwischen den verschiedenen <small>CHAR</small>-Typen?<br />
<a href="#4.11.1">4.11.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wertes?<br />
<a href="#4.11.2">4.11.2</a>) Wie bekomme ich den Wert einer SERIAL-Sequenz?<br />
<a href="#4.11.3">4.11.3</a>) Führt currval() zu einer Race-Condition mit anderen Nutzern?<br />
<a href="#4.11.4">4.11.4</a>) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
Sequenz-/<small>SERIAL</small>-Spalte?<br />
<a href="#4.12">4.12</a>) Was ist ein <small>OID</small>? Was ist ein <small>CTID</small>?<br />
<a href="#4.13">4.13</a>) Wieso bekomme ich den Fehler: "<em>FATAL: Memory exhausted in AllocSetAlloc()</em>"?<br />
<a href="#4.14">4.14</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?<br />
<a href="#4.15">4.15</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
die aktuelle Uhrzeit enthalten soll?<br />
<a href="#4.16">4.16</a>) Wie führe ich eine <small>OUTER JOIN</small> durch?<br />
<a href="#4.17">4.17</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?<br />
<a href="#4.18">4.18</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
zurückgeben lassen?<br />
<a href="#4.19">4.19</a>) Warum bekomme ich eine Fehlermeldung wie <br />
"relation with OID ##### does not exist" wenn ich temporäre Tabellen in<br />
PL/PgSQL-Funktionen benutze?<br />
<a href="#4.20">4.20</a>) Welche Replikationslösungen gibt es?<br />
<a href="#4.21">4.21</a>) Warum werden die Tabellen- und Spaltennamen in meiner
Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt?<br />
<hr />
<h2 align="center">Allgemeine Fragen</h2>
<h3><a name="1.1">1.1</a>) Was ist PostgreSQL? Wie wird es ausgesprochen?</h3>
<p>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:
<a href="http://www.postgresql.org/files/postgresql.mp3">http://www.postgresql.org/files/postgresql.mp3</a>
</p>
<p>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.</p>
<p>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:
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a>
wenn Sie an einer Mitarbeit interessiert sind.</p>
<h3><a name="1.2">1.2</a>) Wer kontrolliert PostgreSQL?</h3>
<p>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:
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a>
wenn Sie an der PostgreSQL-Entwicklung teilnehmen möchten).</p>
<h3><a name="1.3">1.3</a>) Welchem Copyright unterliegt PostgreSQL?</h3>
<p>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:</p>
<p>PostgreSQL Data Base Management System</p>
<P>Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 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>
<p>Es gilt die Copyright-Klausel im Original!</p>
<h3><a name="1.4">1.4</a>) Auf welchen Plattformen läuft PostgreSQL?</h3>
<p>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.</p>
<p>PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen
wie Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes Installationspaket
kann von <a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a> heruntergeladen werden.
DOS-basierte Windows-Versionen (Win95, Win98, WinMe) können PostgreSQL nur mit
Hilfe der Cygwin-Umgebung ausführen.</p>
<p>Eine Portierung für Novell Netware 6 gibt es unter <a href="http://forge.novell.com">http://forge.novell.com</a> sowie eine OS/2 (eComStation) version unter
<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&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F</a>.</p>
<h3><a name="1.5">1.5</a>) Woher bekomme ich PostgreSQL?</h3>
<p>Per Web-Browser hier: <a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a>
und per FTP hier: <a href="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a>.</p>
<h3><a name="1.6">1.6</a>) Was ist die neueste Version von PostgreSQL?</h3>
<p>Die neueste Version von PostgreSQL ist 8.2.5.</p>
<p>Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere
Korrekturversionen alle paar Monaten.</p>
<h3><a name="1.7">1.7</a>) Wo bekomme ich Support für PostgreSQL?</h3>
<p>Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die Web-Seite
<a href="http://www.postgresql.org/community/lists/">http://www.postgresql.org/community/lists/</a> bietet einen Überblick.
Die Listen <i>general</i> und <i>bugs</i> bieten einen guten Einstieg.</p>
<p>Eine deutschsprachige Mailing-Liste gibt es hier:
<a href="http://archives.postgresql.org/pgsql-de-allgemein/">http://archives.postgresql.org/pgsql-de-allgemein/</a>.</p>
<p>Der wichtigsten IRC-Channel ist <em>#postgresql</em> auf Freenode
(<em>irc.freenode.net</em>). Unter UNIX/Linux können Sie mit z.B.
<small>irc -c '#postgresql' "$USER" irc.freenode.net.</small>
daran teilnehmen. Auf Freenode gibt es einen spanischsprachigen Channel
<em>#postgresql-es</em>, einen französischen, <em>#postgresqlfr</em> sowie einen brasilianischen, <em>#postgresql-br</em> .
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.</p>
<p>Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller
Basis leisten, kann unter
<a href="http://www.postgresql.org/support/professional_support">http://www.postgresql.org/support/professional_support</a>
eingesehen werden.</p>
<h3><a name="1.8">1.8</a>) Wie kann ich einen Fehlerbericht abgeben?</h3>
<p>Nutzen Sie das Formular unter <a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>.
Schauen Sie aber vorher unter <a href="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a> nach,
ob es mittlerweile eine neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.</p>
<p>Bugs, die über das Formular bzw. eine der Mailing-Listen bekanntgegeben wurden,
erhalten typischerweise einer der folgenden Reaktionen:</p>
<ul>
<li>es ist kein Bug, der Grund wird benannt</li>
<li>es ist ein bereits bekannter Bug, der bereits auf der
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste aufgenommen wurde</li>
<li>der Bug wurde in der aktuellen Version behoben</li>
<li>der Bug wurde bereits behoben, befindet sich aber noch nicht in
einer offiziell veröffentlichten Version</li>
<li>es wird um eingehendere Informationen gebeten, z.B.:
<ul>
<li>Betriebssystem</li>
<li>PostgreSQL-Version</li>
<li>reproduzierbarer Fallbeispiel</li>
<li>Debugging-Information</li>
<li>Debugger-Backtrace-Ausgabe</li>
</ul>
</li>
<li>der Bug ist neu. Folgendes könnte passieren:
<ul>
<li>ein Patch wird erstellt und in der nächsten Version
eingebaut;</li>
<li>oder der Bug kann nicht sofort behoben werden und wird auf die
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste gesetzt</li>
</ul>
</li>
</ul>
<h3><a name="1.9">1.9</a>) Wie erfahre ich von bekannten Bugs oder fehlenden Features?</h3>
<p>PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe
unsere TODO-Liste unter <a href="http://www.postgresql.org/docs/faqs.TODO.html">http://www.postgresql.org/docs/faqs.TODO.html</a> für eine Auflistung
der bekannten Bugs, fehlenden Features und zukünftigen Pläne.</p>
<p>Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der
folgenden Antworten:</p>
<ul>
<li>das Feature ist bereits auf der <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste</li>
<li>das Feature ist nicht wünschenswert, weil:
<ul>
<li>es vorhandene Funktionalität dupliziert, welche bereits dem
SQL-Standard folgt</li>
<li>es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte
Vorteile zu bringen</li>
<li>es wäre unsicher bzw. unzuverlässig</li>
</ul>
</li>
<li>das neue Feature wird der <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>-Liste hinzugefügt</li>
</ul>
<p>PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter
erwiesen hat, E-Mails direkt zu beantworten und die <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-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 <a href="http://www.postgresql.org/developer/sourcecode/">CVS</a>-Log-Meldungen.
Auch die Release-Notes listen nicht jede Änderung in der Software auf.</p>
<h3><a name="1.10">1.10</a>) Welche Dokumentation ist für PostgreSQL verfügbar?</h3>
<p>PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das <em>/doc</em>-
Verzeichnis. Ausserdem sind alle Handbücher online unter <a href="http://www.postgresql.org/docs/">http://www.postgresql.org/docs/</a>
verfügbar.</p>
<p>Zwei Bücher zu PostgreSQL sind online verfügbar unter
<a href="http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</a> und
<a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a> .</p>
<p>Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter
<a href="http://www.postgresql.org/docs/books">http://www.postgresql.org/docs/books</a>
Diverse technische Artikel befinden sich unter
<a href="http://www.postgresql.org/docs/techdocs">http://www.postgresql.org/docs/techdocs</a> .</p>
<p><em>psql</em> hat einige nützliche <em>\d</em>-Befehle, um Informationen über Typen,
Operatoren, Funktionen, Aggregate, usw. zu zeigen. </p>
<p>Die PostgreSQL-Website enthält noch mehr Dokumentation.</p>
<h3><a name="1.11">1.11</a>) Wie kann ich <small>SQL</small> lernen?</h3>
<p>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).</p>
<p>Es gibt ausserdem einige nützliche Online-Tutorials:</p>
<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><a name="1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?</h3>
<p>Lesen Sie in der Entwickler-FAQ unter <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a> nach.
<h3><a name="1.13">1.13</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?</h3>
<p>Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,
Performanz, Zuverlässigkeit, Support und Preis.</p>
<dl>
<dt><b>Eigenschaften</b></dt>
<dd><p>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.</p>
</dd>
<dt><b>Performanz</b></dt>
<dd><p>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%.</p>
</dd>
<dt><b>Zuverlässigkeit</b></dt>
<dd><p>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.</p>
</dd>
<dt><b>Support</b></dt>
<dd><p>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 <a href="#1.7">1.7</a>).</p>
</dd>
<dt><b>Preis</b></dt>
<dd><p>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.</p>
</dd>
</dl>
<h3><a name="1.14">1.14</a>) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar?</h3>
<p>Ä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.</p>
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
<h3><a name="2.1">2.1</a>) Welche Schnittstellen gibt es für PostgreSQL?</h3>
<p>Die PostgreSQL-Installation stellt nur Schnittstellen für <code>C</code> und
<code>Embedded C</code> 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.</p>
<p>Einige Programmiersprachen wie <code>PHP</code> haben eine PostgreSQL-
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie <code>Perl</code>, <code>TCL</code>,
<code>Python</code> und viele anderen sind unter <a href="http://gborg.postgresql.org">http://gborg.postgresql.org</a>
im Bereich <em>Drivers/Interfaces</em> verfügbar sowie per Internet-Suche.</p>
<h3><a name="2.2">2.2)</a> Wie kann man PostgreSQL in einer Website nutzen?</H3>
<p>Eine nette Einführung zu datenbank-gestützten Webseiten kann unter
<a href="http://www.webreview.com"> http://www.webreview.com</a> (engl.) eingesehen werden.</p>
<p>Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle.
PHP gibt es bei <a href="http://www.php.net">http://www.php.net</a></p>
<p>Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm
oder mod_perl.</p>
<h3><a name="2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle?</h3>
<p>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 <a href="http://www.postgresql.org/docs/techdocs.54">http://www.postgresql.org/docs/techdocs.54</a> .</p>
<hr />
<h2 align="center">Administrative Fragen</h2>
<h3><a name="3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?</h3>
<p>Bei der Ausführung von <em>configure</em> die Option <em>--prefix</em> mit dem Zielverzeichnis
angeben.</p>
<h3><a name="3.2">3.2</a>) Wie regle ich Zugriffe von anderen Rechnern?</h3>
<p>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 <em>postgresql.conf</em> die Einstellung <tt>listen_addresses</tt>
anpassen, in der Datei <em>$PGDATA/pg_hba.conf</em> host-basierte
Authentifizierung einschalten und den Server neu starten.</p>
<h3><a name="3.3">3.3</a>) Wie kann ich eine bessere Performanz erreichen?</h3>
<p>Es gibt drei große Bereiche, in denen Performanzverbesserungen
erzielt werden können:</p>
<dl>
<dt><b>Abfrageoptimierung</b></dt>
<dd>Die Modifizierung von Abfragen kann eine bessere Performanz
erzielen:
<ul>
<li>Erstellung von Indexen, einschliesslich partieller Indexe
sowie Expressionsindexe</li>
<li>Einsatz von <tt>COPY</tt> anstelle multipler <tt>INSERT</tt>-Anweisungen</li>
<li>Gruppierung von mehreren Abfragen innerhalb einer Transaktion,
um Aufwand beim Abschluss von Transaktionen einzusparen</li>
<li>Einsatz von <tt>CLUSTER</tt> beim Holen von einer großen Anzahl
von Datenreihen aus einem Index</li>
<li>Einsatz von <tt>LIMIT</tt>, um eine Untermenge der Abfragen-
ergebnisse zurückzuliefern</li>
<li>Einsatz von vorbereiteten Befehlen (prepared queries)</li>
<li>Einsatz von <tt>ANALYZE</tt>, um die Datenbankstatistik für
den Abfragenplaner aktuell zu halten</li>
<li>Regelmäßiger Einsatz von <tt>VACUUM</tt> bzw. <em>pg_autovacuum</em></li>
<li>Bei großen Datenveränderungen die Löschung von Indexen</li>
</ul><br/>
<br/>
</dd>
<dt><b>Server-Konfiguration</b></dt>
<dd>Einige Einstellungen in der Datei <em>postgresql.conf</em>
wirken auf die Performanz aus. Das Handbuch enthält unter
<a href="http://www.postgresql.org/docs/current/static/runtime-config.html">http://www.postgresql.org/docs/current/static/runtime-config.html</a> eine
komplette Auflistung. Kommentare zu den jeweiligen Einstellungen
gibt es unter
<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>
und <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>Hardware-Auswahl</b></dt>
<dd>Die Auswirkung von Hardware auf Performanz wird unter
<a href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">http://momjian.us/main/writings/pgsql/hw_performance/index.html</a> und
<a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a> erläutert.
<br/>
<br/>
</dd>
</dl>
<h3><a name="3.4">3.4</a>) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?</h3>
<p>Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche
<tt>log_*</tt>-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests sehr
nützlich sein.</p>
<h3><a name="3.5">3.5</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine
Verbindung aufzubauen versuche. Warum?</h3>
<p>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
<em>postgresql.conf</em> den Wert <tt>max_connections</tt> ändern und
den Server neustarten.</p>
<h3><a name="3.6">3.6</a>) Wie wird PostgreSQL aktualisiert?</h3>
<p>Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf der
Seite <a href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>.
Detaillierte technische Informationen gibt es auf der Seite
<a href="http://www.postgresql.org/docs/current/static/install-upgrading.html">http://www.postgresql.org/docs/current/static/install-upgrading.html</a>
</p>
<!--
<p>Zwischen "kleinen" PostgreSQL-Versionsänderungen (z.B. zwischen
7.4.8 und 7.4.9) werden nur Bugs behoben, wodurch ein erneutes Aus-
und Einlesen der Daten nicht erforderlich ist. Es müssen lediglich die
neue Software installiert sowie der Server neugestartet werden.</p>
<p>Alle Nutzer sollten sobald wie möglich die neueste "kleine"
Version installieren. Zwar birgt eine Server-Aktualisierung immer
einige Risiken, doch die "kleinen" Versionsänderungen zielen darauf,
mit dem kleinsten Risiko die häufigsten Bugs zu beheben. Allgemein
wird es als riskanter betrachtet, <em>nicht</em> zu aktualisieren
als zu aktualisieren.</p>
<p>Bei "großen" Versionsänderungen (z.B. zwischen 7.3 und 7.4) wird
oft das interne Format der Systemtabellen und Datendateien
angepasst. Diese Änderungen sind oft sehr komplex, wodurch die
Rückwärtskompatibilität der Datendateien nicht gewährleistet werden kann.
Bei der Aktualisierung zwischen "großen" Versionen muss die
Datenbank exportiert und neu importiert werden.</p>
-->
<h3><a name="3.7">3.7</a>) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?</h3>
<p>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.
</p>
<hr />
<h2 align="center">Fragen zum Betrieb</h2>
<h3><a name="4.1">4.1</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die ersten paar
Zeilen bzw. eine beliebige Zeile in einer Abfrage aus?</h3>
<p>Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden
Reihen bereits kennen, nutzen Sie <tt>LIMIT</tt>. Wenn die <tt>ORDER BY</tt>-
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 <tt>FETCH</tt>.
<p>Um eine beliebige Zeile auszuwählen, nutzen Sie <small>ORDER BY random()</small>:</p>
<pre>
SELECT spalte
FROM tabelle
ORDER BY random()
LIMIT 1
</pre>
<h3><a name="4.2">4.2</a>) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder
Benutzer in der Datenbank definiert sind? Wie bekomme ich die von <em>psql</em> verwendeten Abfragen?</h3>
<p>In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere psql-Befehle
lassen sich mit \? anzeigen. Sie können sich die Datei <em>pgsql/src/bin/psql/describe.c</em>
mit dem Quellcode für <em>psql</em> ansehen. Sie enthält die <small>SQL</small>-Abfragen, die die
Backslash-Kommandos (\) ausführen. Sie können <em>psql</em> auch mit der <em>-E</em>
Option starten. Danach gibt <em>psql</em> die Abfragen aus, die es bei der Ausführung der Befehle
benutzt. Außerdem biete PostgreSQL ein <small>SQL</small>-kompatibles INFORMATION SCHEMA,
das Metainformation über die Datenbank zur Verfügung stellt.</p>
<p>Mit <tt>psql -l</tt> können Sie alle Datenbanken anzeigen lassen.</p>
<p>Die Datei <em>pgsql/src/tutorial/syscat.source</em> enthält außerdem viele <small>SELECT</small>-
Abfragen, mit deren Hilfe man Information über die Systemtabellen erhalten kann.</p>
<h3><a name="4.3">4.3</a>) Wie ändere ich den Datentyp einer Spalte?</h3>
<p>Ab Version 8.0 kann der Datentyp einer Spalte mit <tt>ALTER TABLE ALTER COLUMN TYPE</tt>
geändert werden, sofern der neue Datentyp die Werte des alten Datentype aufnehmen
kann.</p>
<p>Bei früheren Versionen gehen Sie wie folgt vor:</p>
<pre>
BEGIN;
ALTER TABLE <em>tabelle</em> ADD COLUMN <em>neue_spalte</em> <em>neuer_datentyp</em>;
UPDATE <em>tabelle</em> SET <em>neue_spalte</em> = CAST(<em>alte_spalte</em> AS <em>neuer_datentyp</em>);
ALTER TABLE <em>tabelle</em> DROP COLUMN <em>alte_spalte</em>;
COMMIT;
</pre>
<p>Um den Speicherplatz freizugeben, der von der gelöschten Spalte verwendet
wurde, führen Sie <small>VACUUM FULL</small> aus.</p>
<h3><a name="4.4">4.4</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?</h3>
<p>Es bestehen folgende Obergrenzen:</p>
<pre>
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
</pre>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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 <small>UNIQUE</small>-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.</p>
<h3><a name="4.5">4.5</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
Textdatei abzuspeichern? </h3>
<p>Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen Textdatei
bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe der Datei
beanspruchen.</p>
<p>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:</p>
<pre>
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
</pre>
<p>Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB), also:</p>
<pre>
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)
</pre>
<p>Indexe beanspruchen nicht so viel Platz. Da sie jedoch die
Daten beinhalten, die sie indizieren, können auch sie sehr groß werden.</p>
<p>NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig
Platz in Anspruch nehmen.</p>
<h3><a name="4.6">4.6</a>) Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum?</h3>
<p>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).</p>
<p>Um festzustellen, ob ein Index verwendet werden soll, braucht PostgreSQL
Statistiken über die Tabelle. Diese Statistiken werden durch die Anweisungen
<small>VACUUM ANALYZE</small> bzw. <small>ANALYZE</small> 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 <small>JOIN</small>-Reihenfolgen und
-Methoden wertvoll. Daher sollten diese regelmässig durchgeführt werden, da
sich der Inhalt einer Tabelle ja auch verändert.</p>
<p>Indexe werden normalerweise nicht in <small>ORDER BY</small>-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 <small>LIMIT</small> zusammen mit
<small>ORDER BY</small> verwendet wird, oftmals ein Index verwendet, da nur ein
kleiner Abschnitt der Tabelle zurückgeliefert wird.</p>
<p>Sollte es danach aussehen, also ob der Optimierer irrtümlich einen sequentiellen
Scan ausführt, führen Sie <small>SET enable_seqscan TO 'off'</small> aus und prüfen
Sie, ob die Indexabfrage dadurch scheller geworden ist.</p>
<p>Bei der Nutzung von Wildcard-Operatoren wie <small>LIKE</small> oder <small>~</small>, können
Indexe nur unter bestimmten Umständen verwendet werden:</p>
<ul>
<li>Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:
<ul>
<li><small>LIKE</small>-Suchmuster dürfen nicht mit <em>%</em> anfangen;</li>
<li><small>~</small> (reguläre Ausdrücke) müssen mit <em>^</em> anfangen.</li>
</ul>
</li>
<li>Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. <em>[a-e]</em>)
beginnen.</li>
<li>Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B.
<small>ILIKE</small> bzw. <small>~*</small>), verwenden keine Indexe. Stattdessen können
funktionale Indexe verwendet werden, die im Punkt <a href="#4.8">4.8</a> beschrieben werden.</li>
<li>Die Standard-Locale "C" muss während der Datenbank-Initialisierung mit <em>initdb</em>
verwendet worden sein, da andere <em>locales</em> den nächstgrößten Wert nicht
ermitteln können. Es ist allerdings möglich, einen besonderen <small>text_pattern_ops</small>-Index
für solche Fälle zu erstellen.</li>
</ul>
<p>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 <small>INT2</small>, <small>INT8</small> und <small>NUMERIC</small></p>
<h3><a name="4.7">4.7</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
Abfrage auswertet?</h3>
<p>Vgl. die <em>EXPLAIN</em> Man-Page.</p>
<h3><a name="4.8">4.8</a>) 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?</h3>
<p>Der Operator <em>~</em> wendet einen regulären Ausdruck an und <em>~*</em> wendet ihn an, ohne die Groß- und Kleinschreibung zu beachten.
Ebenso beachtet <small>LIKE</small> die Groß- und Kleinschreibung, und <small>ILIKE</small> nicht.</p>
<p>Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren, werden
in der Regel so ausgedruckt:</p>
<pre>
SELECT *
FROM tabelle
WHERE LOWER(spalte) = 'abc'
</pre>
<p>Hier wird kein normaler Index benutzt. Legt man hingegen einen funktionalen
Index an, so wird er auf jeden Fall verwendet:</p>
<pre>
CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))
</pre>
<p>Falls der obige Index als einen <small>UNIQUE</small>-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 <small>CHECK</small>-Constraint oder ein Trigger
eingesetzt werden.</p>
<h3><a name="4.9">4.9</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?
Kann nach der NULL-Belegung sortiert werden?</h3>
<p>Testen Sie die Spalte mit <small>IS NULL</small> bzw. <small>IS NOT NULL</small>.</p>
<pre>
SELECT *
FROM tabelle
WHERE spalte IS NULL
</pre>
<p>Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht,
verwenden Sie die Bedingungen <small>IS NULL</small> bzw. <small>IS NOT NULL</small>
in der <small>ORDER BY</small>-Klausel. Da Bedingungen, die wahr sind, höher
als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die
<small>NULL</small>-Spalten zuerst gelistet werden:</p>
<pre>
SELECT *
FROM tabelle
ORDER BY (spalte IS NOT NULL)
</pre>
<h3><a name="4.10">4.10</a>) Was ist der Unterschied zwischen den verschiedenen <small>CHAR</small>-Typen?</h3><pre>
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
</pre>
<p>Der <em>interne Name</em> kommt vor allem in den Systemkatalogen und in manchen
Fehlermeldungen vor.</p>
<p>Die ersten vier Typen sind "<em>varlena</em>"-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 <small>TOAST</small>-
Verfahren angewendet, womit der tatsächlich belegte Platz auch geringer
als erwartet ausfallen kann.</p>
<p>Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich <small>VARCHAR(n)</small>.
Die maximale Länge eines <small>VARCHAR(n)</small>-Felds wird bei der Tabellendefinition
festgelegt. <small>TEXT</small> setzt keine Längengrenze, allerdings gibt es
eine systembedingte Obergrenze von 1 GB. </p>
<p><small>CHAR(n)</small> ist geeignet für die Speicherung von Zeichenketten, die alle
die gleiche Länge haben. Bitte beachten Sie, dass <small>CHAR(n)</small> automatisch Zeichenketten
bis zur definierten Feldlänge mit Leerzeichen ausfüllt, während bei <small>VARCHAR(n)</small> nur
die tatsächlich eingegebene Zeichenkette gespeichert wird.</p>
<p><small>BYTEA</small> ist für binäre Daten, besonders für Werte, die <small>NULL</small>-Bytes haben. </p>
<p>Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften auf.</p>
<h3><a name="4.11.1">4.11.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des
Wert?</h3>
<p>PostgreSQL bietet einen <small>SERIAL</small>-Datentyp. Dieser erzeugt automatisch
eine Sequenz auf die angegebene Spalte. Zum Beispiel:</p>
<pre>
CREATE TABLE person (
id SERIAL,
name TEXT
)</pre>
<p>wird automatisch in:</p>
<pre>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</pre><p>umgewandelt.</p>
<p>Die <em>create_sequence</em> Man-Page liefert weitere Informationen über Sequenzen.</p>
<h3><a name="4.11.2">4.11.2</a>) Wie bekomme ich den Wert einer <small>SERIAL</small>-Sequenz?</h3>
<p>Eine Möglichkeit wäre, mit der <em>nextval()</em>-Funktion den nächsten <small>SERIAL</small>-Wert
von dem Sequenzobjekt vor der Auszuführung einer <small>INSERT</small>-Anweisung anzufordern und ihn
dann explizit in die <small>INSERT</small>-Anweisung einzubinden. Anhand der Beispieltabelle in
<a href="#4.11.1">4.11.1</a> könnte dieser Vorgang in einer Pseudosprache so aussehen:</p>
<pre>
new_id = output of execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</pre>
<p>Danach stünde der neue Wert in der Variablen <em>new_id</em> 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 <small>SEQUENCE</small>-Objektes folgenden Name hat:
<em>«table»_«serialcolumn»_seq</em>
wobei '<em>table</em>' und '<em>serialcolumn</em>' die Namen der jeweils betreffenden
Tabelle / Spalte darstellen.</p>
<p>Als weitere Möglichkeit können Sie nach einer <small>INSERT</small>-Anweisung den
automatisch eingefügten <small>SERIAL</small>-Wert mit der <em>currval()</em>-Funktion zurückgeben
lassen:</p>
<pre>
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
new_id = output of execute("SELECT currval('person_id_seq')");
</pre>
<h3><a name="4.11.3">4.11.3</a>) Führt <em>currval()</em> zu einer Race-Condition mit anderen
Nutzern?</h3>
<p>Nein. <em>currval()</em> liefert einen Wert zurück, der von Ihrer
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur Verfügung
steht.</p>
<h3><a name="4.11.4">4.11.4</a>) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
Sequenz-/<small>SERIAL</small>-Spalte?</h3>
<p>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.</p>
<h3><a name="4.12">4.12</a>) Was ist ein <small>OID</small>? Was ist ein <small>CTID</small>?</h3>
<p>Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige <small>OID</small>,
sofern die Tabelle nicht mit der Option <small>WITHOUT OIDS</small> angelegt wurde.
<small>OID</small>s 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 <small>OID</small>s, um seine
interne Systemtabellen zu verbinden.</p>
<p>Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings
empfohlen, statt <small>OID</small>s Werte zu verwenden, die von<small>SERIAL</small>-
Sequenzen erzeugt werden. <small>SERIAL</small>-Sequenzen sind innerhalb einer
Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können
8-Byte-Sequenzwerte mit <small>SERIAL8</small> erzeugt werden.</p>
<p><small>CTID</small>s werden benutzt, um bestimmte physikalische Zeilen
durch Block und Offset Werte zu identifizieren. <small>CTID</small>s
verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie
werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu
zeigen.</p>
<h3><a name="4.13">4.13</a>) Wieso bekomme ich einen Fehler: "<em>ERROR: Memory exhausted in
AllocSetAlloc()</em>"?</h3>
<p>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 <em>postmaster</em> folgendes:</p>
<pre>
ulimit -d 262144
limit datasize 256m
</pre>
<p>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.</p>
<h3><a name="4.14">4.14</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?</h3>
<p>Geben Sie in <em>psql</em> <small>SELECT VERSION();</small> ein.</p>
<h3><a name="4.15">4.15</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
die aktuelle Uhrzeit enthalten soll?</h3>
<p>Dazu verwenden Sie <small>CURRENT_TIMESTAMP</small>:</p>
<pre>
CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</pre>
<h3><a name="4.16">4.16</a>) Wie führe ich eine <small>OUTER JOIN</small> durch?</h3>
<p>PostgreSQL unterstützt <small>OUTER JOIN</small>s nach dem SQL-
Standardsyntax. Hier zwei Beispiele:</p>
<pre>
SELECT *
FROM tabelle_1 t1
LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)
</pre>
<p>bzw.:</p>
<pre>
SELECT *
FROM tabelle_1 t1
LEFT OUTER JOIN tabelle_2 t2 USING (spalte)
</pre>
<p>
Diese identischen Abfragen verknüpfen <em>tabelle_1</em> mit <em>tabelle_2</em> über die
Spalte '<em>spalte</em>' und geben außerdem alle unverknüpften Zeilen in tabelle_1
(diejenigen, die keine Entsprechung in <em>tabelle_2</em> haben) zurück.
Ein <small>RIGHT JOIN</small> würde hingegen alle unverknüpften Zeilen in tabelle_2 hinzufügen und
ein <small>FULL JOIN</small> würde alle verknüpften Zeilen sowie jeweils alle
unverknüpften Zeilen aus den beiden Tabellen zurückliefern. Die Angabe von
<small>OUTER</small> ist nicht zwingend und kann in <small>LEFT</small>, <small>RIGHT</small> und <small>FULL</small>-Verknüpfungen
weggelassen werden. Normale Verknüpfungen sind <small>INNER JOIN</small>s.</p>
<h3><a name="4.17">4.17</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?</h3>
<p>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.</p>
<p><em>contrib/dblink</em> ist eine Erweiterung, die datenbankübergreifende Abfragen über
Funktionsaufrufe ermöglicht.</p>
<h3><a name="4.18">4.18</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
zurückgeben lassen?</h3>
<p>Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:
<a href="http://www.postgresql.org/docs/techdocs.17">http://www.postgresql.org/docs/techdocs.17</a>.</p>
<h3><a name="4.19">4.19</a>) Warum bekomme ich eine Fehlermeldung wie
"relation with OID ##### does not exist" wenn ich temporäre Tabellen in
PL/PgSQL-Funktionen benutze?</h3>
<p>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 <small>EXECUTE</small> auf temporäre Tabellen zuzugreifen.
Dies bewirkt, dass bei jedem Funktionsruf die betreffende Abfrage neu
geparst wird.</p>
<p>Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht
mehr auf.</p>
<h3><a name="4.20">4.20</a>) Welche Replikationslösungen gibt es?</h3>
<p>Der Begriff "replikation" umfasst mehrere verschiedene Technologien,
jede mit eigenen Vor- und Nachteilen.</p>
<p>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 <a href="http://main.slony.info/">Slony-I</a>.</p>
<p>"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. <a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a>
ist die populärste freie Lösung für PostgreSQL.</p>
<p>Es gibt auch einige kommerzielle und hardware-basierte Replikationslösungen
für verschiedene Arten der Replikation.</p>
<h3><a name="4.21">4.21</a>) Warum werden die Tabellen- und Spaltennamen in meiner
Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt?</h3>
<p>Die häufigste Ursache ist die Verwendung von Gänsefüßchen
bei der Anlegung von Tabellen, z.B.:</p>
<pre>
CREATE TABLE "Tabelle"
("SPALTE1" INT)
</pre>
<p>Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren)
in genau der Schreibweise gespeichert (vgl. <a
href="http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">
Dokumentation</a>), was dazu führt, dass man sie danach immer
in Gänsefüßchen angeben muss. Im obigen Beispiel muss man also immer
etwa <small>SELECT * FROM "Tabelle"</small> verwenden. Um
dieses Problem zu vermeiden, müssen Sie immer eines der folgenden
Punkte beachten:</p>
<ul>
<li>bei der Tabellenanlegung keine Gänsefüßchen verwenden;</li>
<li>in Identifikatoren nur Kleinschreibung verwenden;</li>
<li>immer Identifikatoren mit Gänsefüßchen versehen</li>
</ul>
<hr />
<h3>Anmerkungen des Übersetzers</h3>
<p>Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher liegt
die Übersetzung nicht immer auf dem aktuellsten Stand.</p>
<p>Die aktuellste Version der deutschen Übersetzung befindet sich immer unter
<a href="http://sql-info.de/de/postgresql/FAQ_german.html">http://sql-info.de/de/postgresql/FAQ_german.html</a>.
Diese "Arbeitsversion" enthält eventuell Änderungen, die noch nicht auf der
PostgreSQL-Website eingebunden worden sind.</p>
<p>Ü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.</p>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="content-type">
<title>PostgreSQL GYIK</title>
</head>
<body>
<br>
<div style="text-align: center;">
<h1>PostgreSQL GyIK</h1>
<br>
</div>
<br>
<pre>Utols&oacute; m&oacute;dos&iacute;t&aacute;s d&aacute;tuma: 2005 m&aacute;jus 9.</pre>
<pre>Ford&iacute;t&aacute;s aktualiz&aacute;l&aacute;sa: 2005 j&uacute;nius</pre>
<pre><br>
A GyIK karbantart&oacute;ja: Bruce Momjian (<a
href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)</pre>
<pre>Ford&iacute;t&oacute;: Horny&aacute;k L&aacute;szl&oacute;<br>(<a
href="mailto:laszlo.hornyak.nospam@gmail.com">laszlo.hornyak.nospam@gmail.com</a>)</pre>
<pre><br>
A legfrissebb verzi&oacute; itt &eacute;rhet&otilde; el (angol):</pre>
<pre><a href="http://www.PostgreSQL.org/docs/faq-english.html">http://www.PostgreSQL.org/docs/faq-english.html</a>.</pre>
<pre><br>
Legfrissebb magyar nyelv&ucirc; verzi&oacute;:</pre>
<pre><a href="http://hackers.forgeahead.hu/space/PostgreSQL/GYIK">http://hackers.forgeahead.hu/space/PostgreSQL/GYIK</a></pre>
<pre><br>
Platform specifikus k&eacute;rd&eacute;sek:</pre>
<pre><a href="http://www.PostgreSQL.org/users-lounge/docs/faq.htm">http://www.PostgreSQL.org/users-lounge/docs/faq.htm</a>l.</pre>
<hr style="width: 100%; height: 2px;">
<div style="text-align: center;">
<h2>&Aacute;ltal&aacute;nos k&eacute;rd&eacute;sek</h2>
</div>
<a href="#1.1">1.1</a> Mi a PostgreSQL? Hogy kell kimondani?<br>
<a href="#1.2">1.2</a> Mik a PostgreSQL felhaszn&aacute;l&aacute;si
felt&eacute;telei?<br>
<a href="#1.3">1.3</a> Milyen UNIX oper&aacute;ci&oacute;s
rendszereken fut PostgreSQL?<br>
<a href="#1.4">1.4</a> Milyen nem UNIX oper&aacute;ci&oacute;s
rendszerek el&eacute;rhet&otilde;ek?<br>
<a href="#1.5">1.5</a> Hogyan tudok PostgreSQL-t szerezni?<br>
<a href="#1.6">1.6</a> Hogyan kapok
term&eacute;kt&aacute;mogat&aacute;st?<br>
<a href="#1.7">1.7</a> Melyik a legfrissebb kiad&aacute;s?<br>
<a href="#1.8">1.8</a> Milyen dokument&aacute;ci&oacute; &aacute;ll
rendelkez&eacute;sre?<br>
<a href="#1.9">1.9</a> Hogyan tal&aacute;lok inform&aacute;ci&oacute;t
hib&aacute;kr&oacute;l vagy hi&aacute;nyz&oacute;
funkcional&iacute;t&aacute;sr&oacute;l?<br>
<a href="#1.10">1.10</a> Hogy tanuljam meg az SQL nyelvet?<br>
<a href="#1.11">1.11</a> A PostgreSQL 2000. &eacute;v kompatibilis?<br>
<a href="#1.12">1.12</a> Hogyan lehet csatlakozni a fejleszt&otilde;
csapathoz?<br>
<a href="#1.13">1.13</a> Hogyan k&uuml;ldjek hibajelent&eacute;st?<br>
<a href="#1.14">1.14</a> Milyen a PostgreSQL m&aacute;s DBMS-ekkel
&ouml;sszehasonl&iacute;tva?<br>
<a href="#1.15">1.15</a> Hogyan tudom &uuml;zletileg segiteni a
PostgreSQL-t?<br>
<a href="#1.16">1.16</a> Ki ir&aacute;ny&iacute;tja a PostgreSQL-t?<br>
<br>
<div style="text-align: center;">
<h2>Felhaszn&aacute;l&oacute;i kliens k&eacute;rd&eacute;sek</h2>
</div>
<br>
<a href="#2.1">2.1</a> Van ODBC meghajt&oacute; PostgreSQL-hez?<br>
<a href="#2.2">2.2</a> Milyen eszk&ouml;z&ouml;k &aacute;llnak
rendelkez&eacute;sre PostgreSQL Web fejleszt&eacute;sekhez?<br>
<a href="#2.3">2.3</a> Van a PostgreSQL-hez grafikus
felhaszn&aacute;l&oacute;i fel&uuml;let ? Riport gener&aacute;tor?
Be&aacute;gyazott lek&eacute;rdez&otilde; nyelv fel&uuml;let?<br>
<a href="#2.4">2.4</a> Milyen programoz&aacute;si nyelvekkel lehet
el&eacute;rni a PostgreSQL szervert?<br>
<br>
<div style="text-align: center;">
<h2>Adminisztr&aacute;ci&oacute;s k&eacute;rd&eacute;sek</h2>
</div>
<br>
<a href="#3.1">3.1</a> Hogyan tudom a PostgreSQL-t /usr/local/pgsql
-t&otilde;l elt&eacute;r&otilde; helyre install&aacute;lni?<br>
<a href="#3.2">3.2</a> AMikor elind&iacute;tom a postmaster-t, egy
"Bad System Call"-t vagy core dump-ot kapok. Mi&eacute;rt?<br>
<a href="#3.3">3.3</a> Amikor megpr&oacute;b&aacute;lom inditani a
postmaster-t, "IpcMemoryCreate" hib&aacute;kat kapok. Mi&eacute;rt?<br>
<a href="#3.4">3.4</a> Amikor megpr&oacute;b&aacute;lom inditani a
postmaster-t, "IpcSemaphoreCreate" hib&aacute;kat kapok. Mi&eacute;rt?<br>
<a href="#3.5">3.5</a> Hogyan tudom kontroll&aacute;lni a m&aacute;s
g&eacute;pekr&otilde;l &eacute;rkez&otilde; kapcsolat
k&eacute;r&eacute;seket?<br>
<a href="#3.6">3.6</a> Hogyan tudom nagyobb
teljes&iacute;tm&eacute;nyre hangolni az
adatb&aacute;zisomat?<br>
<a href="#3.7">3.7</a> Milyen hibakeres&otilde;
lehet&otilde;s&eacute;gek
&eacute;rhet&otilde;ek el?<br>
<a href="#3.8">3.8</a> Mi&eacute;rt kapok "Sorry, too many clients"
hib&aacute;t
csatlakoz&aacute;sn&aacute;l?<br>
<a href="#3.9">3.9</a> Mi van pgsql_tmp k&ouml;nyvt&aacute;rban?<br>
<a href="#3.10">3.10</a> Mi&eacute;rt kell dumpolni &eacute;s
&uacute;jrat&ouml;lteni
PostgreSQL kiad&aacute;s v&aacute;lt&aacute;s&aacute;n&aacute;l?<br>
<br>
<div style="text-align: center;">
<h2>M&ucirc;k&ouml;dtet&eacute;si k&eacute;rd&eacute;sek</h2>
</div>
<br>
<a href="#4.1">4.1</a> Mi a k&uuml;l&ouml;nbs&eacute;g a bin&aacute;ris
&eacute;s a
norm&aacute;l kurzorok k&ouml;z&ouml;tt?<br>
<a href="#4.2">4.2</a> Hogyan tudom select-elni a
lek&eacute;rdez&eacute;s els&otilde;
p&aacute;r sor&aacute;t?<br>
<a href="#4.3">4.3</a> Hogy tudom kilist&aacute;zni a
t&aacute;bl&aacute;kat vagy
m&aacute;s dolgokat a PostgreSQL-ben?<br>
<a href="#4.4">4.4</a> Hogyan tudok elt&aacute;vol&iacute;tani egy
oszlopot egy
t&aacute;bl&aacute;b&oacute;l?<br>
<a href="#4.5">4.5</a> Mi a maxim&aacute;lis m&eacute;rete egy sornak,
egy
t&aacute;bl&aacute;nak vagy egy adatb&aacute;zisnak?<br>
<a href="#4.6">4.6</a> Mekkora adatb&aacute;zis lemez ter&uuml;let
sz&uuml;ks&eacute;ges
egy tipikus sz&ouml;veg &aacute;llom&aacute;ny
t&aacute;rol&aacute;s&aacute;hoz?<br>
<a href="#4.7">4.7</a> Hogy tudhatom meg milyen t&aacute;bl&aacute;k,
indexek,
adatb&aacute;zisok vagy felhaszn&aacute;l&oacute;k vannak
defini&aacute;lva?<br>
<a href="#4.8">4.8</a> A lek&eacute;rdez&eacute;seim lass&uacute;ak,
vagy nem
haszn&aacute;lj&aacute;k az indexeket. Mi&eacute;rt?<br>
<a href="#4.9">4.9</a> Hogy tudom ellen&otilde;rizni, hogy
optimaliz&aacute;lta a
lek&eacute;rdez&eacute;s optimaliz&aacute;l&oacute; a
lek&eacute;rdez&eacute;sem?<br>
<a href="#4.10">4.10</a> Mi az R-tree index?<br>
<a href="#4.11">4.11</a> Mi a Genetic Query Optimizer?<br>
<a href="4.12">4.12</a> Hogyan tudok regexp keres&eacute;st &eacute;s
case-insensitive
regexp keres&eacute;st haszn&aacute;lni? Hogyan tudok indexet
haszn&aacute;lni case-insensitive keres&eacute;shez?<br>
<a href="4.13">4.13</a> Hogyan tudom &eacute;szlelni egy
lek&eacute;rdez&eacute;sban, ha
egy mez&otilde; NULL?<br>
<a href="#4.14">4.14</a> Mi a k&uuml;l&ouml;nbs&eacute;g a
k&uuml;l&ouml;nb&ouml;z&otilde;
karaktert&iacute;pusok k&ouml;z&ouml;tt?<br>
<a href="#4.15.1">4.15.1</a> Hogyan tudok l&eacute;trehozni
automatikusan
n&ouml;vekv&otilde; &eacute;rt&eacute;k&ucirc; mez&otilde;t?<br>
<a href="#4.15.2">4.15.2</a> Hogyan kaphatom meg egy SERIAL
besz&uacute;r&aacute;s
&eacute;rt&eacute;k&eacute;t?<br>
<a href="#4.15.3">4.15.3</a> A currval() &eacute;s a nextval() nem
teremt holtpont
vesz&eacute;lyes helyzetet a felhaszn&aacute;l&oacute;k
k&ouml;z&ouml;tt?<br>
<a href="#4.15.4">4.15.4</a> Mi&eacute;rt nem
haszn&aacute;l&oacute;dnak fel &uacute;jra a
sequence sz&aacute;mok tranzakci&oacute; abort eset&eacute;n?
Mi&eacute;rt vannak probl&eacute;m&aacute;k a serial oszlopok
sz&aacute;moz&aacute;s&aacute;val?<br>
<a href="#4.16">4.16</a> Mi a OID? Mi a TID?<br>
<a href="#4.17">4.17</a> Mi a PostgreSQL-ben haszn&aacute;lt
kifejez&eacute;sek
jelent&eacute;se?<br>
<a href="#4.18">4.18</a> Mi&eacute;rt kapom ezt a hib&aacute;t: "ERROR:
Memory exhausted
in AllocSetAlloc()"?<br>
<a href="#4.19">4.19</a> Hogyan tudhatom meg PostgreSQL, milyen
verzi&oacute;t futtatok?<br>
<a href="#4.20">4.20</a> Mi&eacute;rt kapok "invalid large obj
descriptor" hib&aacute;t
nagy objektumok kezel&eacute;s&eacute;n&eacute;l?<br>
<a href="#4.21">4.21</a> Hogy hozhatok l&eacute;tre olyan oszlopot,
aminek
alap&eacute;rtelmezett &eacute;r&eacute;tke a jelenlegi id&otilde;?<br>
<a href="#4.22">4.22</a> Mi&eacute;rt olyan lass&uacute;ak az
al-lek&eacute;rdez&eacute;seim IN-nel?<br>
<a href="#4.23">4.23</a> Hogyan tudok outer join-t v&eacute;grehajtani?<br>
<a href="#4.24">4.24</a> Hogyan tudok t&ouml;bb adatb&aacute;zison
v&eacute;grehajtani
lek&eacute;rdez&eacute;st?<br>
<a href="#4.25">4.25</a> Hogy tudok t&ouml;bb soros vagy oszlopos
eredm&eacute;nyt
visszaadni egy funkci&oacute;b&oacute;l?<br>
<a href="#4.26">4.26</a> Mi&eacute;rt nem tudom megbizhat&oacute;an
l&eacute;trehozni
&eacute;s t&ouml;r&ouml;lni az &aacute;tmeneti t&aacute;bl&aacute;kat a
PL/pgSQL funkci&oacute;kban?<br>
<a href="#4.27">4.27</a> Milyen replik&aacute;ci&oacute;s
lehet&otilde;s&eacute;gek vannak?<br>
<a href="#4.28">4.28</a> Milyen k&oacute;dol&aacute;si
lehet&otilde;s&eacute;gek vannak?<br>
<br>
<div style="text-align: center;">
<h2>A PostgreSQL kiterjeszt&eacute;se</h2>
</div>
<br>
<a href="#5.1">5.1</a>) &Iacute;rtam egy felhaszn&aacute;l&oacute;i
funkci&oacute;t.
Mi&eacute;rt core dumpol az adatb&aacute;zis amikor haszn&aacute;lom?<br>
<a href="#5.1">5.2</a>) Hogyan lehet &uacute;j adatt&iacute;pusokat
&eacute;s
funkci&oacute;kat hozz&aacute;adni a PostgreSQL
disztrib&uacute;ci&oacute;hoz?<br>
<a href="#5.3">5.3</a>) Hogyan lehet olyan C funkci&oacute;t
&iacute;rni, ami Tuple-t ad
vissza? (t&ouml;bb soros t&ouml;bb oszlopos eredm&eacute;nyek)<br>
<a href="#5.4">5.4</a>) Megv&aacute;ltoztattam egy forr&aacute;s
&aacute;llom&aacute;nyt.
Mi&eacute;rt nem v&aacute;ltozik a bin&aacute;ris
&uacute;jraford&iacute;t&aacute;s ut&aacute;n?<br>
<hr style="width: 100%; height: 2px;">
<h2 style="text-align: center;"> &Aacute;ltal&aacute;nos
k&eacute;rd&eacute;sek</h2>
<br>
<a name="1.1"></a><big style="text-decoration: underline;">1.1 Mi a
PostgreSQL? Hogy kell kimondani?</big><br>
<p>&Iacute;gy ejstd ki: Post-Gres-Q-L.</p>
<p>(Vagy tal&aacute;n ink&aacute;bb t&ouml;ltsd le a kis mp3-at a
PostgreSQL homepage-r&otilde;l)</p>
<p>A PostgreSQL a POSTGRES adatb&aacute;zis management rendszer egy
kieg&eacute;sz&iacute;t&eacute;se, ami egy k&ouml;vetkez&otilde;
gener&aacute;ci&oacute;s DBMS kutat&aacute;si protot&iacute;pus.
Megtartja a POSTGRES adatmodell&eacute;t &eacute;s gazdag
adatt&iacute;pus v&aacute;laszt&eacute;k&aacute;t, de a PostQuel
lek&eacute;rdez&otilde; nyelvet az SQL egy kiterjesztett
verzi&oacute;j&aacute;val helyettes&iacute;ti. A PostgreSQL szabad
&eacute;s a teljes forr&aacute;sk&oacute;d
hozz&aacute;f&eacute;rhet&otilde;.</p>
<p>A PostgreSQL fejleszt&eacute;s&eacute;t egy csapat v&eacute;gzi,
amelynek minden tagja megtal&aacute;lhat&oacute; a PostgreSQL
fejleszt&otilde;i levelez&eacute;si list&aacute;n. A jelenlegi
koordin&aacute;tor
Marc G. Fournier (scrappyp@PostgreSQL.org). Ez a csapat felel&otilde;s
minden fejleszt&eacute;s&eacute;rt. &lt;&gt;A PostgreSQL 1.01
alkot&oacute;i
Andrew Yu &eacute;s Jolly Chen voltak. Sokan j&aacute;rultak
hozz&aacute; portol&aacute;ssal, tesztel&eacute;ssel,
hibakeres&eacute;ssel &eacute;s fejleszt&eacute;ssel. Az eredeti
Postgres k&oacute;d, amib&otilde;l a PostgreSQL sz&aacute;rmazik
Michael Stonebraker professzor ir&aacute;ny&iacute;t&aacute;sa alatt
fejlesztettek az egyetem programoz&oacute;i, tanul&oacute;i &eacute;s
v&eacute;gzett tanul&oacute;i. &lt;&gt;</p>
<p>A szoftver eredeti neve Postgres volt. Amikor SQL
funkcional&iacute;t&aacute;ssal eg&eacute;sz&iacute;tett&eacute;k ki
1995-ben, a nev&eacute;t Postgres95-re v&aacute;ltoztatt&aacute;k. 1996
v&eacute;g&eacute;n kapta mai nev&eacute;t. </p>
<br>
<a name="1.2"></a> <big style="text-decoration: underline;">1.2 Mik a
PostgreSQL felhaszn&aacute;l&aacute;si
felt&eacute;telei?</big><br>
<br>
<pre> Az eredeti angol copyright sz&ouml;veg: </pre>
<pre> -------------------- </pre>
<pre> PostgreSQL is subject to the following COPYRIGHT:</pre>
<pre><br> PostgreSQL Data Base Management System</pre>
<pre><br> Portions copyright (c) 1996-2002, PostgreSQL Global Development Group</pre>
<pre> Portions Copyright (c) 1994-6 Regents of the University of California</pre>
<pre><br> Permission to use, copy, modify, and distribute this software and its</pre>
<pre> documentation for any purpose, without fee, and without a written</pre>
<pre> agreement is hereby granted, provided that the above copyright notice</pre>
<pre> and this paragraph and the following two paragraphs appear in all</pre>
<pre> copies.</pre>
<pre><br> IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY</pre>
<pre> FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,</pre>
<pre> INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND</pre>
<pre> ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN</pre>
<pre> ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</pre>
<pre><br> THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,</pre>
<pre> INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</pre>
<pre> MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE</pre>
<pre> PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF</pre>
<pre> CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,</pre>
<pre> UPDATES, ENHANCEMENTS, OR MODIFICATIONS.</pre>
<pre> --------------------</pre>
<p><br>
</p>
Ami nagyon leegyszer&ucirc;s&iacute;tve azt jelenti, hogy jogod van
haszn&aacute;lni a szoftvert mindenf&eacute;le
ellenszolg&aacute;ltat&aacute;s (p&eacute;nz, stb) n&eacute;lk&uuml;l,
a forr&aacute;s k&oacute;dot m&oacute;dos&iacute;thatod, &eacute;s
tov&aacute;bbadhatod, DE semmilyen, a szoftver
haszn&aacute;lat&aacute;b&oacute;l k&ouml;vetkez&otilde;
k&aacute;rosod&aacute;s&eacute;rt nem v&aacute;llal garanci&aacute;t a
fejleszt&otilde;. A fenti a BSD licensz, egy klasszikus
nyilt-forr&aacute;sk&oacute;d licensz. Nem tartalmaz
megszor&iacute;t&aacute;sokat arra, hogy a forr&aacute;sk&oacute;dot
hogyan haszn&aacute;lod fel.
<p> Kedvelj&uuml;k ezt a licensz form&aacute;t &eacute;s nem &aacute;ll
sz&aacute;nd&eacute;kunkban megv&aacute;ltoztatni.</p>
<a name="1.3"></a> <big><span style="text-decoration: underline;">1.3
Milyen UNIX oper&aacute;ci&oacute;s
rendszereken fut PostgreSQL?</span></big><br>
<p>&Aacute;ltal&aacute;ban minden UNIX-kompatibilis
oper&aacute;ci&oacute;s rendszer k&eacute;pes arra hogy futtassa a
PostgreSQL-t. Azokat a platformokat, amiken tesztelt&eacute;k a
kiad&aacute;st
megtal&aacute;lhatod a install&aacute;ci&oacute;s
utas&iacute;t&aacute;sok k&ouml;z&ouml;tt. </p>
<a name="1.4"></a> <big><span style="text-decoration: underline;">1.4
Milyen nem UNIX oper&aacute;ci&oacute;s
rendszerek el&eacute;rhet&otilde;ek?</span></big><br>
<br>
<p>Kliens<br>
</p>
<p>A libpq C f&uuml;ggv&eacute;nyk&ouml;nyvt&aacute;rat, a psql-t
&eacute;s m&aacute;s fel&uuml;leteket le lehet &uacute;gy
ford&iacute;tani, hogy fussanak MS Windows oper&aacute;ci&oacute;s
rendszereken. Ebben az esetben a kliens MS Windows-on fut &eacute;s
TCP/IP seg&iacute;ts&eacute;g&eacute;vel kommunik&aacute;l a Unixon
fut&oacute; szerverrel. A "win32.mak" &aacute;llom&aacute;ny a
kiad&aacute;s r&eacute;sze, ennek seg&iacute;ts&eacute;g&eacute;vel
lehet Win32 platformokra leford&iacute;tani a libpq-t &eacute;s a
psql-t. A PostgreSQL ODBC kliensekkel is k&eacute;pes
kommunik&aacute;lni.</p>
<p>
Szerver</p>
&lt;&gt;Az adatb&aacute;zis szerver Cygwin
seg&iacute;ts&eacute;g&eacute;vel
fut Windows NT &eacute;s Win2k rendszereken. Tov&aacute;bbi
inform&aacute;ci&oacute;
tal&aacute;lhat&oacute; a pgsql/doc/FAQ_MSWIN &aacute;llom&aacute;nyban
&eacute;s a MS Windows FAQ-ban a k&ouml;vetkez&otilde; helyen: <a
href="http://www.PostgreSQL.org/docs/faq-mswin.html">http://www.PostgreSQL.org/docs/faq-mswin.html</a>.&nbsp;
Nat&iacute;v MS Windows NT/2000/XP portok jelenleg fejleszt&eacute;s
alatt &aacute;llnak.<br>
<br>
<a name="1.5"></a> <big style="text-decoration: underline;">1.5 Hogyan
tudok PostgreSQL-t szerezni?</big><br>
<p>Az els&otilde;dleges anonim ftp oldal: <a
href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</a>. </p>
<p>A t&uuml;k&ouml;r oldalak list&aacute;ja megtal&aacute;lhat&oacute;
a
f&otilde; weboldalunkon.</p>
<a name="1.6"></a> <big style="text-decoration: underline;">1.6 Hogyan
kapok
term&eacute;kt&aacute;mogat&aacute;st?</big><br>
<br>
<p>Az els&otilde;dleges lista a <a
href="mailto:pgsql-general@postgresql.org">pgsql-general@postgresql.org</a>.
Ez
haszn&aacute;lhat&oacute; a PostgreSQL-lel kapcsolatos
p&aacute;rbesz&eacute;dekre. Ha fel
szeretn&eacute;l &iacute;ratkozni, k&uuml;ldj egy levelet a
k&ouml;vetkez&otilde; tartalommal (nem
t&aacute;rggyal) a<a
href="mailto:%20pgsql-general-request@postgresql.org">
pgsql-general-request@postgresql.org</a> c&iacute;mre:</p>
<pre>
subscribe</pre>
<pre>
end </pre>
<br>
Van egy hib&aacute;kkal kapcsolatos levelez&eacute;si lista is:
pgsql-bugs-request@PostgreSQL.org a k&ouml;vetkez&otilde; tartalommal:<br>
<br>
<pre>
subscribe</pre>
<pre>
end
</pre>
<p>A fejleszt&#337;i levelez&eacute;si lista:<a
href="mailto:pgsql-hackers-request@PostgreSQL.org">
pgsql-hackers-request@PostgreSQL.org</a> a k&ouml;vetkez&otilde;
tartalommal:</p>
<pre>
subscribe</pre>
<pre>
end</pre>
<br>
Egy&eacute;b levelez&eacute;si list&aacute;k
tal&aacute;lhat&oacute;ak
a weboldalunkon: <a href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</a>
<p>Van egy IRC csatorna is <a href="irc://irc.freenode.net/#postgresql">#PostgreSQL</a>
n&eacute;ven ahol felteheted
k&eacute;r&eacute;dseid. A k&ouml;vetkez&otilde; unix paranccsal
csatlakozhatsz:
</p>
<p>irc -c '#PostgreSQL' "$USER" irc.phoenix.net.</p>
<p>
A kereskedelmi term&eacute;kt&aacute;mogat&aacute;st
ny&uacute;jt&oacute; c&eacute;gek list&aacute;ja el&eacute;rhet&ouml;
itt:<a
href="http://www.PostgreSQL.org/users-lounge/commercial-support.html">
http://www.PostgreSQL.org/users-lounge/commercial-support.html</a><br>
</p>
<p>Magyar nyelv&#369; levelez&eacute;si lista nincs, de ha tudok segiteni a
fenit e-mail cimemen el&eacute;rhet&#337; vagyok.</p>
<a name="1.7"></a> <big style="text-decoration: underline;">1.7 Melyik
a legfrissebb kiad&aacute;s?</big><br>
<p>A legfrissebb PostgreSQL kiad&aacute;s a 8.0.</p>
<p>A tervek szerint minden &eacute;vben lesz egy nagyobb
fejleszt&eacute;seket tartalmaz&oacute; kiad&aacute;s, m&iacute;g a
kisebb fejleszt&eacute;seket n&eacute;h&aacute;ny havonta adjuk ki.<br>
</p>
<a name="1.8"></a> <big style="text-decoration: underline;">1.8 Milyen
dokument&aacute;ci&oacute; &aacute;ll
rendelkez&eacute;sre?</big><br>
<p>Sz&aacute;mos k&eacute;zik&ouml;nyv, man oldalak &eacute;s kis teszt
p&eacute;ld&aacute;k tal&aacute;lhat&oacute;ak a kiad&aacute;sban a
doc/ k&ouml;nyvt&aacute;r alatt. Az interneten is olvashatod a
dokument&aacute;ci&oacute;t a k&ouml;vetkez&otilde; c&iacute;men:</p>
<p><a href="http://www.PostgreSQL.org/users-lounge/docs/">http://www.PostgreSQL.org/users-lounge/docs/</a>.</p>
<p>K&eacute;t PostgreSQL k&ouml;nyv &eacute;rhet&otilde; el az
interneten
a <a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a>
&eacute;s a <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>
c&iacute;meken. A megv&aacute;s&aacute;rolhat&oacute; k&ouml;nyvek
list&aacute;ja itt
tal&aacute;lhat&oacute;: <a href="http://www.ca.PostgreSQL.org/books/">http://www.ca.PostgreSQL.org/books/</a>.
A PostgreSQL-lel kapcsolatos technikai jelleg&ucirc; cikkek
gy&ucirc;jtem&eacute;nye: <a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a>.</p>
<p>A psql parancs rendelkezik n&eacute;h&aacute;ny \d
utas&iacute;t&aacute;ssal, amellyekkel list&aacute;zhat&oacute;ak az
oper&aacute;torok, a funkci&oacute;k, stb.</p>
<p>A website is tartalmaz tov&aacute;bbi dokument&aacute;ci&oacute;kat.</p>
<a name="1.9"></a> <big style="text-decoration: underline;">1.9 Hogyan
tal&aacute;lok inform&aacute;ci&oacute;t
hib&aacute;kr&oacute;l vagy hi&aacute;nyz&oacute;
funkcional&iacute;t&aacute;sr&oacute;l?</big><br>
<p>A PostgreSQLaz SQL-92 szabv&aacute;ny egy
kieg&eacute;sz&iacute;t&eacute;se. N&eacute;zd meg a TODO
list&aacute;kat ha &eacute;rdekelnek az ismert hib&aacute;k.</p>
<a name="1.10"></a> <big style="text-decoration: underline;">1.10 Hogy
tanuljam meg az SQL nyelvet?</big><br>
<br>
<p>A PostgreSQL k&ouml;nyv a
<a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a>
c&iacute;men tartalmaz SQL
alapokat. El&eacute;rhet&otilde; egy
m&aacute;sik SQL k&ouml;nyv is a <a
href="http://www.commandprompt.com/ppbook">http://www.commandprompt.com/ppbook</a>
c&iacute;men. Egy sz&eacute;p
oktat&oacute; anyag tal&aacute;lhat&oacute; a
<a href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a>,
a
<a
href="http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM</a>
&eacute;s a <a href="http://sqlcourse.com">http://sqlcourse.com</a>
oldalakon.
</p>
<p>Egy m&aacute;sik lehet&otilde;s&eacute;g a "Tan&iacute;tsd magad 21
nap
alatt SQL-re, m&aacute;sodik kiad&aacute;s" a
<a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a>.</p>
<p>
Sok felhaszn&aacute;l&oacute;nak tetszett a gyakorlati SQL k&ouml;nyv
("The Practical SQL Handbook"). </p>
<br>
<a name="1.11"></a> <big style="text-decoration: underline;">1.11 A
PostgreSQL 2000. &eacute;v kompatibilis?</big><br>
<br>
<p>Igen, k&ouml;nnyed&eacute;n kezeli a 2000 ut&aacute;ni &eacute;s
id&otilde;sz&aacute;m&iacute;t&aacute;sunk el&ouml;tt 2000 el&ouml;tti
d&aacute;tumokat is. </p>
<br>
<a name="1.12"></a> <big style="text-decoration: underline;">1.12
Hogyan lehet csatlakozni a fejleszt&otilde;
csapathoz?</big><br>
<br>
El&ouml;ssz&ouml;r is t&ouml;ltsd le a forr&aacute;sk&oacute;dot,
&eacute;s olvasd el a PostgreSQL<br>
fejleszt&otilde;i dokumnet&aacute;ci&oacute;t a web oldalunkon vagy a
kiad&aacute;sban. Ezut&aacute;n<br>
&iacute;ratkozz fel a pgsql-hackers &eacute;s a pgsql-patches
levelez&eacute;si list&aacute;kra.<br>
V&eacute;g&uuml;l pedig k&uuml;ldj be magas szinvonal&uacute;
patch-eket a pgsql-patches list&aacute;ra.<br>
<br>
Van egy p&aacute;r ember, akiknek commit privil&eacute;giumuk a
PostgreSQL CVS f&aacute;n.<br>
&Otilde;k olyan sok magas szinvonal&uacute; patch-et k&uuml;ldtek be,
hogy az addigi <br>
csapat m&aacute;r nem tudta k&ouml;vetni, &eacute;s nem volt
k&eacute;ts&eacute;g&uuml;nk arr&oacute;l, hogy a<br>
patch-ek amiket &otilde;k k&uuml;ldenek j&oacute;
min&otilde;s&eacute;g&ucirc;.<br>
<br>
<a name="1.13"></a> <big style="text-decoration: underline;">1.13
Hogyan k&uuml;ldjek hibajelent&eacute;st?</big><br>
<br>
L&aacute;togass el a BugTool oldalra: <br>
<a href="http://www.PostgreSQL.org/bugs/bugs.php">http://www.PostgreSQL.org/bugs/bugs.php</a><br>
Itt megtal&aacute;lod k&ouml;vetend&otilde; utas&iacute;t&aacute;sokat.<br>
<br>
Ellen&otilde;rizd az ftp oldalunkon is, hogy nincs-e &uacute;jabb
verzi&oacute; vagy folt.<br>
<a href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub </a><br>
<br>
<a name="1.14"></a><big style="text-decoration: underline;">1.14 Milyen
a PostgreSQL m&aacute;s DBMS-ekkel
&ouml;sszehasonl&iacute;tva?</big><br>
<p>Sz&aacute;mos n&eacute;z&otilde;pontb&oacute;l lehet
vizsg&aacute;lni
a
szoftvert: k&eacute;pess&eacute;gek, teljes&iacute;tm&eacute;ny
megb&iacute;zhat&oacute;s&aacute;g, t&aacute;mogatotts&aacute;g
&eacute;s &aacute;r.</p>
<span style="text-decoration: underline;">K&eacute;pess&eacute;gek:</span>
A PostgreSQL rendelkezik a nagy, kereskedelmi DBMS-ek
k&eacute;pess&eacute;geivel: tranzakci&oacute;k,
al-lek&eacute;rdez&eacute;sek, triggerek,
n&eacute;zetek, k&uuml;ls&otilde; kulcsok, integr&iacute;t&aacute;s
&eacute;s kifinoult z&aacute;rmechanizmusok.
Van n&eacute;h&aacute;ny k&eacute;pess&eacute;ge, ami a kereskedelmi
adatb&aacute;zisokb&oacute;l hi&aacute;nyzik, mint
p&eacute;ld&aacute;ul a felhaszn&aacute;l&oacute; &aacute;ltal
defini&aacute;lt t&iacute;pusok,
&ouml;r&ouml;kl&otilde;d&eacute;s, szab&aacute;lyok &eacute;s
verzi&oacute; kontroll a z&aacute;rol&aacute;si vit&aacute;k
reduk&aacute;l&aacute;s&aacute;&eacute;rt.
<p><span style="text-decoration: underline;">Teljes&iacute;tm&eacute;ny:</span>
A PostgreSQL teljes&iacute;tm&eacute;nye hasonl&iacute;t a
kereskedelmi
&eacute;s m&aacute;s ny&iacute;lt adatb&aacute;zis
szerverek&eacute;hez. Lehet bizonyos esetekben
lassabb, m&aacute;sokban gyorsabb. A MySQL nev&ucirc; tanul&oacute;
RDBMS p&eacute;ld&aacute;ul gyorsabban hajt v&eacute;gre insert/update
m&ucirc;veleteket, mivel a tranzakci&oacute;kat
elsum&aacute;kolja. Persze a MySQL nem rendelkezik a
k&eacute;pess&eacute;gek
r&eacute;szben felsoroltak nagy r&eacute;sz&eacute;vel. Mi a
megb&iacute;zhat&oacute;s&aacute;gra
&eacute;s a k&eacute;pess&eacute;gekre &eacute;p&iacute;t&uuml;nk,
b&aacute;r a teljes&iacute;tm&eacute;ny is n&otilde; minden
kiad&aacute;ssal. Van
egy &eacute;rdekes oldal a MySQL &eacute;s a PostgreSQL
&ouml;sszehasonl&iacute;t&aacute;s&aacute;val a
<a href="http://openacs.org/philosophy/why-not-mysql.html">http://openacs.org/philosophy/why-not-mysql.html
</a>c&iacute;men.
</p>
<p><span style="text-decoration: underline;">Megb&iacute;zhat&oacute;s&aacute;g:</span>
Tudjuk hogy ha egy DBMS nem megb&iacute;zhat&oacute;, akkor
teljesen
haszontalan. Igyeksz&uuml;nk j&oacute;l tesztelt, stabil k&oacute;dot
kiadni, amiben
a lehet&otilde; legkevesebb hiba van. Minden kiad&aacute;s
el&ouml;tt eltellik
legal&aacute;bb 1 h&oacute;nap b&eacute;ta teszt, &eacute;s a
kiad&aacute;si
t&ouml;rt&eacute;net is azt mutatja, hogy stabil k&oacute;dot adunk ki,
ami k&eacute;szen &aacute;ll a
produkt&iacute;v felhaszn&aacute;l&aacute;sra. &Uacute;gy gondoljuk,
fel&uuml;lm&uacute;lunk m&aacute;s
adatb&aacute;zis szoftvereket ezen a t&eacute;ren.
</p>
<p></p>
<p><span style="text-decoration: underline;">T&aacute;mogat&aacute;s:</span>
A levelez&eacute;si list&aacute;ink kapcsolatot teremtenek a
fejleszt&otilde;k &eacute;s felhaszn&aacute;l&oacute;k
csoportj&aacute;val , akik
seg&iacute;tenek a probl&eacute;m&aacute;k megold&aacute;s&aacute;ban.
B&aacute;r nem tudjuk garant&aacute;lni
hogy ki tudjuk jav&iacute;tani a hib&aacute;t, m&aacute;s, kereskedelmi
adatb&aacute;zis c&eacute;gek sem tudj&aacute;k. A fejleszt&otilde;
csoport k&ouml;zvetlen el&eacute;r&eacute;si
lehet&otilde;s&eacute;ge, a k&ouml;z&ouml;ss&eacute;g, a
dokument&aacute;ci&oacute; &eacute;s a forr&aacute;sk&oacute;d
gyakran t&aacute;mogat&aacute;st biztos&iacute;t, mint m&aacute;s
adatb&aacute;zisokn&aacute;l. Van kereskedelmi, alkalmi
t&aacute;mogat&aacute;s azoknak, akiknek sz&uuml;ks&eacute;ge van
r&aacute; (l&aacute;sd: 1.6).
</p>
<p></p>
<p><span style="text-decoration: underline;">&Aacute;r:</span> A
PostgreSQL szabad b&aacute;rmilyen
felhaszn&aacute;l&aacute;sra,
ak&aacute;r kereskedelmire is. A term&eacute;khez hozz&aacute;adhatod a
saj&aacute;t
forr&aacute;sk&oacute;djaidat korl&aacute;toz&aacute;s
n&eacute;lk&uuml;l.</p>
<a name="1.15"></a> <big style="text-decoration: underline;">1.15
Hogyan tudom &uuml;zletileg segiteni a
PostgreSQL-t?</big><br>
<p>A PostgreSQL els&otilde; oszt&aacute;ly&uacute;
infrastrukt&uacute;r&aacute;val rendelkezik, amit 1996-ban
ind&iacute;tottunk el. Mindent Marc Fourniernek
k&ouml;sz&ouml;nhet&uuml;nk, aki l&eacute;trehozta &eacute;s
karbantartja a rendszert.
</p>
<p>A min&otilde;s&eacute;gi infrastrukt&uacute;ra nagyon fontos egy
nyilt
forr&aacute;s&uacute; szoftver eset&eacute;ben. Megv&eacute;d az olyan
fennakad&aacute;sokt&oacute;l,
amelyek komoly k&eacute;s&eacute;seket okoznak a
fejleszt&eacute;sekben. Term&eacute;szetesen ez az
infrastrukt&uacute;ra nem olcs&oacute;.
Sz&aacute;mos havi &eacute;s &aacute;lland&oacute; kiad&aacute;sunk
van. Ha a c&eacute;gednek van p&eacute;nze, amivel
t&aacute;mogatn&aacute; er&otilde;fesz&iacute;t&eacute;seinket,
k&eacute;rlek l&aacute;togass el a <a
href="http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</a>
oldalra.</p>
<p>
B&aacute;r a weboldal "PostgreSQL, Inc"-k&eacute;nt
eml&iacute;ti, a
hozz&aacute;j&aacute;rul&aacute;sok kiz&aacute;r&oacute;lag a
PostgreSQL fejleszt&eacute;sre &eacute;rtend&oacute;ek, &eacute;s nem
egy meghat&aacute;rozott c&eacute;gnek. Ha jobban tetszik,
k&uuml;ldhetsz csekket is a kapcsolati c&iacute;mek
b&aacute;rmelyik&eacute;re.</p>
<p><big style="text-decoration: underline;"><a name="1.16"></a>1.16 Ki
ir&aacute;ny&iacute;tja a PostgreSQL-t?<br>
</big></p>
<p><big style="text-decoration: underline;"><small><span
style="text-decoration: underline;"></span></small></big><big><small>Ha
k&ouml;zponti bizotts&aacute;got, ellen&ouml;rz&#337; c&eacute;get keresel a
PostgreSQL m&ouml;g&ouml;tt, add fel, nincs ilyesmi. L&eacute;tezik egy
mag &eacute;s CVS commiter csoport, de ez ink&aacute;b adminisztrativ
mint ellen&ouml;rz&#337; c&eacute;l&uacute;. A projectet fejleszt&#337;k
&eacute;s felhaszn&aacute;l&oacute;k k&ouml;z&ouml;ss&eacute;ge
ir&aacute;ny&iacute;tja, amihez b&aacute;rki csatlakozhat.
Csup&aacute;n annyit kell tenned hogy fel&iacute;ratkozol a
levelez&#337;list&eacute;kra &eacute;s r&eacute;szt veszel a
besz&eacute;lget&eacute;sekben.</small></big><big
style="text-decoration: underline;"><small><span
style="text-decoration: underline;"></span></small></big></p>
<p></p>
<hr style="width: 100%; height: 2px;">
<h2 style="text-align: center;">Felhaszn&aacute;l&oacute;i kliens
k&eacute;rd&eacute;sek</h2>
<br>
<a name="2.1"></a> <big style="text-decoration: underline;">2.1 Van
ODBC meghajt&oacute; PostgreSQL-hez?</big><br>
<p>K&eacute;t ODBC meghajt&oacute; &eacute;rhet&otilde; el: PsqlODBC
&eacute;s a OpenLink ODBC.</p>
<p>A PsqlODBC a PostgreSQL kiad&aacute;s r&eacute;sze. Tov&aacute;bbi
inform&aacute;ci&oacute; tal&aacute;lhat&oacute; a&nbsp;
ftp://ftp.PostgreSQL.org/pub/odbc/ oldalon.</p>
<p>Az OpenLink ODBC-t a <a href="http://www.openlinksw.com">http://www.openlinksw.com</a>
c&iacute;mr&otilde;l
t&ouml;ltheted le. Ez az &otilde; szabv&aacute;nyos ODBC kliens
szoftver&uuml;kkel
m&ucirc;k&ouml;dik, &iacute;gy minden</p>
<p>&aacute;ltaluk t&aacute;mogatott platformon (Win, Mac, Unix, VMS)
el&eacute;rhet&otilde; lesz&nbsp; a PostgreSQL szerver.</p>
<p>Tal&aacute;n olyan vev&otilde;knek fogj&aacute;k eladni, akik
kereskedelmi min&otilde;s&eacute;g&ucirc; term&eacute;ket
szeretn&eacute;nek kapni, de a freeware verzi&oacute; mindig
el&eacute;rhet&otilde; lesz. K&eacute;rd&eacute;seidet a
term&eacute;kkel kapcsolatban a postgres95@openlink.co.uk
c&iacute;men teheted fel.</p>
<p>Olvasd el az ODBC fejezetet is a programoz&oacute;k
k&eacute;zik&ouml;nyv&eacute;ben!</p>
<p><a name="2.2"></a><big style="text-decoration: underline;">2.2
Milyen
eszk&ouml;z&ouml;k &aacute;llnak
rendelkez&eacute;sre PostgreSQL Web fejleszt&eacute;sekhez?</big></p>
<p>Egy sz&eacute;p bemutat&oacute; olvashat&oacute; az
adatb&aacute;zissal
t&aacute;mogatott web oldalanr&oacute;l a http://www.webreview.com
weboldalon.</p>
<p>A web integr&aacute;ci&oacute;hoz a PHP egy kiv&aacute;ll&oacute;
szoftver. Let&ouml;lthet&otilde; a <a href="http://www.php.net">http://www.php.net</a>
c&iacute;mr&otilde;l. </p>
<p>Komplexebb esetekre sokan haszn&aacute;lj&aacute;k a Perl
fel&uuml;letet &eacute;s a CGI.pm vagy a mod_perl-t.</p>
<p><a name="2.3"></a><big style="text-decoration: underline;">2.3 Van a
PostgreSQL-hez grafikus
felhaszn&aacute;l&oacute;i fel&uuml;let?</big></p>
<p>Van egy sz&eacute;p PgAccess nev&ucirc; grafikus
fel&uuml;let&uuml;nk,
ami riport gener&aacute;tork&eacute;nt is haszn&aacute;lhat&oacute;. A
weboldal&aacute;t megtal&aacute;lod a
<a href="http://www.pgaccess.org/">http://www.pgaccess.org/</a>
c&iacute;men.</p>
<p>A <a href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</a>
oldalon tal&aacute;lhatsz egy pontos &eacute;s r&eacute;szltes
list&aacute;t.<br>
</p>
<p><a name="2.4"></a><big style="text-decoration: underline;">2.4
Milyen
programoz&aacute;si nyelvekkel lehet
el&eacute;rni a PostgreSQL szervert?</big></p>
<p>A k&ouml;vetkez&ouml;k: </p>
<ul>
<li>C (libpq)</li>
<li>C++ (libpq++)</li>
<li>Embedded C (ecpg)</li>
<li>Java (jdbc)</li>
<li>Perl (DBD::Pg and perl5)</li>
<li>ODBC (odbc)</li>
<li>Python (PyGreSQL)</li>
<li>TCL (libpgtcl)</li>
<li>C Easy API (libpgeasy)</li>
<li>PHP ('pg_' functions, Pear::DB)</li>
</ul>
<br>
Tov&aacute;bbi programoz&aacute;si fel&uuml;letek
&eacute;rhet&otilde;ek el a <br>
<a href="http://www.PostgreSQL.org/interfaces.html">
http://www.PostgreSQL.org/interfaces.html</a> &eacute;s a<br>
<a href="http://gborg.PostgreSQL.org"> http://gborg.PostgreSQL.org</a>
oldalakon.<br>
<br>
<hr style="width: 100%; height: 2px;">
<h2 style="text-align: center;">Adminisztr&aacute;ci&oacute;s
k&eacute;rd&eacute;sek</h2>
<br>
<a name="3.1"></a> <big><span style="text-decoration: underline;">3.1
Hogyan tudom a PostgreSQL-t /usr/local/pgsql
-t&otilde;l elt&eacute;r&otilde; helyre install&aacute;lni?</span></big><br>
<p>A configure script --prefix param&eacute;ter&eacute;nek
haszn&aacute;lat&aacute;val.</p>
<a name="3.2"></a> <big style="text-decoration: underline;">3.2 AMikor
elind&iacute;tom a postmaster-t, egy
"Bad System Call"-t vagy core dump-ot kapok. Mi&eacute;rt?</big><br>
<p>Sz&aacute;mos probl&eacute;ma lehet, de legel&ouml;ssz&ouml;r
ellen&otilde;rizd le, hogy a kerneled System V
kieg&eacute;sz&iacute;t&eacute;sekkel rendelkezik-e. A
PostgreSQL haszn&aacute;lja a kernel osztott mem&oacute;ria &eacute;s
szemafor API-j&aacute;t. </p>
<p><a name="3.3"></a><big style="text-decoration: underline;">3.3
Amikor
megpr&oacute;b&aacute;lom inditani a
postmaster-t, "IpcMemoryCreate" hib&aacute;kat kapok. Mi&eacute;rt?</big></p>
<p>
Vagy nincs megfelel&otilde;en konfigur&aacute;lva a kerneled osztott
mem&oacute;ria t&aacute;mogat&aacute;sa vagy meg kell
nagyobb&iacute;tanod a maxim&aacute;lis osztott
mem&oacute;ria m&eacute;retet.</p>
<p>A pontos m&eacute;ret sz&uuml;ks&eacute;glet f&uuml;gg az
architekt&uacute;r&aacute;dt&oacute;l &eacute;s att&oacute;l hogy
h&aacute;ny buffert &eacute;s processzt konfigur&aacute;lsz a
postmasternek.
Legal&aacute;bb 1 MB ter&uuml;letre sz&uuml;ks&eacute;ged van. A
PostgreSQL
Adminisztr&aacute;ci&oacute; k&eacute;zik&ouml;nyvben olvashatsz
r&eacute;szletesebb inform&aacute;ci&oacute;kat az osztott
mem&oacute;ri&aacute;r&oacute;l &eacute;s a szemaforokr&oacute;l.</p>
<a name="3.4"></a><big style="text-decoration: underline;">3.4) Amikor
megpr&oacute;b&aacute;lom inditani a
postmaster-t, "IpcSemaphoreCreate" <br>
hib&aacute;kat kapok. Mi&eacute;rt?</big><br>
<p>Ha a hiba&uuml;zenet ez: " IpcSemaphoreCreate: semget failed (No
space left on device)", akkor a kerneled konfigur&aacute;ci&oacute;ja
nem
tesz lehet&otilde;v&eacute; elegend&otilde; szemafort. A PostgreSQL
szerver processzenk&eacute;nt 1
szemafort ig&eacute;nyel. Egy &aacute;tmeneti megold&aacute;s lehet az
hogy a
postmastert kevesebb maxim&aacute;lis processz sz&aacute;mmal inditod
el. Haszn&aacute;ld a
-D param&eacute;tert. Egy sokkal megfelel&otilde;bb megold&aacute;s az
ha n&ouml;veled a
kerneled SEMMNS &eacute;s SEMMNI param&eacute;tereit.</p>
<p>A hib&aacute;s szemaforok is adat&aacute;zis
lerobban&aacute;s&aacute;hoz is vezethet nagy terhel&eacute;s
eset&eacute;n.Ha a hiba&uuml;zenet valami m&aacute;s, lehet hogy nincs
szemaforok
t&aacute;mogat&aacute;s</p>
<p>forditva a kerneledbe. Olvasd el a PostgreSQL
adminisztr&aacute;torok k&eacute;zik&ouml;nyv&eacute;ben az osztott
mem&oacute;ri&aacute;r&oacute;l &eacute;s a szemaforokr&oacute;l
sz&oacute;l&oacute; fejezetet.</p>
<p><a name="3.5"></a><big style="text-decoration: underline;">3.5)
Hogyan tudom kontroll&aacute;lni a m&aacute;s
g&eacute;pekr&otilde;l &eacute;rkez&otilde; kapcsolat
k&eacute;r&eacute;seket?</big></p>
<p>Alap&eacute;rtelmez&eacute;sben a PostgreSQL a helyi kapcsolatokat
Unix
socketekkel val&oacute;s&iacute;tja meg. M&aacute;s g&eacute;pek nem
lesznek
k&eacute;pesek csatlakozni, ha nem enged&eacute;lyezed azt -i
opci&oacute;val a postmasternek, &eacute;s
nem &aacute;ll&iacute;tod be host a alap&uacute;
azonos&iacute;t&aacute;st a pg_hba.conf
&aacute;llom&aacute;nyban. Ezzel v&aacute;lnak lehet&otilde;v&eacute; a
TCP/IP kapcsolatok.</p>
<p><a name="3.6"></a><big style="text-decoration: underline;">3.6)
Hogyan tudom nagyobb
teljes&iacute;tm&eacute;nyre hangolni az adatb&aacute;zisomat?</big></p>
<p>Az indexel&eacute;s felt&eacute;tlen&uuml;l gyors&iacute;tja a
lek&eacute;rdez&eacute;seket. Az EXPLAIN parancs lehet&otilde;v&eacute;
teszi hogy l&aacute;sd, hogy a
PostgreSQL mik&eacute;nt interpret&aacute;lja a
lek&eacute;rdez&eacute;st &eacute;s melyik indexet haszn&aacute;lja.</p>
<p>Ha sok INSERT m&ucirc;veletet hajtassz v&eacute;gre, csin&aacute;ld
nagy k&ouml;tegekben a COPY paranccsal. Ez sokkal gyorsabb mint az
egyedi INSERT parancsok.
M&aacute;sodszor: Azok a m&ucirc;veletek, amelyek nincsenek
tranzakci&oacute; blokkon
bel&uuml;l, azok saj&aacute;t tranzakci&oacute;t ind&iacute;tanak. Sok
m&ucirc;veletet &eacute;rdemes
egy tranzakci&oacute;n bel&uuml;l v&eacute;grehajtani. Ez
cs&ouml;kkenti a tranzakci&oacute;
kezel&eacute;s t&ouml;bbletidej&eacute;t. Az indexeket javasolt a nagy
adatv&aacute;ltoz&aacute;sok el&ouml;tt
elt&aacute;vol&iacute;tani, majd &uacute;jra l&eacute;trehozni.</p>
<p>Sz&aacute;mos teljes&iacute;tm&eacute;ny jav&iacute;t&oacute;
lehet&otilde;s&eacute;g van. Kikapcsolhatod az fsync() m&ucirc;veletet
a postmaster -o -F opci&oacute;kval val&oacute;
ind&iacute;t&aacute;sakor. &Iacute;gy nem fog az amugy lass&uacute;
fsync() f&uuml;ggv&eacute;ny
megh&iacute;v&oacute;dni minden tranzakci&oacute; v&eacute;g&eacute;n.</p>
<p>Haszn&aacute;lhatod a postmaster -B opci&oacute;j&aacute;t is az
osztott mem&oacute;ria szegmens m&eacute;ret&eacute;nek
n&ouml;vel&eacute;s&eacute;hez. Ha az
&eacute;rt&eacute;ket t&uacute;l magasra &aacute;ll&iacute;tod, lehet
hogy a postmaster nem indul el, mert t&uacute;ll&eacute;pted az
oper&aacute;ci&oacute;s rendszer &aacute;ltal&nbsp; megengedett
m&eacute;retet. Minden buffer 8K m&eacute;ret&ucirc;
&eacute;s alap&eacute;rtelmez&eacute;sban 64 buffer van.</p>
<p>A -S opci&oacute;val n&ouml;velheted a szerver &aacute;tmeneti
rendez&eacute;sekre fenntartott mem&oacute;ria ter&uuml;let&eacute;t.
Az &eacute;rt&eacute;ket
kilobyteban add meg. Az alap&eacute;rtelmezett &eacute;rt&eacute;k
512K. </p>
<p>Haszn&aacute;lhatod a CLUSTER utas&iacute;t&aacute;st is, hogy a
t&aacute;bl&aacute;kat egy indexnek megfelel&otilde;en
csoportos&iacute;tsd. Olvasd el a CLUSTER
k&eacute;zik&ouml;nyv oldalt tov&aacute;bbi r&eacute;szletek&eacute;rt.<br>
</p>
<p>Hardver kiv&aacute;laszt&aacute;s&aacute;ban seg&iacute;thet: <a
href="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>
&eacute;s <a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a>.<br>
</p>
<p>A postgresql.conf be&aacute;llit&aacute;saival kapcsolatos
tudnival&oacute;k: <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>
&eacute;s <a
href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>.</p>
<p></p>
<p><a name="3.7"></a> <big style="text-decoration: underline;">3.7)
Milyen hibakeres&otilde;
lehet&otilde;s&eacute;gek &eacute;rhet&otilde;ek el?</big></p>
<p>A PostgreSQL sz&aacute;mos lehet&ouml;s&eacute;ggel rendelkezik ami
&eacute;rt&eacute;kes lehet a hibakeres&eacute;sn&eacute;l.</p>
El&ouml;ssz&ouml;r is, futtathatod a configure scriptet
--enable-cassert opci&oacute;val, sok assert()
funkci&oacute;hiv&aacute;s ellen&ouml;rzi
a program fut&aacute;s&aacute;t &eacute;s meg&aacute;llitja ha valami
v&eacute;ratlan hiba t&ouml;rt&eacute;nik.<br>
<p>Mind a postmaster &eacute;s a postgres sz&aacute;mos hibakeres&ouml;
lehet&uuml;s&eacute;ggel rendelkezik. Mindig amikor elinditod a
postmastert, gy&ouml;z&ouml;dj meg
r&oacute;la, hogy a kimenetet log &aacute;llom&aacute;nyba
k&uuml;ld&ouml;d. Igy:</p>
<p>cd /usr/local/pgsql</p>
<p>./bin/postmaster &gt;server.log 2&gt;&amp;1 &amp;</p>
<p>Ez egy server.log &aacute;llom&aacute;nyt hoz l&eacute;tre a
fels&ouml;
PostgreSQL k&ouml;nyvt&aacute;rban. Ez az &aacute;llom&aacute;ny
tartlamaz majd sz&aacute;mos hasznos
inform&aacute;ci&oacute;t a szerverrel kapcsolatos
probl&eacute;m&aacute;kr&oacute;l &eacute;s
hib&aacute;kr&oacute;l. A postmaster -d opci&oacute;j&aacute;val lehet
r&eacute;szletesebb hibakeres&ouml; inform&aacute;ci&oacute;t kapni. A
-d opci&oacute;hoz meg kell hat&aacute;rozni egy hiba szintet.
Vigy&aacute;zz, a magas
hibakeres&ouml; szint nagy log &aacute;llom&aacute;nyt okozhat.</p>
<p>Ha a postmaster nem fut, akkor futtathatod a postgres szervert
parancssorb&oacute;l is, &eacute;s az SQL kifejez&eacute;st
k&ouml;zvetlen&uuml;l ennek adhatod &aacute;t. Ez csak
hibakeres&eacute;s eset&eacute;ben javasolt. Az &uacute;j sor a
kifejez&eacute;s v&eacute;g&eacute;t jelenti, nem a pontosvessz&ouml;.
Ha hibakeres&ouml; opci&oacute;kkal
forditottad a szervert, haszn&aacute;lhatsz egy debuggert is hogy
l&aacute;sd hogy mi
t&ouml;rt&eacute;nik. Mivel igy a szervert nem a postmaster inditotta,
nem
t&ouml;bbfelhaszn&aacute;l&oacute;s k&ouml;rnyezetk&eacute;nt fut, igy
a z&aacute;rol&aacute;si &eacute;s a szerverek
k&ouml;z&ouml;tti kommunik&aacute;ci&oacute;s hiba jelens&eacute;gek
nem jelentkeznek.</p>
<p>Ha m&aacute;r fut a postmaster, indits egy psql-t, &eacute;s
n&eacute;zd meg a szerver processz PID-j&eacute;t! Egy debuggert
haszn&aacute;lhatsz a processzhez
csatlakoz&aacute;shoz. Be&aacute;llithatsz t&ouml;r&eacute;spontokat
&eacute;s elindithatsz
lek&eacute;rdez&eacute;seket. Ha a postgres indit&aacute;sban keresel
hib&aacute;t, a PGOPTIONS k&ouml;rnyezeti
v&aacute;ltoz&oacute;t &aacute;llitsd be "-W n" &eacute;rt&eacute;kre.
Ez n m&aacute;sodperc v&aacute;rakoz&aacute;st
id&eacute;z el&ouml;, igy tudsz csatlakozni a processzhez, el tdsz
hejezni t&ouml;r&eacute;spontokat, majd
folytathatod a ind&iacute;t&aacute;st.</p>
<p>A postgres program -s, -A &eacute;s -t opci&oacute;i is nagyon
hasznosak lehetnek hibakeres&eacute;sn&eacute;l &eacute;s
teljes&iacute;tm&eacute;ny
m&eacute;r&eacute;sn&eacute;l.</p>
<p>Profiling leht&ouml;s&eacute;ggel is fordithatod a szervert, hogy
l&aacute;sd melyik funkci&oacute;k foglalj&aacute;k el a fut&aacute;si
id&otilde;t. A
szerver profile &aacute;llom&aacute;nyai a pgsql/data/base/dbname
k&ouml;nzvt&aacute;rba ker&uuml;lnek, a kliens
profile &aacute;llom&aacute;nyok az aktu&aacute;lis
k&ouml;nyvt&aacute;rba.
Linuxon ehhez sz&uuml;ks&eacute;ges a -DLINUX_PROFILE
ford&iacute;t&aacute;si direktiva.</p>
<a name="3.8"></a> <big style="text-decoration: underline;">3.8)
Mi&eacute;rt kapok "Sorry, too many clients"
(T&uacute;l sok kliens) <br>
hib&aacute;t csatlakoz&aacute;sn&aacute;l?</big><br>
<p>N&ouml;velned kell a postmaster egyidej&ucirc;leg futtatott szerver
processz sz&aacute;m korl&aacute;tj&aacute;t.</p>
<p>Az alap&eacute;rtelmezett korl&aacute;t 32 processz. Ezt
n&ouml;velhetjed &uacute;gy, hogy &uacute;jrainditod a postmastert
&eacute;s -N opci&oacute;val
meghat&aacute;rotod az &uacute;j &eacute;rt&eacute;ket, vagy
m&oacute;dositod a postgresql.conf-ot.</p>
<p>Ne felejtsd el, hogy ha n&ouml;veled a szerver processzek
maxim&aacute;lis sz&aacute;m&aacute;t, akkor bufferek
sz&aacute;m&aacute;t is n&ouml;velned kell,
legal&aacute;bb a processzek sz&aacute;m&aacute;nak
k&eacute;tszeres&eacute;re. Nagy processz sz&aacute;mokeset&eacute;ben
val&oacute;szin&uuml;leg a Unix konfigur&aacute;ci&oacute;s
param&eacute;tereken is n&ouml;velni kell.
Ellen&ouml;rizd a SHMMAX (az osztott mem&oacute;ria szegmensek
maxim&aacute;lis m&eacute;rete),
a SEMMNS &eacute;s a SEMMNI (a szemaforok maxim&aacute;lis
sz&aacute;ma), az NPROC (a processzek
maxim&aacute;lis sz&aacute;ma), a MAXUPRC
(felhaszn&aacute;l&oacute;nk&eacute;nti maxim&aacute;lis
processz sz&aacute;m) &eacute;s a NFILE &eacute;s NINODE (a megnzitott
&aacute;llom&aacute;nzok maxim&aacute;lis sz&aacute;ma)
param&eacute;tereket. A PostgreSQL az&eacute;rt korl&aacute;tozza
k&uuml;l&ouml;n a processz
sz&aacute;mot, hogy a rendszeredet ne terhelhesse meg
t&uacute;ls&aacute;gosan.</p>
<p>A PostgreSQL 6.5 verzi&oacute;ban a maxim&aacute;lis szerver
processz
sz&aacute;m 64 volt &eacute;s a m&oacute;dosit&aacute;shoz bele kellett
irni a
include/storage/sinvaladt.h &aacute;llom&aacute;nyba &eacute;s
&uacute;jra kellett forditani a servert. <a name="3.9"></a></p>
<big style="text-decoration: underline;">3.9) Mi van pgsql_tmp
k&ouml;nyvt&aacute;rban?</big><br>
<p>Ez a k&ouml;nyvt&aacute;r a lek&eacute;rdez&eacute;s
v&eacute;grehajt&oacute; &aacute;ltal l&eacute;trehezott
&aacute;tmeneti &aacute;llom&aacute;nyokat tartalmazza.
P&eacute;ld&aacute;ul ha egy
rendez&eacute;st kell v&eacute;grehajtani egy ORDER BY kifejez&eacute;s
miatt &eacute;s a m?velet t&ouml;bb
mem&oacute;ri&aacute;t vesz ig&eacute;nybe, mint amennyit a -S
param&eacute;ter megenged, akkor az
&aacute;tmeneti k&ouml;nyvt&aacute;rban hoz l&eacute;tre egy
&aacute;llom&aacute;nyt a
fennmarad&oacute; adat t&aacute;rol&aacute;s&aacute;ra.</p>
<p>Az &aacute;tmeneti &aacute;llom&aacute;nyok t&ouml;bbnyire
t&ouml;rl?dnek, de meg is maradhat ha p&eacute;ld&aacute;ul
v&aacute;ratlan hib&aacute;val le&aacute;ll a
szerver egy rendez&eacute;s k&ouml;zben. Indit&aacute;skor &eacute;s
le&aacute;llit&aacute;skor ezeket az
&aacute;llom&aacute;nyokat t&ouml;rli a postmaster.</p>
<a name="3.10"></a> <big style="text-decoration: underline;">3.10)
Mi&eacute;rt kell dumpolni &eacute;s
&uacute;jrat&ouml;lteni PostgreSQL kiad&aacute;s
v&aacute;lt&aacute;s&aacute;n&aacute;l?</big><br>
<p>A PostgreSQL csapat csak apr&oacute;bb
v&aacute;ltoztat&aacute;sokat
hajt v&eacute;gre a kisebb kiad&aacute;sok k&ouml;z&ouml;tt, igy ha 7.2
verzi&oacute;r&oacute;l
&aacute;llsz &aacute;t 7.2.1 verzi&oacute;ra, akkor nem
sz&uuml;ks&eacute;ges kidumplonod az adatb&aacute;zist. A nagy
kiad&aacute;sok eset&eacute;ben (p&eacute;ld&aacute;ul
verzi&oacute;r&oacute;l 7.3-ra &aacute;tt&eacute;r&eacute;sn&eacute;l)
v&aacute;ltozik a belsi&otilde; adatstrukt&uacute;r&aacute;k &eacute;s
adat&aacute;llom&aacute;nyok form&aacute;tuma. Ezek a
v&aacute;ltoz&aacute;sok gyakran nagyon &ouml;sszetettek, ez&eacute;rt
ink&aacute;b nem tartunk fenn visszafel&eacute;
kompatibilit&aacute;st. A dump az adatot &aacute;ltal&aacute;nos
form&aacute;tumban irja ki, majd az
&uacute;j form&aacute;tumban lehet azt visszat&ouml;leni.
</p>
Azokban a kiad&aacute;sokban, amelyek k&ouml;z&ouml;tt az adat
form&aacute;tum nem v&aacute;ltozik, a pg_upgrade program
haszn&aacute;lhat&oacute; dumpol&aacute;s
&eacute;s helyre&aacute;llit&aacute;s n&eacute;lk&uuml;l.
<hr style="width: 100%; height: 2px;"><br>
<h2 style="text-align: center;"> M&ucirc;k&ouml;dtet&eacute;si
k&eacute;rd&eacute;sek</h2>
<br>
<a name="4.1"></a> <big style="text-decoration: underline;">4.1) Mi a
k&uuml;l&ouml;nbs&eacute;g a
bin&aacute;ris &eacute;s a norm&aacute;l kurzorok k&ouml;z&ouml;tt?</big><br>
<p>N&eacute;zd meg a DECLARE dokument&aacute;ci&oacute;j&aacute;t.</p>
<a name="4.2"></a> <big style="text-decoration: underline;">4.2)
Hogyan tudom select-elni a
lek&eacute;rdez&eacute;s els&otilde; p&aacute;r sor&aacute;t?</big><br>
<p>Olvasd el a FETCH dokument&aacute;ci&oacute;j&aacute;t, vagy
haszn&aacute;ld a SELECT LIMIT-et.</p>
<p>Az eg&eacute;sz lek&eacute;rdez&eacute;st v&eacute;gre kell
hajtani,
m&eacute;g akkor is, ha csak az els&otilde; p&aacute;r sort akarod
megkapni. Gondolj arra, hogy a
lek&eacute;rdez&eacute;sben lehet ORDER BY is. Ha van olyan index, ami
megfelel az ORDER BY kifejez&eacute;sednek,
a PostgreSQL k&eacute;pes lehet az els&ouml; n&eacute;h&aacute;ny
rekord
visszaad&aacute;s&aacute;ra, vagy a teljes lek&eacute;rdez&eacute;snek
le kell futnia, amig a k&eacute;rt rekordok
le nem gener&aacute;l&oacute;dnak.
<a name="4.3"></a><big style="text-decoration: underline;"><br>
</big></p>
<p><big style="text-decoration: underline;">4.3) Hogy tudom
kilist&aacute;zni a
t&aacute;bl&aacute;kat vagy m&aacute;s dolgokat a PostgreSQL-ben?</big></p>
<p>Elolvashatod a psql forr&aacute;s k&oacute;dj&aacute;ban a
pgsql/src/bin/psql/describe.c &aacute;llom&aacute;nyban. Ez SQL
parancsokat tartalmaz, amelyek azokat
a kimeneteket &aacute;llitj&aacute;k el&ouml;, amiket a per jellel
kezd&ouml;d&ouml;
parancsok adnak vissza.</p>
<a name="4.4"></a> <big style="text-decoration: underline;">4.4)
Hogyan tudok elt&aacute;vol&iacute;tani egy
oszlopot egy t&aacute;bl&aacute;b&oacute;l?</big><br>
<br>
<p>Ez a funkcionalit&aacute;s a 7.3 verzi&oacute;t&uuml;l kezdve
&eacute;rhet&ouml; el az ALTER TABLE DROP COLUMN -nal. A r&eacute;gebbi
verti&oacute;kban igy lehet
v&eacute;grehajtani:</p>
<pre>BEGIN;</pre>
<pre>LOCK TABLE old_table;</pre>
<pre>SELECT ... -- minden oszlopot, kiv&eacute;tel amit t&ouml;r&ouml;lni szeretn&eacute;l<br></pre>
<pre>INTO TABLE new_table</pre>
<pre>FROM old_table;</pre>
<pre>DROP TABLE old_table;</pre>
<pre>ALTER TABLE new_table RENAME TO old_table;</pre>
<pre>COMMIT;</pre>
<pre><br></pre>
<h4><a name="4.5"></a><big
style="text-decoration: underline; font-weight: normal;">4.5) Mi a
maxim&aacute;lis m&eacute;rete egy sornak,
egy t&aacute;bl&aacute;nak vagy egy adatb&aacute;zisnak?</big></h4>
<br>
<p>A korl&aacute;tok:</p>
<ul>
<li>
<p>adatb&aacute;zis: korl&aacute;tlan (1 TB az &aacute;ltalunk
ismert
lagnagyobb)</p>
</li>
<li>
<p>t&aacute;bla: 16 TB</p>
</li>
<li>
<p>rekord/sor 1.6TB</p>
</li>
<li>
<p>mez&ouml; 1 GB</p>
</li>
<li>
<p>a t&aacute;bla sorainak sz&aacute;ma: korl&aacute;tlan</p>
</li>
<li>
<p>a t&aacute;bla oszlopainak sz&aacute;ma: 250-1600 az oszlop
nevekt&otilde;l f&uuml;gg&ouml;en</p>
</li>
<li>
<p>A t&aacute;bla indexeinek sz&aacute;ma: korl&aacute;tlan</p>
</li>
</ul>
<p>Term&eacute;szetesen nem igaz&aacute;n korl&aacute;tlan, de a
t&aacute;rter&uuml;let, mem&oacute;ria &eacute;s egy&eacute;b
k&uuml;ls&ouml; t&eacute;nyez&ouml;k korl&aacute;tozz&aacute;k. A
teljesitm&eacute;ny romolhat, ha ezek az &eacute;rt&eacute;kek
szokatlanul nagyok.</p>
<p>A 16 TB-os legnagyobb t&aacute;bla m&eacute;ret nem ig&eacute;nyel
nagy
&aacute;llom&aacute;ny t&aacute;mogat&aacute;st. A nagy
t&aacute;bl&aacute;k t&ouml;bb 1 GB m&eacute;ret&uuml;
&aacute;llom&aacute;nyba ker&ouml;lnek, igy az &aacute;llom&aacute;ny
rendszer korl&aacute;tai nem l&eacute;nyegesek.</p>
<p>A maxim&aacute;lis t&aacute;bla m&eacute;ret &eacute;s az oszlopok
maxim&aacute;lis oszlop sz&aacute;m n&ouml;velhet&ouml;, ha az
alap&eacute;rtelmezett blokkm&eacute;retet 32k-ra n&ouml;veled.</p>
<a name="4.6"></a> <big style="text-decoration: underline;">4.6)
Mekkora adatb&aacute;zis lemez ter&uuml;let
sz&uuml;ks&eacute;ges egy tipikus sz&ouml;veg &aacute;llom&aacute;ny <br>
t&aacute;rol&aacute;s&aacute;hoz?</big><br>
<p>A PostgreSQL ak&aacute;r a sz&ouml;veg &aacute;llom&aacute;ny
helyig&eacute;ny&eacute;nek &ouml;tsz&ouml;r&ouml;s&eacute;t is
elfoglalhatja.</p>
<p>K&eacute;pzelj el p&eacute;ld&aacute;ul, egy 100.000 soros
sz&ouml;veget, aminek minde sora egy sz&aacute;mb&oacute;l &eacute;s
egy sz&ouml;vegb&otilde;l
&aacute;ll. Tegy&uuml;k el, hogy &aacute;tlagosan 20 byte hossz&uacute;
sz&ouml;vegek. Ez a sz&ouml;veg&aacute;llom&aacute;ny
k&ouml;r&uuml;lbel&uuml;l 2.8 MB helyet foglalna el. A t&aacute;bla ami
a fenti adatszerkezetet elt&aacute;roln&aacute;,
k&ouml;r&uuml;lbel&uuml;l 6.4 MB-os lenne. Ezt a
k&ouml;vetkez&ouml;k&eacute;ppen sz&aacute;molhatjuk ki:</p>
<p>36 byte: sor fejl&eacute;c</p>
<pre>24 byte: egy int mez&ouml; + egy sz&ouml;veg mez&ouml;</pre>
<pre>4 byte: mutato</pre>
<pre>---------------------------------------</pre>
<pre>64 byte soronkent.</pre>
<p>Az adat oldal m&eacute;rete a PostgreSQL-ben 8192 byte, igy 8192 /
64 = 128 rekord adatb&aacute;zis oldalank&eacute;nt
(lefel&eacute; kerekitve).</p>
<pre>100000 rekord / 128 rekord oldalank&eacute;nt = 782 adat oldal<br>(felel&eacute; kerekitve).</pre>
<pre>782 adatb&aacute;zis oldal * 8192 byte olalank&eacute;nt = 6,406,144<br>byte (6.4 MB)</pre>
<p>Az indexek nem foglalnak t&uacute;l sokat, de tartalmazz&aacute;k az
indexelt adatot, igy ezek is lehetnek nagyok.</p>
<p>A NULL &eacute;rt&eacute;kek bitt&eacute;rk&eacute;pben vannak
t&aacute;rolva, igy kev&eacute;s helyet foglanak.</p>
<p><a name="4.7"></a><big style="text-decoration: underline;">4.7) Hogy
tudhatom meg milyen t&aacute;bl&aacute;k,
indexek, adatb&aacute;zisok vagy felhaszn&aacute;l&oacute;k</big></p>
<big style="text-decoration: underline;">vannak defini&aacute;lva?<br>
</big>
<p>A psql-ben tal&aacute;lsz sz&aacute;mos '\' karakterrel
kezd&ouml;d&ouml; utas&iacute;t&aacute;st az ilyen
inform&aacute;ci&oacute;k list&aacute;z&aacute;s&aacute;ra. A '\?'
segits&eacute;g&eacute;vel tudot kilist&aacute;zni ezeketa parancsokat.
Ezen kiv&uuml;l vannak rendszer t&aacute;bl&aacute;k,
amelyek nevei 'pg_'-vel kezd&ouml;dnek.</p>
<p>Pr&oacute;b&aacute;ld ki a pgsql/src/tutorial/syscat.source
&aacute;llom&aacute;nyt is. Ez sok p&eacute;ld&aacute;t tartalmaz az
rendszert&aacute;bl&aacute;kon
v&eacute;grehajtott SELECT-ekr&ouml;l.</p>
<p><a name="4.8"></a><big style="text-decoration: underline;">4.8) A
lek&eacute;rdez&eacute;seim lass&uacute;ak,
vagy nem haszn&aacute;lj&aacute;k az indexeket. Mi&eacute;rt?</big></p>
<p><big style="text-decoration: underline;"></big></p>
<p>Az indexeket nem haszn&aacute;lja a szerver minden
lek&eacute;rdez&eacute;sn&eacute;l automatikusan. Csak akkor
haszn&aacute;l indexet, ha a t&aacute;bla m&eacute;rete egy
megadott als&oacute; hat&aacute;r felett van, &eacute;s a
lek&eacute;rdez&eacute;s csak a sorok egy kis
r&eacute;sz&eacute;t &eacute;rinti. Ez az&eacute;rt van, mert a
v&eacute;letlen hozz&aacute;f&eacute;r&eacute;s m&eacute;g
mindig lassabb lehet mint az t&aacute;bla szekvenci&aacute;lis
olvas&aacute;sa.</p>
<p>Hogy a PostgreSQL meg tudja hat&aacute;rozni hogy kell-e indexet
haszn&aacute;lni, l&eacute;teznie kell egy statisztik&aacute;nak a
t&aacute;bl&aacute;r&oacute;l. Ez a statisztikai adatok a VAACUM
ANALYZE vagy az egyszer&ucirc; ANALYZE m&ucirc;veletek
sor&aacute;n j&ouml;nnek l&eacute;tre. A statisztikai adatok
felhaszn&aacute;l&aacute;s&aacute;val az optimaliz&aacute;l&oacute; meg
tudja hat&aacute;rozni, hogy h&aacute;ny sor van a
t&aacute;bl&aacute;ban, &eacute;s el tudja d&ouml;nteni, hogy
haszn&aacute;ljon-e indexet. A statisztiaki
adatgy&uuml;jt&eacute;st id&otilde;nk&eacute;nt v&eacute;gre kell
hajtani, ahogy a t&aacute;bla adatai v&aacute;ltoznak.</p>
<p>Az indexeket norm&aacute;lis esetben nem haszn&aacute;lja az ORDER
BY
vagy az OUTER JOIN. A szekvenci&aacute;lis olvas&aacute;s
&aacute;ltal&aacute;ban gyorsabb, mint az index keres&eacute;s egy nagy
t&aacute;bl&aacute;ban. B&aacute;r a LIMIT az ORDER BY-val
kombin&aacute;lva haszn&aacute;lhat
indexet, mert a t&aacute;bla csak kis r&eacute;sze &eacute;rintett.
B&aacute;r a MIN
&eacute;s MAX SQL funkci&oacute;k sem haszn&aacute;lj&aacute;k az
indexeket, ezeket az
&eacute;rt&eacute;keket egy ORDER BY + LIMIT
lek&eacute;rdez&eacute;ssel is le lehet k&eacute;rdezni:</p>
<pre>SELECT col</pre>
<pre>FROM tab</pre>
<pre>ORDER BY col [ DESC ]</pre>
<pre>LIMIT 1;</pre>
<br>
<p>Amikor helyettes&iacute;t&otilde; jel oper&aacute;torokat
haszn&aacute;lsz, mint a LIKE kulcssz&oacute; vagy a ~, az indexeket
csak bizonyos k&ouml;r&uuml;lm&eacute;nyek
k&ouml;z&ouml;tt lehet haszn&aacute;lni:</p>
<p>A keres&otilde; string kezdete a keres&eacute;si minta elej&eacute;n
kell hogy legyen. P&eacute;ld&aacute;ul:</p>
<ul>
<li>A LIKE mint&aacute;k nem kezd&otilde;dhetnek % jellel.</li>
<li>&nbsp;~ (regexp) kifejez&eacute;sek nem kezd&otilde;dhetnek ^
jellel.</li>
<li>A keres&eacute;si kifejez&eacute;s nem kezd&otilde;dhet karakter
oszt&aacute;llyal.</li>
<li>A case-insensitive keres&eacute;s (ILIKE, ~*) nem
haszn&aacute;lnak
indexet ehelyett funkcion&aacute;lis indexet haszn&aacute;lnak, amit a
4.12
pontban tal&aacute;lhatsz.</li>
<li>Az alap&eacute;rtelmezett C hellyel kell futtatni az initdb-t.</li>
</ul>
<a name="4.9"></a> <big style="text-decoration: underline;">4.9) Hogy
tudom ellen&otilde;rizni, hogy
optimaliz&aacute;lta a lek&eacute;rdez&eacute;s
optimaliz&aacute;l&oacute;<br>
a lek&eacute;rdez&eacute;sem?<br>
</big>
<p>Olvasd el a dokument&aacute;ci&oacute; EXPLAIN-r&oacute;l
sz&oacute;l&oacute; r&eacute;sz&eacute;t.</p>
<p><a name="4.10"></a><big style="text-decoration: underline;">4.10) Mi
az R-tree index?</big></p>
<p>Az R-tree index a t&eacute;rbeli adat indexel&eacute;s&eacute;re
alkalmas. Egy hash index nem k&eacute;pes tartom&aacute;ny
keres&eacute;sekre. A B-tree
index csak egy dimenzi&oacute;n kezeli a tartom&aacute;ny
keres&eacute;seket.
P&eacute;ld&aacute;ul ha az indexet egy pont (point adatt&iacute;pus)
t&iacute;pus&uacute; mez.re
&eacute;p&iacute;tj&uuml;k, gyorsabban kezeli az olyan jelleg&uuml;
lek&eacute;rdez&eacute;seket, mint egy
adott k&ouml;rben</p>
<p>tal&aacute;lhat&oacute; pontok.</p>
<p>Az R-tree tervez&eacute;si mint&aacute;t eredetileg
le&iacute;r&oacute;
sz&ouml;veg: Guttman, A. "R-trees: A Dynamic Index Structure for
Spatial Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on
Mgmt of Data, 45-57.</p>
<p>Ezt olvashatod Stonebraker "Readings in Database Systems" c.
k&ouml;nyv&eacute;ben.</p>
<p>A be&eacute;p&iacute;tett R-tree kezelni tudj&aacute;k a
soksz&ouml;geket (polygon adatt&iacute;pus) &eacute;s a dobozokat
(box). Elm&eacute;letileg, az R-tree
kiterjeszthet&otilde; tov&aacute;bbi dimenzi&oacute;kra is.
Gyakorlatilag ezen dolgoznod kell egy kicsit,
&eacute;s m&eacute;g nincs dokument&aacute;ci&oacute;nk arr&oacute;l
hogy az
hogyan m&ucirc;k&ouml;dik.</p>
<p><a name="4.11"></a><big style="text-decoration: underline;">4.11) Mi
a Genetic Query Optimizer?</big></p>
<p><big style="text-decoration: underline;"></big></p>
<p>A GEQO modul a lek&eacute;rdez&eacute;s optimaliz&aacute;ci&oacute;
sebess&eacute;g&eacute;t n&ouml;veli nagy mennyis&eacute;g&ucirc;
t&aacute;bla &ouml;sszekapcsol&aacute;sa
eset&eacute;n. Lehet&otilde;v&eacute; teszi a nagy
lek&eacute;rdez&eacute;sek v&eacute;grehajt&aacute;s&aacute;t nem
teljes keres&eacute;ssel.</p>
<p><a name="4.12"></a><big style="text-decoration: underline;">4.12)
Hogyan tudok regexp keres&eacute;st &eacute;s
case-insensitive regexp keres&eacute;st </big><big
style="text-decoration: underline;">haszn&aacute;lni? Hogyan tudok
indexet haszn&aacute;lni
case-insensitive keres&eacute;shez?</big><br>
</p>
<p>A ~ oper&aacute;tor hajt v&eacute;gre regul&aacute;ris
kifejez&eacute;s
(regexp) &eacute;rtelmez&eacute;st, a ~* ennek case-insensitive
v&aacute;ltozata. A LIKE case-insensitive v&aacute;ltozata az ILIKE.</p>
<p>A case-insensitive egyenl&otilde;s&eacute;g m&ucirc;veleteket
&aacute;ltal&aacute;ban igy hajtjuk v&eacute;gre:</p>
<p>SELECT *</p>
<pre>FROM tab</pre>
<pre>WHERE lower(col) = 'abc';</pre>
<p>Ez nem fog indexet haszn&aacute;lni, b&aacute;r l&eacute;trehozhatsz
egy funkci&oacute; indexet:</p>
<pre>CREATE INDEX tabindex ON tab (lower(col));</pre>
<a name="4.13"></a> <big style="text-decoration: underline;">4.13)
Hogyan tudom &eacute;szlelni egy
lek&eacute;rdez&eacute;sben, ha egy mez&otilde; NULL?</big><br>
<p>Haszn&aacute;ld "IS NULL"-t &eacute;s az "IS NOT NULL"-t.</p>
<p><a name="4.14"></a><big style="text-decoration: underline;">4.14) Mi
a k&uuml;l&ouml;nbs&eacute;g a
k&uuml;l&ouml;nb&ouml;z&otilde; karaktert&iacute;pusok k&ouml;z&ouml;tt?</big></p>
<ul>
<li>"char" egy karakter hossz&uacute; string</li>
<li>CHAR(n) bpchar &uuml;res hellyel a megadott n
hossz&uacute;s&aacute;gig</li>
<li>VARCHAR(n) varchar m&eacute;ret maxim&aacute;lis hossz
meghat&aacute;roz&aacute;s&aacute;val, a lefogllat ter&uuml;let is
v&aacute;ltoz&oacute; hossz&uacute; lesz</li>
<li>TEXT nincs meghat&aacute;rozott fels&#337; korl&aacute;t</li>
<li>BYTEA v&aacute;ltoz&oacute; hossz&uacute;s&aacute;g&uacute;
byte-t&ouml;mb</li>
</ul>
<p>L&aacute;tni fogod a bels&otilde; elnevez&eacute;s&uuml;ket, ha
tanulm&aacute;nyozod a rendszert&aacute;bl&aacute;kat&eacute;s
n&eacute;h&aacute;ny hiba&uuml;zenetet.</p>
<p>Az ut&oacute;bbi n&eacute;gy a "varlena" t&iacute;pusok, ami a
t&aacute;rol&aacute;suk m&oacute;dj&aacute;ra utal: az els&otilde; 4
byte a lemezen a hossz&uacute;s&aacute;g, a t&ouml;bbi
az adat. A val&oacute;di m&eacute;ret teh&aacute;t nagyobb mint a
deklar&aacute;lt
hossz&uacute;s&aacute;g.Ezek azadatok t&ouml;m&ouml;ritve
t&aacute;rol&oacute;dnak el, igy kevesebb helyet foglalnek el az
el&ouml;re sz&aacute;mitottn&aacute;l.</p>
<p>A CHAR(n) a legjobb megold&aacute;s, ha stabil
hossz&uacute;s&aacute;g&uacute; stringet t&aacute;rolsz. A VARCHAR(n)
j&oacute; arra az esetekre, ha a hossz&uacute;s&aacute;g
v&aacute;ltozik, de van fels&otilde; korl&aacute;tja. A TEXT
t&iacute;pus korl&aacute;tlan
hossz&uacute;s&aacute;g&uacute; (1 GB-ig) sz&ouml;vegek
t&aacute;rol&aacute;s&aacute;ra alklamas. A BYTEA bin&aacute;ris adatok
t&aacute;rol&aacute;s&aacute;ra van. A teljesitm&eacute;ny
mutat&oacute;i hasonl&oacute;ak ezenek a
t&iacute;pusoknak.</p>
<p><a name="4.15.1"></a><big style="text-decoration: underline;">4.15.1)
Hogyan tudok l&eacute;trehozni
automatikusan n&ouml;vekv&otilde; &eacute;rt&eacute;k&ucirc;
mez&otilde;t?</big></p>
<br>
A PostgreSQL rendelkezik egy SERIAL adatt&iacute;pussal. Ez egy
szekvenci&aacute;t &eacute;s egy indexet hoz l&eacute;tre az oszlopon.
P&eacute;ld&aacute;ul ez:<br>
<pre>CREATE TABLE person (</pre>
<pre>id SERIAL,</pre>
<pre>name TEXT</pre>
<pre>);</pre>
<p>ugyanezt jelenti:</p>
<pre>CREATE SEQUENCE person_id_seq;</pre>
<pre>CREATE TABLE person (</pre>
<pre>id INT4 NOT NULL DEFAULT nextval('person_id_seq'),</pre>
<pre>name TEXT</pre>
<pre>);</pre>
<pre>CREATE UNIQUE INDEX person_id_key ON person ( id );</pre>
<br>
<p>A szekvenci&aacute;kkal kapcsolatban olvasd el a create_sequence man
oldalt. A sor OID-j&eacute;t is haszn&aacute;lhatod egyedi
azonosit&oacute;k&eacute;nt, b&aacute;r ebben az esetben figyelj a
pg_gump haszn&aacute;lat&aacute;n&aacute;l a
-o opci&oacute;ra (COPY WITH OIDS, m&aacute;sol&aacute;s OID-dal), hogy
meg?rizd az
&eacute;rt&eacute;keket.</p>
<p><a name="4.15.2"></a><big style="text-decoration: underline;">4.15.2)
Hogyan kaphatom meg egy SERIAL
besz&uacute;r&aacute;s &eacute;rt&eacute;k&eacute;t?</big></p>
<p>Egy megold&aacute;s erre az, ha a nextval() funkci&oacute;val
megszerzed az &eacute;rt&eacute;ket m&eacute;g miel&ouml;tt
besz&uacute;rn&aacute;d
az adatot a t&aacute;bl&aacute;ba. Erre itt l&aacute;thatsz egy
p&eacute;ld&aacute;t:</p>
<pre>new_id = execute("SELECT nextval('person_id_seq')");</pre>
<pre>execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise<br>Pascal')");</pre>
<p>
Esetleg lek&eacute;rdezheted a szekvencia &aacute;llapot&aacute;t a sor
besz&uacute;r&aacute;sa ut&aacute;n. </p>
<pre>execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");</pre>
<pre>new_id = execute("SELECT currval('person_id_seq')");</pre>
<p>
V&eacute;g&uuml;l pedig, haszn&aacute;lhatod a visszaadott OID
&eacute;rt&eacute;ket is, b&aacute;r ez a lehet&otilde;
legkev&eacute;sb&eacute; portolhat&oacute;. Perl DBI-ben, Edmund Mergl
DBD::Pg modulj&aacute;ban az OID &eacute;rt&eacute;k
haszn&aacute;lhat&oacute; a
$sth-&gt;execute() ut&aacute;n ($sth-&gt;{pg_oid_status}).</p>
<a name="4.15.3"></a> <big style="text-decoration: underline;">4.15.3)
A currval() &eacute;s a nextval() nem
teremt holtpont vesz&eacute;lyes helyzetet a felhaszn&aacute;l&oacute;k
k&ouml;z&ouml;tt?</big><br>
<p>Nem. A currval() funkci&oacute; a szerver processzed &aacute;ltal
adott
&eacute;rt&eacute;ket adja vissza, nem pedig a t&ouml;bbi szerver
processz &aacute;ltal adottat.</p>
<big style="text-decoration: underline;"><a name="4.15.4"></a>4.15.4)
Mi&eacute;rt nem haszn&aacute;l&oacute;dnak fel &uacute;jra a
sequence sz&aacute;mok tranzakci&oacute; abort eset&eacute;n?</big><br>
<p>Mi&eacute;rt vannak probl&eacute;m&aacute;k a serial oszlopok
sz&aacute;moz&aacute;s&aacute;val?</p>
<p>A p&aacute;rhuzamoss&aacute;g fejleszt&eacute;se
&eacute;rdek&eacute;ben a sorozat sz&aacute;mokat k&eacute;r&eacute;sre
adja ki a szerver fut&oacute; tranzakci&oacute;knak, &eacute;s azokat
nem z&aacute;rja, amig a tranzakci&oacute; v&eacute;get nem &eacute;r.
Ez jukakat okoz a
sz&aacute;moz&aacute;sokban a visszaforditott tranzakci&oacute;k miatt.</p>
<p><a name="4.16"></a><big style="text-decoration: underline;"> 4.16)
Mi a
OID? Mi a TID?</big></p>
<p>Az OID a PostgreSQL egyedi sor azonosit&oacute;ja. Minden sor, ami
l&eacute;trej&ouml;n a szerveren, kap egy OID-t. Minden OID, amit az
initdb alatt j&ouml;n
l&eacute;tre 16384 alatt van (l&aacute;sd include/access/transam.h).
Minden,
felhaszn&aacute;l&oacute; &aacute;ltal l&eacute;trehozott OID
legal&aacute;bb ennyi.
Alap&eacute;rtelmez&eacute;sben, az OID nem csak a
t&aacute;bl&aacute;ban vagy az adatb&aacute;zisban egyedi,
hanem a teljes PostgreSQL adatb&aacute;zis rendszerben.</p>
<p>A PostgreSQL az OID-okat a bels&ouml; t&aacute;bl&aacute;iban
haszn&aacute;lja a sorok t&aacute;bl&aacute;k k&ouml;z&ouml;tt
&ouml;sszekapcsol&aacute;s&aacute;hoz. Ezek az OID-k
haszn&aacute;lhat&oacute;ak a rekordok azonosit&aacute;s&aacute;ra is
amikor t&aacute;bl&aacute;kat csatol
&ouml;ssze a szerver (JOIN). Az OID-ot haszn&aacute;lhatod mez&ouml;
t&iacute;pusk&eacute;nt is,
&eacute;s indexelheted is.</p>
<p>Az OID &eacute;rt&eacute;k egy k&ouml;zponti ter&uuml;letr&ouml;l
sz&aacute;rmazik, amit minden szerver processz haszn&aacute;l. Ha az
OID-ot valami m&aacute;sra
szeretn&eacute;d cser&eacute;lni:</p>
<p>CREATE TABLE new_table(old_oid oid, mycol int);</p>
<pre>SELECT old_oid, mycol INTO new FROM old;</pre>
<pre>COPY new TO '/tmp/pgtable';</pre>
<pre>DELETE FROM new;</pre>
<pre>COPY new WITH OIDS FROM '/tmp/pgtable';</pre>
<br>
<p>Az OID 4 byte-os integer &eacute;rt&eacute;kk&eacute;nt
t&aacute;rol&oacute;dik, igy 4 milli&aacute;rdn&aacute;l
t&uacute;lcsordul. M&eacute;g soha senki nem jelezte hogy ez
t&ouml;rt&eacute;nt volna,
&eacute;s ezt a korl&aacute;tot igyeksz&uuml;nk elt&aacute;volitani,
m&eacute;g miel&ouml;tt
b&aacute;rki &eacute;szrevenn&eacute;.</p>
<p>A TID a fizikai sorok blokk &eacute;s offszet c&iacute;mmel
val&oacute;
azonosit&aacute;s&aacute;ra szolg&aacute;l. A TID v&aacute;ltozik
minden rekord m&oacute;dosit&aacute;s &eacute;s
t&ouml;rl&eacute;s alkalm&aacute;val. Ezeket az indexek
haszn&aacute;lj&aacute;k hogy a fizikai sort gyorsan
megtal&aacute;lj&aacute;k.</p>
<p><a name="4.17"></a><big style="text-decoration: underline;">4.17) Mi
a PostgreSQL-ben haszn&aacute;lt
kifejez&eacute;sek jelent&eacute;se?</big></p>
<br>
<p>N&eacute;hol a forr&aacute;s k&oacute;dban &eacute;s a
dokumnet&aacute;ci&oacute;ban tal&aacute;lhat&oacute;ak
kifejez&eacute;sek, amelyek &aacute;ltal&aacute;nosabb
jelent&eacute;ssel b&iacute;rnak.
Itt van n&eacute;h&aacute;ny:</p>
<ul>
<li>t&aacute;bla (table), rel&aacute;ci&oacute; (relation),
oszt&aacute;ly (class)</li>
<li>sor (row), rekord (record), tuple (nincs magyar jelent&eacute;s)</li>
<li>oszlop (column), mez&ouml; (field), attributum (attribute)</li>
<li>retrieve, select</li>
<li>helyettesit (replace), m&oacute;dosit (update)</li>
<li>hozz&aacute;f&ucirc;z (append), besz&uacute;r (insert)</li>
<li>OID, sorozat &eacute;rt&eacute;k (serial value)</li>
<li>portal, cursor</li>
<li>range variable, t&aacute;bla n&eacute;v, t&aacute;bla alias</li>
</ul>
Az &aacute;ltal&aacute;nos adatb&aacute;zis kifejez&eacute;sek
&ouml;sszefoglal&oacute;j&aacute;t itt olvashat&oacute;:
<p><a
href="http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary%0A/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</a></p>
<br>
<a name="4.18"></a> <big style="text-decoration: underline;">4.18)
Mi&eacute;rt kapom ezt a hib&aacute;t:
"ERROR: Memory exhausted in AllocSetAlloc()"?<br>
</big>
<p>Lehet hogy elfogyott a virtu&aacute;lis mem&oacute;ri&aacute;d, vagy
a
kerneled er&otilde;forr&aacute;s korl&aacute;tai alacsonyak.
Pr&oacute;b&aacute;ld ki ezt miel&ouml;tt
elinditan&aacute;d a postmastert:</p>
<pre>ulimit -d 262144</pre>
<pre>limit datasize 256m</pre>
<p>A shellt&otilde;l f&uuml;gg&otilde;en ezek k&ouml;z&uuml;l csak az
egyik fut majd le, de a processzek adatszegmens&eacute;t sokkal
magasabbra &aacute;llitja, ami
tal&aacute;n el&eacute;g lesz a lek&eacute;rdez&eacute;s
v&eacute;grehajt&aacute;s&aacute;hoz. Ez az utas&iacute;t&aacute;s a
jelenlegi processzre (a shelled) &eacute;rv&eacute;nyes, &eacute;s
minden
&aacute;ltala l&eacute;trehozott processzre. Ha probl&eacute;m&aacute;d
van az SQL klienssel, mert a
szerver t&uacute;l nagy adatot k&uuml;ld vissza, pr&oacute;b&aacute;ld
meg e
klienssel is ugyanezt.</p>
<p><a name="4.19"></a><big style="text-decoration: underline;">4.19)
Hogyan tudhatom meg PostgreSQL, milyen
verzi&oacute;t futtatok?</big></p>
<p>A psql programban select version();</p>
<a name="4.20"></a> <big style="text-decoration: underline;">4.20)
Mi&eacute;rt kapok "invalid large obj
descriptor" hib&aacute;t nagy objektumok
kezel&eacute;s&eacute;n&eacute;l?</big><br>
<p>A nagy objektumok kezel&eacute;s&eacute;t egy tranzakci&oacute;s
blokkban helyezd el. (BEGIN &eacute;s COMMIT k&ouml;z&ouml;tt)</p>
<p><br>
Jelenleg a PostgreSQL ezt a szab&aacute;lyt azzal teszi
k&ouml;telez&otilde;v&eacute;, hogy a tranzakci&oacute;
v&eacute;g&eacute;n a nagy objektumokat
lez&aacute;rja, igy a tranzakci&oacute; ut&aacute;n az els&otilde;
m&ucirc;velet amit az objektumon
v&eacute;grahajtan&aacute;l hib&aacute;s lesz.</p>
<p>Ha olyan programoz&aacute;si fel&uuml;letet haszn&aacute;lsz mint az
ODBC vagy a JDBC akkor val&oacute;szin&ucirc;leg ki kell kapcsolnod az
auto-commit-ot.</p>
<p><a name="4.21"></a><big style="text-decoration: underline;">4.21)
Hogy hozhatok l&eacute;tre olyan oszlopot,
aminek alap&eacute;rtelmezett </big><big
style="text-decoration: underline;">&eacute;r&eacute;tke a jelenlegi
id&otilde;?</big><br>
</p>
<p>Haszn&aacute;ld a CURRENT_TIMESTAMP -ot:</p>
<pre>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );</pre>
<a name="4.22"></a> <big style="text-decoration: underline;">4.22)
Mi&eacute;rt olyan lass&uacute;ak az
al-lek&eacute;rdez&eacute;seim IN-nel?</big><br>
<p>Jelenleg az al-lek&eacute;rdez&eacute;seket a k&uuml;ls&otilde;
lek&eacute;rdez&eacute;shez csatoljuk. Ha az allek&eacute;rdez&eacute;s
csak kev&eacute;s sort eredm&eacute;nyez
&eacute;s a k&uuml;ls&otilde; lek&eacute;rdez&eacute;s sokat, akkor az
IN is gyors. Az EXISTS kulcssz&oacute;
haszn&aacute;lat&aacute;val gyorsithatod a lek&eacute;rdez&eacute;seket.</p>
<p>SELECT *</p>
<pre>FROM tab</pre>
<pre>WHERE col IN (SELECT subcol FROM subtab);</pre>
<br>
<p>EXISTS haszn&aacute;lat&aacute;val:</p>
<pre>SELECT *</pre>
<pre>FROM tab</pre>
<pre>WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);</pre>
Ahhoz hogy ez gyorsan fusson le, a subcol indexelt oszlopnak kell hogy
legyen. Rem&eacute;lj&uuml;k ezt a korl&aacute;tot siker&uuml;l
hamarosan legy&otilde;zn&uuml;nk.
<p><a name="4.23"></a><big style="text-decoration: underline;">4.23)
Hogyan tudok outer join-t v&eacute;grehajtani?</big></p>
<p>A PostgreSQL a szabv&aacute;nyos SQL szintaktik&aacute;t
k&ouml;veti.
Itt van k&eacute;t p&eacute;lda:</p>
<p>SELECT *</p>
<pre>FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);</pre>
<p>
vagy</p>
<pre>SELECT *</pre>
<pre>FROM t1 LEFT OUTER JOIN t2 USING (col);</pre>
<p>Ezek az identikus lek&eacute;rdez&eacute;sek
&ouml;sszekapcsolj&aacute;k a t1.col &eacute;s a t2.col mez&otilde;ket,
&eacute;s a t1 b&aacute;rmelyik kapcsolatlan
sor&aacute;t is visszadj&aacute;k. A RIGHT JOIN a t2 kapcsolatlan
sorait adta volna vissza, a FULL JOIN pedig a kapcsolt, &eacute;s
mindk&eacute;t t&aacute;bla kapcsolatlan sorait
adja. Az OUTER kulcssz&oacute; opcion&aacute;lis, a LEFT, RIGHT
&eacute;s FULL JOIN
szintaktikailag helyes. Az &aacute;tlagos
&ouml;sszekapcsol&aacute;sokat INNER JOIN-nak
nevezz&uuml;k.</p>
<p>Az el&otilde;z&otilde; kiad&aacute;sokban a OUTER JOIN
lek&eacute;rdez&eacute;seket UNION &eacute;s NOT IN kulcsszavakkal
lehetett szimul&aacute;lni. P&eacute;ld&aacute;ul a tab1
&eacute;s a tab2 &ouml;sszekapcsol&aacute;sa:</p>
<pre><code>SELECT tab1.col1, tab2.col2</code></pre>
<pre><code>
FROM tab1, tab2</code></pre>
<pre><code>
WHERE tab1.col1 = tab2.col1</code></pre>
<pre><code>
UNION ALL</code></pre>
<pre><code>
SELECT tab1.col1, NULL</code></pre>
<pre><code>
FROM tab1</code></pre>
<pre><code>
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)</code></pre>
<pre><code>
ORDER BY col1</code></pre>
<pre><code></code></pre>
<code></code>
<a name="4.24"></a> <big style="text-decoration: underline;">4.24)
Hogyan tudok t&ouml;bb adatb&aacute;zison
v&eacute;grehajtani lek&eacute;rdez&eacute;st?<br>
</big>
<p>Arra nincs lehet&otilde;s&eacute;g, hogy m&aacute;s
adatb&aacute;zisb&oacute;l k&eacute;rdezz le adatot.Mivel a PostgreSQL
adatb&aacute;zis specifikus rendszer
t&aacute;bl&aacute;kat t&ouml;ltbe, bizonytalan hogy egy
adatb&aacute;zisok k&ouml;z&ouml;tti
lek&eacute;rdez&eacute;snek hogyankellene viselkednie. </p>
<p>A contrib/dblink k&ouml;nyvt&aacute;rban tal&aacute;lsz egy
megold&aacute;st erre, ami funkci&oacute; hiv&aacute;sok
segits&eacute;g&eacute;vel
m&ucirc;k&ouml;dik. Persze, a kliens hozhat
l&eacute;treszimult&aacute;n kapcsolatot t&ouml;bb adatb&aacute;zissal,
&eacute;s
&ouml;sszef&eacute;s&uuml;lheti az eredm&eacute;nyeket.</p>
<p><big style="text-decoration: underline;"><a name="4.25"></a>4.25)
Hogy tudok t&ouml;bb soros vagy oszlopos
eredm&eacute;nyt visszaadni egy funkci&oacute;b&oacute;l?</big><br>
</p>
<big style="text-decoration: underline;"></big>
<p>A PL/pgSQL t&aacute;rolt elj&aacute;r&aacute;s nyelvvel refcursor
haszn&aacute;lat&aacute;val. R&eacute;szletesen itt:</p>
<p><a
href="http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html">http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html</a></p>
<a name="4.26"></a> <big style="text-decoration: underline;">4.26)
Mi&eacute;rt nem tudom megbizhat&oacute;an
l&eacute;trehozni &eacute;s t&ouml;r&ouml;lni az &aacute;tmeneti
t&aacute;bl&aacute;kat a PL/pgSQL funkci&oacute;kban?</big><br>
<p>A PL/pgSQL cacheli a funkci&oacute;k tartalm&aacute;t, aminek az a
szerencs&eacute;tlen mell&eacute;khat&aacute;sa, hogy ha egy PL/pgSQL
funkci&oacute;
haszn&aacute;l egy &aacute;tmeneti t&aacute;bl&aacute;t, ami
k&eacute;s&#337;bb t&ouml;rl&otilde;dik majd ujra
l&eacute;trej&ouml;n, akkor az &uacute;jra lefut&oacute; funkci&oacute;
nem fogja megtal&aacute;lni a t&aacute;bl&aacute;t, mert
a cache v&aacute;ltozat a r&eacute;gi t&aacute;bl&aacute;ra tartalmaz
mutat&oacute;t. A megold&aacute;s erre
az <code>EXECUTE</code> haszn&aacute;lata az &aacute;tmeneti
t&aacute;bl&aacute;k
kezel&eacute;s&eacute;re PL/pgSQL-ben. Ez a lek&eacute;rdez&eacute;s
&uacute;jraford&iacute;t&aacute;s&aacute;t
fogja el&otilde;id&eacute;zni minden alkalommal.</p>
<big style="text-decoration: underline;">4.27)
Milyen replik&aacute;ci&oacute;s
lehet&otilde;s&eacute;gek vannak?</big><br>
<p>B&aacute;r a replik&aacute;ci&oacute; egyetlen ter&uuml;let,
t&ouml;bb technol&oacute;gia l&eacute;tezik replik&aacute;ci&oacute;ra,
term&eacute;szetesen mindnek meg vannak a maga el&#337;nyei &eacute;s
h&aacute;tr&aacute;nyai.</p>
<p>A master/slave replik&aacute;ci&oacute;s megold&aacute;ssal a master
adatb&aacute;zison hajthatunk v&eacute;gre modos&iacute;t&aacute;sokat,
m&iacute;g a slave adatb&aacute;zisokon csak
lek&eacute;rdez&eacute;seket. A PostgreSQL legn&eacute;pszer&#369;bb
master/slave replik&aacute;ci&oacute;s megold&aacute;sa a Solny-I. </p>
<p>Sz&aacute;mos m&aacute;s master/slave replik&aacute;ci&oacute;s
lehet&otilde;s&eacute;g l&eacute;tezik.Egy List&aacute;t olvashatsz
ezekr&otilde;l itt: </p>
<p><a href="http://gborg.PostgreSQL.org/genpage?replication_research">http://gborg.PostgreSQL.org/genpage?replication_research</a></p>
<p>A multi-master replik&aacute;ci&oacute; lehet&#337;v&eacute; teszi
t&ouml;bb master adatb&aacute;zis haszn&aacute;lat&aacute;t, b&aacute;r
ez a technol&oacute;gia drasztikusan cs&ouml;kkenti az adatb&aacute;zis
teljes&iacute;tm&eacute;ny&eacute;t a sok szinkorniz&aacute;ci&oacute;
miatt. A PGCluster a legelterjedtebb ilyen megold&aacute;s.</p>
<p>Egy t&ouml;bbfelhaszn&aacute;l&oacute;s replik&aacute;ci&oacute;s
rendszer k&eacute;sz&uuml;l itt:</p>
<p><a
href="http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.</a></p>
<p><a name="4.28"></a><big style="text-decoration: underline;">4.28)
Milyen k&oacute;dol&aacute;si
lehet&otilde;s&eacute;gek vannak?</big></p>
<ul>
<li>A contrib/pgcrypto tartlamaz sz&aacute;mos SQL
lek&eacute;rdez&eacute;sben haszn&aacute;lhat&oacute;
k&oacute;dol&aacute;st.</li>
<li>A kliens-szerver kommunik&aacute;ci&oacute;
rejtjelez&eacute;s&eacute;re a hostssl haszn&aacute;lhat&oacute;. Ezt a
pg_hba.conf-ben enged&eacute;lyeztheted.</li>
<li>Az adatb&aacute;zis felhszn&aacute;l&oacute;k jelszavait
t&aacute;rol&aacute;skor k&oacute;dolja a rendszer.&nbsp;</li>
<li>R&eacute;gebbi verzi&oacute;kban a PASSWORD_ENCRYPTION
opci&oacute;val
lehetett bekapcsolni.</li>
<li>A szerveren haszn&aacute;lhatsz k&oacute;dolt f&aacute;jrendszert.<br>
</li>
</ul>
<hr style="width: 100%; height: 2px;"><br>
<div style="text-align: center;">
<h2>A PostgreSQL kiterjeszt&eacute;se</h2>
</div>
<br>
<a name="5.1"></a> <big style="text-decoration: underline;">5.1)
&Iacute;rtam egy felhaszn&aacute;l&oacute;i
funkci&oacute;t. Mi&eacute;rt core dumpol az adatb&aacute;zis amikor
haszn&aacute;lom?<br>
</big>
<p>Sz&aacute;mos probl&eacute;ma lehet. El&ouml;bb prob&aacute;ld ki a
funkci&oacute;dat egy k&uuml;l&ouml;n&aacute;ll&oacute;
alkalmaz&aacute;sban.</p>
<p><a name="5.2"></a><big style="text-decoration: underline;">5.2)
Hogyan lehet &uacute;j adatt&iacute;pusokat
&eacute;s funkci&oacute;kat hozz&aacute;adni a PostgreSQL </big><big
style="text-decoration: underline;">disztrib&uacute;ci&oacute;hoz?</big><br>
</p>
<p>K&uuml;ldd el a kieg&eacute;sz&iacute;t&eacute;seid a pgsql-hackers
levelez&eacute;si list&aacute;ra &eacute;s a forr&aacute;skodjaid
v&eacute;g&uuml;l a contrib-ban k&ouml;tnek ki.</p>
<a name="5.3"></a> <big style="text-decoration: underline;">5.3)
Hogyan lehet olyan C funkci&oacute;t
&iacute;rni, ami Tuple-t ad vissza?</big><br>
<p>A 7.3 verzi&oacute;t&oacute;l kezdve a PostgreSQL t&aacute;mogatja a
t&aacute;bl&aacute;zatokat viszzaad&oacute; funkci&oacute;kat C,
PL/pgSQL &eacute;s SQL nyelveken.
B&otilde;vebb dokument&aacute;ci&oacute;t a Programoz&oacute;
k&eacute;zik&ouml;nyvben tal&aacute;lsz. Egy C p&eacute;lda
funkci&oacute; tal&aacute;lhat&oacute; a contrib/tablefunc
k&ouml;nyvt&aacute;rban.</p>
<p><a name="5.4"></a><big style="text-decoration: underline;">5.4)
Megv&aacute;ltoztattam egy forr&aacute;s
&aacute;llom&aacute;nyt. Mi&eacute;rt nem v&aacute;ltozik a
bin&aacute;ris </big><big style="text-decoration: underline;">&uacute;jraford&iacute;t&aacute;s
ut&aacute;n?</big><br>
</p>
<p>A Makefile-ok nem ismerik a include &aacute;llom&aacute;nyok
megfelel&otilde; f&uuml;gg&otilde;s&eacute;geit. V&eacute;gre kell
hajtanod egy make clean-t, majd &uacute;jra egy
make-t. Ha GCC-t haszn&aacute;lsz felhaszn&aacute;lhatod a configure
script
--enable-depend opci&oacute;j&aacute;t, &iacute;gy a compiler maga
fogja ellen&otilde;rizni a
f&uuml;gg&otilde;s&eacute;geket.</p>
<br>
<br>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>PostgreSQL FAQ in Japanese</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#A00000" ALINK="#0000FF">
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<h1>PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)</h1>
<p>原文最終更新日: Thu Jan 01 14:01:00 EDT 2009</p>
<p>現在の維持管理者: Bruce Momjian (<A
href="mailto:bruce@momjian.us">bruce@momjian.us</a>)<br />
Maintainer of Japanese Translation: Jun Kuwamura (<A
href="mailto:juk at postgresql.jp">juk at postgresql.jp</a>)<br /></p>
<p>この文書の最新版は<a href=
"http://www.postgresql.org/docs/faqs.FAQ.html">
http://www.postgresql.org/docs/faqs.FAQ.html</a>
で見ることができます。</p>
<p>プラットホームに特有の質問については:<a href=
"http://www.postgresql.org/docs/faq/">
http://www.postgresql.org/docs/faq/</a>
<br />
に解答があります。</p>
<p><small><pre>
(以下、訳者による注釈を [訳注: と ] とで囲んで記します。)
[訳注:
日本語版のFAQは、
http://www.postgresql.org/docs/faqs.FAQ_japanese.html
にあります。
最新の日本語版については、この文書の最後にある<a
href="#item-japanese">「日本語版について」</a>をごらんください。
]
</pre></small></p>
<hr />
<h2 align="center">一般的な質問</h2>
<a href="#item1.1">1.1</a>) PostgreSQLとは何ですか? その呼び方は? Postgresとは?<br />
<a href="#item1.2">1.2</a>) 誰が PostgreSQL をコントロールしていますか?<br />
<a href="#item1.3">1.3</a>) PostgreSQLの著作権はどうなってますか?<br />
<a href="#item1.4">1.4</a>) PostgreSQLをサポートするプラットホームは?<br />
<a href="#item1.5">1.5</a>) PostgreSQLはどこから入手できますか?<br />
<a href="#item1.6">1.6</a>) 最新のリリースはどれですか?<br />
<a href="#item1.7">1.7</a>) サポートはどこで受けられますか?<br />
<a href="#item1.8">1.8</a>) バグレポートはどのように発信しますか?<br />
<a href="#item1.9">1.9</a>) 既知のバグや未だ無い機能はどうやって見つけますか?<br />
<a href="#item1.10">1.10</a>) どのような文書がありますか?<br />
<a href="#item1.11">1.11</a>) <small>SQL</small>はどうすれば学べますか?<br />
<a href="#item1.12">1.12</a>) パッチを提供したり、開発チーム参加するにはどうすればよいですか?<br />
<a href="#item1.13">1.13</a>) 他の<small>DBMS</small>と比べてPostgreSQL はどうなのですか? PostgreSQLを組み込みに使えますか?<br />
<a href="#item1.14">1.14</a>) PostgreSQLは国毎の最新の夏時間の変更を扱いますか?<br />
<a href="#item1.15">1.15</a>) PostgreSQLのメーリングリストの購読をやめるにはどうすればよいですか?また、電子メールを重複して受け取らないようにするにはどうしますか?<br />
<h2 align="center">ユーザ・クライアントの質問</h2>
<a href="#item2.1">2.1</a>) PostgreSQL にはどんなインターフェースが使えますか?<br />
<a href="#item2.2">2.2</a>) PostgreSQL を Web ページと連携させるにはどんなツールがありますか?<br />
<a href="#item2.3">2.3</a>) PostgreSQL にグラフィカル・ユーザインターフェースはありますか?<br />
<h2 align="center">管理上の質問</h2>
<a href="#item3.1">3.1</a>) どうすれば、PostgreSQLを<i>/usr/local/pgsql</i> 以外の場所にインストールできますか?<br />
<a href="#item3.2">3.2</a>) 他のホストからの接続はどのように制御しますか?<br />
<a href="#item3.3">3.3</a>) より良い性能を得るためには、データベース・エンジンをどのように調整しますか?<br />
<a href="#item3.4">3.4</a>) どのようなデバグ機能が使えますか?<br />
<a href="#item3.5">3.5</a>) 接続しようとするときに <i>'Sorry, too many clients'</i> が出るのはなぜですか?<br />
<a href="#item3.6">3.6</a>) PostgreSQLのアップグレードの手順はどうなりますか?<br />
<a href="#item3.7">3.7</a>) ハードウェアにはどのようなコンピュータを使えばよいですか?<br />
<h2 align="center">操作上の質問</h2>
<a href="#item4.1">4.1</a>) 最初のいくつかのロウのみを <small>select</small> するにはどうしますか? ランダムなロウ? <br />
<a href="#item4.2">4.2</a>) 定義されたテーブル、インデックス、データベース、および、ユーザをどのようにして見つけ出しますか?<br />
<a href="#item4.3">4.3</a>) カラムのデータタイプを変更するにはどうしますか?<br />
<a href="#item4.4">4.4</a>) ロウ、テーブル、データベースの最大サイズは?<br />
<a href="#item4.5">4.5</a>) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量はどのくらい必要ですか?<br />
<a href="#item4.6">4.6</a>) クエリが遅いのはなぜでしょう? なぜ、インデックスが使われないのでしょうか?<br />
<a href="#item4.7">4.7</a>) クエリオプティマイザが、どのようにクエリを評価していかを、見るにはどうしますか?<br />
<a href="#item4.8">4.8</a>) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使いますか?<br />
<a href="#item4.9">4.9</a>) クエリの中で、フィールドが
<small>NULL</small> であることを検出するにはどうしますか?
<small>NULL</small>の可能性のあるものをどのようすれば連結できますか?
フィールドが<small>NULL</small>かどうかでどのようにソートができますか?<br />
<a href="#item4.10">4.10</a>) いろいろな文字型のそれぞれの違いは何ですか?<br />
<a href="#item4.11.1">4.11.1</a>) 通番(serial)/自動増分フィールドはどのようにつくりますか?<br />
<a href="#item4.11.2">4.11.2</a>) <small>SERIAL</small>データ型に挿入される値は、どうすれば得られますか?<br />
<a href="#item4.11.3">4.11.3</a>) <i>currval()</i> は他のユーザとの競合状態に陥ることはないですか?<br />
<a href="#item4.11.4">4.11.4</a>) トランザクションが中断したときにもういちどシーケンス番号が使われないのはなぜですか?シーケンス/SERIALカラムに空きがあるのはなぜですか?<br />
<a href="#item4.12">4.12</a>) <small>OID</small> とは何ですか? <small>TID</small> とは何ですか?<br />
<a href="#item4.13">4.13</a>) エラーメッセージ <i>"ERROR: Memory exhausted in AllocSetAlloc()"</i>が出るのはなぜですか?<br />
<a href="#item4.14">4.14</a>) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうしますか?<br />
<a href="#item4.15">4.15</a>) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか?<br />
<a href="#item4.16">4.16</a>) <i>外部</i>結合(<i>outer</i> join)はどのように実現しますか?<br />
<a href="#item4.17">4.17</a>) 複数のデータベースを使う問い合わせはどのようにすればできますか?<br />
<a href="#item4.18">4.18</a>) 関数から複数のロウまたはカラムを返すにはどうしますか?<br />
<a href="#item4.19">4.19</a>) PL/PgSQL の関数の中で一時テーブルにアクセスするとき、どうして "relation with OID ##### does not exist" というエラーを受け取るのでしょうか?<br />
<a href="#item4.19">4.20</a>) どのようなレプリケーションのソリューションがありますか?<br />
<a href="#item4.20">4.21</a>) テーブルとカラムの名前がクエリーの中で認識
されないのはなぜですか? なぜ大文字化(キャピタライズ)は温存されないのですか?<br />
<h2 align="center">日本語に関する質問</h2>
<a href="#item5.1">5.1</a>) 日本語がうまく扱えないのはなぜですか?<br />
<a href="#item5.2">5.2</a>) psql でWindowsからアクセスしたときに、日本語が文字化けするのですが?<br />
<a href="#item5.3">5.3</a>) PostgreSQLで日本語の全文検索はできますか?<br />
<hr />
<h2 align="center">一般的な質問</h2>
<h4 id="item1.1">1.1</a>) PostgreSQLとは何ですか? その呼び方は? Postgresとは?</h4>
<p>PostgreSQLは<i>Post-Gres-Q-L</i>(ポスト・グレス・キュー・エル)
と発音しますが、会話の中では単純に <i>Postgres</i> と呼ばれることも
あります。("PostgreSQL"をどう発音するか気になる人のために、
<a href="http://www.postgresql.org/files/postgresql.mp3">
音声ファイル</a>を用意してあります。</p>
<p>PostgreSQL はオブジェクト-リレーショナルデータベースシステムで、
伝統的な商用データベースシステムに、次世代<small>DBMS</small>システ
ムに見られるような改良が施された特徴を有します。PostgreSQLは、無料で
完全なソースコードを手に入れることができます。</p>
<p>PostgreSQL の開発は、ほとんどが、世界中にひろがったボランティアの
開発者によって、インターネットを通したコミュニケーションによって行わ
れています。コミュニティによるプロジェクトであるため、どの企業の制御
もうけません。開発に参加したければ、<a href=
"http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a>
にある開発者のFAQを見てください。
</p>
<p>PostgresはPostgreSQLの広く使われている愛称です。また、バークレー
でのプロジェクトでもともと使われていた名前で、ほかのいずれの愛称に
比べても遥かに好ましいです。'PostgreSQL' の発音が難しいと思うのであ
れば、そのかわりに 'Postgres' と呼ぶようにしましょう。</p>
<h4 id="item1.2">1.2</a>) 誰が PostgreSQL をコントロールしていますか?</h4>
<p>PostgreSQLの門番、中央委員会、あるいは、コントロールをする会社を
探そうとしても、諦めざるをえず ---- 存在しないのです。我々は、中心
となるコミッティとCVSコミッタを持ちますが、これらのグループはコン
トロールするためというよりも、管理上のものです。ここでは、プロジェ
クトは、だれでも参加ができる開発者とユーザのコミュニティにより方向
付けられます。読者がやらなければならないことは、メーリングリストを
サブスクライブして、議論に 参加することです。(<a
href="http://wiki.postgresql.org/wiki/Developer_FAQ">Developer's
FAQ</a>には、PostgreSQL開発に加わり方についての情報があります。)</p>
<h4 id="item1.3">1.3</a>) PostgreSQL の著作権はどうなってますか?</h4>
<p> PostgreSQL は下記の著作権に従います。</p>
<p> PostgreSQLは古くからのBSDライセンスの下で配布されています。それ
は基本的には、利用者がそのコードを好き勝手に利用することが許されて
います。制限があるとすれば、このソフトウェアに伴ういかなる問題にお
いても法的に責任を我々に負わせることができないということです。
また、この著作権表示がこのソフトウェアのすべての複製に表示すること
も必要です。以下に、我々が実際に使っているBSD使用許諾書を示します:
</p>
<small><pre>
[訳注:
正文は英語です。参考として、訳文を併記掲載します。
]
</pre></small>
<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>
<small><pre>
POSTGRESQL データベース管理システム
部分的著作権 (c) 1996-2009, PostgreSQL国際開発グループ
部分的著作権 (c) 1994-1996 カリフォルニア大学本校
本ソフトウェアおよびその文書一式は上記の著作権表示と、この文章
およびこれに続く二つの段落が全ての複製に添付されている限りにおい
て、使用、複製、修正および配付の許可を、いかなる目的であっても、
無償でかつ同意書無しに行なえることをここに認めます。
カリフォルニア大学は、いかなる当事者にたいしても、利益の壊失を
含む、直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた
損害について、たとえカリフォルニア大学がこれらの損害について訴追
を受けていたとしても、一切の責任を負いません。
カリフォルニア大学は、商用目的における暗黙の保証と、特定目的で
の適合性に関してはもとより、これらに限らず、いかなる保証も放棄す
ることを明言します。以下に用意されたソフトウェアは「そのまま」を
基本原理とし、カリフォルニア大学はそれを維持、支援、更新、改良あ
るいは修正する義務を負いません。
[訳注:
著作権に関する正文は上記の英語による表記です。日本語訳はあくまで
参考程度としてください。
]
</pre></small>
<h4 id="item1.4">1.4</a>) PostgreSQLをサポートするプラットホームは?</h4>
<p>一般的に、最近のUnix互換プラットホームであればPostgreSQLを稼働さ
せられるはずです。リリースの時点で実際にテストを行なったことの報告が
なされたプラットホームについてはインストール手引書に列挙してあります。
</p>
<p>PostgreSQL は、Win2000 SP4, WinXP, そして、Win2003 など Microsoft
Windows NTベースのオペレーティングシステムで、ネイティブに走ります。
あらかじめパッケージにされたインストーラが<a href=
"http://www.postgresql.org/download/windows">
http://www.postgresql.org/download/windows</a>
からダウンロードできます。
MSDOSベースのWindowsのバージョン(Win95, Win98, WinMe)では、Cygwinを
使って PostgreSQL を走らせることができます。</p>
<small><pre>
[訳注
日本語での情報は、次の Windows版に関するFAQの和訳をごらんくださ
い(やや古いです)。
http://old.postgresql.jp/wg/jpugdoc/FAQ_windows.ja.html
]
</pre></small>
<p>次のサイトに Novell Netware 6 への移植版もあります。
<a href="http://developer.novell.com/wiki/index.php/Postgresql">
http://developer.novell.com/wiki/index.php/Postgresql</a>
また、OS/2 (eComStation) バージョンは、<a href=
"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>
<br />
<h4 id="item1.5">1.5</a>) PostgreSQL はどこから入手できますか?</h4>
<p>Webブラウザ経由だと、<a href="http://www.postgresql.org/ftp/">
http://www.postgresql.org/ftp/</a>、それから、ftp経由だと、
<a href="ftp://ftp.postgresql.org/pub/">
ftp://ftp.postgresql.org/pub/</a> を使います。</p>
<h4 id="item1.6">1.6</a>) 最新のリリースはどれですか?</h4>
<p>PostgreSQL の最新版はバージョン 8.3.5 です。</p>
<p>我々は、1年毎にメジャーリリースを、数ヵ月ごとのマイナーリリースを
行なうことを計画しています。</p>
<p><small><pre>
[訳注
バージョン番号の x.y.z の最初の x.y がメジャーリリースの番号に相
当し、最後の z がマイナーリリースの番号になります。メジャーリリー
スの番号が同じであれば、データベース・クラスタに互換性があります。
]
</pre></small></p>
<h4 id="item1.7">1.7</a>) サポートはどこで受けられますか?</h4>
<p>PostgreSQL コミュニティは多くのユーザのために、電子メール経由の支
援を提供しています。電子メールリストをサブスクライブするためのメイン
となるウェブサイトは
<a href="http://www.postgresql.org/community/lists/">
http://www.postgresql.org/community/lists/</a>です。これから、始める
のであれば <i>general</i> または、<i>bugs</i> といったリストがよいで
しょう。</p>
<p>メジャーなIRC チャンネルは、Freenode (<i>irc.freenode.net</i>)の
<i>#postgresql</i> というチャンネルです。UNIX コマンドでは、
<code>irc -c '#PostgreSQL' "$USER" irc.freenode.net</code> を使って
参加できます。同じネットワークに、スペイン語のチャンネル
(<i>#postgresql-es</i>)、フランス語のチャンネル
(<i>#postgresqlfr</i>)、ブラジル語チャンネル (<i>#postgresql-br</i>)
もあります。また、EFNetにもPostgreSQLチャンネルがあります。</p>
<p><small><pre>
[訳注:
1999年7月23日、日本ポストグレスユーザー会、略称JPUGが設立されました。
JPUG は非営利組織で、PostgreSQLを利用する人達の相互協力の場となっています。
(2006年 特定非営利活動(NPO)法人日本PostgreSQLユーザ会になりました。
Web会員と正会員の会費は無料ですが、協賛会員の会費と会員の貢献で
会は運営されています。)
詳しくは、JPUG のWeb サイト:
<a href="http://www.postgresql.jp/">http://www.postgresql.jp/</a>
をごらんください。
日本語のIRCチャンネル '#PostgreSQL:*.jp' も存在します。
]
</pre></small></p>
<p>商用サポート会社のリストは<a
href="http://www.postgresql.org/support/professional_support">
http://www.postgresql.org/support/professional_support</a>にあります。</p>
<h4 id="item1.8">1.8</a>) バグレポートはどのように発信しますか?
</h4>
<p><a href=
"http://www.postgresql.org/support/submitbug">
http://www.postgresql.org/support/submitbug</a>
のPostgreSQL バグフォームを訪れてください。 バグレポートを提出する仕方
についての手引と指針があります。</p>
<p> それと同時に ftp サイト <A
href="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a>
で、最新バージョンの PostgreSQL を探してみてください。</p>
<h4 id="item1.9">1.9</a>) 既知のバグや未だ無い機能はどうやって見つけますか?
</h4>
<p>PostgreSQLは拡張された<small>SQL:2003</small>のサブセットをサポート
します。我々のページの <A
href="http://www.PostgreSQL.org/docs/todo.html">TODO</a> リストに、
既知のバグや欠落機能や将来計画についての記述があります。</p>
<p>特徴の要求は普通次のいずれかの解答の中にあります:</p>
<ul>
<li>既にここにある機能は、
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
リストです</li>
<li>次のような機能は目論まれていません。それは:
<ul>
<li>SQL規格に準ずる既存の機能と重複するもの</li>
<li>コードの複雑性ばかりを高めて、得るものが少ない機能</li>
<li>安全性が確められない機能</li>
</ul>
</li>
<li>新しい機能は、
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
のリストに</li>加えられられます。
</ul>
<p>我々は、PostgreSQL に関して、電子メールで直接対応して
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>
リストを最新に更新してゆくほうがより効果的であることを知っています
ので、バグ追跡システムは使いません。
現実に、このソフトウェアの中でバグはそれほど長くはい続けませんし、
多くのユーザに影響するバグは早急に修正されます。PostgreSQLのリリース
で、すべての変更点、改良点、そして、修正点を知りたければ、
<a href="http://www.postgresql.org/developer/sourcecode/">CVS</a>
のログメッセージを見てください。リリースノートにさえ、このソフトウェア
に加えられたすべての変更点は網羅されていません。</p>
<h4 id="item1.10">1.10</a>) どのような文書がありますか?</h4>
<p> 配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュ
アル・ページ)およびいくつかの小さなテスト例題が含まれます。
<i>/doc</i>ディレクトリをごらんください。また、マニュアルは、<A
href="http://www.postgresql.org/docs/">
http://www.postgresql.org/docs/</a>でオンラインでも閲覧できます。
</p>
<p><small><pre>
[訳注:
JPUG 文書・書籍関連分科会で翻訳されたマニュアルもあります。
<a href="http://www.postgresql.jp/document/pg835doc/">
http://www.postgresql.jp/document/pg830doc/</a>
インプレスから、
<a href="http://home.impress.co.jp/reference/2108.htm">
PostgreSQLオフィシャルマニュアル</a>として出版されています。
]
</pre></small></p>
<p>オンラインで参照できる PostgreSQL の本も2冊あります。<a href=
"http://www.postgresql.org/docs/books/awbook.html">
http://www.postgresql.org/docs/books/awbook.html</a>
<p><small><pre>
[訳注:
この本は、JPUG<a href="http://www.postgresql.jp/wg/psqltrans/">「PostgreSQL Book翻訳分科会」
</a>で翻訳され、ピアソンから<a href="http://www.seshop.com/detail.asp?pid=2587">
「はじめてのPostgreSQL」</a>として出版されています。
]
</pre></small></p>
および、 <a href=
"http://www.commandprompt.com/ppbook/">
http://www.commandprompt.com/ppbook/</a>です。
<p><small><pre>
[訳注:
邦訳は<a href="http://www.oreilly.co.jp/books/4873111021/">「実践 PostgreSQL」
</a>がオライリーから出版されています。
]
</pre></small></p>
購入可能な書籍の目録は、<a href=
"http://www.postgresql.org/docs/books/">http://www.postgresql.org/docs/books/</a>
にあります。
PostgreSQL 技術情報記事も、<a href=
"http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation">http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation</a>
にあります。</p>
<p><small><pre>
[訳注:
日本語の書籍等については、日本PostgreSQLユーザ会の、<A
href="http://old.postgresql.jp/PostgreSQL/references.html">http://www.postgresql.jp/PostgreSQL/references.html</a>
もごらんください。
]
</pre></small></p>
<p> コマンドラインのクライアントプログラム<i>psql</i> にも、型、
演算子、関数、集約、その他の情報を調べるために、素晴らしい \d コマンド
がいくつかあります。 \? を入力すると利用可能なコマンドが表示されます。</p>
<p> 我々の Web サイトには、さらに沢山の文書があります。</p>
<p><small><pre>
[訳注:
2008年11月18日、PostgreSQL普及のために一般向けの情報を扱う
「Let's Postgres」というポータルサイトがオープンしました。<A
href="http://lets.postgresql.jp/">http://lets.postgresql.jp/</a>
]
</pre></small></p>
<h4 id="item1.11">1.11</a>) <small>SQL</small> はどうすれば学べますか?</h4>
<p>まず、 上記で述べた PostgreSQL についての本を読むことを検討してください。
<i>The Practical SQL Handbook</i>, Bowman Judith S. et al.,
Addison-Wesley も多くのユーザに好評です。 ほかでは、<i>The Complete
Reference SQL</i >, Groff et al., McGraw-Hill も好評です。</p>
<p>素晴らしい手引書は、<a href=
<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>
<li><a href=
"http://sqlzoo.net">http://sqlzoo.net</a>
</li>
</ul>
にあります。</p>
<p><small><pre>
[訳注:
日本PostgreSQLユーザ会の日本語の参考文献の紹介ページ
<a href="http://www.postgresql.jp/PostgreSQL/references.html">
http://www.postgresql.jp/PostgreSQL/references.html</a>
があります。
堀田倫英氏の「PostgreSQL日本語マニュアル」
<a href="http://www.net-newbie.com/">http://www.net-newbie.com/</a>
ではオンラインマニュアルの検索ができます。
丸山不二夫氏のUNIX データベース入門
<a href="http://www.wakhok.ac.jp/DB/DB.html">http://www.wakhok.ac.jp/DB/DB.html</a>
もオンラインで読むことができます。
Nikkei BP IT Pro にある石井達夫氏の <a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060120/227628/">PostgreSQL ウォッチ</a>
では毎回新しい情報をとりあげています。
]
</pre></small></p>
<h4 id="item1.12">1.12</a>) パッチを提供したり、開発チーム参加するにはどうすればよいですか?</h4>
<p><a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
(開発者向けの)Developer's FAQ</a>をごらんください。</p>
<h4 id="item1.13">1.13</a>) 他の<small>DBMS</small>と比べPostgreSQLはどうなのですか? PostgreSQLを組み込みに使えますか?</h4>
<p>ソフトウェアを評価する方法にはいくつかあります。機能と性能と信頼性と
サポートと価格です。</p>
<dl>
<dt> <b>機能(Features)</b></dt>
<dd>
PostgreSQLは、トランザクション、サブクエリ、トリガー、ビュー、外
部キー整合性参照、および、洗練されたロック機構など、大規模商用
<small>DBMS</small>が持つ機能をほとんど持っています。さらに
PostgreSQLは、ユーザ定義型、継承、ルール、それから、ロック競合を縮
小するマルチバージョン同時性制御など、商用<small>DBMS</small>も持
ち合わせないような機能をいくつか持ち合わせています。<br />
</dd>
<dt> <b>性能(Performance)</b></dt>
<dd>
PostgreSQLは他の商用あるいはオープンソースのデータベースと互角の性
能も持ちます。ある面ではより早かったり、ほかの面ではより遅かったり
します。他のデータベースに比べた性能は、ふつう +/-10% くらいでしょう。
</dd>
<dt> <b>信頼性(Reliability)</b></dt>
<dd>
我々は、<small>DBMS</small>の信頼性が高くなくてはその価値が無いこ
とを理解してます。十分テストして、安定したコードをバグを最小にして
からリリースするように努めてます。それぞれのリリースは少なくとも1
カ月以上のベータ・テストを行ない、これまでのリリースの履歴が、製品
版として安定した堅固なリリースであることを物語っています。この分野
では、他のデータベースと比べても遜色がないことに自信を持っています。
<br />
</dd>
<dt> <b>サポート(Support)</b></dt>
<dd>
我々のメーリングリストは、遭遇するいかなる問題についても解決への手
助けをしてくれる、開発者やユーザの大きな集まりへの接点を提供してい
ます。我々は問題の解決を保証することはできませんが、商用データベー
スであっても常に解決されるわけではありません。開発者や、ユーザ・コ
ミュニティ、マニュアル類、それに、ソースコードなどへ直接アクセスで
きることによって、PostgreSQLのサポートは、他の<small>DBMS</small>
サポートよりも優れたものとなっています。御要望に答えて、事柄毎の商
用サポートなどもあります(<a href="#item1.7">FAQ1.7節</a>をごらんくだ
さい)。
<br />
</dd>
<dt> <b>価格(Price)</b></dt>
<dd>
PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示し
てあるBSDスタイルの使用許諾に外れない限り、PostgreSQLのコードを制
限無しで商品に組み込むことができます。<br />
</dd>
</dl>
PostgreSQLはクライアント/サーバ・アーキテクチャで設計されていて、
クライアントとサーバおよびそれを補助するいろいろなプロセスが別々に走
ることが要求されます。多くの組み込みアーキテクチャはこのような要求を
サポート可能です。しかし、お使いになっている組み込みアーキテクチャに
よっては、データベースサーバがアプリケーション・プロセスの中で走るこ
とを要求される場合があり、Postgresを使うことはできないので、軽量のデー
タベースソリューションを選択すべきです。
</p>
<h3 id="item1.14">1.14) PostgreSQLは国毎の最新の夏時間の変更を扱いますか?</h3>
<p>合州国の夏時間の変更は、PostgreSQLのリリース8.0.4以降[4+]と、その
後のメジャーリリース、たとえば 8.1 には含まれています。カナダとオー
西部ストラリアの変更は、8.0.[10+], 8.1.[6+] および、その後のメジャー
リリースのすべてに含まれます。8.0より前のPosrgreSQLではオペレーティ
ングシステムのタイムゾーンデータベースを夏時間情報のために使ってい
ます。</p>
<hr />
<h3 id="item1.15">1.15) PostgreSQLのメーリングリストの購読をやめるにはどうすればよいですか?また、電子メールを重複して受け取らないようにするにはどうしますか?
</h3>
<p>PostgreSQLの<a
href="http://mail.postgresql.org/mj/mj_wwwusr/domain=postgresql.org?user=&amp;passw=&amp;func=login">Majordomo</a>
ページから、PostgreSQLに関する複数のメーリングリストの購読の開始と中止
ができるようになっています。(ログインするためにはMajaordomoから送ら
れる御本人のパスワードが必要になります。)</p>
<p>PostgreSQLnoすべてのメーリングリストでは、返信はメーリングリスト
<i>かつ</i>元のメールの投稿者へ送られるように構成してあります。こ
れにり利用者は、もっとも迅速にメールへの返信を受けられるようになって
います。既に直接受け取っているメールを、リストから重複して受け取りた
くない場合は、Majordomo の<i>Change Settings</i>ページから、
<i>eliminatecc</i>をチェックします。また、<i>selfcopy</i>のチェック
をはずすことで、自分の送ったメールのコピーを受け取らないようにもでき
ます。</p>
<h2 align="center">ユーザ・クライアントの質問</h2>
<h4 id="item2.1">2.1</a>) PostgreSQL にはどんなインターフェースが使えますか?</h4>
<p>PostgreSQL のインストールに含まれる物は<small>C</small>と組込み
<small>C</small>のインターフェースだけです。その他のインターフェース
は独立したプロジェクトで、別々にダウンロードされます。分かれることで、
それぞれの開発チームが独自のリリーススケジュールを持つことが許されま
す。</p>
<p><small>PHP</small> のようないくつかのプログラミング言語は、
PostgreSQLのインターフェースを含んでいます。Perl, <small>TCL</small>,
Python, そして、そのほかの利用可能な言語のインターフェースは、<a
href="http://pgfoundry.org">http://pgfoundry.org</a>
<i>Drivers/Interfaces</i> の節の中とインターネットの検索でみつけ
られます。
</p>
<h4 id="item2.2">2.2</a>) PostgreSQL を Web ページと連携させるにはどんなツールがありますか?</h4>
<p> データベースを裏に持つ Web ページについての素晴らしい紹介が、<br />
<a href="http://www.webreview.com">http://www.webreview.com</a>にあります。</p>
<p> Web への拡張のためには、PHP(<a href="http://www.php.net">http://www.php.net/</a>)
が卓越したインターフェースとなっています。</p>
<p><small><pre>
[訳注:
PHPに関する日本語の情報は、2000年4月19日に発足した日本PHPユーザ会のサイト
<a href="http://www.php.gr.jp/">http://www.php.gr.jp/</a>
あるいは、廣川 類さんのサイト
<a href="http://www.geocities.jp/rui_hirokawa/php/">http://www.geocities.jp/rui_hirokawa/php/</a>
にかなりまとめられています。
]
</pre></small></p>
<p> 処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm か
mod_perl を使います。 </p>
<h4 id="item2.3">2.3</a>) PostgreSQL にグラフィカル・ユーザインターフェースはありますか?</h4>
<p>商用とオープンソース開発者によるもの両方で、PostgreSQLには多くのGUIツールが利用可能で、詳細なリストは、<a
href="http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools">
PostgreSQL GUI ツールについてのコミュニティガイド</a> にてごらんください。</p>
<p><small><pre>
[訳注:
pgAdmin3 はPostgreSQL標準GUI管理ツールで、Windows版(PostgreSQL
for Windows) に同梱されています。詳しい情報は、
<a href="http://www.pgadmin.org/">http://www.pgadmin.org/</a>にあります。
]
</pre></small></p>
<hr />
<h2 align="center">管理上の質問</h2>
<h4 id="item3.1">3.1</a>) どのようにすれば <i>/usr/local/pgsql</i> 以外の場所にインストールできますか?</h4>
<p> 簡単な方法は、 <i>configure</i> を走らせるときに --prefix オプショ
ンを指定することです。 </p>
<h4 id="item3.2">3.2</a>) 他のホストからの接続はどのように制御しますか?</h4>
<p>既定値では、PostgreSQL は Unix ドメインソケット、または、TCP/IP接
続のローカルマシンからの接続しか許しません。postgresql.conf の中の
listen_addresses を修正し、<b>かつ</b><i>$PGDATA/pg_hba.conf</i>
ファイルを適切に直し、データベースサーバを再起動して、ホストベース
の認証を有効にしないかぎりは、他のマシンからは接続できないでしょう。</p>
<h4 id="item3.3">3.3</a>) より良い性能を得るためには、データベース・エンジンをどのように調整しますか?</h4>
<p>性能改善の可能性のありそうな主な領域が3つあります:</p>
<dl>
<dt><b>クエリの変更</b></dt>
<dd>クエリを修正してより良い性能を得ることを含みます:
<ul>
<li>式および部分インデックスを含む、インデックスを作成</li>
<li>複数の<small>INSERT</small>のかわりにCOPYを使用</li>
<li>複数の文をグループ化し、1つのトランザクションにしてコミットのオーバヘッドを削減</li>
<li>インデックスからから沢山のロウを取り出すときは<small>CLUSTER</small>を使用</li>
<li>クエリの出力のサブセットを返すために<small>LIMIT</small>を使用</li>
<li>準備されているクエリを使用</li>
<li>オプティマイザの正確な統計を維持するために<small>ANALYZE</small>を使用</li>
<li><small>VACUUM</small> または <i>pg_autovacuum</i> の常用</li>
<li>大きなデータ変更のあるときはインデックスを削除</li>
</ul><br/>
<br/>
</dd>
<dt><b>サーバ構成</b></dt>
<dd><i>postgresql.conf</i>の設定のいくつかは性能に影響します。
詳しくは、<a href=
"http://www.postgresql.org/docs/current/static/runtime-config.html">
Administration Guide/Server Run-time Environment/Run-time
Configuration</a> の全件リストをごらんください(<a
href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">
JPUGサイトの日本語版、サーバの構成</a>)。
そして、解説として、<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>
および、 <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>ハードウェアの選定</b></dt>
<dd>性能におけるハードウェアの影響は
<a href="http://www.powerpostgresql.com/PerfList/">
http://www.powerpostgresql.com/PerfList/</a> と、 <a
href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">
http://momjian.us/main/writings/pgsql/hw_performance/index.html</a>
(<a href="http://www.postgresql.jp/wg/psqltrans/hw_performance_j/index.html">JPUGサイトの日本語版</a>)
に述べられています。
<br/>
<br/>
</dd>
</dl>
<p><small><pre>
[訳注:
JPUG理事長の片岡裕生氏による、「今すぐできるPostgreSQLチューニング」
というコーナーが ThinkIT サイトにあり、実作業の参考になります。
http://www.thinkit.co.jp/free/tech/10/1/1.html
]
</pre></small></p>
<h4 id="item3.4">3.4</a>) どのようなデバグ機能が使えますか?</h4>
<p>サーバ構成変数については、
href="http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html">http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html</a>
に示されるように多くの <code>log_*</code> があり、クエリとプロセス
の統計情報を出力することができ、デバグや性能測定にはとても便利です。</p>
<h4 id="item3.5">3.5</a>) 接続しようとするときに <i>'Sorry, too many clients'</i> が出るのはなぜですか?</h4>
<p> 既定での制限である 100 のデータベースセッションに達してしまって
います。サーバーの同時接続できるバックエンドプロセスの制限値を増やす
必要があります。<i>postgresql.conf</i> の中の<i>max_connections</i>
の値を変更してサーバを再起動することで可能になります。</p>
<h4 id="item3.6">3.6</a>) PostgreSQLのアップグレードの手順はどうなりますか?</h4>
<p>バージョン番号付けの方針について、更新全般についての解説は<a
href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a> を、
そして、アップグレードについての一般的な説明は <a
href="http://www.postgresql.org/docs/current/static/install-upgrading.html">
http://www.postgresql.org/docs/current/static/install-upgrading.html</a>
をご覧ください。
</p>
<p><small><pre>
[訳注:
アップグレードについての和訳版は下記にあります。
<a href="http://www.postgresql.jp/document/current/html/install-upgrading.html">http://www.postgresql.jp/document/current/html/install-upgrading.html</a>
]
</pre></small></p>
<small><pre>
[訳注:
原文では、下記の内容は<a href="http://www.postgresql.org/support/versioning">独立したページに移され</a>、削除されています。
</pre>
<p>新しい機能を盛り込むPostgreSQLのメジャーリリースはだいたい年に1回
程度行ないます。メジャーリリースは、たとえば、8.1から8.2へのように、
バージョン番号の1番目か2番目の部分を増やしてゆきます。</p>
<p>PostgreSQLのメジャーリリースは通常、システムテーブルとデータの内
部フォーマットを変更します。これらの変更はたいていは複雑なのでで、デー
タファイルの後方互換性を維持したりはしません。メジャーアップグレード
のためには、データベースのダンプ/リロードが必要になります。</p>
<p>マイナーリリースは、たとえば、8.1.5 から8.1.6へのように、バージョ
ン番号の3番目の値を増やします。PostgreSQLチームは、マイナーリリース
に対しては、バグフィクスしか行ないません。すべてのユーザは、できるだ
け最新のマイナーリリースに更新すべきです。アップグレードには、常にリ
スクがつきものですから、PostgreSQLのマイナー修正リリースでは、頻繁に
発生したり、<a href="http://www.postgresql.org/support/security">セキュリティ</a>に関係したり、データがつぶれるバグだけを修正
し、アップグレードのリスクを最小限にとどめます。我々のコミュニティで
は、アップグレードするリスクよりも、アップグレード<i>しないリスク</i>
のほうが高いと考えています。</p>
<p>マイナーリリースのアップグレードにはダンプとリストアの必要はなく、
データベースサーバを停止して、アップデートされたバイナリをインストー
ルし、サーバをリスタートします。</p>
<pre>
]
</pre></small>
<h4 id="item3.7">3.7</a>) ハードウェアにはどのようなコンピュータを使えばよいですか?</h4>
<p>PCハードウェアはほとんど互換性がありますので、ほとんどの人は、す
べてのPCハードウェアが同じ品質だと思い込む傾向があります。しかし、そ
れは間違いです。ECC RAM、SCSI、および、高品質マザーボードは、安いハー
ドウェアに比べると、より信頼性が高く、より性能も良いのです。
PostgreSQL はほとんどのハードウェアで稼働しますが、信頼性や性能が重
要な場合は、使用中のハードウェアのオプションについて調査することが
賢明です。バッテリーバックアップ付きのキャッシュを持つディスクコント
ローラも役に立ちます。我々のメーリングリスト上でもハードウェアオプショ
ンのトレードオフについて議論することができます。</p>
<hr />
<h2 align="center">操作上の質問</h2>
<h4 id="item4.1">4.1</a>) 最初の数ロウのみを <small>SELECT</small>するにはどうしますか?ランダムなロウ?
</h4>
<p>取得したいロウがほんの数行で、<small>SELECT</small> の実行時に取得するロウの
数が分かっていれば <small>LIMIT</small> を使いましょう。インデックスが
<small>ORDER BY</small> とマッチすれば、クエリ全体を(丸ごと)実行しなくても済む場合も
あります。<small>SELECT</small> する時点でロウの数が不明なら、カーソルを使って
<small>FETCH</small> しましょう。
<p>ランダムにロウを<small>SELECT</small>するには、次の文を使います:
<pre>
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</pre>
<h4 id="item4.2">4.2</a>) 定義されたテーブル、インデックス、データベース、および、ユーザをどのようにして見つけ出しますか?<i>psql</i>で使われているクエリを表示するにはどうしますか?</h4>
<p><i>psql</i> の中で \dtコマンドを使ってテーブルを見ることができ
ます。psqlの中で \? を使って、コマンドの全リストを調べることができま
す。一方で、<i>psql</i> のソースコードで、バックスラッシュコマンドを
出力する <i>pgsql/src/bin/psql/describe.c</i> ファイルを読むこともで
きます。その中には、 <small>SQL</small> コマンドを生成する部分も含ま
れます。また、 <i>-E</i> オプションを付けて <i>psql</i> を開始すると、
入力されたコマンドを実行するためのクエリを印字出力するようになります。
PostgreSQLは <small>SQL</small> 準拠の INFORMATION SCHEMA インター
フェースを提供しますので、データベースについての情報を問い合わせるこ
ともできます。</p>
<p><i>pg_</i> で始まるシステムテーブルでもこれらを記述することができ
ます。</p>
<p><i>psql -l</i>を使うと全てのデータベースをリストします。</p>
<p>それと、<i>pgsql/src/tutorial/syscat.source</i> を試してみてくだ
さい。そこには、データベースのシステムテーブルから情報を得るために必
要な <small>SELECT</small> 文が沢山あります。</p>
<h4 id="item4.3">4.3</a>) カラムのデータ型を変更するにはどうしますか?</h4>
<p>カラムのデータ型の変更は 8.0 以降では、
<small>ALTER TABLE ALTER COLUMN TYPE</small> を使うことにより間単に
なりました。</p>
<p>それより前のバージョンでは、以下のようにします:</p>
<pre>
BEGIN;
ALTER TABLE tab ADD COLUMN new_col <i>new_data_type</i>;
UPDATE tab SET new_col = CAST(old_col AS <i>new_data_type</i>);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
</pre>
<p>これを行なったときは、抹消された行が使っているディスク空間を回収
するために<i>VACUUM FULL tab</i>をしたほうが良いかもしれません。</p>
<h4 id="item4.4">4.4</a>) ロウ、テーブル、データベースの最大サイズは?</h4>
<p>制限は以下のとおりです:</p>
<blockquote>
<table>
<tr><td>データベースの最大サイズ?</td><td>制限無し (32 TB のデータベースも存在します)</td></tr>
<tr><td>テーブルの最大サイズ?</td><td>32 TB</td></tr>
<tr><td>ロウの最大サイズ?</td><td>400 GB</td></tr>
<tr><td>フィールドの最大サイズ?</td><td>1 GB</td></tr>
<tr><td>テーブル内での最大ロウ数?</td><td>制限無し</td></tr>
<tr><td>テーブル内での最大カラム数?</td><td>カラムの型によって 250-1600</td></tr>
<tr><td>テーブル内での最大インデックス数?</td><td>制限無し</td></tr>
</table>
</blockquote>
<p> もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーや
スワップスペースの大きさにより制限されます。性能はこれらの値がことの
ほか大きな時に煽りを受けます。</p>
<p> 最大テーブルサイズの32TBはオペレーティングシステムによる巨大ファ
イルのサポートは必要としません。巨大なテーブルは複数の1GBのファイル
に分けて保存されますので、ファイルシステムの制限は重要ではありません。
</p>
<p> デフォルトのブロックサイズを32kに増加することで、最大テーブルサイズ
と行サイズと最大カラム数とを4倍にすることができます。また、最大テーブル
サイズはテーブルパーティションを使って増やすこともできます。</p>
<p>ひとつの制限は、約2,000文字以上の長さのカラムにインデックスを付
けることができないことです。 幸いにも、そのようなインデックスは実際
は必要ありません。長いカラムのMD5ハッシュの関数インデックスは一意性
がなによりの保険で、また、フルテキストのインデックスではカラム内の
単語を検索することができます。</p>
<h4 id="item4.5">4.5</a>) 一般的なテキストファイルのデータを保存するには、データベースのディスク容量はどのくらい必要です?</h4>
<p>普通のテキストファイルを PostgreSQL のデータベースに保存するには、
最大で約5倍のディスク容量を必要とします。</p>
<p> 例題として、各行に整数とテキスト記述を持つ 100,000行のファイルを
考えてみましょう。テキストの文字列の平均長さを20バイトと仮定すると、
フラットファイルの大きさは約2.8MB です。このデータを含む PostgreSQL
データベースファイルの大きさは次のように約5.2MBと見積もることができ
ます:
<pre>
24 bytes: 各ロウのヘッダ(概算)
24 bytes: 整数(int)フィールドとテキスト(text)フィールド
+ 4 bytes: ページ上のタップルへのポインタ
----------------------------------------
52 bytes per row
PostgreSQL のデータページサイズは 8192バイト(8KB)なので:
8192 bytes per page
------------------- = 146 rows per database page (切り捨て)
52 bytes per row
100000 data rows
-------------------- = 633 database pages (切り上げ)
158 rows per page
633 database pages * 8192 bytes per page = 5,185,536 bytes (5.2 MB)
</pre>
<p>インデックスは、これほどのオーバヘッドは要求しませんが、インデッ
クス付けされるデータを含む以上、それなりに大きくなります。 </p>
<p><small>NULL</small>はビットマップとして保存されていて、それらがわ
ずかにスペースを使います。</p>
<h4 id="item4.6">4.6</a>) クエリが遅いのはなぜでしょう? なぜ、インデックスが使われないのでしょうか?</h4>
<p>インデックスは、すべてのクエリで使われるわけではありません。テー
ブルが最小サイズより大きく、クエリでそのわずかなパーセンテージのロウ
を選択する時だけ、インデックスは使われます。これはインデックススキャ
ンにより起こされるランダムなディスクアクセスは、テーブルをストレート
に読む順次走査よりも遅くなることがあるからです。 </p>
<p>インデックスを使うかを決定するために、PostgreSQL はテーブルについ
ての統計情報を持たなければなりません。この統計情報は、
<small>VACUUM ANALYZE</small>または、単に <small>ANALYZE</small> を使っ
て収集することができます。統計情報を使ってオプティマイザはテーブルの
中にあるロウ数を知り、インデックスを使うべきかの決定をより正しくでき
ます。統計情報は最適な結合順や結合方法を決める上でも貴重なものもあり
ます。統計情報の収集は、テーブルの内容が変わる毎に繰返しなされるべ
きです。</p>
<p> インデックスは、通常 <small>ORDER BY</small> や結合を行なうため
には使われません。順次スキャンに続く明示的ソートは、巨大なテーブルの
インデックススキャンよりも普通は高速です。</p>
しかし、<small>ORDER BY</small>と組み合わされた<small>LIMIT</small>
は、テーブルの小さな部分を返すためにたびたびインデックスを使うでしょ
う。
<p>もし、オプティマイザが間違ってシーケンシャルスキャンを選択したこ
とに疑いがなければ、<CODE>SET enable_seqscan TO 'off'</CODE>に設定し
て、クエリをもう一度実行し、インデックススキャンがまちがいなく速くなっ
ているかどうかをみてください。</p>
<p> <small>LIKE</small> あるいは <i>~</i> のようなワイルドカード演算
子は特別な環境でしか使えません:
<ul>
<li>検索文字列が文字列の最初にききます。たとえば:</li>
<ul>
<li><small>LIKE</small> パターンが<i>%</i>で始まらない</li>
<li><i>~</i> (正規表現) パターンは<i>^</i>で始まらなければならない</li>
</ul>
<li>検索文字列を文字クラスから始めることはできません。たとえば、[a-e]。</li>
<li><small>ILIKE</small><i>~*</i> のような大文字と小文字を区別し
ない検索は使えません。そのかわり、このFAQの<a
href="#item4.8">4.8</a>節で説明する式インデックスが使えます。
</li>
<li><i>initdb</i> においては、デフォルトで<i>C</i>ロケールが使われな
くてはなりません。その理由は、Cロケール以外では次に大きな文字を
知ることができないからです。このような場合、<pre>LIKE</pre>イン
デクシングにだけ働くような、特別な<pre>text_pattern_ops</pre>
ンデックスを作成することもできます。また、それを全文検索のフル
テキストのインデックス作成に使うことができます。
</li>
</ul>
<p>
<h4 id="ITEM4.7">4.7</a>) 問い合わせオプティマイザがどのように問い合わせを評価するのかを見るにはどうしますか?</h4>
<p>オンラインマニュアルで <small>EXPLAIN</small> を見てください。</p>
<h4 id="item4.8">4.8</a>) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使いますか?</h4>
<p><i>~</i>演算子は正規表現照合を行ない、<i>~*</i> は大文字と小文字
を区別しない(case-insensitive)正規表現照合を行います。 大文字と小文
字を区別しない <small>LIKE</small> 演算子を <small>ILIKE</small>
いいます。</p>
<p>大文字と小文字を区別しない等値比較は次のように表現できる:
<pre>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</pre>
<p>標準インデックスでは使われず、しかしながら、もし、式インデックス
を作ったならそれが使われるでしょう。</p>
<pre>
CREATE INDEX tabindex ON tab (lower(col));
</pre>
<p>上記のインデックスが<small>UNIQUE</small>で作成された場合、カラム
は大文字と小文字を格納できますが、その違いが文字ケースだけであっても
同一にはなりません。あえて特定の文字ケースをカラムに格納するには
<small>CHECK</small>制約か、トリガーを使ってください。</p>
<h4 id="item4.9">4.9</a>) クエリの中で、フィールドが<small>NULL</small> であることを検出するにはどうしますか? <small>NULL</small> であることを検出するにはどうしますか? フィールドが<small>NULL</small>かどうかでどのようにソートができますか?</h4>
<p>以下のように、<small>IS NULL</small><small>IS NOT
NULL</small>で、そのカラムをテストしてみます:</p>
<pre>
SELECT *
FROM tab
WHERE col IS NULL;
</pre>
<small>NULL</small>の可能性のあるものを連結するには、<i>COALESCE()</i>
次のように使います。
<pre>
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
</pre>
<p><small>NULL</small>状態でソートするには、<small>IS NULL</small>
<small>IS NOT NULL</small> の修飾子を <small>ORDER BY</small> 句の中
で使ってみます。<i>true</i> のものは <i>false</i> のものよりも高い値
として並べられますので、次の例では NULL の記載が結果リストの上部に置
かれます。
<pre>
SELECT *
FROM tab
ORDER BY (col IS NOT NULL)
</pre>
<h4 id="item4.10">4.10</a>) いろいろな文字型のそれぞれの違いは何ですか?
</h4>
<blockquote>
<table>
<tr><th></th><th>内部名</th><th>備考</th></tr>
<tr><td>VARCHAR(n)</td><td>varchar</td><td>最大長のサイズを指定する、詰め物無し</td></tr>
<tr><td>CHAR(n)</td><td>bpchar</td><td>指定された固定長となるように空白が詰められる</td></tr>
<tr><td>TEXT</td><td>text</td><td>長さに特別な上限は無し</td></tr>
<tr><td>BYTEA</td><td>bytea</td><td>可変長のバイト配列(null-byte safe)</td></tr>
<tr><td>"char"</td><td>char</td><td>1文字</td></tr>
</table>
</blockquote>
<p> 内部名にお目にかかるのは、システム・カタログを調べるときや、エラー
メッセージを受け取るときです。</p>
<p> 上記の型のうち最初の4つの型は "varlena" 型です(すなわち、ディス
クの最初の4バイトがデータ長で、それの後に実際のデータが続きます)。
このように実際の空間は宣言された大きさよりも少し大きくなります。しか
し、長い値は圧縮されるので、ディスク上の空間は思ったよりも小さくなります。</p>
<p><small>VARCHAR(n)</small> は可変長の文字列を保存するのに最適です
が、保存できる文字列の長さに制限があります。<small>TEXT</small> は長
さに制限の無い文字列の保存のためのもので、最大で 1ギガバイトです。
<small>CHAR(n)</small>は、<small>VARCHAR(n)</small>が与えられた文字
だけを保存するのに対し、ブランクを詰め込んでいつも同じ長さで文字列を
保存するのに最適です。<small>BYTEA</small>は、部分的に
<small>NULL</small> のバイトを含むバイナリデータを保存するためのもの
です。これらのタイプは同じくらいの性能特性をもちます。</p>
<h4 id="item4.11.1">4.11.1</a>) 通番(serial)/自動増分フィールドはどのようにつくりますか?</h4>
<p> PostgreSQL は <small>SERIAL</small> データ型をサポートします。カ
ラム上にシーケンスを自動作成します。たとえば、</p>
<pre>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</pre>
は自動的に次のように翻訳されます:
<pre>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</pre>
<p><small><pre>
[訳注:
CREATE UNIQUE INDEX person_id_key ON person ( id );
は、 7.3 以降は自動的には行なわれなくなりました。
]
</small></pre></p>
<p>自動的につくられる通番は、
&lt;<i>table</i>&gt;_&lt;<i>serialcolumn</i>&gt;_<i>seq</i>
と名付けられていて、<i>table</i><i>serialcolumn</i> は、それぞれ
テーブルと <small>SERIAL</small> カラムの名前です。
通番については、オンラインマニュアルで<i>create_sequence</i>
をごらんください。</p>
<h4 id="item4.11.2">4.11.2</a>) <small>SERIAL</small>データ型に挿入される値は、どうすれば得られますか?</h4>
<p>最も簡単な方法は、割り当てられた<small>SERIAL</small>値を
<small>RETURNING</small>として取得することです。
<a href="#item4.11.1">4.11.1</a>の例題テーブルを使うと次のように
なります。
<pre>
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
</pre>
<h4 id="item4.11.3">4.11.3</a>) <i>currval()</i> は他のユーザとの競合状態に陥ることはないですか?</h4>
<p>それはありません。<i>currval()</i> は、すべてのユーザではありませ
んが、読者のセッションに与えられた現在の値を返します。 </p>
<h4 id="item4.11.4">4.11.4</a>) トランザクションが中断したときにもういちどシーケンス番号が使われないのはなぜですか?シーケンス/SERIALカラムに空きがあるのはなぜですか?</h4>
<p>同時性を改善するために、実行中のトランザクションに、必要に応じてト
ランザクションが終了するまでロックされないようシーケンス値を与えてい
ます。このためトランザクションが中断されると番号割り当てにギャップを
生じます。</p>
<h4 id="item4.12">4.12</a>) <small>OID</small> とは何ですか? <small>CTID</small> とは何ですか?</h4>
<p>テーブルが<small>WITH OIDS</small>でつくられた場合は、それぞれの
ロウに一意な<small>OID</small>が取られます。
<small>OID</small>は自動的に4バイトの整数で与えられ、それは、全イン
ストレーションを通して一意な値となります。しかし、約40億でオーバーフ
ローし、そして、<small>OID</small>は重複をしはじめます。PostgreSQLは
内部システムテーブルを一緒にリンクするために<small>OID</small> を使
います。
<p>ユーザのテーブルのカラムに一意の番号を付けるためには、
<small>OID</small> ではなく <small>SERIAL</small> を使うのが最もよい
でしょう。<small>SERIAL</small>の連番は1つのテーブル内でのみ一意にな
るからで、オーバーフローを起こしにくいと考えられます。
8バイトのシーケンス値を保存するために、<small>SERIAL8</small>があり
ます。</p>
<p><small>CTID</small> は、特定の物理ロウをブロックとオフセットの値
で識別するために使われます。<small>CTID</small>は、ロウが修正された
り再読込みされたときに変わります。また、物理ロウを差すためにインデッ
クスの記載に使われます。</p>
<h4 id="item4.13">4.13</a>) エラーメッセージ <i>"ERROR: Memory exhausted in AllocSetAlloc()"</i>が出るのはなぜですか?</h4>
<p>おそらく、システムの仮想メモリーを全て使い果たしてしまっている可
能性があるか、カーネルがあるリソースについてもつ制限値が低すぎる可能
性があります。サーバを始動する前にこれを試してみてください:</p>
<pre>
ulimit -d 262144
limit datasize 256m
</pre>
シェルによって、どちらかひとつが成功するでしょうが、これはプロセスの
データセグメント制限をより高く設定し、たぶんクエリが完結するようにな
るでしょう。このコマンドは現行のプロセスと、このコマンドを走らせた後
に作られる全てのサブプロセスについて適用されます。バックエンドがとて
も多くのデータを返すために<small>SQL</small> クライアントで問題が続
いているのであれば、クライアントを開始する前にこれを試してみてくださ
い。
<h4 id="item4.14">4.14</a>) どのバージョンの PostgreSQL を走らせているかを調べるにはどうしますか?<br /></h4>
<p><i>psql</i> から <CODE>SELECT version();</CODE> をタイプします。</p>
<h4 id="item4.15">4.15</a>) 現在の時刻がデフォルトとなるようなカラムはどのようにつくりますか?<br /></h4>
<p><i>CURRENT_TIMESTAMP</i>を使います:</p>
<pre>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</pre>
<h4 id="item4.16">4.16</a>) <i>外部</i>結合(<i>outer</i> join)はどのように実現しますか?<br /></h4>
<p>PostgreSQL は SQL 標準構文を使う外部結合(アウタージョイン)をサポー
トします。ここに 2つの例題があります。</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre>
あるいは
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</pre>
これらの象徴的なクエリでは t1.col を t2.col と結合して、t1 の結合されなかったロウ(t2 と一致しなかったロウ)も返しています。<small>RIGHT</small> 結合は t2 の結合されなかったロウを加えるでしょう。<small>FULL</small> 結合は、一致したロウに t1 と t2 からは結合されなかったロウを返すでしょう。<small>OUTER</small> という言葉はオプションで <small>LEFT</small>, <small>RIGHT</small>, または <small>FULL</small> などの結合を仮定されています。通常、結合は<small>INNER</small>結合と呼ばれます。
<h4 id="item4.17">4.17</a>) 複数のデータベースを使う問い合わせはどのようにすればできますか?</h4>
<p>現行のデータベース以外への問い合わせの方法はありません。というの
もPostgreSQLがデータベース仕様のシステムカタログを読み込むためで、そ
こには、たとえそのふりをするだけにしろ、データベースを越えて問い合わ
せをするすべがありません。 </p>
<p><i>contrib/dblink</i> はデータベース間(cross-database)の問い合わ
せを関数呼出しにより許します。もちろん、クライアントは同時に接続を別
のデータベースへも張らなくてはならず、結果をクライアント側でマージし
なくてはなりません。</p>
<h4 id="item4.18">4.18</a>) 関数から複数のロウまたはカラムを返すにはどうしますか?</h4>
<p>集合を返す関数(Set Returning Functions):
<a href="http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions">
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions</a>
を使うと簡単です</p>
<h4 id="item4.19">4.19</a>) PL/PgSQL の関数の中で一時テーブルにアクセスするとき、どうして "relation with OID ##### does not exist" というエラーを受け取るのでしょうか?</h4>
<p>バージョン8.3より前の PostgreSQL では、PL/PgSQL は関数スクリプトを
キャッシュしたため、運悪くその副作用がありました。PL/PgSQL 関数が一時
テーブルにアクセスして後でそのテーブルを消して作りした場合に、関数が
もう一度呼び出されたときは、その関数のキャッシュしていた内容がまだ古い
一時テーブルを指し示したままだったからです。
この、解決策として、PL/PgSQLの中で <small>EXECUTE</small> を一時テー
ブルへのアクセスのために使います。そうすると、クエリは毎回パースをや
り直しされるようになります。</p>
<p>この問題は、 PostgreSQL バージョン8.3 以降では起きません。</p>
<h4 id="item4.20">4.20</a>) どのようなレプリケーションのソリューションがありますか?</h4>
<p>「レプリケーション」と一言でいいますが、レプリケーションをする
ための技術はいくつかあり、それぞれ、利点と欠点があります。</p>
<p>マスタ/スレーブのレプリケーションは、読み/書きのクエリを受け取
るシングルマスタが可能で、スレーブでは 読み/<small>SELECT</small>
問い合わせだけを受け付けることができます。最も人気がある、フリーで利
用できる、マスタ−スレーブのPostgreSQLレプリケーションソリューション
は、<a
href="http://main.slony.info/">
Slony-I</a> です。</p>
<p>マルチ−マスタのレプリケーションは、読み/書きのクエリを受けと
り、複数のレプリケートさせるコンピュータに送ることができます。この機
能は、サーバ間の変更の同期が必要なため、性能に重大な衝撃を与えます。
<a href="http://pgfoundry.org/projects/pgcluster/">PGCluster</a> は、
このようなソリューションとしてPostgreSQLのためにフリーで利用できるも
のとして、最も人気があります。</p>
<p>この他にも、商用やハードウェア−ベースのレプリケーションソリュー
ションがいろいろなレプリケーションモデルをサポートしています。</p>
<h3 id="item4.21">4.21</a>)テーブルとカラムの名前がクエリーの中で認識されないのはなぜですか?なぜ大文字化(キャピタライズ)は温存されないのですか?</h3>
<p>名前が認識されない、最も一般的な原因は、テーブルを作成する際に、
テーブルやカラムを囲う二重引用符の使用です。
二重引用符を使うと、テーブルとカラムの名前(識別子といいます)は<a
href="http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">大文字と小文字の区別</a>
をして格納されます。したがって、pgAdminのようにテーブル作成のときに
自動的に二重引用符を使うものはクエリの中でそれらの名前を使うときに
二重引用符を付けなくてはならないことを意味します。このため、識別子
を認識させるためには以下のいずれかを心がけます。
<ul>
<li>テーブルを作成するときに二重引用符で識別子を囲うことを避ける</li>
<li>識別子には小文字だけを使う</li>
<li>クエリの中で参照するときは二重引用符で識別子を囲う</li>
</ul>
<hr />
<h2 align="center">日本語に関する質問</h2>
<h3 id="item5.1">5.1</a>)日本語がうまく扱えないのはなぜですか?</h3>
<p><i>createdb -E</i>コマンドオプションに UTF8 あるいは EUC_JP
のエンコーディングを指定してデータベースを作成するか、次のように
エンコーディングを指定してデータベースを作成してください。</p>
<pre>
CREATE DATABASE dbname WITH ENCODING 'UTF8';
もしくは、
CREATE DATABASE dbname WITH ENCODING 'EUC_JP';
</pre>
<h3 id="item5.2">5.2</a>) psql でWindowsからアクセスしたときに、日本語が文字化けするのですが?</h3>
<p><i>psql</i>の中でクライアントのエンコーディングを指定してください。</p>
<pre>
SET client_encoding TO 'SJIS'
</pre>
<p>PostgreSQLデータベースのエンコーディングに使える日本語文字コード
は EUC_JP か UTF-8(UNICODE) であるため、Shift-JIS表示のコマンドプロ
ンプトからは、client_encodingを設定しておかないと、日本語を表示する
際に文字化けがおきます。</p>
<h3 id="item5.3">5.3</a>) PostgreSQLで日本語の全文検索はできますか?</h3>
<p>バージョン8.3では、<i>TSearch2</i>全文検索機能が本体に組み込まれ
ましたが、そのままでは日本語のインデックスを作る事が難しい状況です。
これを解決するために、Takahiro Itagaki氏によって、Mecabという形態素
解析プログラムを利用する日本語全文検索モジュール <a
href="http://textsearch-ja.projects.postgresql.org/index-ja.html">textsearch_ja</a>
が開発されました。TSearch2対応の製品をわずかに改修することで日本語対
応にきます。
</p>
<hr />
<h4 id="item-japanese">「日本語版について」</h4>
<p><small><pre>
[訳注:
日本語版の製作については以下の通りです。
最終更新日: 2008年10月8日
翻訳者: 桑村 潤 (<a href="mailto:juk at postgresql.jp">Jun KUWAMURA &lt;juk at postgresql.jp&gt;</a>)
このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):
田仲 稔(<a href="mailto:Tanaka.Minoru at keiken.co.jp">Minoru TANAKA &lt;Tanaka.Minoru at keiken.co.jp&gt;</a>)
石井 達夫(<a href="mailto:ishii at sraoss.co.jp">Tatsuo ISHII &lt;ishii at sraoss.co.jp&gt;</a>)
齊藤 知人(<a href="mailto:tomos at elelab.nsc.co.jp">Tomohito SAITOH &lt;tomos at elelab.nsc.co.jp&gt;</a>)
馬場 肇(<a href="mailto:baba at kusastro.kyoto-u.ac.jp">Hajime BABA &lt;baba at kusastro.kyoto-u.ac.jp&gt;</a>)
岡本 一幸(<a href="mailto:kaz-okamoto at hitachi-system.co.jp">Kazuyuki OKAMOTO &lt;kaz-okamoto at hitachi-system.co.jp&gt;</a>)
小菅 昭一(<a href="mailto:s-kosuge at str.hitachi.co.jp">Shoichi Kosuge &lt;s-kosuge at str.hitachi.co.jp&gt;</a>)
山下 義之(<a href="mailto:dica at eurus.dti.ne.jp">Yoshiyuki YAMASHITA &lt;dica at eurus.dti.ne.jp&gt;</a>)
境 真太郎(<a href="mailto:s_sakai at mxn.mesh.ne.jp">Sintaro SAKAI &lt;s_sakai at mxn.mesh.ne.jp&gt;</a>)
生越 昌己(<a href="mailto:ogochan at zetabits.com">Masami OGOSHI &lt;ogochan at zetabits.com&gt;</a>)
石川 俊行(<a href="mailto:tosiyuki at gol.com">Toshiyuki ISHIKAWA &lt;tosiyuki at gol.com&gt;</a>)
本田 茂広(<a href="mailto:fwif0083 at mb.infoweb.ne.jp">Shigehiro HONDA &lt;fwif0083 at mb.infoweb.ne.jp&gt;</a>)
せせ じゅん(<a href="mailto:sesejun at linet.gr.jp">Jun SESE &lt;sesejun at linet.gr.jp&gt;</a>)
神谷 英孝(<a href="mailto:hkamiya at catvmics.ne.jp">Hidetaka KAMIYA &lt;hkamiya at catvmics.ne.jp&gt;</a>)
菅原 敦(<a href="mailto:asugawar at f3.dion.ne.jp">Atsushi SUGAWARA &lt;asugawar at f3.dion.ne.jp&gt;</a>)
稲葉 香理(<a href="mailto:i-kaori at sraoss.co.jp">Kaori Inaba &lt;i-kaori at sraoss.co.jp&gt;</a>)
芳賀 靖史(<a href="mailto:yasufumi.haga at nifty.com">Yasufumi Haga &lt;yasufumi.haga at nifty.com&gt;</a>)
をはじめ、ポストグレスに関する話題豊富な日本語PostgreSQLメーリングリスト、
和訳のきっかけを作ってくれたり、いつもチェックをしてくれる
<a href="http://jf.linux.or.jp/">JF(Linux Japanese FAQ)プロジェクト</a>、FreeBSD ドキュメンテーションプロジェクト
の方々、それから、直接あるいは間接的にかかわってくださるすべてのオープンソース
コミュニティのみなさまに感謝いたします。
この翻訳文書は <a href="http://www.postgresql.org/docs/faq/">本家 "Frequently Asked Questions" </a> のページに "Japanese FAQ"
という項目であります。
また、最新版は以下のサイトにあります。
<a
href="http://www.postgresql.jp/wg/jpugdoc/">http://www.postgresql.jp/wg/jpugdoc/</a> 「JPUG文書・書籍関連分科会」
<a href="http://www.linux.or.jp/JF/JFdocs/INDEX-database.html">http://www.linux.or.jp/JF/JFdocs/INDEX-database.html</a> 「Linux JFプロジェクト」 <a href="http://www.linet.gr.jp/~juk/pgsql/">http://www.linet.gr.jp/~juk/pgsql/</a> 「PostgreSQL Notes for Japanese」(翻訳者ページ)
なお、この和訳に関するご意見・ご質問は(<a href="mailto:juk at
postgresql.jp">juk at postgresql.jp</a>)までお寄せください。
(※ メールアドレスの " at " は適切に直してください。半角の "@" です。)
]
</pre></small></p>
</div>
</BODY>
</HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
<HTML>
<!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
<!-- HTML -->
<HEAD>
<META name="generator" content="HTML Tidy, see www.w3.org">
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<TITLE>PostgreSQL FAQ</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
alink="#0000ff">
<H1>Frequently Asked Questions (FAQ) o PostgreSQL</H1>
<P>Ostatnia aktualizacja: Sobota Luty 7 22:16:21 EST 2004</P>
<P>Ostatnia aktualizacja tłumaczenia: Piątek Marzec 5 19:31:12 EST 2004</P>
<P>Obecny maintainer: Bruce Momjian (<A href=
"mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
</P>
<P>Tłumaczenie: Marcin Mazurek (<A href=
"mailto:m.mazurek@netsync.pl">m.mazurek@netsync.pl</A>)<BR>
</P>
<P>Najbardziej aktualną wersję tego dokumentu można znaleźć pod
adresem:
<A href=
"http://www.Postgresql.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html</A>.</P>
<P>Odpowiedzi na pytania dotyczące konkretnych systemów operacyjnych
można znaleźć pod adresem:
<A href=
"http://www.PostgreSQL.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html</A>.</P>
<HR>
<H2 align="center">Pytania ogólne</H2>
<A href="#1.1">1.1</A>) Co to jest PostgreSQL? Jak to wymawiać?<BR>
<A href="#1.2">1.2</A>) Jaką licencją chroniony jest PostgreSQL?<BR>
<A href="#1.3">1.3</A>) Na jakich systemach Unixowych działa
PostreSQL?<BR>
<A href="#1.4">1.4</A>) Na jakich nie-Unixowych systemach działa
PostgreSQL?<BR>
<A href="#1.5">1.5</A>) Skąd mogę ściągnąć PostgreSQL?<BR>
<A href="#1.6">1.6</A>) Gdzie można szukać wsparcia technicznego?<BR>
<A href="#1.7">1.7</A>) Jaka jest ostatnia dostępna wersja?<BR>
<A href="#1.8">1.8</A>) Jaka dokumentacja jest dostępna?<BR>
<A href="#1.9">1.9</A>) Gdzie mogę znaleźć informację o znanych
błędach czy brakujących rozwiązanich?<BR>
<A href="#1.10">1.10</A>) Jak mogę się nauczyć <SMALL>SQL</SMALL>?<BR>
<A href="#1.11">1.11</A>) Czy PostgreSQL ma rozwiązany problem Y2K?<BR>
<A href="#1.12">1.12</A>) Jak mogę się przyłączyć do grupy osób
bezpośrednio pracujących nad rozwojem PostgreSQL?<BR>
<A href="#1.13">1.13</A>) Jak mogę zgłaszać błędy?<BR>
<A href="#1.14">1.14</A>) Jak można porównać PostgreSQL w stosunku
do innych <SMALL>DBMS</SMALL>?<BR>
<A href="#1.15">1.15</A>) W jaki sposób mogę wesprzeć finansowo
PostgreSQL?<BR>
<H2 align="center">Pytania użytkowników</H2>
<A href="#2.1">2.1</A>) Czy są jakieś driwery <SMALL>ODBC</SMALL> dla
PostgreSQL?<BR>
<A href="#2.2">2.2</A>) Jakie istnieją narzędzia pozwalające na dostęp do
PostgreSQL przez www?<BR>
<A href="#2.3">2.3</A>) Czy istnieje jakieś GUI dla PostgreSQL?<BR>
<A href="#2.4">2.4</A>) Za pomocą jakich języków programowania można
się komunikować z PostgreSQL?<BR>
<H2 align="center">Pytania dotyczące administracji</H2>
<A href="#3.1">3.1</A>) Jak mogę zainstalować PostgreSQL w innej
lokalizacji niż <I>/usr/local/pgsql</I>?<BR>
<A href="#3.2">3.2</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat:
<I>Bad System Call</I> lub "core dumped". Dlaczego?<BR>
<A href="#3.3">3.3</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat o błędzie: <I>IpcMemoryCreate</I>. Dlaczego?<BR>
<A href="#3.4">3.4</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat o błędzie: <I>IpcSemaphoreCreate</I>. Dlaczego?<BR>
<A href="#3.5">3.5</A>) W jaki sposób mogę kontrolować połączenia z
innych hostów?<BR>
<A href="#3.6">3.6</A>) Jak powinienem skonfigurować system baz
danych aby uzyskać lepszą wydajność?<BR>
<A href="#3.7">3.7</A>) Jakie są możliwości wyszukiwania błędów?<BR>
<A href="#3.8">3.8</A>) Skąd się bierze komunikat: <I>"Sorry, too many
clients"</I> podczas próby połączenia się z bazą danych?<BR>
<A href="#3.9">3.9</A>) Jakie pliki znajdują się w <I>pg_temp</I>?<BR>
<A href="#3.10">3.10</A>) Dlaczego konieczne jest przy upgradzie
PostgreSQL korzystanie ze skryptów dump i restore?<BR>
<H2 align="center">Pytania dotyczące użytkowania</H2>
<A href="#4.1">4.1</A>) Jaka jest różnica pomiędzy kursorami
binarnymi (binary cursors) i zwykłymi kursorami (normal cursors)?<BR>
<A href="#4.2">4.2</A>) Jak mogę pobrać za pomocą <SMALL>SELECT</SMALL>
jedynie kilka pierwszych wyników zapytania?<BR>
<A href="#4.3">4.3</A>) Jak mogę uzyskać listę wszystkich tabel czy
innych rzeczy pod <I>psql</I>?<BR>
<A href="#4.4">4.4</A>) Jak usunąć kolumnę z tabeli lub zmienić jej
typ?<BR>
<A href="#4.5">4.5</A>) Jaki jest maksymalny rozmiar dla rzędu,
tabeli i bazy danych?<BR>
<A href="#4.6">4.6</A>) Jak dużo miejsca w bazie danych jest
potrzebne aby przechować dane ze zwyczajnego pliku tekstowego?<BR>
<A href="#4.7">4.7</A>) Jak mogę sprawdzić jakie tabele, klucze,
bazy danych i użytkownicy są utworzeni?<BR>
<A href="#4.8">4.8</A>) Moje zapytania są wolne lub nie używają
kluczy. Dlaczego?<BR>
<A href="#4.9">4.9</A>) Jak mogę sprawdzić w jakis sposób "query
optimizer" wykonuje moje zapytanie?<BR>
<A href="#4.10">4.10</A>) Co to jest "R-tree index"?<BR>
<A href="#4.11">4.11</A>) Co to jest "Genetic Query Optimizer"?<BR>
<A href="#4.12">4.12</A>) Jak mogę używać wyrażeń regularnych w
zapytaniach i zapytań case-insensitive w wyrażeniach regularnych?
Jak korzystać z indeksów dla zapytań case-insensitive?<BR>
<A href="#4.13">4.13</A>) Jak sprawdzić w zapytaniu czy pole ma
wartość <SMALL>NULL</SMALL>?<BR>
<A href="#4.14">4.14</A>) Jaka jest różnica pomiędzy różnymi typami
tekstowymi (character types)?<BR>
<A href="#4.15.1">4.15.1</A>) Jak mogę utworzyć pole typu int, które samo
zwiększa swoją wartość?<BR>
<A href="#4.15.2">4.15.2</A>) Jak pobrać wartość pola typu
<SMALL>SERIAL</SMALL> po wykonaniu insert'u?<BR>
<A href="#4.15.3">4.15.3</A>) Czy użycie <I>currval()</I> i
<I>nextval()</I> nie doprowadzi do "race condition" z innymi
użytkownikami?<BR>
<A href="#4.15.4">4.15.4</A>) Dlaczego numery sekwencji nie są
ponownie używane przy przerwaniu transakcji?
Skąd się biorą luki w numerowaniu kolumny tabeli sekwencjami/SERIALem?<BR>
<A href="#4.16">4.16</A>) Co to jest <SMALL>OID</SMALL>? Co to jest
<SMALL>TID</SMALL>?<BR>
<A href="#4.17">4.17</A>) Jakie jest znaczenie niektórych terminów w
PostgreSQL?<BR>
<A href="#4.18">4.18</A>) Skąd bierze się ten błąd: <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?<BR>
<A href="#4.19">4.19</A>) Jak sprawdzić jakiej wersji PostgreSQL
używam?<BR>
<A href="#4.20">4.20</A>) Dlaczego operacje, które wykonuję na
dużych obiektach "large-object" zwracają komunikat:
<I>"invalid large obj descriptor"</I>?<BR>
<A href="#4.21">4.21</A>) Jak stworzyć kolumnę której domyślną
wartością będzie bieżący czas?<BR>
<A href="#4.22">4.22</A>) Dlaczego zapytania używające
<CODE><SMALL>IN</SMALL></CODE> są takie wolne?<BR>
<A href="#4.23">4.23</A>) Jak wykonać "outer join"?<BR>
<A href="#4.24">4.24</A>) Jak wykonywać zapytanie używające kilku
baz danych jednocześnie?<BR>
<A href="#4.25">4.25</A>) Jak zwrócić w funkcji wiele rzędów lub
kolumn?<BR>
<A href="#4.26">4.26</A>) Dlaczego nie mogę w sposób pewny
tworzyć/usuwać tabel tymczasowych w funkcjach PL/PgSQL?<BR>
<A href="#4.27">4.27</A>) Jakie są możliwości replikacji w
PostgreSQL?<BR>
<A href="#4.28">4.28</A>) Jakie możliwości szyfrowania oferuje
PostgreSQL?<BR>
<H2 align="center">Rozwijanie PostgreSQL</H2>
<A href="#5.1">5.1</A>) Napisałem własną funkcję. Kiedy użyję jej w
<I>psql</I>, program zrzuca pamięć (dump core)?<BR>
<A href="#5.2">5.2</A>) Jak mogę dodać/zgłosić nowe typy czy funkcje
do PostgreSQL?<BR>
<A href="#5.3">5.3</A>) Jak napisać funkcję C zwracającą krotkę
(tuple)?<BR>
<A href="#5.4">5.4</A>) Zmieniłem plik źródłowy. Dlaczego po
rekompilacji nie widać zmiany?<BR>
<HR>
<H2 align="center">Pytania ogólne</H2>
<H4><A name="1.1">1.1</A>) Co to jest PostgreSQL? Jak to wymawiać?</H4>
<P>PostgreSQL wymawia się <I>Post-Gres-kju-el</I>. Często podczas
rozmów używany jest termin "Postgres"</P>
<P>PostgreSQL jest rozszerzeniem systemu zarządzania bazami danych -
POSTGRES, kolejną generacją rozwojowego prototypu <SMALL>DBMS</SMALL>.
Mimo, że PostgreSQL zachował bardzo dobrze zbudowany model danych
(data model) i bogaty zestaw typów danych POSTGRES'a, zastąpił
PostQuel'owy język zapytań z rozbudowanym podzbiorem języka
<SMALL>SQL</SMALL>. PostgreSQL jest oprogramowaniem darmowym
z dostępnymi całymi źródłami.
</P>
<P>Rozwój PostgreSQL jest prowadzony przez grupę ludzi z Internetu,
komunikujących się poprzez mailowe listy dyskusyjne PostgreSQL.
Obecnym koordynatorem jest Marc G. Fournier (<A href=
"mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A>). (Zobacz
pytanie <A href="#1.6">1.6</A> jak się przyłączyć). Ta grupa ludzi jest
odpowiedzialna za cały rozwój PostgreSQL. PostgreSQL jest projektem
nie kontrolowanym przez żadną firmę, aby wziąć udział w jego rozwoju
sprawdź, <A href="http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html">
http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html</a></P>
<P>Autorami PostgreSQL 1.01 byli Andrew Yu and Jolly Chen.
Wiele innych osób pomogło przy portowaniu, testowaniu, debugowaniu i
rozwijaniu kodu. Oryginalny kod Postgresa, na którym został oparty
PostgreSQL, był wysiłkiem studentów oraz pracowników pracujących pod
kierownictwem profesora Michael'a Stonebraker'a z University of
California w Berkeley.</P>
<P>Oryginalną nazwą oprogramowania w Berkeley był Postgres. Po
dodaniu obsługi <SMALL>SQL</SMALL> w 1995, nazwa została zmieniona
na Postgres95. Pod koniec roku 1996 nazwa została zmieniona na
PostgreSQL.</P>
<H4><A name="1.2">1.2</A>) Jaką licencją chroniony jest
PostgreSQL?</H4>
<P>PostgreSQL objęty jest następującą licencją:</P>
<P>PostgreSQL Data Base Management System</P>
<P>Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 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>
<P>Tekst powyżej, jest klasyczną licencją BSD.
Nie posiada ona żadnych restrykcji co do używania kodu źródłowego.
Podoba nam się i nie zamierzamy jej zmieniać.</P>
<H4><A name="1.3">1.3</A>) Na jakich systemach Unixowych działa
PostreSQL?</H4>
<P>PostgreSQL powinien działać na wszystkich nowych Unix-podobnych
systemach. Platformy, które zostały szczegółowo przetestowane podczas
publikowania PostgreSQL są wymienione w dokumentacji opisującej
instalację.</P>
<H4><A name="1.4">1.4</A>) Na jakich nie-Unixowych systemach działa
PostgreSQL?</H4>
<P><STRONG>Klient</STRONG></P>
<P>Możliwa jest kompilacja bibliteki C <I>libpq</I>, psql oraz
innych interfejsów i uruchamianie ich na platformie MS Windows. W tym
wypadku klient jest uruchamiany na MS Windows a z serwerem komunikuje się
poprzez TCP/IP. Serwer może działać na dowolnej wspieranej platformie
Unixowej. Plik <I>win32.mak</I> jest dołączony
do źródeł, aby można było stworzyć bibliotekę <I>libpq</I> oraz
program <I>psql</I> działające w środowisku Win32. PostgreSQL może się
także komunikować z klientami <SMALL>ODBC</SMALL>.</P>
<P><STRONG>Serwer</STRONG></P>
<P>Serwer może być uruchamiany na Windows NT i Win2k używając
bibliotek Cygwin, Cygnus Unix/NT. W pliku <I>pgsql/doc/FAQ_MSWIN</I>
znajdującym się w źródłach lub pod adresem: <A href=
"http://www.postgresql.org/docs/faqs/text/FAQ_MSWIN">http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN</A> na naszych stronach.</P><P>
Obecnie prowadzone są prace nad stworzeniem wersji dla MS Win
NT/200/XP. Jeśli chcesz się dowiedzieć o obecnym statusie tych prac
zobacz <A
href="http://techdocs.postgresql.org/guides/Windows">http://techdocs.postgresql.org/guides/Windows</A> and
<A
href="http://momjian.postgresql.org/main/writings/pgsql/win32.html">http://momjian.postgresql.org/main/writings/pgsql/win32.html</A>.
</P>
<P>
Istnieje także port pod Novell Netware 6 dostępny pod adresem <A
href="http://forge.novell.com">http://forge.novell.com</A>.
</P>
<H4><A name="1.5">1.5</A>) Skąd można ściągnąć PostgreSQL?</H4>
<P>Główny serwer ftp z dostępem "anonymous" dla PostgreSQL znajduje
się <A href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
jeśli szukasz mirrorów sprawdź naszą główną stronę www.</P>
<H4><A name="1.6">1.6</A>) Gdzie można szukać wsparcia technicznego?</H4>
<P>Adres głównej listy mailowej: <A href=
"mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org</A>.
Jest ona przeznaczona dyskusjom dotyczącym spraw związanych z PostgreSQL.
Żeby zapisac się na listę, wyślij email z następującymi liniami w
treści maila (nie w temacie):</P>
<PRE>
subscribe
end
</PRE>
<P>na adres: <A href=
"mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</A>.</P>
<P>Dostępna jest także lista wysyłająca digesty. Aby zapisać się na
nią, wyślij email na adres:
<A href=
"mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</A>
z treścią maila zawierającą:</P>
<PRE>
subscribe
end
</PRE>
Digesty są wysyłane do członków listy, kiedy na główną listę dotrze ok
30k wiadomości.
<P>Dostępna jest także lista poświęcona błędom znalezionym w
PostgreSQL. Aby zapisać się na nią wyślij email na adres:
<A href=
"mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org</A>
z treścią maila zawierającą:</P>
<PRE>
subscribe
end
</PRE>
Lista poświęcona dyskusjom developerów jest dostępna pod adresem:
<A href=
"mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org</A>
Aby się na nią zapisać wyślij na jej adres mail z treścią:
<PRE>
subscribe
end
</PRE>
<P>Dodatkowe informacje o listach mailowych dotyczących PostgreSQL
można znaleźć na stronach WWW PostgreSQL pod adresem:</P>
<BLOCKQUOTE>
<P><A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A></P>
</BLOCKQUOTE>
<P>W sieci EFNet istnieje kanał IRC <I>#PostgreSQL</I>. Ja, do
połączenia się z kanałem używam Unixowego polecenia <CODE>irc -c
'#PostgreSQL' "$USER" irc.phoenix.net.</CODE></P>
<P>Lista firm oferujących wsparcie na zasadach komercyjnych znajduje
się pod adresem: <A href= "http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</A>.</P>
<H4><A name="1.7">1.7</A>) Jaka jest ostatnia dostępna wersja?</H4>
<P>Ostatnia dostępna wersja PostgreSQL to 7.4.1.</P>
<P>Planujemy publikowanie kolejnych wersji co sześć do ośmiu miesięcy.</P>
<H4><A name="1.8">1.8</A>) Jaka dokumentacja jest dostępna?</H4>
<P>Kilka manuali, stron podęcznika man, oraz kilka przykładów do
testowania są załączone w samej dystrybucji. Znajdują się one w
katalogu <I>/doc</I>. Manual może być także przeglądany poprzez
strony www pod adresem <A href=
"http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</A>.</P>
<P>Istnieją także dwie książki dostępne online pod adresami
<A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
i <A href=
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
Lista książek o PostgreSQL, które można kupić znajduje się pod adresem
<A href=
"http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</A>.
Zbiór technicznych artykułów o PostgreSQL znajduje się pod adresem <A
href=
"http://techdocs.PostgreSQL.org">http://techdocs.postgresql.org/</A>.</P>
<P><I>psql</I> posiada kilka wbudowanych poleceń \d, za pomoca których
można sprawdzić informacje dotyczące typów, operatorów, funkcji,
agregatów itd.</P>
<P>Na naszej stronie można znaleźć dużo więcej dokumentacji.</P>
<H4><A name="1.9">1.9</A>) Gdzie można znaleźć informację o znanych
błędach czy brakujących rozwiązanich?</H4>
<P>PostgreSQL wspiera rozszerzony podzbiór standardu <SMALL>SQL</SMALL>-92.
Sprawdź naszą listę <A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
aby znaleźć informację o znanych problemach, brakujących
rozwiązaniach czy przyszłych planach.</P>
<H4><A name="1.10">1.10</A>) Jak mogę się nauczyć
<SMALL>SQL</SMALL>?</H4>
<P>Książka o PostgreSQL <A href=
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
uczy <SMALL>SQL</SMALL>. Jest jeszcze inna ksiązka o PostgreSQL
dostępna pod adresem: <A href=
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook.</A>
Dobry tutorial możesz znaleźć pod adresem: <A href=
"http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
oraz <A href=
"http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,</A>
i <A href=
"http://sqlcourse.com/">http://sqlcourse.com.</A></P>
<P>Jeszcze inny to "Teach Yourself SQL in 21 Days, Second Edition"
pod adresem: <A href=
"http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A></P>
<P>Wielu z naszych użytkowników poleca <I>The Practical SQL Handbook</I>,
Bowman, Judith S., et al., Addison-Wesley. Inni polecają <I>The
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
<H4><A name="1.11">1.11</A>) Czy PostgreSQL ma rozwiązany problem Y2K?</H4>
<P>Tak, bez problemu radzimy sobie z datami po roku 2000 AD, oraz
przed rokiem 2000 BC.</P>
<H4><A name="1.12">1.12</A>) Jak mogę się przyłączyć do grupy osób
bezpośrednio pracujących nad rozwojem PostgreSQL?</H4>
<P>Przede wszystkim ściągnij ostatnie dostępne źródła i przeczytaj
dokumentację przeznaczoną dla developerów na naszej stronie www lub
dostępną także w źródłach PostgreSQL. Następnie zapisz się na listy
mailowe <I>pgsql-hackers</I> i
<I>pgsql-patches</I>. I na koniec, wysyłaj nam wysokiej jakości
patch'e na listę pgsql-patches.</P>
<P>Jest około 12 osób, które mają uprawnienia do commit'owania w
<SMALL>CVS</SMALL> PostgreSQL'a. Każdy z nich submitował tak wiele
wysokiej jakości patchy, że stało się niemożliwe dla obecnych
commiterów być z nimi na bieżąco, więc musieliśmy im ufać i mieć
pewność, że ich poprawki są wysokiej jakości.</P>
<H4><A name="1.13">1.13</A>) Jak mogę zgłaszać błędy?</H4>
<P>Zajrzyj na stronę <A href=
"http://www.postgresql.org/bugs/bugs.php">PostgreSQL BugTool</A>, na
której opisane są wskazówki jak zgłaszać informacje o błędach.</P>
<P>Zajrzyj także na nasz ftp <A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>, aby
sprawdzić czy nie ma nowszych wersji PostgreSQL czy patchy.</P>
<H4><A name="1.14">1.14</A>) Jak można porównać PostgreSQL w stosunku
do innych <SMALL>DBMS</SMALL>?</H4>
<P>Jest kilka sposobów oceny softwaru: możliwości,
wydajność, stabilność, wsparcie i cena.</P>
<DL>
<DT><B>Możliwości</B></DT>
<DD>PostgreSQL posiada możliwości dostępne w dużych, komercyjnych
systemach <SMALL>DBMS</SMALL>, takie jak transakcje, podzapytania
(subselects), triggery, widoki, klucze obce, referential integrity,
oraz wyrafinowany system blokowania. Mamy także właściowści których
inni nie posiadają, jak typy definiowane przez użytkownika,
dziedziczenie, rules, multi-version concurrency control, która
redukuje problemy z blokowaniem (lock contention).<BR>
<BR>
</DD>
<DT><B>Wydajność</B></DT>
<DD>Wydajność PostgreSQL jest podobna do innych komercyjnych i open
source baz danych. W niektórych sytuacjach jest szybszy w
niektórych wolniejszy. W porównianiu do MySQL lub mniejszych baz
danych jesteśmy szybsi przy wielu użytkownikach, skomplikowaych
zapytaniach i dużym obciążeniu podczas. MySQL jest szybszy dla
prostych SELECTów wykonywanych przez niewielu użytkowników.
Spowodowane jest to narzutem, który się pojawia przy transakcjach.
Oczywiście MySQL nie ma większości z rozwiązań opisanych powyżej
w sekcji <I> Możliwości </I>. PostgreSQL został stworzony z myślą o
stabilności, oraz szerokiej gamie możliwości, ale mimo to staramy
się w każdej wersji poprawiać jego wydajność.
Ciekawe porównanie PostgreSQL i MySQL można znaleźć pod adresem <A href=
"http://openacs.org/philosophy/why-not-mysql.html">http://openacs.org/philosophy/why-not-mysql.html</A>
Dodatkowo, MySQL jest firmą, która dystrybuuje jej produkty poprzez
zasadę Open Source i wymaga wykupienia licencji w przypadku
tworzenia close-source software, co ie ma miejsca w przypadku
PostgreSQL.<BR>
<BR>
</DD>
<DT><B>Stabilność</B></DT>
<DD>Zdajemy sobie sprawę, że <SMALL>DBMS</SMALL> musi być stabilny,
w przeciwnym wypadku jest bez wartości. Staramy się publikować kod
stabilny, dobrze przetestowany, z minimum możliwych błędów. Każde
wydanie poprzedza co najmniej miesiąc testów wersji beta. Patrząc na
historię wydań PostgreSQL widać, że dostarczamy stabilne, dobrze
sprawdzone wersje, które są gotowe do użycia w środowisku
produkcyjnym. Myślimy, że proces publikowania kolejnych wersji
opracowany przez nas jest jednym z lepszych wśród innych twórców
oprogramowania bazodanowego.<BR>
<BR>
</DD>
<DT><B>Wsparcie</B></DT>
<DD>Dzięki naszym listom mailowym masz dostęp do dużej liczby
programistów i użytkowników, którzy pomagają rozwiązać każdy
napotkany problem. Chociaż nie możemy gwarantować znalezienia
rozwiązania danego problemu, nie różnimy się w tym od innych
komercyjnych systemów <SMALL>DBMS</SMALL>. Bezpośredni kontakt z
programistami, użytkownikami, dokumentacją i kodem źródłowym
sprawiają, że wsparcie oferowane PostgreSQL niejednokrotnie jest
lepsze niż w innych systemach <SMALL>DBMS</SMALL>. Istnieje także
możliwość skorzystania z komercyjnego wsparcia dla tych, których
takiego rozwiązania potrzebują.
(Sprawdź <A href="#1.6">ten punkt FAQ</A>.)<BR>
<BR>
</DD>
<DT><B>Cena</B></DT>
<DD>Korzystanie z PostgreSQL jest darmowe, zarówno w przypadku
komercyjnym jak i niekomercyjnym. Możesz korzystać z naszego kodu
źródłowego w Twoim produkcie bez żadnych ograniczeń, poza tymi
wymienionymi w licencji BSD przytoczonej powyżej.<BR>
<BR>
</DD>
</DL>
<H4><A name="1.15">1.15</A>) W jaki sposób mogę wesprzeć finansowo
PostgreSQL?</H4>
<P>PostgreSQL korzysta z najlepszej infrastruktury od samego początku
istnienia projektu, czyli roku 1996 kiedy rozpoczeliśmy pracę. Wszystko
to zawdzięczamy Marc'owi Fournier'owi, który stworzył tą infrastrukturę
i zarządza nią od lat.</P>
<P>Wysokiej jakości infrastruktura jest bardzo ważna dla każdego
projektu open-source. Zapobiega przerwom w rozwoju projektu i
jakimkolwiek przestojom.</P>
<P>Oczywiście korzystanie z wysokiej jakości infrastruktury nie jest
tanie. Istnieje wiele różnych miesięcznych, czy jednorazowych
wydatków, które trzeba ponosić aby wszystko działało jak należy.
Jeśli Ty, bądź Twoja firma może wspomóc finansowo rozwój PostgreSQL
odwiedź adres: <A href=
"http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</A>
gdzie opisane jest jak to zrobić.</P>
<P>Chociaż na stronie wspomniana jest nazwa PostgreSQL Inc, "datki"
są przeznaczone jedynie na rozwój projektu PostgreSQL i nie są
przeznaczane na finansowanie jakiejkolwiek firmy. Jeśli wolisz,
możesz wysłać czek na adres kontaktowy.</P>
<HR>
Jeśli możesz się pochwalić udanymi wdrożeniami PostgreSQL, prosimy
abyś zgłosił nam to na stronie: <A
href="http://advocacy.postgresql.org/">http://advocacy.postgresql.org</a>.
<H2 align="center">User Client Questions</H2>
<H4><A name="2.1">2.1</A>) Czy są jakieś driwery <SMALL>ODBC</SMALL> dla
PostgreSQL?</H4>
<P>Dostępne są dwa driwery <SMALL>ODBC</SMALL>: PsqlODBC
i OpenLink <SMALL>ODBC</SMALL>.</P>
<P>Możesz pobrać PsqlODBC z adresu <A
href="http://gborg.postgresql.org/project/psqlodbc/projdisplay.php">http://gborg.postgresql.org/project/psqlodbc/projdisplay.php</A>
</P>
<P>OpenLink <SMALL>ODBC</SMALL> może być pobrany z adresu: <A href=
"http://www.openlinksw.com/">http://www.openlinksw.com</A>.
Współpracuje ze standardowym oprogramowaniem klienckim <SMALL>ODBC</SMALL>
więc w ten sposób możesz korzystać z PostgreSQL <SMALL>ODBC</SMALL>
dostępnego na każdej pltaformie którą wspiera (Win, Mac, Unix, VMS).</P>
<P>Autorzy będą prawdopodobnie sprzedawać ten produkt osobom które
wymagają komercyjnego wsparcia, ale wersja darmowa będzie zawsze
dostępna. Wszystkie pytania możesz wysyłać na adres: <A href=
"mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</A>.</P>
<H4><A name="2.2">2.2</A>) Jakie istnieją narzędzia pozwalające na dostęp do
PostgreSQL przez www?</H4>
<P>Dobry podręcznik dla początkujących o dostępie do bazy danych
przez www możesz znaleźć pod adresem:
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
<P>Do integracji z www, świetnym rozwiązaniem jest PHP. Możesz
znaleźć więcej informacji na ten temat pod adresem
<A href="http://www.php.net">http://www.php.net</A>.</P>
<P>Wiele osób w przypadku skomplikowanych rozwiązań uzywa Perl'a i
modułu CGI.pl lub mod_perl.</P>
<H4><A name="2.3">2.3</A>) Czy istnieje jakieś GUI dla PostgreSQL?</H4>
<P>Tak, istnieje kilka interfejsów graficznych dla PostgreSQL.
Wśród nich PgAccess (<A href="http://www.pgaccess.org">
http://www.pgaccess.org</A>), PgAdmin III (<A
href="http://www.pgadmin.org">http://www.pgadmin.org</A>),
RHDB Admin (http://sources.redhat.com/rhdb/ ) oraz Rekall (
http://www.thekompany.com/products/rekall/, komercyjny). Istnieje
także PHPPgAdmin ( http://phppgadmin.sourceforge.net/ ), webowy
interfejs dla PostgreSQL.
</P>
<P>
Więcej informacji na ten temat znajduje się pod adresem See
<A href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</A>.</P>
<H4><A name="2.4">2.4</A>) Za pomocą jakich języków programowania
można się komunikować z PostgreSQL?</H4>
<P>Najbardziej popularne języki posiiadają własny interfejs dla
PostgreSQL. Sprawdź listę rozszerzeń dla intersującego Ciebie języka
programowania.</P>
<P>Ze źródłami PostreSQL dystrubuowane są interfejsy dla
następujących języków programowania:</P>
<UL>
<LI>C (libpq)</LI>
<LI>Embedded C (ecpg)</LI>
<LI>Java (jdbc)</LI>
<LI>Python (PyGreSQL)</LI>
<LI>TCL (libpgtcl)</LI>
</UL>
Inne interfejsy są dostępne pod adresem:
<A href="http://gborg.postgresql.org"> http://gborg.postgresql.org</A> w
sekcji Drivers/Interfaces.
<HR>
<H2 align="center">Pytania dotyczące administracji</H2>
<H4><A name="3.1">3.1</A>) Jak mogę zainstalować PostgreSQL w innej
lokalizacji niż <I>/usr/local/pgsql</I>?</H4>
<P>Użyj opcji <I>--prefix</I> podczas uruchamiania skryptu
<I>configure</I>.</P>
<H4><A name="3.2">3.2</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat o błędzie: <I>Bad System Call</I> lub "core dumped".
Dlaczego?</H4>
<P>Ten błąd może być wynikiem wielu problemów, ale na początek
sprawdź czy masz zainstalowane rozszerzenia systemu V w jądrze
systemu. PostgreSQL wymaga do pracy zainstalowanej obsługi pamięci
dzielonej i semaforów.</P>
<H4><A name="3.3">3.3</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat o błędzie: <I>IpcMemoryCreate</I>.
Dlaczego?</H4>
<P>Albo nie masz poprawnie skonfigurowanej obsługi pamięci dzielonej
w jądrze systemu, albo musisz zwiększyć jej dostępny rozmiar.
Dokładna ilość jaką potrzebujesz jest zależna od architektury systemu
na jakim pracujesz, jak dużo buforów oraz jak dużo procesów backendu
skonfigurowałeś dla <I>postmaster'a</I>. Dla większości systemów, z
domyślną liczbą buforów i procesów potrzebujesz minimum w
przybliżeniu 1MB. Zobacz <A href=
"http://www.postgresql.org/idocs/index.php?kernel-resources.html">PostgreSQL
Administrator's Guide</A> gdzie szczegółowo zostało opisane
wykorzystanie pamięci dzielonej i semaforów.</P>
<H4><A name="3.4">3.4</A>) Podczas startu <I>postmaster'a</I>,
otrzymuję komunikat o błędzie: <I>IpcSemaphoreCreate</I>.
Dlaczego?</H4>
<P>Jeśli treść błędu brzmi: <I>IpcSemaphoreCreate: semget failed
(No space left on device)</I> oznacza to, że jądro systemu nie jest
skonfigurowane do obsługi wystarczającej liczby semaforów.
Postgres wymaga jednego semafor'a na potencjalny jeden proces backend.
Tymczasowym rozwiązaniem jest uruchomienie programu <I>postmaster</I>
z mniejszą maksymalną liczbą procesów backend.
Użyj opcji <I>-N</i> z parameterem mniejszym od domyślnego - 32.
Bardziej trwałym rozwiązaniem jest zwiększenie parametrów
<SMALL>SEMMNS</SMALL> i <SMALL>SEMMNI</SMALL> jądra twojego systemu.</P>
<P>Niedziałające semafory mogą spowodować niepoprawne zamknięcie
systemu w czasie intensywnego korzystania z bazy.</P>
<P>Jeśli treść błędu jest inna, może to oznaczać, że obsługa semaforów
nie została włączona do jądra wcale. Zobacz PostgreSQL
Administrator's Guide po bardziej szczegółowe informacje o pamięci
dzielonej i semaforach.</P>
<H4><A name="3.5">3.5</A>) W jaki sposób mogę kontrolować połączenia
z innych hostów?</H4>
<P>Domyślnie PostgreSQL pozwala jedynie na połączenia za pomocą
socketów Unixowych z lokalnego hosta. Inne hosty nie będą mogły się
połączyć z serwerem dopóki nie zostanie dodana opcja <I>-i</I> do
<I>postmaster'a</I>,
<B>oraz</B> nie umożliwi się autoryzacji na podstawie adresu hostów
modyfikując odpowiednio plik
<I>$PGDATA/pg_hba.conf</I>. To zmiany pozwolą na połączenia TCP/IP.</P>
<H4><A name="3.6">3.6</A>) Jak powinienem skonfigurować system baz
danych aby uzyskać lepszą wydajność?</H4>
<P>Indeksy bez wątpienia mogą przyspieszyć wykonywanie zapytań.
Polecenie <SMALL>EXPLAIN</SMALL> pozwala zobaczyć jak PostgreSQL
interpretuje Twoje zapytanie i które indeksy są używane.</P>
<P>Jeśli wykonujesz bardzo dużo <SMALL>INSERTów</SMALL>, może warto
je wykonać za pomocą jednego dużego pliku używając polecenia
<SMALL>COPY</SMALL>. Jest to dużo szybsze niż pojedyncze
<SMALL>INSERTy.</SMALL> Po drugie polecenia SQL nie zawarte w bloku
określającym transakcję - <SMALL>BEGIN WORK/COMMIT</SMALL>, są
traktowane jako pojedyncza transakcja. Rozważ wykonanie kilku
poleceń/zdań SQL w jednym bloku transakcji. To redukuje narzut
nakładany przez transakcję. Przy dużych zmianach w danych, warto
usunąć i stworzyć na nowo indeksy.</P>
<P>Jest kilka opcji pozwalających na poprawienie wydajności.
Możesz wyłączyć <I>fsync()</I> poprzez uruchomienie <I>postmaster'a</I>
z opcjami <I>-o -F</I>. To spowoduje, że
<I>fsync()</I> nie będzie zrzucał danych na dysk po każdej
transakcji.</P>
<P>Możesz także uruchomić <I>postmaster'a</I> z opcją <I>-B</I>
aby zwiększyć wielkość pamięci dzielonej używanej przez procesy
backendów. Jeśli ustawisz tą wartość zbyt wysoko i przekroczysz limity
ustawione przez kernel na pamięć dzieloną, <I>postmaster</I> może się
nie uruchomić. Każdy bufor zajmuje 8K a domyślna ilość buforów to 64.</P>
<P>Możesz także użyć opcji <I>-S</I> dla backendu aby zwiększyć
maksymalną wartość pamięci używaną przez proces backendu podczas
sortowania. Opcja <I>-S</I> jest ustawiana wartością podawaną w
kilobajtach, domyślna wartość to 512K.</P>
<P>Możesz także użyć polecenia <SMALL>CLUSTER</SMALL> aby pogrupować
dane w tabelach wg indeksu. Zobacz opis polecenia <SMALL>CLUSTER</SMALL>
w manualu żeby dowiedzieć się więcej.</P>
<H4><A name="3.7">3.7</A>) Jakie są możliwości wyszukiwania
błędów?</H4>
<P>PostgreSQL ma kilka możliwości na raportowanie informacji o
jego statusie, które mogą być przydatne przy debugowaniu procesu.</P>
<P>Przede wszystkim uruchom skrypt <I>configure</I> z opcją
--enable-cassert, wiele funkcji <I>assert()</I> monitorują postęp
procesu backend i zatrzymują program kiedy wydarzy się coś
nieoczekiwanego.</P>
<P>Zarówno <I>postmaster</I> jak i <I>postgres</I> mają kilka opcji
do debugowania. Za każdym razem kiedy uruchamiasz <I>postmaster'a</I>,
upewnij się, że wysyłasz standardowe wyjście i error do pliku z
logami, np. w ten sposób:</P>
<PRE>
cd /usr/local/pgsql
./bin/postmaster &gt;server.log 2&gt;&amp;1 &amp;
</PRE>
<P>To utworzy plik server.log w głównym katalogu PostgreSQL.
Ten plik zawiera pożyteczne informacje o problemach i błędach, które
wydarzyły się podczas pracy serwera. <I>Postmaster</I> posiada opcję
<I>-d</I>, która pozwala na raportowanie bardzo szczególowych
informacji. Do opcji <I>-d</I> podajemy liczbę, która określa
szczegółowość wysyłanych informacji. Musisz mieć świadomość, że
wysoki poziom logowania będzie powodował tworzenie bardzo duzych
plików z logami.</P>
<P>Jeśli <I>postmaster</I> nie został uruchomiony, możesz uruchomić
<I>postgres'owy</I> backend z linii poleceń, i uruchomić Twoje
polecenie <SMALL>SQL</SMALL> bezpośrednio na nim.
Taki sposób jest polecany <B>jedynie</B> w przypadku debugowania.
Zwróć uwagę, że w tym wypadku zapytanie kończy znak nowej linii a nie
średnik. Jeśli skompilowałeś z opcjami debugowania mozesz użyć
debuggera aby sprawdzić co się dzieje. Poniewż backend nie został
uruchomiony przez <I>postmaster'a</I>, nie działa w identycznym
środowisku, co oznacza że powtórzenie warunków w jakich wystąpiły
problemy moze być problemem.</P>
<P>Jeśli <I>postmaster</I> działa, uruchom <I>psql</I> w jednym z
okien, następnie znajdź <SMALL>PID</SMALL> procesu <I>postgres</I>
używanego przez <I>psql</I>. Użyj debuggera aby do
<SMALL>PID'u</SMALL> <I>postgres'a</I>. Możesz ustawiać pułapki
(breakpoints) w debuggerze i wykonywać zapytania z <I>psql</I>.
Jeśli debugujesz uruchamianie <I>postgres'a</I>, możesz ustawić zmienną
PGOPTIONS="-W n", następnie uruchomić <I>psql</I>.
Opcja ta pozwoli spowolnić uruchomienie na
<I>n</I> sekund abyś mógł się połączyć z procesem za pomocą
debugera, ustawić jakiekolwiek pułapki i kontynuować proces
uruchamiania.</P>
<P><I>postgres</I> może być uruchamiany z opcjami <I>-s, -A</I> i
<I>-t</I>, które mogą być bardzo przydatne przy debuggowaniu i ocenie
wydajności.</P>
<P>Możesz także skompilować z profilingiem aby zobaczyć jakie funkcje
ile czasu wykonują się. Pliki profilowane dla backendu zostaną
umieszczone w katalogu
<I>pgsql/data/base/dbname</I>. Pliki profilu klienta zostaną
umieszczone w bieżącym katalogu klienta. Linux wymaga aby kompilować
z opcją <I>-DLINUX_PROFILE</I> aby profilowanie odbywało się
poprawnie.</P>
<H4><A name="3.8">3.8</A>) Skąd się bierze komunikat: <I>"Sorry, too
many clients"</I> podczas próby połączenia się z bazą danych?</H4>
<P>Musisz zwiększyć limit ilości jednoczesnych procesów bacekendu
dla procesu <I>postmaster'a</I>.</P>
<P>Domyślny limit to 32 procesy. Możesz go zwiększyć przez restart
<I>postmaster</I> z odpowiednią wartością ustawianą opcję <I>-N</I> w
pliku <I>postgresql.conf</I>.</P>
<P>Weź pod uwagę, że jeśli zwiększysz wartość podaną w opcji
<I>-N</I> na więcej niż 32 musisz także zwiększyć wartość w opcji
<I>-B</I> ponad jej domyślną wartość 64; wartość <I>-B</I> musi być
co najmniej dwa razy większa od wartości podanej w opcji
<I>-N</I>, a prawdopodobnie powinna być w rzeczywistości jeszcze
większa dla optymalnej wydajności.
Dla dużej liczby procesów backendu na pewno zauważysz, że trzeba
zwiększyć różne parametry jądra Unixa. Rzeczy, które pownieneś
sprawdzić to maksymalna liczba bloków pamięci dzielonej,
<SMALL>SHMMAX;</SMALL> maksymalna liczba semaforów, <SMALL>SEMMNS</SMALL>
oraz <SMALL>SEMMNI;</SMALL>
maksymalna liczba procesów, <SMALL>NPROC;</SMALL> maksymalna liczba
procesów na jednego użytkownika, <SMALL>MAXUPRC;</SMALL> i maksymalna
liczba otwartych plików, <SMALL>NFILE</SMALL> oraz
<SMALL>NINODE.</SMALL> Powód dla którego PostgreSQL ma limit na
maksymalną liczbę procesów backendu to obawa o wyczerpanie zasobów
systemu.</P>
<H4><A name="3.9">3.9</A>) Jakie pliki znajdują się w <I>pg_temp</I>?</H4>
<P>Katalog ten zawiera tymczasowe pliki utworzone przez executor. Dla
przykładu, jeśli jakaś operacja sortowania jest wymagana do wykonania
<SMALL>ORDER BY,</SMALL> a samo sortowanie wymaga więcej miejsca niż
parametr backendu
<I>-S</I> ustawił do wykorzystania, wtedy tymczasowe pliki są używane
do przechowywania tych danych.</P>
<P>Pliki tymczasowe powinny być usunięte automatycznie, ale mogło się
to nie stać jeśli proces backendu w międzyczasie nie zakończył się
poprawnie podczas operacji sortowania. Jeśli w danym momencie nie
działają żadne procesy backendów mozesz spokojnie usunąć pliki
pg_tempNNN.NN.</P>
<H4><A name="3.9">3.9</A>) Dlaczego konieczne jest przy upgradzie
PostgreSQL korzystanie ze skryptów dump i restore?</H4>
<P>
Twórcy PostgreSQL dokonują jedynie małych zmian pomiędzy małymi
upgradami wersji, np z 7.2 do 7.2.1, wtedy upgrade nie wymaga
korzystania z dump i restore. Przy większych zmianach, np. z wersji
7.2 do 7.3, często zmianymają wpływ na format przechowywanych danych.
Zmiany te są na tyle skomplikowane, że nie utrzymujemy zgodości z
poprzednimi wersjami PostgreSQL. dump pozwala na wydostanie danych w
takiej postaci, w której łatwe jest ich zaimportowanie do nowszych
wersji bez kłopotu.
</P>
<P>
W wydaniach gdzie zmiany nie dotyczą formatu danych na dysku, można
wykorzystać skryptu pg_upgrade, do upgradu bez użycia dump/restore.
Dokumentacja do danego wydania zawiera informację czy możliwe jest
użycie pg_upgrade.
</P>
<HR>
<H2 align="center">Pytania dotyczące używania</H2>
<H4><A name="4.1">4.1</A>) Jaka jest różnica pomiędzy kursorami
binarnymi (binary cursors) i zwykłymi kursorami (normal
cursors)?</H4>
<P>Zobacz w manualu opis polecenia <SMALL>DECLARE</SMALL>.</P>
<H4><A name="4.2">4.2</A>) Jak mogę pobrać za pomocą
<SMALL>SELECT</SMALL> jedynie kilka pierwszych wyników
zapytania?</H4>
<P>Zobacz w manualu opis polecenia <SMALL>FETCH</SMALL> lub użyj
polecenia <SMALL>SELECT</SMALL> ... <SMALL>LIMIT</SMALL>....</P>
<P>Nawet jeśli chesz pobrać kilka pierwszych rzędów z wyniku
zapytania, całe zapytanie musi zostać wykonane. Byc może powinieneś
skorzystać z polecenia <SMALL>ORDER BY.</SMALL>
Jeśli istnieje indeks który odpowiada polom określonym przez
<SMALL>ORDER BY</SMALL>, PostgreSQL może wykorzystać jedynie kilka
pierwszych rzędów, być może będzie konieczność wykonania zapytania do
momentu aż zostaną znalezione pożądane wyniki.</P>
<P>
Aby otrzymać losowy rząd, użyj:</P>
<PRE>
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</PRE>
<H4><A name="4.3">4.3</A>) Jak mogę uzyskać listę wszystkich tabel
czy innych rzeczy pod <I>psql</I>?</H4>
<P>Możesz sprawdzić zawartość źródeł <I>psql</I>, a konkretnie plik
<I>pgsql/src/bin/psql/describe.c</I>. Zawiera on polecenia
<SMALL>SQL</SMALL> które generuja wyniki komend z backslashem.
Możesz także uruchomić <I>psql</I> z opcją
<I>-E</I> wtedy po wykonaniu polecenia z backslashem wyświetlane
będzie zapytanie, które w rzeczywistości jest wykonywane.</P>
<H4><A name="4.4">4.4</A>) Jak usunąć kolumnę z tabeli lub zmienić
jej typ?</H4>
<P>DROP COLUMNT zostało dodane w wersji 7.3 przy poleceniu ALTER
TABLE DROP COLUMN. We wcześńiejszych wersjach możesz zrobić tak:
</P>
<PRE>
BEGIN;
LOCAL TABLE old_table;
SELECT ... -- wybierz wszystkie kolumny poza tą jedną której chcesz się pozbyć
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
</PRE>
<P>
Aby zmienić typ danych kolumny możesz zrobić tak:
</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>
<H4><A name="4.5">4.5</A>) Jaki jest maksymalny rozmiar dla rzędu,
tabeli i bazy danych?</H4>
<P>Oto wszystkie ograniczenia:</P>
<PRE>
Maksymalny rozmiar dla bazdy danych? nieograniczony ( istnieją
bazy danych o wielkości 32 TB databases )
Maksymalny rozmiar dla tabeli? 32 TB
Maksymalny rozmiar dla rzędu? 1.6 TB
Maksymalny rozmiar pola? 1 GB
Maksymalna liczba rzędów w tabeli? nieograniczona
Maksymalna liczba kolumn w tabeli? 250-1600 w zależoności od typów kolumn
Makasymalna liczba indeksów na tabeli? nieograniczona
</PRE>
Oczywiście "nieograniczony" nie jest prawdą tak do końca, istnieją
ograniczenia wynikające z dostępnego miejsca na dysku, pamięci/swapa.
Kiedy wielkości te będą bardzo duże może odbić się to na wydajności.
<P>Maksymalny rozmiar tabeli, czyli 32 TB nie wymaga od systemu
operacyjnego wsparcia dla dużych plików. Duże tabele są przechowywane
jako pliki o rozmiarze 1 GB, więc ograniczenia co do wielkości plików
narzucone przez system plików nie są istotne.</P>
<P>Masymalny rozmiar tabeli i maksymalna liczba kolumn może być
zwiększona jeśli zwiększymy domyślny rozmiar bloku (block size) do
32k.</P>
<H4><A name="4.6">4.6</A>) Jak dużo miejsca w bazie danych jest
konieczne aby przechowywać dane ze zwyczajnego pliku
tekstowego?</H4>
<P>Baza danych PostgreSQL może potrzebować do pięciu razy więcej
miejsca na przechowywanie danych z plików tekstowych niż ich
objętość.</P>
<P>Jako przykład możemy rozważyć plik składający się z 100,000 linii
zbudowanych z liczby całkowitej oraz opisu tekstowego w każdej.
Załóżmy, że średnio każdy łańcuch tekstu w linii zajmuje 20
bajtów. Cały plik powinien zajmować ok. 2.8 MB. Rozmiar pliku bazy danych w
PostgreSQL zawierającego te dane mozna oszacować na około 6.4MB:</P>
<PRE>
36 bajtów: nagłówek każdego rzędu w przybliżeniu)
24 bajty: jedno pole int i jedno pole typu text
+ 4 bajty: wkaźnik na stronie do krotki
--------------------------------------------------
64 bajty w jednym rzędzie
Strona danych w PostgreSQL zajmuje 8192 bajtów (8 KB), więc:
8192 bajtów na stronę
--------------------- = 128 rzędów na jedną strone w bazie (zaokrąglone w dół)
64 bajtów na rząd
100000 rzędów danych
----------------------- = 782 stron w bazie danych (zaokrąglone w górę)
128 rzędów na stronę
782 stron w bazie * 8192 bajtów na stronę = 6,406,144 bajtów (6.4 MB)
</PRE>
<P>Indeksy nie powodują dużego narzutu na zajmowane miejsce,
ale zawierają pewne dane,
więc w pewnych przypadkach moga być całkiem duże.</P>
<P> NULLe są przechowywane jako mapy bitowe, więc używają bardzo mało
miejsca.
</P>
<H4><A name="4.7">4.7</A>) Jak mogę sprawdzić jakie tabele, klucze,
bazy danych i użytkownicy są utworzeni?</H4>
<P><I>psql</I> ma całkiem dużą ilość poleceń z backslashem aby
wydobyć takie informacje. Wprowadź \? aby zobaczyć ich spis. Istnieją
także tablice systemowe rozpoczynające się od <i>pg_</i>, zawierające
interesujące Ciebie informacje. Wykonanie <i>psql -l</i> pokaże spis
wszystkich baz danych.</P>
<P>Obejrzyj także plik <I>pgsql/src/tutorial/syscat.source</I>.
Zawiera on wiele z zapytań typu <SMALL>SELECT</SMALL>, które są
potrzebne aby wydobyć informacje z tablic systemowych.</P>
<H4><A name="4.8">4.8</A>) Moje zapytania są wolne lub nie używają
kluczy. Dlaczego?</H4>
Indeksy nie są używane automatycznie przez kążde z zapytań. Ideksy są
używane jedynie gdy tabela jest odpowiedniego rozmiaru, większego niż
wymagany minimalny, a zapytanie wybiera jedynie mały procent
zawartości tabeli. Wynika to z tego, że losowy dostep do dysku
powodowany przez ideksowane poszukiwanie jest czasami wolniejsze niż
poszukiwanie sekwencyjne bez użycia kluczy.
<P>Żeby zdecydować czy indeks powinien byc używany, PostgreSQL musi
mieć statystyki dotyczące danej tabeli. Są one gromadzone przez
użycie polecenia <SMALL>VACUUM ANALYZE</SMALL>, lub poprostu
<SMALL>ANALYZE</SMALL>. używając statystyk, optymalizator wie ile
rzędów jest w tabeli i może lepiej określić czy indeksy powinny być
użyte. Statystyki mogą być także pomocne w określeniu najlepszej
kolejności wykonania złączenia (join) i jego sposobu. Gromadzenie
statystyk powinno się odbywać w określonych interwałach czasu
ponieważ dane w tabelach zmieniają się.</P>
<P>Indeksy nie są zazwyczaj używane przez <SMALL>ORDER BY</SMALL> lub
przy wykonywaniu złączeń (join). Sekwencyjne przeszukiwanie po którym
następuje sortowanie jest zazwyczaj szybsze nię wyszukiwanie za
pomocą indeksu na dużej tabeli.</P>
<P>Jakkolwiek <SMALL>LIMIT</SMALL> w połączeniu z <SMALL>ORDER BY</SMALL>
często będzie wykorzystywał indeksy ponieważ jedynie mała część z
tabeli jest zwracana. W rzeczywistości, chociaż MAX() i MIN() nie
używają indeksów, możliwe jest aby zwrócić te wartości używając
indeksów poprzez użycie ORDER BY i LIMIT.
</P>
<PRE>
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
</PRE>
<P>
Jeśli uważasz, że optimizer myli się wybierając sequential scan, użyj
SET enable_seqscan TO 'off' i uruchom testy aby sprawdzić czy wtym
wypadku zapytanie będzie szybciej wykonywane.</P>
<P>Kiedy używa się operatorów dopasujących takich jak
<SMALL>LIKE</SMALL> lub <I>~</I>, indeksy będą używane jedynie w
pewnych wypadkach:</P>
<UL>
<LI>Początek wyszukiwania jest oparty na początku łańcucha tekstu.
<UL>
<LI>wzorce <SMALL>LIKE</SMALL> nie mogą się zaczynać <I>%</I></LI>
<LI>dopasowania operatorem <I>~</I> (dopasowania regularne)
muszą się zaczynać znakiem specjalnym <I>^</I>.</LI>
</UL></LI>
<LI>Początek wyszukiwania nie może się zaczynać od klas znaków, np.
[a-e].</LI>
<LI>Case-insensitive searches such as ILIKE and ~* do not utilise
indexes. Instead, use functional indexes, which are described in
section 4.12.</LI>
<LI>Standardowe locale C musi być uzyte przy wykonywaniu initdb</LI>
</UL>
<H4><A name="4.9">4.9</A>) Jak mogę sprawdzić w jakis sposób "query
optimizer" wykonuje moje zapytanie?</H4>
<P>Zobacz manual dla polecenia <SMALL>EXPLAIN</SMALL>.</P>
<H4><A name="4.10">4.10</A>) Co to jest "R-tree index"?</H4>
<P>Indeks R-tree jest używany do indeksowania danych przestrzennych.
Indeks hasuujący nie nadaje się do wyszukiwania odległości.
Natomiast indeks typu B-tree może wyszukiwać odleglości jedynie w
jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
przestrzeniami wielo-wymiarowymi. Dla przykładu, jeśli zostanie
założony indeks typu R-tree na polu typu <I>point</I>, system może
bardziej wydajnie odpowiadać na zapytania typu
"select all points within a bounding rectangle."</P>
<P>Źródłowym dokumentem opisującym oryginalnie projektowanie R-tree
indeksów jest:</P>
<P>Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt
of Data, 45-57.</P>
<P>Ten dokument możesz znaleźć także w pracy Stonebraker'a "Readings in
Database Systems".</P>
<P>Wbudowane indeksy R-trees radzą sobie w wielobokami i boxes.
Teoretycznie, indeksy R-tree mogą być rozszerzone o możliwości
indeksowania w więcej wymiarowych przestrzeniach. W praktyce,
rozbudowa indeksów R-tree wymaga trochę pracy, a w tej chwili nie
dysponujemy jakąkolwiek dokumentacją jak to zrobić.</P>
<H4><A name="4.11">4.11</A>) Co to jest "Genetic Query
Optimizer"?</H4>
<P>Moduł <SMALL>GEQO</SMALL> ma za zadanie przyspieszenie
optymalizacji zapytań łącząc wiele tabel za pomocą algorytmów
genetycznych (Genetic Algorithm (GA)). Pozwala na używanie dużych
zapytań łączących tabele (join queries) bez wykorzystywania
zasobożernego wyszukiwania.</P>
<H4><A name="4.12">4.12</A>) Jak mogę używać wyrażeń regularnych w
zapytaniach i zapytań case-insensitive w wyrażeniach
regularnych?
Jak korzystać z indeksów dla zapytań case-insensitive?</H4>
<P>Operator <I>~</I> moze być wykorzystywany do wyszukiwania za
pomocą wyrażeń regularnych, a
<I>~*</I> do wyszukiwania case-insensitive z wyrażeniami
regularnymi.
Wariant case-insensitive dla <SMALL>LIKE</SMALL> został nazwany
<SMALL>ILIKE</SMALL>.</P>
<P>Porównania case-insensitive są zazwyczaj wykonywane w następujący
sposób:</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc'
</PRE>
W tym wypadku standardowe indeksy nie będą używane. Możesz utworzyć
indeks funkcyjny, poprzez:
<PRE>
CREATE INDEX tabindex on tab (lower(col));
</PRE>
<H4><A name="4.13">4.13</A>) Jak sprawdzić w zapytaniu czy pole ma
wartość <SMALL>NULL</SMALL>?</H4>
<P>Możesz to sprawdzić, testując wartość kolumny warunkiem
<SMALL>IS NULL</SMALL> albo <SMALL>IS NOT NULL</SMALL>.</P>
<H4><A name="4.14">4.14</A>) Jaka jest różnica pomiędzy różnymi
typami tekstowymi (character types)?</H4>
<PRE>
Type Nazwa wewnętrzna Uwagi
--------------------------------------------------
VARCHAR(n) varchar rozmiar określa maksymalną długość, nie ma tutaj wypełniania
CHAR(n) bpchar wypełniane pustymi znakami do podanej długości
TEXT text bez limitu na długość łańcucha
BYTEA bytea zmiennej długości tablica bajtów (null-byte safe)
"char" char 1 znak
</PRE>
<P>Jeśli będziesz przeglądać katalogi systemowe lub komunikaty o
błędach często spotkasz się z podanymi powyżej nazwami
wewnętrznymi.</P>
<P>Pierwsze cztery typy powyżej to tzw typy "varlena" (np. pierwsze
cztery bajty na dysku to długość, po których jest data). Dlatego
faktyczna długośc takiego łańcucha jest trochę większa niż
zadeklarowany rozmiar. Te typy także podlegają kompresji lub mogą być
przechowywane out-of-line jako <SMALL>TOAST</SMALL>, więc faktyczne
zużycie miejsca na dysku może być mniejsze niż oczekiwane.</P>
<P> <SMALL>VARCHAR(n)</SMALL> jest
najodpowiedniejszy do przechowywania łańcuchów o różnej długości
ale określa on maksymalną jego długość.
<SMALL>TEXT</SMALL> jest najlepszy dla łańcuchów o dowolnej długości,
nie przekraczającej 1GB.</P>
<P>
<SMALL>CHAR(n)</SMALL> jast najlepszym typem do przechowywania
łańcuchów o tej samej długości. CHAR(n) wypełnia dane do żadanej
długości, podczas gdy VARCHAR(n) przechowuje jedynie dane
dostarczone.
<SMALL>BYTEA</SMALL> służy do przechowywania danych binarnych,
w szczególności dla danych zawierających <SMALL>NULL</SMALL> bajty.
Wszystkie typy opisane tutaj maja podobne charakterystyki jeśli
chodzi o wydajność.</P>
<H4><A name="4.15.1">4.15.1</A>) Jak mogę utworzyć pole które samo
zwiększa swoją wartość?</H4>
<P>PostgreSQL ma zaimplementowany typ <SMALL>SERIAL</SMALL>.
Automatycznie tworzy sekwencję i indeks na tej kolumnie. Dla
przykladu:</P>
<PRE>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</PRE>
zostanie automatycznie prztłumaczone na:
<PRE>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
</PRE>
Więcej informacji o sekwencjach znajdziesz w manualu o
<I>create_sequence</I>. Możesz także użyć pola <I>OID</I> jako
unikalnej wartości dla każdego rzędu danych. Jeśli będziesz
potrzebował z backupować dane robiąc dump bazy i odtworzyć ją, musisz
użyc <I>pg_dump</I> z opcją <I>-o</I> lub polecenia <SMALL>COPY
WITH OIDS</SMALL> aby zachować <SMALL>OIDy</SMALL>.
<H4><A name="4.15.2">4.15.2</A>) Jak pobrać wartość pola typu
<SMALL>SERIAL</SMALL> po wykonaniu insert'u?</H4>
<P>Jednym z podejść jest pobranie kolejnej wartości typu
<SMALL>SERIAL</SMALL> z sekwencji za pomocą funkcji <I>nextval()</I>
<I>zanim</I> zostanie wstawiona, a później należy jej użyć. Używając
przykładu z tabeli z punktu <A href="#4.15.1">4.15.1</A>, może to
wyglądać w Perlu na przykład w ten sposób:</P>
<PRE>
new_id = output of "SELECT nextval('person_id_seq')"
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
</PRE>
Będziesz miał wtedy tą wartość przechowaną w zmiennej
<CODE>new_id</CODE> do użytku w innych zapytaniach (np. jako klucz
obcy do tabeli <CODE>person</CODE>). Warto zwrócić uwagę, że nazwa
automatycznie utworzonej sekwencji
<SMALL>SEQUENCE</SMALL> będzie następująca:
&lt;<I>tabela</I>&gt;_&lt;<I>kolumnatypuserial</I>&gt;_<I>seq</I>,
gdzie
<I>tabela</I> i <I>kolumnatypuserial</I> są nazwami Twojej tabeli i
Twojej kolumny typu <SMALL>SERIAL</SMALL>.
<P>Inne rozwiązanie to użycie funkcji <I>currval</I>() na pola typu
<SMALL>SERIAL</SMALL> po dodaniu nowej wartości do rzędu zawierającego
kolumnę typu <SMALL>SERIAL</SMALL> z wstawioną domyślnie wartością,
np.</P>
<PRE>
INSERT INTO person (name) VALUES ('Blaise Pascal');
new_id = output of "SELECT currval('person_id_seq')";
</PRE>
Ostatecznie możesz użyć <A href="#4.16"><SMALL>OID</SMALL></A>
zwracanej po wykonaniu <SMALL>INSERT</SMALL>, chociaż to jest najmniej
przenośne rozwiązanie.
W Perlu, wykorzystując bibliotekę DBI z modułem Edmunda Mergla
DBD::Pg, oid jest dostępny poprzez <I>$sth-&gt;{pg_oid_status}</I> po
wykonaniu <I>$sth-&gt;execute()</I>.
<H4><A name="4.15.3">4.15.3</A>) Czy użycie <I>currval()</I> i
<I>nextval()</I> nie doprowadzi do race condition z innymi
użytkownikami?</H4>
<P>Nie. currval() zwraca bieżącą wartość przypisaną przez Twój
backend, a nie przez wszystkich użytkowników.</P>
<H4><A name="4.15.4">4.15.4</A>) Dlaczego numery sekwencji nie są
ponownie używane przy przerwaniu transakcji?
Skąd się biorą luki w numerowaniu kolumny tabeli
sekwancjami/SERIALem?</H4>
<P>Aby poprawić zbieżność (concurrency), wartości sekwencji są
podawane działającym transakcjom kiedy tego potrzebują i nie są
blokowane dopóki transakcja się nie zakończy. To spowoduje przerwy w
numerowaniu z przerwanych transakcji.</P>
<H4><A name="4.16">4.16</A>) Co to jest <SMALL>OID</SMALL>? Co to
jest <SMALL>TID</SMALL>?</H4>
<P><SMALL>OID</SMALL> są PostgreSQL'owym rozwiązaniem problemu
unikalnych numerów rzędów. Każdy rząd tworzony przez PostgreSQL
otrzymuje unikalny <SMALL>OID</SMALL>. Wszystkie <SMALL>OID</SMALL>y
generowane podczas procesu uruchamianego przez skrypt
<I>initdb</I> mają mniejszą wartość niż 16384 (na podstawie pliku
<I>backend/access/transam.h</I>). Wszystkie
<SMALL>OID</SMALL>y tworzone przez użytkownika sa równe lub większe
podanej wcześniej wartości. Domyślnie
wszystkie <SMALL>OID</SMALL>y są unikalne nie tylko w pojedyńczej
tabeli czy bazie danych ale w całej instalacji PostgreSQL.</P>
<P>PostgreSQL używa <SMALL>OIDów</SMALL> w swoim wewnętrznym systemie
tabel, aby można było je łączyć.
Te <SMALL>OIDy</SMALL> mogą byc używane aby identyfikowac rzędy w
tabelach i wykorzystywać je w złączeniach tych tabel. Zaleca się abyś
używał typu <SMALL>OID</SMALL> aby przechowywać wartości
<SMALL>OID</SMALL>. Możesz utworzyć indeks na polu
<SMALL>OID</SMALL> aby dostęp do niego był szybszy.</P>
<P><SMALL>OID</SMALL> są przypisane do wszystkich rzędów z jednego
głównego miejsca i używane sa przez wszystkie bazy danych. Jeśli
chciałbyś zmienić <SMALL>OID</SMALL> na coś innego, lub jeśli
chciałbyś zrobić kopię tabeli, z orginalnymi <SMALL>OIDami</SMALL>
nie ma żadnego przeciwwskazania abyś to zrobił:</P>
<PRE>
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
<!--
CREATE TABLE new_table (mycol int);
INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table;
-->
</PRE>
<P><SMALL>OIDy</SMALL> są przechowywane jako cztero-bajtowe liczby
całkowite i skończą się po osiągnięciu czterech miliardów. Nikt jak
dotąd nie zgłosił aby coś takiego się stalo, ale mamy zamiar pozbyć
się tego ograniczenia zanim ktoś to zgłosi.</P>
<P><SMALL>TID</SMALL> są używane aby zidentyfikować konkretne rzędy z
blokami i wartością ofsetów. <SMALL>TIDy</SMALL> zmieniają się wraz
ze zmianami rzędów. Sa używane przez indeksy, aby wskazywać do
fizycznych rzędów.</P>
<H4><A name="4.17">4.17</A>) Jakie jest znaczenie niektórych terminów
w PostgreSQL?</H4>
<P>W części kodu źródłowego i starszej dokumentacji używamy terminów,
które mają bardziej ogólne znaczenie. Oto niektóre z nich:</P>
<UL>
<LI>table, relation, class</LI>
<LI>row, record, tuple</LI>
<LI>column, field, attribute</LI>
<LI>retrieve, select</LI>
<LI>replace, update</LI>
<LI>append, insert</LI>
<LI><SMALL>OID</SMALL>, serial value</LI>
<LI>portal, cursor</LI>
<LI>range variable, table name, table alias</LI>
</UL>
<P>Listę terminów związanych z bazami danych możesz znaleźć pod tym
adresem:<A
href="http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</A>.</P>
<H4><A name="4.18">4.18</A>) Skąd bierze się ten błąd <I>"ERROR:
Memory exhausted in AllocSetAlloc()"</I>?</H4>
<P>
Prawdopodobnie wyczerpała Ci się pamięć wirtualna (virtual memory)
w systemie lub Twój kernel ma zbyt nisko
ustawione limity dla pewnych zasobów. Spróbuj wykonać następujące
polecenia zanim uruchomisz <I>postmaster'a</I>:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
W zależności od shell'a jakiego używasz jedno z tych poleceń może nie
zadziałać, ale to ustawienie pozwoli ustawić segment danych dla
procesu znacznie większy i być może pozwoli wykonać zapytanie.
To polecenie zadziała dla bieżącego procesu oraz wszytkich podprocesów
utworzonych po wykonaniu polecenia. Jeśli ten problem występuje z
klientem <SMALL>SQL</SMALL>, ponieważ backend zwraca zbyt dużo danych,
spróbuj wykonać to polecenie przed uruchomieniem klienta.
<H4><A name="4.19">4.19</A>) Jak sprawdzić jakiej wersji PostgreSQL
używam?</H4>
<P>W <I>psql</I>, wpisz <CODE>select version();</CODE></P>
<H4><A name="4.20">4.20</A>) Dlaczego operacje, które wykonuję na
dużych obiektach "large-object" zwracają komunikat:
<I>"invalid large obj descriptor"</I>?</H4>
<P>Musisz użyć <CODE>BEGIN WORK</CODE> i <CODE>COMMIT</CODE>
przed i po użyciu uchwytu do dużego obiektu, tzn. musisz nimi otoczyć
funkcje <CODE>lo_open</CODE> ... <CODE>lo_close.</CODE></P>
<P>Obecnie PostgreSQL używjąc "rule" zamyka uchwyt do dużego obiektu
przy każdym wywołaniu "commit". Więc pierwsze próba zrobienia
czegokolwiek z uchwytem spowoduje wypisanie: <I>invalid large obj
descriptor</I>. Kod, który do tej pory działał (przynajmniej
większość razy) będzie teraz generował informację o błędzie jeśli nie
będziesz korzystał z transakcji.</P>
<P>Jeśli używasz interfejsu klienta jak <SMALL>ODBC</SMALL> być może
będziesz musiał ustawić <CODE>auto-commit off.</CODE></P>
<H4><A name="4.21">4.21</A>) Jak stworzyć kolumnę której domyślną
wartością będzie bieżący czas?</H4>
<P>Użyj <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
<CODE>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</CODE>
</PRE>
<H4><A name="4.22">4.22</A>) Dlaczego zapytania używające
<CODE><SMALL>IN</SMALL></CODE> sa takie wolne?</H4>
<P>W wersjach wcześniejszych niż 7.4 łączymy podzapytania w outer queries
poprzez sekwencyjne przeszukiwanie wyników podzapytania dla każdego rzędu
z outer query. Jeśli podzapytanie zwraca jedynie kilka rzędów a
zewnętrzne zapytanie zwraca ich wiele, IN jest najszybsze.
Aby przyspieszyć inne zapytania można zastąpić <CODE>IN</CODE> przez
<CODE>EXISTS</CODE>:</P>
<PRE>
<CODE>SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab)
</CODE>
</PRE>
na:
<PRE>
<CODE>SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col)
</CODE>
</PRE>
<P>
Aby to rozwiązanie było szybkie, subcol powinna być kolumną
indeksowaną.
</P>
<P>
W wersji 7.4 i późniejszych, IN w rzeczywistości używa tej samej
wyrafinowanej techniki łączenia jak normalne zapytania i jest
preferowane nad używaniem EXISTS.
</P>
<H4><A name="4.23">4.23</A>) Jak wykonać "outer join"?</H4>
<P>PostgreSQL ma zaimplementowane outer join
wykorzystując standardową składnię SQL. Poniżej dwa przykłady:</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>Te dwa identyczne zapytania łączą kolumnę t1.col z kolumną t2.col,
ale także zwrócą niepołączone rzędy w t1 (te, które nie pasują w t2).
<SMALL>RIGHT</SMALL> join dodałby niepołączone rzędy z tabeli t2.
<SMALL>FULL</SMALL> join zwróciłby rzędy plus dodatkowo wszystkie
rzędy z tabel t1 i t2. Słowo <SMALL>OUTER</SMALL> jest opcjonalne i
jest dodawane domyślnie przy
<SMALL>LEFT</SMALL>, <SMALL>RIGHT</SMALL>, i <SMALL>FULL</SMALL>
join'ach. Zwykłe join'y są nazywane <SMALL>INNER</SMALL> joins.</P>
<P>W poprzednich wersjach "outer joins" mogą być zasymulowane poprzez
użycie slowa kluczowego
<SMALL>UNION</SMALL> i <SMALL>NOT IN</SMALL>. Dla przykładu, łącząc
tabele <I>tab1</I> i <I>tab2</I>, następujące zapytanie wykonuje
<I>outer</I> join:<BR>
<BR>
</P>
<PRE>
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
</PRE>
<H4><A name="4.24">4.24</A>) Jak wykonywać zapytanie używające kilku
baz danych jednocześnie?</H4>
<P>Nie ma takiej możliwości aby w zapytaniu odpytawać inną baze danych
poza bieżącą. Ponieważ PostgreSQL ładuje specyficzne dla bazy danych
katalogi systemowe, nie jest do końca jasne jak zapytanie pomiędzy
różnymi bazami danych powinno się zachowywać.</P>
<P><I>contrib/dblink</I> pozwala na wykonywanie zapytań poprzez różne
bazy danych wywołując odpowiednie funkcje. Oczywiście klient może łączyć
się z różnymi bazami danych i łączyć informację w ten sposób uzyskaną
po stronie klienta.</P>
<H4><A name="4.25">4.25</A>) Jak zwrócić w funkcji wiele rzędów lub
kolumn?</H4>
<P>Możesz w łatwy sposób zwracać wiele rzędów lub kolumn używając
funkcji z: <A href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</A>.</P>
<H4><A name="4.26">4.26</A>) Dlaczego nie mogę w sposób pewny
tworzyć/usuwać tabel tymczasowych w funkcjach PL/PgSQL?</H4>
<P>
PL/PgSQL przechowuje w cache zawartość funkcji, niepożądanym efektem tego
jest to, że gdy taka funkcja korzysta z tabel tymczasowych, które są
później kasowane i odtwarzane, a funkcja wywoływana jest ponownie,jej
wywołanie nie powiedzie się ponieważ cachowana funkcja wciąż będzie
wskazywać na stara tablicę tymczasową. Rozwiązaniem tego problemu jest
używanie EXECUTE aby korzystać z tabel tymczasowych w PL/PgSQL. To
spowoduje, że zapytanie będzie parsowane przy każdym wywołaniu
funkcji.
</P>
<H4><A name="4.27">4.27</A>) Jakie są możliwości replikacji w PostgreSQL?</H4>
<P>
Jest kilka opcji aby stosować replikację typu master/slave. Ten typ
pozwala jedynie masterowi na dokonywanie zmian w bazie danych, a
slave może jedynie te zmiany odczytywać. Na stronie
<A
href="http://gborg.PostgreSQL.org/genpage?replication_research">http://gborg.PostgreSQL.org/genpage?replication_research</A>
znajduje się ich lista. Replikacja typu multi-master jest w trakcie
prac, opis projektu znajduje się pod adresem: <A
href="http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php</A>.
</P>
<H4><A name="4.28">4.28</A>) Jakie możliwości szyfrowania oferuje
PostgreSQL?</H4>
<UL>
<LI>contrib/pgcrypto zawiera wiele funkcji za pomocą, których możemy używać
kryptografii w zapytaniach SQL.</LI>
<LI>Aby szyfrować transmisję od klienta do serwera, ten musi mieć
ustawioną opcję ssl na true w pliku postgresql.conf, odpowiedni
wpis host lub hostssl musi występować w pliku pg_hba.conf, oraz
sslmode nie może być wyłączone w kliencie. (Warto zwrócić uwagę, że
możliwe jest także używanie transportów szyfrująców przez strony
trzecie, takie jak stunnel lub ssh, poza natywnym wsparciem dla SSL
przez PostgreSQL).</LI>
<LI>Hasła użytkowników bazy danych są automatycznie szyfrowane od
wersji 7.3. W poprzednich wersjach, należy tą funkcjonalność poprzez
włączenie opcji PASSWORD_ENCRYPTION w postgresql.conf. </LI>
<LI>Serwer może działać używając szyfrowanego systemu plików.</LI>
</UL>
<H2 align="center">Rozwijanie PostgreSQL</H2>
<H4><A name="5.1">5.1</A>) Napisałem własną funkcję. Kiedy użyję jej
w <I>psql</I>, program zrzuca pamięć (dump core)?</H4>
<P>Problem może być spowodowany przez bardzo wiele rzeczy. Spróbuj
najpierw przetestować Twoją funkcję w samodzielnie działającym programie.
</P>
<H4><A name="5.2">5.2</A>) Jak mogę dodać/zgłosić nowe typy czy
funkcje do PostgreSQL?</H4>
<P>Wyślij Twoje propozycje na listę mailową <I>pgsql-hackers</I>,
wtedy prawdopodobnie Twój kod znajdzie się w katalogu <I>contrib/</I>.</P>
<H4><A name="5.3">5.3</A>) Jak napisać funkcję C zwracającą krotkę
(tuple)?</H4>
<P>
W wersjach PostgreSQL od numeru 7.3, funckje zwracające tabele są w
pęlni wspierane w C, PL/PgSQL i SQL. Sprawdź w Programmer's Guide aby
uzyskać więcej informacji. Przykład funkcji napisanej w C zwracającej
tabelę został umieszczony w <I>contrib/tablefunc</I>.
</P>
<H4><A name="5.4">5.4</A>) Zmieniłem plik źródłowy. Dlaczego po
rekompilacji nie widać zmiany?</H4>
<P>Pliki <I>Makefiles</I> nie mają dorzuconych odpowiednich
zależności dla plików nagłówkowych (include files). Wykonaj najpierw
<I>make clean</I>, a następnie ponownie <I>make</I>.
Jeśli używasz <SMALL>GCC</SMALL> możesz użyć opcji
<I>--enable-depend</I> przy wykonywaniu <I>configure</I> aby
kompilator mógł określić zależności samodzielnie.
</P>
</BODY>
</HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
<HTML>
<!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
<HEAD>
<META name="generator" content="HTML Tidy, see www.w3.org">
<META http-equiv="Content-Type" content="text/html; charset=utf8">
<TITLE>PostgreSQL FAQ</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000" alink="#0000ff">
<H1>Ответы на часто задаваемые вопросы по PostgreSQL</H1>
<P>Дата последнего обновления: Среда 25 июня 23:54:14 EDT 2008</P>
<P>Английский вариант сопровождает: Брюс Момьян (Bruce Momjian) (<A href=
"mailto:bruce@momjian.us">bruce@monjian.us</A>)
</P>
<P>Перевёл на русский: Виктор Вислобоков (<A href=
"mailto:admin@postgresql.ru.net">admin@postgresql.ru.net</A>)<BR>
</P>
<P>Самую свежую английскую версию документа можно найти на
<A href="http://www.postgresql.org/files/documentation/faqs/FAQ.html">http://www.postgresql.org/files/documentation/faqs/FAQ.html</A>.</P>
<P>Самую свежую русскую версию документа можно найти на
<A href="http://postgresql.ru.net/docs/FAQ_russian.html">http://postgresql.ru.net/docs/FAQ_russian.html</A>.</P>
<P>Ответы на вопросы специфичные для конкретных платформ можно найти на
<A href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</A>.</P>
<HR>
<H2 align="center">Общие вопросы</H2>
<A href="#item1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название? Что такое Postgres?<BR>
<A href="#item1.2">1.2</A>) Кто управляет PostgreSQL?<BR>
<A href="#item1.3">1.3</A>) Каковы авторские права на PostgreSQL?<BR>
<A href="#item1.4">1.4</A>) На каких платформах работает PostgreSQL?<BR>
<A href="#item1.5">1.5</A>) Где можно взять PostgreSQL?<BR>
<A href="#item1.6">1.6</A>) Какая версия наиболее свежая?<BR>
<A href="#item1.7">1.7</A>) Где получить поддержку?<BR>
<A href="#item1.8">1.8</A>) Как мне сообщить об ошибке?<BR>
<A href="#item1.9">1.9</A>) Как найти информацию об известных ошибках или отсутствующих
возможностях?<BR>
<A href="#item1.10">1.10</A>) Какая документация имеется в наличии?<BR>
<A href="#item1.11">1.11</A>) Как научиться <SMALL>SQL</SMALL>?<BR>
<A href="#item1.12">1.12</A>) Как мне отправить исправление или присоединится к команде разработчиков?<BR>
<A href="#item1.13">1.13</A>) Как сравнить PostgreSQL с другими
<SMALL>СУБД</SMALL>? Может ли PostgreSQL быть встроенной?<BR>
<A href="#item1.14">1.14</A>) Будет ли PostgreSQL работать с последними изменениями, в разных страных,
касающимися дневного времени?<BR>
<A href="#item1.15">1.15</A>) Как мне отписаться от списков рассылки PostgreSQL?
Как избежать получения дублирующихся сообщений?<BR>
<H2 align="center">Вопросы пользователей по клиентской части</H2>
<A href="#item2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?<BR>
<A href="#item2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?<BR>
<A href="#item2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
пользователя?<BR>
<H2 align="center">Вопросы администрирования</H2>
<A href="#item3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
от <I>/usr/local/pgsql</I>?<BR>
<A href="#item3.2">3.2</A>) Как мне управлять соединениями от других
компьютеров?<BR>
<A href="#item3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
производительности?<BR>
<A href="#item3.4">3.4</A>) Какие возможности для отладки есть в наличии?<BR>
<A href="#item3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too many
clients"</I> когда пытаюсь подключиться к базе?<BR>
<A href="#item3.6">3.6</A>) Как выполнить обновление PostgreSQL?<BR>
<A href="#item3.7">3.7</A>) Какое компьютерное "железо" я должен
использовать?<BR>
<H2 align="center">Вопросы эксплуатации</H2>
<A href="#item4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Для произвольной строки?<BR>
<A href="#item4.2">4.2</A>) Как мне найти какие таблицы, индексы,
базы данных и пользователи существуют? Как мне увидеть запросы,
которые использует <I>psql</I> для получения этой информации?<BR>
<A href="#item4.3">4.3</A>) Как изменить тип данных колонки?<BR>
<A href="#item4.4">4.4</A>) Каковы максимальные размеры для строк в таблице,
таблиц и базы данных?<BR>
<A href="#item4.5">4.5</A>) Как много дискового пространства в базе данных
нужно для сохранения данных из обычного текстового файла?<BR>
<A href="#item4.6">4.6</A>) Почему мои запросы работают медлено? Почему
они не используют мои индексы?<BR>
<A href="#item4.7">4.7</A>) Как посмотреть на то, как оптимизатор выполняет
мой запрос?<BR>
<A href="#item4.8">4.8</A>) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?<BR>
<A href="#item4.9">4.9</A>) Как мне определить, что значение поля в каком-либо
запросе равно <SMALL>NULL</SMALL>? Как мне соединить возможные
<SMALL>NULL</SMALL>? Могу я сортировать поля <SMALL>NULL</SMALL> или нет?<BR>
<A href="#item4.10">4.10</A>) Каковы отличия между разными символьными
типами?<BR>
<A href="#item4.11.1">4.11.1</A>) Как мне создать поле serial/с-авто-увеличением?<BR>
<A href="#item4.11.2">4.11.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?<BR>
<A href="#item4.11.3">4.11.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?<BR>
<A href="#item4.11.4">4.11.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?<BR>
<A href="#item4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>CTID</SMALL>?<BR>
<A href="#item4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?<BR>
<A href="#item4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
запущена?<BR>
<A href="#item4.15">4.15</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?<BR>
<A href="#item4.16">4.16</A>) Как выполнить внешнее связывание?<BR>
<A href="#item4.17">4.17</A>) Как выполнять запросы, использующие несколько
баз данных?<BR>
<A href="#item4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?<BR>
<A href="#item4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?<BR>
<A href="#item4.20">4.20</A>) Какие есть решения для репликации?<BR>
<A href="#item4.21">4.21</A>) Почему имена таблицы и колонок не
распознаются в в моём запросе? Почему не сохраняются заглавные буквы?<BR>
<HR>
<H2 align="center">Общие вопросы</H2>
<H3><A name="item1.1">1.1</A>) Что такое PostgreSQL? Как произносится это название? Что такое Postgres?</H3>
<P>PostgreSQL произносится <I>Post-Gres-Q-L (Пост-Грес-Кью-Эл)</I>.
(Для особо любопытствующих как произносить "PostgreSQL", существует
<A href="http://www.postgresql.org/files/postgresql.mp3">аудио-файл</A>).
</P>
<P>PostgreSQL - это объектно-реляционная система управления базами
данных (СУБД), которая имеет традиционные возможности коммерческих
<small>СУБД</small> с расширениями, которые есть в <small>СУБД</small>
нового поколения. PostgreSQL - это свободное и полностью открытое
программное обеспечение.</P>
<P>Разработку PostgreSQL выполняет команда разработчиков, разбросанная
по всему миру и связанная через Интернет. Разработка является
общественным проектом и не управляется какой-либо компанией.
Подробности смотрите в FAQ для разработчиков,
<A href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
http://www.postgresql.org/docs/faqs.FAQ_DEV.html</A>
</P>
<P>Postgres &mdash; это широко используемое сокращение для PostgreSQL.
Первоначальным именем проекта в Беркли было Postgres и этот ник теперь
наиболее популярен в разговорах о PostgreSQL по сравнению с другими.
Если вам трудно полностью проговаривать 'PostgreSQL', можно просто
говорить 'Postgres'.</P>
<H3><A name="item1.2">1.2</A>) Кто управляет PostgreSQL?</H3>
<P>Если вы ищите какого-то особенного человека, центральный
комитет или управляющую компанию, то напрасно --- их нет.
У нас есть ядро комитета и разработчиков, работающих с CVS,
но эти группы служат больше для административных целей, чем
для управления. Проект напрямую функционирует с помощью
сообщества разработчиков и пользователей, к которому может
присоединится каждый. Всё что нужно -- это подписаться на
списки рассылки и участвовать в дискуссиях. (Подробности о
том как включиться в разработку PostgreSQL смотрите в
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ для разработчиков</A>.)</P>
<H3><A name="item1.3">1.3</A>) Каковы авторские права на PostgreSQL?</H3>
<P>PostgreSQL распространяется по классической лицензии BSD. Эта
лицензия не содержит ограничений на то, как будет использоваться
исходный код. Нам нравится эта лицензия и у нас нет намерений её
менять. Вот эта лицензия BSD, которую мы используем:</P>
<P>Система Управления Базами Данных PostgreSQL</P>
<P>Portions copyright (c) 1996-2008, PostgreSQL Global Development
Group Portions Copyright (c) 1994-1996 Regents of the University of
California</P>
<P>Предоставляются права на использование, копирование, изменение
и распространение данного программного обеспечения и его документации
для любых целей, бесплатно и без подписания какого-либо соглашения,
при условии что для каждой копии будут предоставлены данное выше
замечание об авторских правах, текущий параграф и два следующих
параграфа.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ
ЗА ЛЮБЫЕ ПОВРЕЖДЕНИЯ, ВКЛЮЧАЯ ПОТЕРЮ ДОХОДА, НАНЕСЕННЫЕ ПРЯМЫМ
ИЛИ НЕПРЯМЫМ, СПЕЦИАЛЬНЫМ ИЛИ СЛУЧАЙНЫМ ИСПОЛЬЗОВАНИЕМ ДАННОГО
ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ
КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ БЫЛ ИЗВЕЩЕН О ВОЗМОЖНОСТИ ТАКИХ
ПОВРЕЖДЕНИЙ.</P>
<P>КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ СПЕЦИАЛЬНО ОТКАЗЫВАЗЫВАЕТСЯ ПРЕДОСТАВЛЯТЬ
ЛЮБЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ТОЛЬКО ЭТИМИ ГАРАНТИЯМИ:
НЕЯВНЫЕ ГАРАНТИИ ПРИГОДНОСТИ ТОВАРА ИЛИ ПРИГОДНОСТИ ДЛЯ ОТДЕЛЬНОЙ ЦЕЛИ.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ ПРИЦИПА
"КАК ЕСТЬ" И КАЛИФОРНИЙСКИЙ УНИВЕРСИТЕТ НЕ ОБЯЗАН ПРЕДОСТАВЛЯТЬ
СОПРОВОЖДЕНИЕ, ПОДДЕРЖКУ, ОБНОВЛЕНИЯ, РАСШИРЕНИЯ ИЛИ ИЗМЕНЕНИЯ.</P>
<H3><A name="item1.4">1.4</A>) На каких платформах работает PostgreSQL?</H3>
<P>Обычно, PostgreSQL может работать на любой современной платформе
совместимой с Unix. В инструкции по установке, вы найдете список
тех платформ, на которых были проведены тестовые запуски PostgreSQL
к моменту выхода данной версии.</P>
<P>PostgreSQL также работает на операционных системах Microsoft
Windows, основанных на NT, таких как Win2000 SP4, WinXP и Win2003.
Пакет инсталлятора доступен по адресу
<A href="http://www.postgresql.org/download/windows">
http://www.postgresql.org/download/windows</A>. Версии Windows,
основанные на MS-DOS (Win95, Win98, WinMe) могут запускать
PostgreSQL с помощью Cygwin.</P>
<P>Также существует версия спортированная под Novell Netware 6 на
<A href="http://developer.novell.com/wiki/index.php/Postgresql">http://developer.novell.com/wiki/index.php/Postgresql</A>,
и версия для OS/2 (eComStation) на
<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><A name="item1.5">1.5</A>) Где можно взять PostgreSQL?</H3>
<P>Через браузер, используя <a href="http://www.postgresql.org/ftp/">
http://www.postgresql.org/ftp/</a> и через ftp, используя
<A href="ftp://ftp.PostgreSQL.org/pub/">ftp://ftp.postgresql.org/pub/</A>.</P>
<H3><A name="item1.6">1.6</A>) Какая версия наиболее свежая?</H3>
<P>Последний выпуск PostgreSQL - это версия 8.3.3</P>
<P>Мы планируем выпускать новые старшие версии каждый год,
а младшие версии каждые несколько месяцев.</P>
<H3><A name="item1.7">1.7</A>) Где получить поддержку?</H3>
<P>Сообщество PostgreSQL предоставляет помощь множеству пользователей
через E-mail. Основной web-сайт для подписки на списки рассылки по
E-mail это: <A href="http://www.postgresql.org/community/lists/">
http://www.postgresql.org/community/lists/</A>. Хорошим местом для
того, чтобы начать задавать вопросы являются списки <i>general</i>
(общие вопросы) или <i>bugs</i> (ошибки).</P>
<P>Главным IRC каналом является <I>#postgreql</I>,
расположенный на сервере Freenode (<I>irc.freenode.net</I>). Чтобы
подключиться, вы можете использовать в Unix вызов программы
<code>irc -c '#postgresql' "$USER" irc.freenode.net</code> или
любой другой IRC клиент. На этом же сервере существуют каналы на
испанском (<I>#postgresql-es</I>), французском (<I>#postgresqlfr</I>)
и бразильском (<I>#postgresql-br</I>) языках. Также существует канал
по PostgreSQL на сервере EFNet.</P>
<P>Список коммерческой поддержки компаний доступен на
<A href="http://www.postgresql.org/support/professional_support">
http://www.postgresql.org/support/professional_support</A>.</P>
<H3><A name="item1.8">1.8</A>) Как мне сообщить об ошибке?</H3>
<P>Посетите страничку со специальной формой отчёта об ошибке в
PostgreSQL по адресу:
<A HREF="http://www.postgresql.org/support/submitbug">
http://www.postgresql.org/support/submitbug</A>.
Также проверьте наличие более свежей версии PostgreSQL на нашем
FTP сайте <A href="ftp://ftp.postgresql.org/pub/">
ftp://ftp.postgresql.org/pub/</A>.</P>
<P>На ошибки, уведомление о которых были сделаны через специальную
форму или отправленные в какой-либо список рассылки PostgreSQL,
обычно генерируется один из следующих ответов:</P>
<UL>
<LI>Это не ошибка и почему</LI>
<LI>Это известная ошибка и она уже есть в списке
<A HREF="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
<LI>Данная ошибка была исправлена в текущем выпуске</LI>
<LI>Данная ошибка была исправлена, но исправление пока не попало в
официальный выпуск</LI>
<LI>Запрашивается более детальная информация:
<UL>
<LI>Операционная система</LI>
<LI>Версия PostgreSQL</LI>
<LI>Тест, воспроизводящий ошибку</LI>
<LI>Отладочная информация</LI>
<LI>Вывод backtrace отладчика</LI>
</UL>
</LI>
<LI>Это новая ошибка. Может произойти следующее:
<UL>
<LI>Будет создано исправление, которое будет включено в следующий
выпуск</LI>
<LI>Ошибка не может быть исправлена немедленно и будет добавлена в список
<A HREF="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
</UL>
</LI>
</UL>
<H3><A name="1.9">1.9</A>) Как найти информацию об известных ошибках
или отсутствующих возможностях?</H3>
<P>PostgreSQL поддерживает расширенный подкласс <SMALL>SQL:2003</SMALL>.
Смотрите наш список <A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
на предмет известных ошибок, отсутствующих возможностей и будущих
планов.</P>
<P>На запрос какой-либо возможности обычно приходят следующие ответы:</P>
<UL>
<LI>Данная возможность уже есть в списке
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A></LI>
<LI>Данная возможность нежелательна потому что:
<UL>
<LI>Она дублирует существующую функциональность, которая следует
стандарту SQL</LI>
<LI>Данная возможность сильно усложнила бы код, но дала бы маленькую
выгоду</LI>
<LI>Данная возможность небезопасна или ненадёжна</LI>
</UL>
</LI>
<LI>Данная новая возможность добавлена в список
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
</LI>
</UL>
<P>PostgreSQL не использует какую-либо систему отслеживания ошибок,
потому что мы обнаружили, что использование прямого обращения по
электронной почте и обновляемого списка
<A href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>
является более эффективным. На практике, ошибки в программном
обеспечении сохраняются очень недолго, а ошибки, которые важны
большому количеству пользователей исправляются моментально. Есть
только одно место, где можно найти все изменения, улучшения и
исправления, сделанные в выпуске PostgreSQL - это журналы сообщений
системы контроля версий
<A HREF="http://www.postgresql.org/developer/sourcecode/">CVS</A>.
Даже замечания к выпускам не содержат все изменения, сделанные
в программном обеспечении.</P>
<H3><A name="item1.10">1.10</A>) Какая документация имеется в наличии?</H3>
<P>PostgreSQL содержит много документации, включая большое руководство,
страницы электронного руководства man и некоторые маленькие тестовые
примеры. Смотрите в каталог <I>/doc</I>. Вы также можете просматривать
документацию в Интернет по адресу <A href="http://www.postgresql.org/docs">
http://www.postgresql.org/docs</A>.</P>
<P>Существует две книги по PostgreSQL доступные по адресам <A href=
"http://www.PostgreSQL.org/docs/books/awbook.html">http://www.PostgreSQL.org/docs/books/awbook.html</A>
и <a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a>.
Есть несколько книг по PostgreSQL, которые можно купить.
Одну из наиболее популярных написал Корри Дуглас (Korry Douglas).
Список обзоров по этим книгам доступен по адресу
<a href="http://www.postgresql.org/docs/books/">http://www.postgresql.org/docs/books/</a>.
Кроме того, по адресу <a href="http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation">http://wiki.postgresql.org/wiki/Community_Generated_Articles%2C_Guides%2C_and_Documentation</a>
вы можете найти коллекцию технических статей, посвещенных PostgreSQL.</P>
<P>Клиент командной строки <I>psql</I> имеет несколько команд \d для
отображения информации по типам, операторам, функциям, агрегатам и т.д. -
используйте \? для получения списка доступных команд.</P>
<P>Наш сайт содержит еще больше информации.</P>
<H3><A name="item1.11">1.11</A>) Как мне научиться <SMALL>SQL</SMALL>?</H3>
<P>Во-первых, возьмите одну из книг по PostgreSQL, о которых говорилось
выше. Многим из наших пользователей также нравится книга
<I>The Practical SQL Handbook</I>,
Bowman, Judith S., et al., Addison-Wesley. Другим нравится <I>The
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
<P>Существует также множество прекрасных учебников доступных в 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.w3school.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>
</P>
<H3><A name="item1.12">1.12</A>) Как мне прислать исправление или присоединится к команде разработчиков?</H3>
<P>Смотрите <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">
FAQ для разработчиков</A>.</P>
<H3><A name="item1.13">1.13</A>) Как сравнить PostgreSQL с другими
<SMALL>СУБД</SMALL>? Может ли PostgreSQL быть встроенным?</H3>
<P>
Существует несколько методов сравнения программного обеспечения:
возможности, производительность, надежность, поддержка и цена.</P>
<DL>
<DT><B>Возможности</B></DT>
<DD>PostgreSQL имеет большинство возможностей представленных
в больших коммерческих <SMALL>СУБД</SMALL>, такие как: транзакции,
подзапросы, триггеры, представления, ссылочной
целостности вторичного ключа и разные блокировки. У нас есть некоторые возможности,
которых нет у них: типы, определяемые пользователем, механизм
наследования, правила и конкуретное многоверсионное управление
для работы с содержимым блокировок.<BR>
<BR>
</DD>
<DT><B>Производительность</B></DT>
<DD>Производительность PostgreSQL сходна с другими коммерческими
СУБД и с СУБД с открытым исходным кодом. В каких-то вещах мы быстрее,
в каких-то медленнее. Наша производительности обычно +/-10% по
сравнению с другими СУБД.
<BR>
</DD>
<DT><B>Надежность</B></DT>
<DD>Мы понимали, что наша <SMALL>СУБД</SMALL> должна быть надежной
или она ничего не будет стоить. Мы стараемся выпускать хорошо проверенный,
стабильный код, который содержит минимум ошибок. Каждый выпуск
проходит стадию бета-тестирования по крайней мере в течении одного
месяца и наша история выпусков показывает что мы можем предоставлять
стабильные, монолитные выпуски, которые готовы к продуктивному
использованию. Мы верим, что мы производим проверку не хуже,
чем у других СУБД.<BR>
<BR>
</DD>
<DT><B>Поддержка</B></DT>
<DD>Наш список рассылки предоставляет возможможность общения с
большой группой разработчиков и пользователей, которые могут помочь решить
любые возникшие проблемы. В то же время, мы не гарантируем какие-либо
исправления, но и разработчики коммерческих <SMALL>СУБД</SMALL> не всегда
делают исправления. Прямой доступ к разработчикам, сообществу
пользователей, руководствам и исходным текстам часто делают поддержку
PostgreSQL превосходящей другие <SMALL>СУБД</SMALL>. Существует
коммерческая поддержка по результам возникших инцидентов, которая
доступна для тех кому она нужна. (Смотрите <A href="#item1.7">Секцию 1.7</A>.)<BR>
<BR>
</DD>
<DT><B>Цена</B></DT>
<DD>Наш продукт бесплатен как для коммерческого так, и не для
коммерческого использования. Вы можете добавлять свой код в наш
продукт без ограничений, за исключением тех, что описываются в
нашей лицензии стиля BSD, которая приведена выше.<BR>
<BR>
</DD>
</DL>
<P>PostgreSQL разрабатывается по архитектуре клиент/сервер, которая
требует отдельных процессов для каждого клиента и сервера, а также
несколько вспомогательных процессов. Многие встраиваемые архитектуры
могут соответствовать таким требованиям. Однако, если ваша встраиваемая
архитектура требует сервер баз данных для запуска внутри прикладного
процесса, вы не можете использовать Postgres и вам лучше бы выбрать
для базы данных какое-либо другое облегченное решение.</P>
<H3><A name="item1.14">1.14</A>) Будет ли PostgreSQL работать с
последними изменениями, в разных страных, касающимися дневного времени?</H3>
<P>Изменения в сохранении дневного времени в США включены в PostgreSQL версии
8.0.[4+] и во все следующие выпуски, например в 8.1. Изменения по Канаде
и Западной Австралии включены в 8.0.[10+], 8.1.[6+] и все следующие
выпуски. Выпуски PostgreSQL до 8.0 используют информацию о сохранении
дневного времени из базы данных временных зон в операционной системе.</p>
<HR>
<H3 id="item1.15">1.15) Как мне отписаться от списков рассылки PostgreSQL?
Как избежать получения дублирующих сообщений?</H3>
<P>Страница <a
href="http://mail.postgresql.org/mj/mj_wwwusr/domain=postgresql.org?user=&amp;passw=&amp;func=login">Majordomo</a>
на сайте PostgreSQL позволяет подписаться или отписаться от любого из списков
рассылки PostgreSQL. (Вам может понадобится ваш пароль для Majordomo, который
отправляется на ваш E-mail, чтобы войти в управление вашими подписками.)</P>
<P>Все списки рассылки PostgreSQL настариваются так, чтобы групповой ответ уходил
на адрес списка <I>и</I> на адрес автора сообщения. Так сделано, чтобы пользователи
получали ответы на E-mail как можно быстрее. Если вы не хотите получать дублирующие
E-mail сообщения из списка, в случаях когда вы уже получили эти сообщения напрямую,
установите флажок <I>eliminatecc</I> на странице <I>Change Settings</I> в
Majordomo. Вы также можете избежать получения копий своих сообщений для самого себя,
если снимите флажок <I>selfcopy</I>.</P>
<HR>
<H2 align="center">Вопросы пользователей по клиентской части</H2>
<H3><A name="item2.1">2.1</A>) Какие интерфейсы есть для PostgreSQL?</H3>
<P>Установка PostgreSQL включает только <small>C</small> и встроенный
(embedded) <small>C</small> интерфейсы. Все другие интерфейсы
являются независимыми проектами и загружаются отдельно; самостоятельность
проектов позволяет им организовать собственное расписание выпусков
новых версий и иметь собственную команду разработчиков.</P>
<P>Некоторые языки программирования, такие как <small>PHP</small>
включают в себя интерфейс к PostgreSQL. Интерфейсы для таких языков
как Perl, <small>TCL</small>, Python и многих других, доступны на
<a href="http://pgfoundry.org">http://pgfoundry.org</A>.</P>
<H3><A name="item2.2">2.2</A>) Какие инструменты существуют для использования
PostgreSQL через Web?</H3>
<P>Прекрасное введение во взаимодействие баз данных и Web можно найти на:
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
<P>Для интеграции с Web, PHP <A href="http://www.php.net">
http://www.php.net</A> является неплохим интерфейсом.</P>
<P>В сложных случаях, многие пользуются Perl и DBD::Pg с CGI.pm
или mod_perl.</P>
<H3><A name="item2.3">2.3</A>) Есть ли у PostgreSQL графический интерфейс
пользователя?</H3>
<P>Для PostgreSQL существует большое количество инструментов с
графическим интерфейсом как коммерческих, так и открытых. Подробности
можно найти в <A href="http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools">
Документации сообщества для GUI иструментов PostgreSQL</A></P>
<HR>
<H2 align="center">Вопросы администрирования</H2>
<H3><A name="item3.1">3.1</A>) Как мне установить PostgreSQL в место отличное
от <I>/usr/local/pgsql</I>?</H3>
<P>Задайте опцию <I>--prefix</I> когда запускаете <I>configure</I>.</P>
<H3><A name="item3.2">3.2</A>) Как мне управлять соединениями от других
компьютеров?</H3>
<P>По умолчанию, PostgreSQL разрешает только соединения на локальной
машине через сокеты домена Unix или TCP/IP соединения. Для того, чтобы
другие машины смогли подключиться к базе вы должны изменить
<I>listen_addresses</I> в <I>postgresql.conf</I>, разрешить
host-авторизация в файле <I>$PGDATA/pg_hba.conf</I> и перестартовать
сервер СУБД.</P>
<H3><A name="item3.3">3.3</A>) Какие настройки мне нужно сделать для улучшения
производительности?</H3>
<P>Существует три главных области, которые потенциально могут
увеличить производительность:</P>
<DL>
<DT><B>Изменение запроса</B></DT>
<DD>Это означает модификацию запросов для получения лучшей
производительности:
<UL>
<LI>Создание индексов, включая индексы выражений и частичные индексы</LI>
<LI>Использование COPY вместо множества <small>INSERT</small></LI>
<LI>Группировка нескольких операторов в единую транзакцию для
уменьшения нагрузки при выполнении завершения транзакции</LI>
<LI>Использование <small>CLUSTER</small>, когда из индекса берётся
множество строк</LI>
<LI>Использование <small>LIMIT</small> для того, чтобы возвращалась
только часть вывода от запроса</LI>
<LI>Использование Подготовленных (Prepared) запросов</LI>
<LI>Использование <small>ANALYZE</small> для обслуживания статистики
оптимизатора</LI>
<LI>Регулярное использование <small>VACUUM</small> или <I>pg_autovacuum</I></LI>
<LI>Удаление индексов во время больших изменений данных</LI>
</UL>
<BR><BR>
</DD>
<DT><B>Настройка сервера</B></DT>
<DD>Некоторые установки в <I>postgresql.conf</I> влияют на
производительность. Подробный полный список установок см. в
<A href="http://www.postgresql.org/docs/current/static/runtime-config.html">
Administration Guide/Server Run-time Environment/Run-time Configuration</A>,
а комментарии см. в <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>
и <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>Выбор "железа" - аппаратного обеспечения</B></DT>
<DD>Влияние "железа" на производительность подробно описано в
<A href="http://www.powerpostgresql.com/PerfList/">
http://www.powerpostgresql.com/PerfList/</A> и
<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><A name="item3.4">3.4</A>) Какие возможности для отладки есть в
наличии?</H3>
<P>Есть множество установок в настройках сервера, начинающихся
на <code>log_*</code> на <a
href="http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html">http://www.postgresql.org/docs/current/interactive/runtime-config-logging.html</a>,
позволяющих протоколировать запросы и статистику работы процесса,
которая очень полезна для отладки и измерения производительности.</P>
<H3><A name="item3.5">3.5</A>) Почему я получаю сообщение <I>"Sorry, too
many clients"</I> когда пытаюсь подключиться к базе?</H3>
<P>Вы достигли установленного по умолчанию ограничения в 100 сессий
подключения к базе данных. Вам необходимо увеличить лимит на количество
конкурентных backend процессов для вашего сервера БД,
изменив значение <I>max_connections</I> в файле <I>postgresql.conf</I>
и перестартовать сервер БД.</P>
<H3><A name="item3.6">3.6</A>) Как выполнить обновление PostgreSQL?</H3>
<P>См. информацию об обновлении в <a
href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>
и специальные инструкции в <a href="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>) Какое компьютерное "железо" я должен
использовать?</H3>
<P>Поскольку "железо" персональных компьютеров является наиболее
совместимым, люди склонны верить, что такое "железо" имеет одинаковое
качество. Это не так. Память ECC, SCSI и качественные материнские платы
являются более надёжными и имеют более лучшую производительность, чем
менее дорогое "железо". PostgreSQL будет работать на любом "железе",
но если для вас важны надёжность и производительность, то с вашей стороны
будет мудро поставить соответствующее "железо". Обсудить разное "железо"
можно в наших списках рассылки.</P>
<HR>
<H2 align="center">Вопросы эксплуатации</H2>
<H3><A name="item4.1">4.1</A>) Как выполнить <SMALL>SELECT</SMALL> только
для нескольких первых строчек запроса? Произвольной строки?</H3>
<P>Для получения только нескольких строк, если вы знаете их количество
на момент выполнения <SMALL>SELECT</SMALL> используйте <SMALL>LIMIT</SMALL>.</P>
Если есть какой-либо индекс, который совпадает с <SMALL>ORDER BY</SMALL>,
то возможно, что весь запрос выполнен и не будет. Если вы не знаете
количества необходимых строк на момент выполнения <SMALL>SELECT</SMALL>,
используйте курсор и <SMALL>FETCH</SMALL>.</P>
<P>To <small>SELECT</small> a random row, use:</P>
<PRE> SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</PRE>
<H3><A name="item4.2">4.2</A>) Как мне найти какие таблицы, индексы,
базы данных и пользователи существуют? Как мне увидеть запросы,
которые использует <I>psql</I> для получения этой информации?</H3>
<P>Чтобы просматривать таблицы в <I>psql</I>, используйте команду \dt.
Полный список команд в <I>psql</I> вы можете получить, используя \?.
Кроме того, вы можете посмотреть исходный код <I>psql</I> в файле
<I>pgsql/src/bin/psql/describe.c</I>. Он содержит команды
<SMALL>SQL</SMALL> которые генерируются при вводе в <I>psql</I> команд,
начинающихся с обратной косой черты. Вы также можете запустить
<I>psql</I> с опцией <I>-E</I> так, чтобы эта программа выдавала
запросы, которые она использует для выполнения заданных вами
команд. PostgreSQL также предоставляет <SMALL>SQL</SMALL>
совместимый с INFORMATION SCHEMA интерфейс, с помощью которого, вы
можете сформировать запрос на получение информации о базе данных.</P>
<P>Также существуют системные таблицы, начинающиеся с <I>pg_</I>.</P>
<P>Используйте <I>psql -l</I> для получения списка всех баз данных.</P>
<P>Также посмотрите файл <I>pgsql/src/tutorial/syscat.source</I>.
Он показывает многие из операторов <SMALL>SELECT</SMALL> необходимых
для получения информации из системных таблиц базы данных.</P>
<H3><A name="item4.3">4.3</A>) Как изменить тип данных колонки?</H3>
<P>В 8.0 и более поздних версиях, изменение типа колонки выполняется
очень легко через <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.</P>
<P>В более ранних версиях сделайте так:</P>
<PRE>
BEGIN;
ALTER TABLE tab ADD COLUMN new_col <i>new_data_type</i>;
UPDATE tab SET new_col = CAST(old_col AS <i>new_data_type</i>);
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
</PRE>
<H3><A name="item4.4">4.4</A>) Каковы максимальные размеры для строк в таблице,
таблиц и базы данных?</H3>
<P>Существуют следующие ограничения:</P>
<BLOCKQUOTE>
<TABLE>
<TR>
<TD>Максимальный размер базы?</TD>
<TD>неограничен (существуют базы на 32 TB)</TD>
</TR>
<TR>
<TD>Максимальный размер таблицы?</TD>
<TD>32 TB</TD>
</TR>
<TR>
<TD>Максимальный размер строки?</TD>
<TD>400 Gb</TD>
</TR>
<TR>
<TD>Максимальный размер поля?</TD>
<TD>1 GB</TD>
</TR>
<TR>
<TD>Максимальное количество строк в таблице?</TD>
<TD>неограничено</TD>
</TR>
<TR>
<TD>Максимальное количество колонок в таблице?</TD>
<TD>250-1600 в зависимости от типа</TD>
</TR>
<TR>
<TD>Максимальное количество индексов в таблице?</TD>
<TD>неограничено</TD>
</TR>
</TABLE>
</BLOCKQUOTE>
<BR>
<P>Разумеется, понятие "неограничено" на самом деле ограничивается
доступным дисковым пространиством и размерами памяти/своппинга.
Когда значения перечисленные выше неоправдано большие, может
пострадать производительность.</P>
<P>Максимальный размер таблицы в 32 TB не требует чтобы операционная
система поддерживала файлы больших размеров. Большие таблицы хранятся
как множество файлов размером в 1 GB, так что ограничения, которые
накладывает файловая система не важны.</P>
<P>Максимальный размер таблицы и максимальное количество колонок
могут быть увеличены в четыре раза, если размер блока по умолчанию будет
увеличен до 32k.</P>
<P>Существует ограничение, по которому индексы не могут создаваться для
колонок длиннее чем 2,000 символов. К счастью такие индексы вряд ли
действительно кому-то нужны. Уникальность гарантируется наилучим образом,
с помощью функционального индекса из хэша MD5 длинной колонки, а
полнотекстовое индексирование позволяет искать слова внутри колонки.</P>
<H3><A name="item4.5">4.5</A>) Как много дискового пространства в базе данных
нужно для сохранения данных из обычного текстового файла?</H3>
<P>СУБД PostgreSQL может потребоваться дискового пространства до 5 раз
больше для сохранения данных из простого текстового файла.</P>
<P>В качестве примера, рассмотрим файл в 100,000 строк в каждой, из
которых целое число и текстовое описание. При этом длина текста,
в среднем, составляет 20 байт. Размер простого файла составит 2.8 MB.
Размер базы PostgreSQL, содержащей эти же данные составит приблизительно
5.2 MB из которых:</P>
<PRE>
24 байт: на каждый заголовок строки в таблице (приблизительно)
+ 24 байта: одно поле с целочисленным типом и одно текстовое поле
+ 4 байта: указатель на странице для всей табличной строки
----------------------------------------
56 байт на строку в таблице
Размер страницы данных в PostgreSQL составляет 8192 байт (8 KB), так что:
8192 байт на страницу
--------------------- = 158 строк в таблице на страницу БД (округлённо)
52 байт на строку в таблице
100000 строк данных
----------------------- = 633 страниц в БД (округлённо)
158 строк в таблице на страницу
633 страниц БД * 8192 байт на страницу = 5,185,536 байт (5.2 MB)
</PRE>
<P>Индексы не требуют так много, но поскольку они создаются для
большого количества данных, они также могут быть велики.</P>
<P>Значения <small>NULL</small> хранятся как битовые карты и поэтому они
занимают очень мало места.
</P>
<H3><A name="item4.6">4.6</A>) Почему мои запросы работают медлено? Почему
они не используют мои индексы?</H3>
<P>Индексы не используются для каждого запроса. Они
используются только если таблица больше минимального размера и запрос
выбирает только маленький процент строк в таблице. Так устроено,
потому что доступ к диску с применением рандомизации при сканировании
индексов может быть медленнее, чем простое чтение таблицы или ее
последовательное сканирование.</P>
<P>Чтобы определить необходимость использования индекса для какой-либо
таблицы, PostgreSQL должен иметь статистику по этой таблице. Эта
статистика собирается при использовании <SMALL>VACUUM ANALYZE</SMALL>
или просто <SMALL>ANALYZE</SMALL>. Используя статистику, оптимизатор
узнает о том как много строк в таблице и если он должен использовать
индексы, то он может принимать лучшие решения. Статистика также
влияет на определение оптимального порядка связывания и метода связывания.
При изменении содержимого таблицы должен периодически выполнятся
сбор статистики.</P>
<P>Обычно индексы не используются для <SMALL>ORDER BY</SMALL> или для
выполнения связываний. Последовательный перебор следующий за явной
сортировкой обычно быстрее, чем поиск по индексам в большой таблице.
Однако, <SMALL>ORDER BY</SMALL> часто комбинируется с <SMALL>LIMIT</SMALL>
и в этом случае индекс будет использоваться, поскольку при выполнении
будет возвращаться небольшая часть таблицы.</P>
<P>Если вам кажется, что оптимизатор некорректно выбирает последовательный
перебор, используйте <CODE>SET enable_seqscan TO 'off'</CODE> и
запустите запрос снова, чтобы увидеть, действительно ли сканирование
индексов быстрее.
</P>
<P>Когда используются операции с шаблонами, например <SMALL>LIKE</SMALL>
или <I>~</I>, индексы могут быть использованы в следующих случаях:</P>
<UL>
<LI>Начало строки поиска должно совпадать с началом искомой строки, т.е.:
<UL>
<LI><small>LIKE</small> шаблоны не должны начинаться с <i>%.</i>.</LI>
<LI><i>~</i> шаблоны регулярных выражений должна начинаться на <i>^</i>.</LI>
</UL></LI>
<LI>Строка поиска не должна начинаться с символа класса, т.е. [a-e].</LI>
<LI>Поиск независимый от регистра, такой как <small>ILIKE</small> и
<i>~*</i> не использует индексы. Вместо него, используйте индексы
выражений, которые описываются в секции <A href="#item4.8">4.8</A>.</LI>
<LI>Во время <i>initdb</i> должна использоваться локаль по умолчанию
<i>C</i>, потому что не существует возможности узнать следующий наибольший
символ для не-C локали. Вы можете для таких случаев создать специальный
индекс <CODE>text_pattern_ops</CODE> который работает только для
<SMALL>LIKE</SMALL> индексирования. Для поиска слов также можно
использовать полнотекстовый индекс.</LI>
</UL>
<H3><A name="item4.7">4.7</A>) Как посмотреть на то, как оптимизатор выполняет
мой запрос?</H3>
<P>Смотрите страницу руководства посвященную <SMALL>EXPLAIN</SMALL>.</P>
<H3><A name="item4.8">4.8</A>) Как мне выполнить поиск регулярного выражения
и поиск независимый от регистра букв поиск регулярного выражения?
Как мне использовать индекс для поиска независимого от регистра букв?</H3>
<P>Оператор <I>~</I> производит поиск регулярного выражения, а оператор
<I>~*</I> производит независимый от регистра букв поиск регулярного
выражения. Независимый от регистра вариант <SMALL>LIKE</SMALL> называется
<SMALL>ILIKE</SMALL>.</P>
<P>Независимое от регистра сравнение обычно выражается так:</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</PRE>
Эта конструкция не будет использовать стандартный индекс. Однако, если
вы создадите индекс выражения, он будет использован:
<PRE>
CREATE INDEX tabindex ON tab (lower(col));
</PRE>
<P>Если вышеуказанный индекс создаётся как <SMALL>UNIQUE</SMALL>, то
колонка, для которой он создаётся может хранить символы и в верхнем,
и в нижнем регистре, индес не может иметь идентичных значений, которые
отличаются только регистром. Чтобы в колонке можно было хранить символы
только в определённом регистре, используйте ограничение
<SMALL>CHECK</SMALL> или проверку через триггер.</P>
<H3><A name="item4.9">4.9</A>) Как мне определить, что значение поля в каком-либо
запросе равно <SMALL>NULL</SMALL>? Как мне соединить возможные
<SMALL>NULL</SMALL>? Могу я сортировать поля <SMALL>NULL</SMALL> или нет?</H3>
<P>Вы просто сравниваете значение с <SMALL>IS NULL</SMALL> и
<SMALL>IS NOT NULL</SMALL>, как здесь:</P>
<PRE>
SELECT *
FROM tab
WHERE col IS NULL;
</PRE>
<P>Чтобы соединить с возможными значениями <SMALL>NULL</SMALL>, используйте
<I>COALESCE()</I> как здесь:</P>
<PRE>
SELECT COALESCE(col1, '') || COALESCE(col2, '')
FROM tab
</PRE>
<P>Чтобы отсортировать данные по значению <NULL> используйте модификаторы
<SMALL>IS NULL</SMALL> и <SMALL>IS NOT NULL</SMALL> в выражении
<SMALL>ORDER BY</SMALL>. Когда они будут генерировать значения
<I>истина</I>, то при сортировке они будут выше, чем значения
<I>ложь</I>, так что записи с NULL будут в отсортированном списке сверху:</P>
<PRE>
SELECT *
FROM tab
ORDER BY (col IS NOT NULL);
</PRE>
<H3><A name="item4.10">4.10</A>) Каковы отличия между разными символьными
типами?</H3>
<BLOCKQUOTE>
<TABLE>
<TR>
<TH>Тип</TH>
<TH>Внутреннее имя</TH>
<TH>Замечания</TH>
</TR>
<TR>
<TD>VARCHAR(n)</TD>
<TD>varchar</TD>
<TD>размер задает максимальную длину, нет заполнения</TD>
</TR>
<TR>
<TD>CHAR(n)</TD>
<TD>bpchar</TD>
<TD>заполняется пустотой до фиксированной длины</TD>
</TR>
<TR>
<TD>TEXT</TD>
<TD>text</TD>
<TD>нет задаваемого верхнего ограничения или длины</TD>
</TR>
<TR>
<TD>BYTEA</TD>
<TD>bytea</TD>
<TD>массив байт переменной длины (можно использовать null-байт без опаски)</TD>
</TR>
<TR>
<TD>"char"</TD>
<TD>char</TD>
<TD>один символ</TD>
</TR>
</TABLE>
</BLOCKQUOTE>
<P>Внутреннее имя вы можете увидеть, когда смотрите системные каталоги
и в некоторых сообщениях об ошибках.</P>
<P>Первые четыре типа являются "varlena" типами (т.е., первые
четыре байта на диске являются длинной, за которой следуют данные).
Таким образом, фактически используемое пространство больше, чем
обозначенный размер. Однако, длинные значения также сжимаются,
так что занимаемое дисковое пространство может также быть и меньше,
чем ожидалось.</P>
<SMALL>VARCHAR(n)</SMALL> - это лучшее решение, когда нужно хранить
строки переменной длины, не превышающие определенного размера.
<SMALL>TEXT</SMALL> - это лучшее решение для строк неограниченной длины,
с максимально допустимой длиной в 1 гигабайт.
<P><SMALL>CHAR(n)</SMALL> - это лучшее решение для хранения строк, которые
обычно имеют одинаковую длину. <SMALL>CHAR(n)</SMALL> заполняется
пустотой до заданной длины, в то время как <SMALL>VARCHAR(n)</SMALL>
хранит только символы, из которых состоит строка.
<SMALL>BYTEA</SMALL> используется для хранения бинарных данных, значения
которых могут включать <SMALL>NULL</SMALL> байты. Все типы описанные
здесь, имеют сходные характеристики производительности.</P>
<H3><A name="item4.11.1">4.11.1</A>) Как мне создать поле
serial/с-авто-увеличением?</H3>
<P>PostgreSQL поддерживает тип данных <SMALL>SERIAL</SMALL>. Он
автоматически создает последовательность. Например:</P>
<PRE>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</PRE>
автоматически транслируется в:
<PRE>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
</PRE>
<P>Автоматически созданная последовательность имеет имя вида
&lt;<I>таблица</I>&gt;_&lt;<I>колонка_serial</I>&gt;_<I>seq</I>, где
<I>таблица</I> и <I>колонка_serial</I> - это соответственно имена
таблицы и колонки с типом <SMALL>SERIAL</SMALL>.
Смотрите подробности о последовательностях на странице руководства
посвященной <I>create_sequence</I>.</P>
<H3><A name="item4.11.2">4.11.2</A>) Как мне получить значение при вставке
<SMALL>SERIAL</SMALL>?</H3>
<P>Простейший способ получить назначенное значение <SMALL>SERIAL</SMALL>
это использовать <SMALL>RETURNING</SMALL>. Используя для примера таблицу в <A
href="#item4.11.1">4.11.1</A>, это может выглядеть так:</P>
<PRE>
INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;
</PRE>
Вы также можете вызвать <I>nextval()</I> и использовать это значение в
<SMALL>INSERT</SMALL> или вызвать <I>currval()</I> <I>после</I>
<SMALL>INSERT</SMALL>.
<H3><A name="item4.11.3">4.11.3</A>) Не может ли получиться так, что
использование <I>currval()</I> и <I>nextval()</I> приведет к
зациклированию с другими пользователями?</H3>
<P>Нет. <i>currval()</i> возвращает текущее значение, назначенное вашей
сессией, а не другими сессиями.</P>
<H3><A name="item4.11.4">4.11.4</A>) Почему числа из моей последовательности
не используются снова при отмене транзакции? Почему создаются разрывы
при нумерации в колонке, где я использую последовательность/SERIAL?</H3>
<P>Для реализации конкуретности, значения последовательностей, при
необходимости выдаются во время запуска транзакций и не блокируются
до полного выполнения транзакций. Это может вызывать разрывы в
нумерации при отмене транзакций.</P>
<H3><A name="item4.12">4.12</A>) Что такое <SMALL>OID</SMALL>? Что такое
<SMALL>CTID</SMALL>?</H3>
<P>Если таблица создана с <SMALL>WITH OIDS</SMALL>, то каждая строка
получает уникальный индентификатор <SMALL>OID</SMALL>.
O<SMALL>ID</SMALL> - это автоматически назначаемое уникальное 4-х
байтовое целое число, которое уникально для всей установленной СУБД.
Однако, после того как его значение превысит 4 миллиарда, значения
O<SMALL>ID</SMALL> начинают дублироваться. PostgreSQL использует
<SMALL>OID</SMALL> для связывания своих внутренних таблиц.</P>
<P>Для уникального значения в строках таблицы пользователя, лучшим
способом является использование <SMALL>SERIAL</SMALL> вместо
O<SMALL>ID</SMALL>, потому что последовательности <SMALL>SERIAL</SMALL>
уникальны только внутри таблицы и таким образом меньше подвержены
переполнению. Для хранения значений 8-ми байтной последовательности
доступен тип <SMALL>SERIAL8</SMALL>.
<P>C<SMALL>TID</SMALL> используется для идентификации специальных
физических записей с блочными и offset значениями. C<SMALL>TID</SMALL>
изменяется после того как строки в таблице были изменены или перегружены.
<P>T<SMALL>ID</SMALL> используется индексными записями в качестве
указателя на физические записи.</P>
<H3><A name="item4.13">4.13</A>) Почему я получаю ошибку <I>"ERROR: Memory
exhausted in AllocSetAlloc()"</I>?</H3>
<P>Предположительно у вас закончилась виртуальная память
или что ваше ядро имеет маленький лимит на определенные ресурсы.
Попытайтесь перед запуском сервера БД выполнить следующие
команды:</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
В зависимости от командного интерпретатора shell, только одна из данных
команд выполнится успешно, но она позволит вам установить больший
сегмент данных процесса и возможно решит проблему. Эта команда
изменяет параметры текущего процесса и всех его потомков, созданных
после её запуска. Если у вас возникла проблема с <SMALL>SQL</SMALL>
клиентом, потому что backend возвращает слишком большой объем данных,
попытайтесь выполнить эту команду перед запуском клиента.
<H3><A name="item4.14">4.14</A>) Как мне узнать, какая версия PostgreSQL
запущена?</H3>
<P>Из <I>psql</I>, наберите <CODE>SELECT version();</CODE></P>
<H3><A name="item4.15">4.15</A>) Как мне создать колонку которая по умолчанию
будет содержать текущее время?</H3>
<P>Используйте <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
</PRE>
<H3><A name="item4.16">4.16</A>) Как мне выполнить внешнее связывание?</H3>
<P>PostgreSQL поддерживает внешнее связывание,
используя стандартный синтаксис SQL. Вот два примера:</P>
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</PRE>
или
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</PRE>
<P>Это идентичные запросы связывания t1.col и t2.col, также возвращают
любые несвязанные строки в t1 (которые не совпадают с t2).
<SMALL>RIGHT</SMALL> связывание должно добавить несвязанные строки
t2. <SMALL>FULL</SMALL> связывание должно возвратить совпавшие
строки плюс все несвязанные строки из t1 и t2. Слово <SMALL>OUTER</SMALL>
является необязательным и назначается в <SMALL>LEFT</SMALL>,
<SMALL>RIGHT</SMALL> и <SMALL>FULL</SMALL> связываниях. Обычные
связывания называются <SMALL>INNER</SMALL> связывания.</P>
<H3><A name="item4.17">4.17</A>) Как выполнять запросы, использующие несколько
баз данных?</H3>
<P>Не существует способа создать запрос к базам данных отличным от текущей.
Поскольку PostgreSQL загружает системные каталоги специфичные для базы
данных, непонятно даже, как должен себя вести такой межбазовый запрос.</P>
<P><I>contrib/dblink</I> позволяет запросы между базами, используя
вызовы функций. Разумеется, клиент может одновременно также устанавливать
соедиенения с различными базами данных и таких образом объединять
информацию из них.</P>
<H3><A name="item4.18">4.18</A>) Как мне вернуть из функции несколько строк таблицы?</H3>
<P>Вы можете легко использовать функции, возвращающие список,
<a href="http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions">
http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions</a>.</P>
<H3><A name="item4.19">4.19</A>) Почему я получаю ошибку "relation with OID ####
не существует", когда обращаютсь к временным таблицам в функциях PL/PgSQL?</H3>
<P>В PostgreSQL до версии 8.3, PL/PgSQL кэширует сценарии функции и один из
негативных эффектов этого состоит в том, что если функция PL/PgSQL обращается
к временной таблице и эта таблица позднее удаляется и пересоздается, а функция
затем вызывается снова, то ее вызов приведет к ошибке, потому что скэшированное
содержимое функции содержит указатель на старую временную таблицу. Чтобы решить
эту проблему, используйте <SMALL>EXECUTE</SMALL> для доступа к временным
таблицам в PL/PgSQL. Использование этого оператора заставит запрос
перегенерироваться каждый раз.</P>
<P>В PostgreSQL 8.3 и позднее, этой проблемы нет.</p>
<H3><A name="item4.20">4.20</a>) Какие есть решения для репликации?</H3>
<P>Хотя "репликация" -- это единый термин, есть несколько разных технологий
для выполнения репликаций с разными особенностями для каждой.</P>
<P>Репликация Master/slave позволяет иметь один главный (master) сервер
для выполнения запросов чтения/записи, в то время как подчинённые
(slave) сервера могут производить только запросы
чтения/<SMALL>SELECT</SMALL>. Наиболее популярным решением для репликации
master-slave в PostgreSQL является
<A href="http://main.slony.info/">
Slony-I</A>.</P>
<P>Репликация Multi-master позволяет выполнять запросы чтения/записи
на нескольких, реплицируемых друг с другом компьюетрах. Эта особенность
также приводит к потере производительности, потому что необходима
синхронизация изменений между несколькими серверами. Наиболее
популярным решением для такой репликации в PostgreSQL является
<A href="http://pgfoundry.org/projects/pgcluster/">PGcluster</A>.
<H3><A name="item4.21">4.21</A>) Почему имена таблицы и колонок не
распознаются в в моём запросе? Почему не сохраняются заглавные буквы?</H3>
<P>Наиболее часто имена нераспознаются из-за использования двойных кавычек в
имени таблицы или колонки при создании таблицы. При использовании двойных
кавычек, имя таблицы и колонки (которые называют идентификаторами)
сохраняются в <A href="http://www.postgresql.org/docs/current/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS">
регистро-зависимом виде</A>; это означает, что вы должны использовать
двойные кавычки, когда указываете эти имена в запросе. Некоторые
интерфейсы, такие как pgAdmin, во время создания таблицы добавляют
двойные кавычки автоматически. Таким образом, чтобы идентификаторы
распознавались вы должны следовать одному из следующих правил:
<UL>
<LI>Избегать использования двойных кавычек при создании таблиц</LI>
<LI>Использовать в идентификаторах только символы нижнего регистра</LI>
<LI>Использовать двойные кавычки для идентификаторов в запросах</LI>
</UL>
</BODY>
</HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>PostgreSQL Sıkça Sorulan Sorular - Türkçe</title>
<style type="text/css"><!--
body { background: #FFFFFF; }
a:link { color: #ff0000; }
a:active { color: #0000ff; }
a:visited { color: #a00000; }
i { font-style: oblique; }
body, h1, h2, h4, ul, p, a { font-family: helvetica, arial, sans-serif; font-size: medium; color: black; }
pre { color: #5C5C5C; padding-left: 30px; }
.fixme { color: cyan; }
--></style>
</head>
<body bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000" alink="#0000ff">
<h1>PostgreSQL için Sıkça Sorulan Sorular (SSS)</h1>
<p>Son güncelleme : 15 Kasım 2004 Pazartesi - 15:03:23</p>
<p>Current maintainer: Bruce Momjian
(<a href="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>)<br></p>
<p>Çevirenler : Devrim Gündüz (<a href="mailto:devrim@tdmsoft.com">devrim@tdmsoft.com</a>)<br>Nicolai Tufar
(<a href="mailto:ntufar@tdmsoft.com">ntufar@tdmsoft.com</a>)<BR>Volkan YAZICI (<a href="mailto:volkany@phreaker.net">volkany@phreaker.net</a>)</p>
<p>Bu belgenin en güncel hali, <a href="http://www.postgresql.org/docs/faqs/FAQ_turkish.html">http://www.PostgreSQL.org/docs/faqs/FAQ_turkish.html</a>
ve <a href="http://www.gunduz.org/seminer/pg/FAQ_turkish.html">http://www.gunduz.org/seminer/pg/FAQ_turkish.html</a>
adreslerinde görülebilir.</p>
<p>Platforma özel sorularınız, <a href="http://www.postgresql.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html</a> adresinde yanıtlanır.</p>
<hr>
<h2 align="center">Genel Sorular</h2>
<a href="#1.1">1.1</a>) PostgreSQL nedir? Nasıl okunur?<br>
<a href="#1.2">1.2</a>) PostgreSQL'in hakları nedir?<br>
<a href="#1.3">1.3</a>) PostgreSQL, hangi Unix platformlarında çalışır?<br>
<a href="#1.4">1.4</a>) Hangi Unix olmayan uyarlamaları bulunmaktadır?<br>
<a href="#1.5">1.5</a>) PostgreSQL'i nereden indirebilirim?<br>
<a href="#1.6">1.6</a>) Desteği nereden alabilirim?<br>
<a href="#1.7">1.7</a>) En son sürümü nedir?<br>
<a href="#1.8">1.8</a>) Hangi belgelere ulaşabilirim?<br>
<a href="#1.9">1.9</a>) Bilinen hatalar ya da eksik özelliklere nereden ulasabilirim?<br>
<a href="#1.10">1.10</a>) Nasıl <small>SQL</small> öğrenebilirim?<br>
<a href="#1.11">1.11</a>) PostgreSQL 2000 yılına uyumlu mudur?<br>
<a href="#1.12">1.12</a>) Geliştirme takımına nasıl katılabilirim??<br>
<a href="#1.13">1.13</a>) Bir hata raporunu nasıl gönderebilirim?<br>
<a href="#1.14">1.14</a>) PostgreSQL, diğer <small>VTYS(DBMS)</small> lerle nasıl
karşılaştırılabilir?<br>
<a href="#1.15">1.15</a>) PostgreSQL'e maddi açıdan nasıl destek olabilirim?<br>
<h2 align="center">Kullanıcı/istemci Soruları</h2>
<a href="#2.1">2.1</a>) PostgreSQL için <i>ODBC</i> sürücüleri var mı?<br>
<a href="#2.2">2.2</a>) PostgreSQL'i web sayfalarında kullanabilmek için
hangi araçlar bulunmaktadır?<br>
<a href="#2.3">2.3</a>) PostgreSQL'in grafik kullanıcı arabirimi var mıdır?<br>
<a href="#2.4">2.4</a>) PostgreSQL ile iletişimi kurabilmek için
hangi dilleri kullanabilirim? <br>
<h2 align="center">Yönetimsel Sorular</h2>
<a href="#3.1">3.1</a>) PostgreSQL'i <code>/usr/local/pgsql</code> dizininden
başka dizinlere nasıl kurabilirim?<br>
<a href="#3.2">3.2</a>) <i>Postmaster</i>'ı başlattığımda <code>Bad System Call</code>
ya da <code>core dumped</code> mesajı alıyorum. Neden?<br>
<a href="#3.3">3.3</a>) <i>Postmaster</i>'ı başlattığımda, <code>IpcMemoryCreate</code>
hatası alıyorum. Neden?<br>
<a href="#3.4">3.4</a>) <i>Postmaster</i>'ı, başlattığımda, <code>IpcSemaphoreCreate</code>
hatası alıyorum. Neden?<br>
<a href="#3.5">3.5</a>) Diğer bilgisayarların benim PostgreSQL veritabanı
sunucuma bağlantılarını nasıl kontrol edebilirim?<br>
<a href="#3.6">3.6</a>) Veritabanı motorunu daha iyi başarım icin nasıl ayarlayabilirim?<br>
<a href="#3.7">3.7</a>) Hangi hata ayıklama özellikleri bulunmaktadır?<br>
<a href="#3.8">3.8</a>) Bağlanmaya çalışırken, neden "<code>Sorry, too many clients</code>"
hatasını alıyorum. Neden?<br>
<a href="#3.9">3.9</a>) <code>pgsql_tmp</code>dizinin içindeki dosyalar nelerdir?<br>
<a href="#3.10">3.10</a>) PostgreSQL sürümlerini yükseltmek için neden bir
<code>dump/reload</code> işlemi gerçekleştirmek zorundayım?<br>
<a href="#3.11">3.11</a>) Nasıl bir donanım kullanmalıyım?br>
<h2 align="center">İşletimsel Sorular</h2>
<a href="#4.1">4.1</a>) <i>Binary cursor</i> ve <i>normal cursor</i> arasındaki fark nedır?<br>
<a href="#4.2">4.2</a>) Sorgunun sadece ilk birkaç satırını nasıl
<code>SELECT</code> edebilirim?<br>
<a href="#4.3">4.3</a>) <i>psql</i>'in içinde gördügüm tabloların ya da diğer
şeylerin listesini nasıl alabilirim?<br>
<a href="#4.4">4.4</a>) Bir tablodan bir kolonu nasıl kaldırabilirim?<br>
<a href="#4.5">4.5</a>) Bir satır, tablo ve veritabanı için en fazla büyüklük nedir?<br>
<a href="#4.6">4.6</a>) Tipik bir metin dosyasındaki veriyi saklamak için ne
kadar disk alanı gereklidir?<br>
<a href="#4.7">4.7</a>) Veritabanında hangi tablo ya da <i>index</i>'lerin
tanımlandığını nasıl görebilirim?<br>
<a href="#4.8">4.8</a>) Sorgularım cok yavaş, ya da <i>index</i>'lerimi kullanmıyorlar. Neden?<br>
<a href="#4.9">4.9</a>) <i>Query-optimizer</i>'ın sorgularımı nasıl değerlendirdiğini,
işleme soktuğunu nasıl görebilirim?<br>
<a href="#4.10">4.10</a>) <i>R-tree index</i> nedir?<br>
<a href="#4.11">4.11</a>) <i>Genetic Query Optimizer</i> nedir?<br>
<a href="#4.12">4.12</a>) Düzenli ifade (<i>Regular Expression</i>) aramalarını
ve büyük/küçük harfe duyarsız aramaları nasıl yapabilirim? Bu büyük/küçük harfe duyarlı
aramalar için <i>index</i>'i nasıl kullanabilirim?<br>
<a href="#4.13">4.13</a>) Bir sorguda, bir alanın <code>NULL</code> olduğunu nasıl
ortaya çıkarabilirim?<br>
<a href="#4.14">4.14</a>) Çesitli karakter tipleri arasındaki farklar nelerdir?<br>
<a href="#4.15.1">4.15.1</a>) Nasıl <code>serial</code>/otomatik artan
(<i>auto-incrementing</i>) bir alan yaratabilirim?<br>
<a href="#4.15.2">4.15.2</a>) <code>Serial</code> girişinin değerini nasıl alabilirim?<br>
<a href="#4.15.3">4.15.3</a>) <code>currval()</code> ve <code>nextval()</code>
diğer kullanıcılara sorun yaratmaz mı?<br>
<a href="#4.15.4">4.15.4</a>) Neden sequence sayıların <i>transaction</i>
işleminin iptalinden sonra yeniden kullanılıyor? Neden <code>sequence/SERIAL</code>
kolonumdaki sayılarda atlamalar oluyor?<br>
<a href="#4.16">4.16</a>) <code>OID</code> nedir? <code>TID</code> nedir?<br>
<a href="#4.17">4.17</a>) PostgreSQL' de kullanılan bazı terimlerin anlamları nelerdir?<br>
<a href="#4.18">4.18</a>) Neden "<code>ERROR: Memory exhausted in AllocSetAlloc()</code>"
hatasını alıyorum?<br>
<a href="#4.19">4.19</a>) Hangi PostgreSQL sürümünü çalıstırdığımı nasıl görebilirim?<br>
<a href="#4.20">4.20</a>) Neden <i>large-object</i> işlemlerim, "<code>invalid large
obj descriptor</code>" hatasını veriyor?<br>
<a href="#4.21">4.21</a>) Şu andaki zamanı öntanımlı değer olarak kabul
eden kolonu nasıl yaratırım?<br>
<a href="#4.22">4.22</a>) Neden <code>IN</code> kullanan <i>subquery</i>'lerim çok yavaş?<br>
<a href="#4.23">4.23</a>) <i>Outer join</i> işlemini nasıl yapabilirim?<br>
<a href="#4.24">4.24</a>) Aynı anda birden fazla veritabanında nasıl işlem yapabilirim?<br>
<a href="#4.25">4.25</a>) Bir fonksiyondan nasıl çoklu satır ya da kolon döndürebilirim?<br>
<a href="#4.26">4.26</a>) Neden Pl/PgSQL fonksiyonları içinden güvenli
bir şekilde tablo yaratma/kaldırma işlemlerini yapamıyoruz?<br>
<a href="#4.27">4.27</a>) Hangi şifreleme seçenekleri bulunmaktadır?<br>
<h2 align="center">PostgreSQL Özelliklerini Genişletmek</h2>
<a href="#5.1">5.1</a>) Kullanıcı-tanımlı bir fonksiyon yazdım. <i>psql</i>'de
çalıştırdığım zaman neden <code>core dump</code> ediyor?<br>
<a href="#5.2">5.2</a>) PostgreSQL'e nasıl yeni veri tipleri/fonksiyonlar ekleyebilirim?<br>
<a href="#5.3">5.3</a>) Bir tuple döndürmek için bir C fonksiyonunu nasıl yazarım?<br>
<a href="#5.4">5.4</a>) Bir kaynak dosyasında değişiklik yaptım.
Yeniden derlememe rağmen değişiklik geçerli olmuyor. Neden?<br>
<hr>
<h2 align="center">Genel Sorular</h2>
<h4><a name="1.1">1.1</a>) PostgreSQL nedir? Nasıl okunur?</h4>
<p>PostgreSQL, <i>Post-Gres-Q-L</i>. olarak okunur</p>
<p>PostgreSQL, yeni-nesil <small>VTYS</small> araştırma prototipi olan POSTGRES
veritabanı yönetim sisteminin geliştirilmesidir. POSTGRES'in zengin veri tiplerini ve
güçlü veri modelini tutarken, <small>SQL</small>'in geliştirilmiş alt kümesi
olan PostQuel dilini kullanır. PostgreSQL ücretsizdir ve kaynak kodu açık dağıtılır.</p>
<p>PostgreSQL, PostgreSQL geliştirme listesine üye olan bir Internet geliştirici
takımı tarafından geliştirilir. Şu andaki koordinatör, Marc G. Fournier
(<a href="mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</a>).
(Bu takıma nasıl katılacagınızı öğrenmek için <a href="#1.6">1.6</a> numaralı maddeyi
okuyunuz.) Bu takım, tüm PostgreSQL gelişiminden sorumludur.</p>
<p>PostgreSQL 1.01 sürümünün yazarları Andrew Yu ve Jolly Chen idi. Bunların dışında
bir kaç kisi de uyarlama, hata ayıklama ve kodun geliştirilmesi için çalısmıştı.
PostgreSQL'in türediği orijinal Postgres kodu, lisans, lisansüstü ve akademisyenler
tarafından, Professor Michael Stonebraker (University of California, Berkeley)
koordinatörlügünde yazılmıştır.</p>
<p>Berkley'deki yazılımın adı Postgres idi. <small>SQL</small> uyumluluğu
1995'te eklenince, adı Postgres 95 oldu. 1996 yılının sonlarında adı
PostgreSQL olarak değiştirildi.</p>
<h4><a name="1.2">1.2</a>) PostgreSQL'in hakları nedir?</h4>
<p>PostgreSQL Data Base Management System</p>
<P>Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 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>
<p>Üstteki metin klasik açık-kod lisansı olan BSD lisansıdır. Kaynak kodun nasıl
kullanılabileceğine dair sınırlamaları yoktur. Bu lisansı seviyoruz. Değiştirme
niyetimiz bulunmamaktadır.</p>
<h4><a name="1.3">1.3</a>) PostgreSQL, hangi Unix platforlarında çalışır?</h4>
<p>Genel olarak, modern bir Unix-uyumlu platform PostgreSQL'i çalıştıracaktır.
Ayrıntılı bilgi için kurulum belgelerine bakabilirsiniz.</p>
<h4><a name="1.4">1.4</a>) Hangi Unix olmayan uyarlamaları bulunmaktadır?</h4>
<P>PostgreSQL 8.0 sürümü ile , PostgreSQL artık Win2000, WinXP ve Win2003 gibi Microsoft
Windows NT tabanlı işletim sistemlerinde doğal olarak çalışmaya başlamıştır. Paketlenmiş bir
kurulum programı, <a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a>. adresinden
indirilebilir.</P>
<p>Ayrıca, http://forge.novell.com adresinde Novell Netware 6 portu bulunmaktadır.</p>
<h4><a name="1.5">1.5</a>) PostgreSQL'i nereden indirebilirim?</h4>
<p>PostgreSQL için ana anonim ftp sitesi <i><a href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</a></i>
adresidir. Yansılar için, ana web sayfamıza bakabilirsiniz.</p>
<h4><a name="1.6">1.6</a>) Nereden destek alabilirim?</h4>
<p>Ana e-posta listesi : pgsql-general@PostgreSQL.org. PostgreSQL konusundaki tartışmalara
açıktır. Üye olmak için, aşağıdaki satırları e-postanızın <i>body</i> kısmına
(konu kısmına değil) yazıp, pgsql-general-request@PostgreSQL.org adresine gönderin:</p>
<pre>subscribe<br>end</pre>
<p>Aynı zamanda, bir <i>digest</i> listesi bulunmaktadır. Bu listeye üye olmak için,
pgsql-general-digest-request@PostgreSQL.org adresine, body kısmında</p>
<pre>subscribe<br>end</pre>
<p>yazan bir e-posta atmanız yeterli olacaktır.</p>
<p><i>Digest</i> postalar, ana liste 30k civarında e-postaya ulaştığında
üyelere gönderilmektedir.</p>
<p><i>Bug</i>'lar için bir e-posta listesi bulunmaktadır. Bu listeye üye olmak için,
pgsql-bugs-request@PostgreSQL.org adresine, <i>body</i> kısmında</p>
<pre>subscribe<br>end</pre>
<p>yazan bir e-posta atmanız yeterli olacaktır.</p>
<p>Aynı zamanda, geliştiriciler için tartışma listesi bulunmaktadır. Bu listeye
üye olmak için, pgsql-hackers-request@PostgreSQL.org adresine, body kısmında</p>
<pre>subscribe<br>end</pre>
<p>yazan bir e-posta atmanız yeterli olacaktır.</p>
<p>Bunun dışındaki e-posta listelerine ve PostgreSQL hakkında bilgiye, PostgreSQL WWW
ana sayfasından ulasabilirsiniz: <i><a href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</a></i></p>
<p>Aynı zamanda, EFNet üzerinde, <code>#PostgreSQL</code> adlı bir IRC kanalı
bulunmaktadır. Bunun için, <code>irc -c '#PostgreSQL' "$USER" irc.phoenix.net</code>
Unix komutunu kullanabilirsiniz.</p>
<p>Ticari destek veren firmaların listesine</p>
<p><i><a href="http://www.postgresql.org/users-lounge/commercial-support.html">http://www.postgresql.org/users-lounge/commercial-support.html</a></i></p>
<p>adresinden ulaşbilirsiniz.</p>
<h4><a name="1.7">1.7</a>) En son sürüm nedir?</h4>
<p>PostgreSQL'in son sürümü 7.4.6'dır.</p>
<p>Her 6-8 ayda <i>ana sürüm</i> çıkarılması planlanmaktadır.</p>
<h4><a name="1.8">1.8</a>) Hangi belgelere ulaşabilirim?</h4>
<p>Dağıtımın içinde, kitapçıklar, kitapçık sayfaları ve bazı küçük örnekler verilmektedir.
<code>/doc</code> dizinine bakınız. Ayrıca, bu el kitapçıklarını online olarak
<i><a href="http://www.PostgreSQL.org/docs/">http://www.PostgreSQL.org/docs/</a></i> adresinden inceleyebilirsiniz.</p>
<p><i><a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a></i>
ve <i><a href="http://www.commandprompt.com/ppbook">http://www.commandprompt.com/ppbook</a></i>
adreslerinde PostgreSQL kitapları bulunmaktadır. PostgreSQL kitablarının listesine,
<i><a href="http://www.ca.PostgreSQL.org/books/">http://www.ca.PostgreSQL.org/books/</a></i> adresinden ulaşaiblirsiniz.
Ayrıca, PostgreSQL konusundaki teknik makalelere de
<i><a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</a></i> adresinden ulaşabilirsiniz.</p>
<p>psql'in, \d ile baslayan veri tipler, operatorler, fonksiyonlar,
<i>aggregate</i>'ler, vb. ile ilgili güzel komutları vardır.</p>
<p>Web sitemiz daha fazla belgeyi içermektedir.</p>
<h4><a name="1.9">1.9</a>) Bilinen hatalar ya da eksik
özelliklere nereden ulaşabilirim?</h4>
<p>PostgreSQL SQL-92 uyumluluğu içindedir, standartlardan fazla da özellikleri
bulunmaktadır. Bilinen hatalar, eksik özellikler ve gelecek ile ilgili planlar için
TODO listesine bakınız.</p>
<h4><a name="1.10">1.10</a>) Nasıl <small>SQL</small> öğrenebilirim?</h4>
<p><i><a href="http:/www.PostgreSQL.org/docs/awbook.html">http:/www.PostgreSQL.org/docs/awbook.html</a></i>
adresindeki kitap SQL ögretecektir.
<i><a href="http://www.commandprompt.com/ppbook">http://www.commandprompt.com/ppbook</a></i>
adresinde de bir baska PostgreSQL kitabı bulunmaktadır.</p>
<p><i><a href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a></i>,
<i><a href="http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM</a></i>
<i><a href="http://sqlcourse.com">http://sqlcourse.com</a></i>
ve <i><a href="http://sqlcourse2.com">http://sqlcourse2.com</a></i>
adreslerinde de güzel belgeler bulunmaktadır.</p>
<p>Bir başkası da, <i><a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a></i>
adresinde bulunan "<i>Teach Yourself SQL in 21 Days, Second Edition</i>" kitabıdır.</p>
<p>Bazı kullanıcılarımız da şu kitabı önermektedirler: "<i>The Practical SQL Handbook,
Bowman, Judith S., et al.,Addison-Wesley</i>". Bazıları ise "<i>The Complete
Reference SQL, Groff et al., McGraw-Hill</i>" kitabını önermektedirler.</p>
<h4><a name="1.11">1.11</a>) PostgreSQL 2000 yılına uyumlu mudur?</h4>
<p>Evet.</p>
<h4><a name="1.12">1.12</a>) Geliştirme takımına nasıl katılabilirim?</h4>
<p>Öncelikle, en son kaynak kodunu indirin ve web sitemizdeki ya da dağıtımın içindeki
PostgreSQL Developer belgesini okuyun. Ardından, pgsql-hackers ve pgsql-patches
listelerine üye olun. Üçüncü olarak da, pgsql-pacthes listesine yüksek kalitede
yamalar gönderin.</p>
<p>PostgreSQL CVS arşivine erişim izni olan, 10 kadar geliştirici bulunmaktadır.
Hepsi defalarca, diğer kişilerin yaptığından çok daha yüksek-kaliteli yamalar
göndermişlerdir. Ayrıca biz de bu geliştiricilerin ekledikleri yamaların yüksek
kalitede olduğuna güveniyoruz.</p>
<h4><a name="1.13">1.13</a>) Bir hata raporunu nasıl gönderebilirim?</h4>
<p>PostgreSQL BugTool sayfasına gidiniz. O sayfada bir <i>bug</i> bildirmek
için neleri yapmanız gerektiği anlatılmıştır.</p>
<p>Ayrıca, <i><a href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</a></i>
ftp adresimizde, yeni bir PostgreSQL sürümü ya da yaması olup olmadığıni kontrol ediniz.</p>
<h4><a name="1.14">1.14</a>) PostgreSQL, diger DBMS'lerle nasıl karşılastırılabilir?</h4>
<p>Bir yazılımın gücünü ölçmek için çeşitli yollar vardır: Yazılımın özellikleri,
başarımı, güvenilirliği, desteği ve ücreti.</p>
<p>Özellikler:</p>
<p>PostgreSQL mevcut büyük ticari veritabanlarının, <i>transaction</i>,
<i>subselect</i>, <i>trigger</i>, <i>view</i>, <i>foreign key referential integrity</i>
ve <i>sophisticated locking</i> gibi (<i>user-defined types</i>), <i>rules</i>,
<i>inheritance</i> ve <i>lock</i> cakışmalarını düşürmek için <i>multi-version</i>
uyumluluk özellikleri bulunmaktadır.</p>
<p>Performans (Başarım):</p>
<p>PostgreSQL, diğer ticari ve açık kaynak kodlu veritabanlarıyla yakın başarımı sağlar.
Bazı açılardan daha hızlıdır, diğer açılardan da yavaştır. MySQL ya da daha zayıf
veritabanları ile karşılaştırıldığında, <code>INSERT/UPDATE</code> işlemlerinde,
<i>transaction</i> bazlı çalıstığımız için daha yavaşız. MySQL, yukarıdaki "özellikler"
kısmında belirtilenlerden hiç birine sahip değildir. Biz, başarımımızı her sürümde
arttırsak da, esneklik ve gelişmiş özellikler için yapılanmış durumdayız.
PostgreSQL'i MySQL ile karşılaştıran şu web sitesine bakabilirsiniz:
<i><a href="http://openacs.org/why-not-mysql.html">http://openacs.org/why-not-mysql.html</a></i></p>
<p>Güvenilirlik:</p>
<p><i>DBMS</i>'lerin güvenilir olması gerketiği, yoksa değerleri olmayacağını düşünüyoruz.
Çok iyi test edilmiş, dengeli çalısan minimum sayıda hata içeren kod sunmaya çalışıyoruz.
Her bir sürüm en az 1 aylık beta testlerinden geçirilmektedir. Sürüm geçmişine bakarsanız,
üretime hazır, dengeli ve kararlı kodlar sunduğumuzu görebilirsiniz. Bu alanda, diğer
veritabanı yazılımlarına üstünlüğümüz olduğuna inanmaktayız.</p>
<p>Destek:</p>
<p>E-posta listemiz, oluşan herhangi bir sorunu çözebilecek büyük sayıda kullanıcı
ve geliştirici grubunu içerir. Sorununuz için, en az bir ticari veritabanı kadar
rahat çözüm bulabilirsiniz. Gelistiricilere, kullanıcı grubuna, belgelere ve
kaynak koda direk olarak erişebilme, PostgreSQL desteğini, diğer <i>DBMS</i>'lere
göre daha önemli kılar. Gereksinimi olanlara, ticari destek verilebilir.
(Destek için 1.6 bölümüne bakınız.)</p>
<p>Fiyat:</p>
<p>Ticari ve ticari olmayan tüm kullanımlarınız için PostgreSQL ücretsizdir. Kodumuzu,
yukarıda belirtilen BSD-stili lisanstaki sınırlamalar hariç, ürününüzün içine
ekleyebilirsiniz.</p>
<h4><a name="1.15">1.15</a>) PostgreSQL'e maddi açıdan nasıl destek olabilirim?</h4>
<p>PostgreSQL, 1996 yılından beri 1. sınıf altyapıya sahiptir. Bunun için, yıllar
boyu çalışıp bu altyapıyı oluşturup yöneten Marc Fournier'e teşekkürler.</p>
<p>Bir açık kaynak kodlu proje için, kaliteli altyapı çok önemlidir. Bu altyapı,
projenin kesilmesini önler ve projenin ilerlemesini hızlandırır.</p>
<p>Tabii ki bu altyapı ucuz değildir. İşlerin yürümesi için çeşitli yılık ve anlık
harcamalarımız olmaktadır. Eğer siz ya da şirketinizin bu çabamıza bağışta
bulunabilecek parası varsa, lütfen
<i><a href="http://store.pgsql.com/">http://store.pgsql.com/</a></i>
adresine gidiniz ve bağışta, hibede bulununuz.</p>
<p>Web sayfasının 'PostgreSQL Inc.' den bahsetmesine rağmen, "katkıda bulunanlar"
(<i>contributors</i>) maddesi sadece PostgreSQL projesini desteklemek içindir ve
belirli bir şirketin para kaynağı değildir. isterseniz, bağlantı adresine bir
çek gönderebilirsiniz.</p>
<hr>
<h2 align="center">Kullanıcı/İstemci Soruları</h2>
<h4><a name="2.1">2.1</a>) PostgreSQL icin ODBC sürücüleri var mı?</h4>
<p>iki tane ODBC sürücüsü bulunmaktadır: PsqlODBC ve OpenLink ODBC.</p>
<p>PsqlODBC'i http://gborg.postgresql.org/project/psqlodbc/projdisplay.php adresinden
indirebilirsiniz.</p>
<p>OpenLink ODBC http://www.openlinksw.com adresinden alınabilir.Bu sürücü,
kendi standart ODBC istemci yazılımı ile çalıstığından, destekledikleri
her platformda (Win, Mac, Unix, VMS) PostgreSQL ODBC bulunmalidir.</p>
<p>Ücretsiz sürümü olmakla beraber, ticari kalitede destek almak isteyenlere satmak isteyeceklerdir.
Sorularınızı lütfen postgres95@openlink.co.uk adresine gönderiniz.</p>
<h4><a name="2.2">2.2</a>) PostgreSQL'i web sayfalarında kullanabilmek için hangi
araçlar bulunmaktadır?</h4>
<p><i><a href="http://www.webreview.com/">http://www.webreview.com/</a></i> adresinde,
arka planda veritabanı çalıstıran Web sayfaları için giriş seviyesinde bilgi bulunmaktadır.</p>
<p>Web ile bütünleşme için, PHP (<i><a href="http://www.php.net/"></a></i>)
mükemmel bir arabirim sunar.</p>
<p>Karmaşık sorunlar için, çoğu kisi Perl arabirimini ve CGI.pm ya da mod_perl kullanır.</p>
<h4><a name="2.3">2.3</a>) PostgreSQL'in grafik kullanıcı arabirimi var mıdır?</h4>
<p>Çeşitli grafik arabirimlerimiz bulunmaktadır. Bunların arasında,
PgAccess (<i><a href="http://www.pgaccess.org/">http://www.pgaccess.org/</a></i>),
PgAdmin II (<i><a href="http://www.pgadmin.org/">http://www.pgadmin.org/</a></i>, sadece Win32 için),
RHDB Admin (<i><a href="http://sources.redhat.com/rhdb/">http://sources.redhat.com/rhdb/</a></i>)
ve Rekall (<i><a href="http://www.thekompany.com/products/rekall/">http://www.thekompany.com/products/rekall/</a></i>)
bulunmaktadır. Ayrıca, PostgreSQL için web tabanlı bir arabirim olan
PHPPgAdmin (<i><a href="http://phppgadmin.sourceforge.net/">http://phppgadmin.sourceforge.net/</a></i>) bulunmaktadır.</p>
<p>Daha ayrıntılı liste için
<i><a href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</a></i>
adresine bakabilirsiniz.</p>
<h4><a name="2.4">2.4</a>) PostgreSQL ile iletişimi kurabilmek için hangi dilleri kullanabilirim?</h4>
<ul><li>C (libpq)</li>
<li>Embedded C (ecpg)</li>
<li>Java (jdbc)</li>
<li>Python (PyGreSQL)</li>
<li>TCL (libpgtcl)</li></ul>
<p>Diğerleri için, http://gborg.postgresql.org adresindeki Drivers/Interfaces bölümüne
bakabilirsiniz.</p>
<hr>
<h2 align="center">Yönetimsel Sorular</h2>
<h4><a name="3.1">3.1</a>) PostgreSQL'i, <code>/usr/local/pgsql</code> dizininden
başka dizinlere nasıl kurabilirim?</h4>
<p><i>configure</i> betiğini çalıstırırken, <code>--prefix</code> seçeneğini veriniz.</p>
<h4><a name="3.2">3.2</a>) postmaster'i baslattıgımda, a Bad System Call ya da core dumped mesajı alıyorum. Neden?</h4>
<p>Bunun birçok nedeni olabilir. Ancak ilk kontrol edilmesi gereken sey, çekirdeginize
System V uzantılarının kurulu olup olmadıgını kontrol etmek olabilir. PostgreSQL
shared memory ve semaphores için çekirdek destegine gereksinim duyar.</p>
<h4><a name="3.3">3.3</a>) postmaster'i başlattığımda, <code>ıpcMemoryCreate</code>
hatası alıyorum. Neden?</h4>
<p>Ya çekirdeğinizde <i>shared memory</i> desteğiniz düzgünce yapılandırılmamıştır,
ya da çekirdeğinizdeki mevcut <i>shared memory</i> miktarını büyütmeniz gerekecektir.
Gereksinim duyacağınız miktar, mimarinize ve postmaster için ayarladıgınız tampon
ile <i>backend</i> işlemi sayısına bağlıdır. Tüm sistemler için, tamponlar ve
işlemlerde öntanımlı sayılarla, ~ 1MB kadar yere gereksinmeniz olacaktır.
<i><a href="http://www.postgresql.com/docs/7.3/interactive/admin.html">PostgreSQL
7.3.2 Sistem Yöneticileri Rehberi</a></i>'ne, <i>shared memory</i> ve <i>semaphorelar</i>
hakkındaki ayrıntılı bilgi için bakabilirsiniz.</p>
<h4><a name="3.3">3.4</a>) postmaster'ı başlattığımda,
<code>ıpcSemaphoreCreate</code> hatası alıyorum. Neden?</h4>
<p>Eğer hata, "<code>ıpcSemaphoreCreate: semget failed (No space left on device)</code>"
ise, çekirdeğiniz yeterli <i>semaphore</i> ile yapılandırılmamış demektir. Postgres, her
bir potansiyel <i>backend</i> için bir <i>semaphore</i> gereksinimi duyar. Geçici
bir çözüm, postmasterı <i>backend</i> işlemleri için daha az miktarda sınırla
başlatmak olabilir. <code>-N</code>'i varsayılan değer olan 32'den küçük bir
değerle başlatınız. Daha kalıcı bir çözüm, çekirdeğinizin <code>SEMMNS</code> ve
<code>SEMMNI</code> parametrelerini yükseltmek olacaktır.</p>
<p>Çalışmayan <i>semaphore</i>'lar ağır veritabanı işlemlerinde çökme yaratabilirler.</p>
<p>Eğer hata mesajınız başka bir şey ise, çekirdeğinizde <i>semaphore</i> desteğini
yapılandırmamış olabilirsiniz. <i>Shared memory</i> ve <i>semaphore</i>'lar hakkındaki
daha ayrıntılı bilgi için
<i><a href="http://www.postgresql.com/docs/7.3/interactive/admin.html">PostgreSQL
7.3.2 Sistem Yöneticileri Rehberi</a></i>'ne bakabilirsiniz.</p>
<h4><a name="3.5">3.5</a>) Diger bilgisayarların benim PostgreSQL veritabanı
sunucuma bağlantılarını nasıl kontrol edebilirim?</h4>
<p>Ön tanımlı olarak, PostgreSQL sadece yerel makineden <i>Unix domain sockets</i>
kullanarak bağlanılmasına izin verir. Diger makineler, postmaster'a <code>-i</code>
etiketini geçirmezseniz ve <code>$PGDATA/pg_hba.conf</code> dosyasını düzenleyerek
<i>host-based authentication</i>'a olanak vermezseniz, bağlantı yapamayacaklardır.</p>
<h4><a name="3.6">3.6</a>) Veritabani motorunu daha iyi
başarım için nasıl ayarlayabilirim?</h4>
<p><i>Index</i>'ler sorguları hızlandırabilir. <code>EXPLAIN</code> komutu,
PostgreSQL'in sorgunuzu nasıl yorumladığını ve hangi <i>index</i>'leri kullandığını
görmenize izin verir.</p>
<p>Eğer cok fazla <code>INSERT</code> işlemi yapıyorsanız, bunları büyük bir
toplu işlem dosyasıkullanıp <code>COPY</code> komutu ile veritabanına girmeyi
deneyiniz. Bu, tekil <code>INSERT</code>'lerden daha hızlıdır. İkinci olarak,
<code>BEGIN WORK/COMMIT</code> <i>transaction</i> bloğu içinde olmayan ifadeler kendi
<i>transaction</i>'larındaymış gibi düşünülür. Çoklu ifadeleri tek bir
<i>transaction</i> bloğu içinde yapabilirsiniz. Bu, <i>transaction overhead</i>'ini
düşürecektir. Tek bir <i>transaction</i> bloğu içinde birden çok ifadeyi çalıştırmayı
deneyebilirsiniz. Bu da aynı şekilde, <i>transaction overhead</i>'ini düşürür.</p>
<p>Çeşitli ayarlama seçenekleri mevcuttur. <code>fsync()</code> işlemini, postmaster'ı
<code>-o -F</code> seçeneği ile başlatarak devre dışı bırakabilirsiniz. Bu işlem,
<code>fsync()</code>'lerin her <i>transactiondan</i> sonra diski <i>flush</i> etmesini
engelleyecektir.</p>
<p>Aynı zamanda, postmaster'i <code>-B</code> seçeneği ile başlatıp, <i>backend</i>
işlemleri tarafından kullanılan <i>shared memory buffers</i> sayılarını arttırabilirsiniz.
Eğer bu parametreyi çok yüksek tutarsanız, çekirdeğinizin <i>shared memory</i>
bölgesindeki limiti aşma olasılığınız yüzünden postmaster başlayamayabilir. Her bir
tampon (<i>buffer</i>) 8K'dır. Öntanımlı sayı ise 64 tampondur.</p>
<p>Aynı şekilde, backend'in <code>-S</code> seçeneğini geçici sıralamalar için
<i>backend</i> süreçleri tarafından kullanılacak hafızayı arttırmak amacıyla
kullanabilirsiniz. <code>-S</code> seçeneği kilobayt cinsinden değer alır ve ön
tanımlı değeri 512'dir (512 K)</p>
<p>Tablolardaki veriyi bir <i>index</i>'e eşlemek amacıyla gruplama için
<code>CLUSTER</code> komutunu kullanabilirsiniz. Ayrıntılı bilgi için
<code>CLUSTER</code> komutunun yardım sayfasına bakabilirsiniz.</p>
<h4><a name="3.7">3.7</a>) Hangi hata ayıklama özellikleri bulunmaktadır?</h4>
<p>PostgreSQL, hata ayıklama amacıyla kullanılabilecek durum bilgisi
rapor eden çeşitli özeliklere sahiptir.</p>
<p>Öncelikle, <i>configure</i> betiğini <code>--enable-cassert</code> seçeneğiyle
çalıştırırsanız, bir çok <code>assert() backend</code> calışmasını gözlemler ve
beklenmeyen bir durumda programı durdurur.</p>
<p>Postmaster ve postgres çeşitli hata ayıklama seçeneklerine sahiptir. Öncelikle,
postmaster'ı başlattığınızda, standart çıktıyı ve hataları bir log dosyasına
yönlendirdiğinize emin olun:</p>
<pre>cd /usr/local/pgsql<br>./bin/postmaster >server.log 2>&amp;1 &amp;</pre>
<p>Bu işlem PostgreSQL ana dizinine <code>server.log</code> dosyası yerleştirecektir.
Bu dosya sunucunun yaşadığı sorunlar ya da hatalar hakkında yararlı bilgiler içerir.
<code>-d</code> seçeneği, hata ayıklama seviyesini belirten bir rakam ile kullanılır.
Yüksek hata ayıklama seviyelerinin büyük log dosyaları oluşturacağını unutmayınız.</p>
<p>Eğer postmaster çalışmıyorsa, <code>postgres backend</code>'ini komut satırından
çalıştırabilir ve SQL ifadenizi direk olarak yazabilirsiniz. Bu sadece hata ayıklama
amacıyla önerilir. Burada, noktalı virgülün değil de yeni bir satırın sorguyu
sonlandırdığını unutmayınız. Eğer hata ayıklama sembolleri ile derlediyseniz,
ne olduğunu görmek için bir hata ayıklayıcı kullanabilirsiniz. <i>backend</i>
postmaster'dan başlatılmadığından, eşdeğer bir ortamda çalışmamaktadır ve
<i>locking/backend</i> etkileşim sorunları artabilir.</p>
<p>Eğer postmaster çalışıyorsa, bir pencerede psql'i çalıştırın ve psql tarafından
kullanılan postgres sürecinin süreç numarasını (<code>PID</code>) bulun. Postgres
süreci ile ilişkilendirmek için bir hata ayıklarıcı kullanın. Sorguları psql aracılığı
ile çalıştırabilirsiniz. Eğer postgres başlangıcında hata ayıklamak istiyorsanız,
<code>PGOPTIONS="-W n"</code> seçeneğini ayarlayabilir ve psql'i başlatabilirsiniz.
Bu işlem, başlangıcın <code>n</code> saniye kadar gecikmesini sağlayacaktır; böylece
hata ayıklayıcıyı sürece ilişkilendirdikten sonra başlangıç sürecinin devam etmesini
sağlayabilirsiniz.</p>
<p>postgres programı hata ayıklama ve başarım ölçümleri için <code>-s</code>,
<code>-A</code> ve <code>-t</code> seçeneklerine sahiptir.</p>
<h4><a name="3.8">3.8</a>) Bağlanmaya çalışırken, neden "<i>Sorry, too many
clients</i>" hatasını alıyorum?</h4>
<p>Postmaster'ın eşzamanlı olarak başlatabileceği <i>backend</i> süreçleri
sınırlarını arttırmanız gerekmektedir.</p>
<p>Ön tanımlı değer 32 süreçtir. Bunu, postmaster'ı uygun <code>-N</code>
değeri ile ya da <code>postgresql.conf</code> dosyasını düzenleyerek yeniden
başlatmakla arttırabilirsiniz.</p>
<p>Eğer <code>-N</code> değerini 32'den büyük yapacaksanız, aynı zamanda
<code>-B</code> değerini de değiştirmeniz gerektiğini unutmayın. <code>-B</code>,
<code>-N</code>'nin en az 2 katı kadar olmalıdır; daha iyi başarım için bu sayıyı daha
da arttırmalısınız. Yüksek sayıdaki <i>backend</i> süreçleri için, çeşitli çekirdek
yapılandırma parametrelerini arttırmanız gerekecektir. Yapılması gerekenler,
<code>SHMMAX</code>, <code>SEMMNS</code>, <code>SEMMNI</code>, <code>NPROC</code>,
<code>MAXUPRC</code> ve açılabilecek dosyaların maksimum sayısı olan <code>NFILE</code>
ve <code>NINODE</code> değerlerini karıştırmaktır. Bunun nedeni, PostgreSQL'in izin
verilen <i>backend</i> süreçlerinin sayısı üzerinde bir sınırı olmasıdır. Böylelikle
sistem kaynaklarının dışına çıkılmayacaktır.</p>
<p>PostgreSQL'in 6.5 sürümüne kadar, en fazla <i>backend</i> sayısı 64 idi ve bunu
değiştirmek için <code>include/storage/sinvaladt.h</code> dosyası içindeki
<code>MaxBAckendid</code> sabitini değiştirdek sonra yazılımı yeniden
derlemek gerekiyordu.</p>
<h4><a name="3.9">3.9</a>) <code>pgsql_tmp</code> dizinin içindeki dosyalar nelerdir?</h4>
<p>Sorgu çalıstırıcı (<i>query executer</i>) tarafından yaratılan geçici dosyalardır.
Örnegin, bir sıralama <code>ORDER BY</code> ile yapılacaksa ve sıralama
<code>backend</code>'in <code>-s</code> parametresinin izin verdiğinden daha
fazla alana gereksinim duyuyorsa, ekstra veriyi tutmak için geçici dosyalar yaratılır.</p>
<p>Geçici dosyalar, eğer sıralama sırasında <i>backend</i> göçmezse otomatik olarak
silinecektir. Eğer çalışan durumda bir <i>backend</i>'iniz yoksa,
<code>pg_tempNNN.NN</code> dosyalarını silmeniz güvenlidir.</p>
<h4><a name="3.10">3.10</a>) PostgreSQL sürümlerini yükseltmek için neden bir
dump/reload işlemi gerçekleştirmek zorundayım?</h4>
<p>PostgreSQL takımı ara sürümlerde sadece küçük değişiklikler yapmaktadır;
bu yüzden 7.2 sürümünden 7.2.1'e yükseltmek <i>dump/restore</i> işlemi
gerekmemektedir. Ancak, esas sürümlerde (örnek: 7.2'den 7.3'e) çoğunlukla sistem
tablolarının ve veri dosyalarının iç yapısı değiştirilir. Bu değişiklikler çoğunlukla
karmaşıktır; dolayısıyla veri dosyalarının geriye dönük uyumluluğu işlemlerini
yapmıyoruz. <i>Dump</i> işlemi, veriyi genel biçimde alacağından yeniden yükleme
esnasında veri, yeni iç biçime uygun şekilde yerleştirilecektir.</p>
<p>Disk biçiminin değişmediği sürümlerde, <code>pg_upgrade</code> betiği güncellemenin
bir <i>dump/restore</i> gerektirmeden yapılmasını sağlayacaktır. <i>pg_upgrade</i>
betiğinin o sürüm için bulunup bulunmadığını sürüm notları içinde bulabilirsiniz.</p>
<h4><a name="3.11">3.11</a>) Nasıl bir donanım kullanmalıyım? </h4>
<p> PC donanımı tamamen uyumlu olduğu için, insanlar tüm PC donanımlarının aynı kalitede olduğunu
düşünürler. Oysa böyle değildir. ECC RAM, SCSI ve kaliteli anakartlar daha ucuz donanımlara göre daha
çok güvenilirlerdir ve başarımları daha yüksektir. PostgreSQL hemen hemen tüm donanımda
çalışabilmektedir, ancak güvenilirlik ve başarım önemli ise donanım seçeneklerini çok iyi araştırmak
gereklidir. E-posta listelerimi donanımlarla ilgili sorular ve de ticaret için kullanılabilir.</p>
<hr>
<h2 align="center">İşletimsel Sorular</h2>
<h4><a name="4.1">4.1</a>) <i>Binary cursor</i> ve <i>normal cursor</i>
arasındaki fark nedir?</h4>
<p><code>DECLARE</code> yardım sayfasına bakınız.</p>
<h4><a name="4.2">4.2</a>) Sorgunun sadece ilk birkaç satırını
nasıl <code>SELECT</code> edebilirim?</h4>
<p><code>FETCH</code> yardım sayfasına bakınız, ya da <code>SELECT</code> ...
<code>LIMIT</code> ... kullanınız.</p>
<p>İlk birkaç satırı almak isteseniz bile, tüm sorgu değerlendirilmek durumunda kalınabilir. ORDER
BY içeren bir sorgu düşünün. Eğer ORDER BY işe eşleşen bir index varsa, PostgreSQL istenen ilk birkaç
satırı işleyebilir, ya da tüm sorgu istenen satırlar üretilene kadar işlenebilir. </p>
<h4><a name="4.3">4.3</a>) psql'in içinde gördügüm tabloların ya da diğer
şeylerin listesini nasıl alabilirim?</h4>
<p><code>pgsql/src/bin/psql/describe.c</code> içindeki psql kaynak kodunu
okuyabilirsiniz. Bu kod, psql'in <code>\</code> ile başlayan komutlarının
çıktısını olusturan SQL komutlarını içerir. Aynı zamanda, psql'i <code>-E</code>
seçeneği ile başlatıp, verdiğiniz komutları çalıştırmak için yaptığı
sorguların çıktılarını görebilirsiniz.</p>
<h4><a name="4.4">4.4</a>) Bir tablodan bir kolonu nasıl kaldırabilirim?</h4>
<p>Bu özellik (<code>ALTER TABLE DROP COLUMN</code>) 7.3 sürümü ile gelmiştir.
Eski sürümlerde aşağıdakileri uygulamalısınız: </p>
<pre>
BEGIN;
LOCK TABLE old_table;
SELECT ... -- select all columns but the one you want to remove
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
</pre>
<h4><a name="4.5">4.5</a>) Bir satır, tablo ve veritabanı için en
fazla büyüklük nedir?</h4>
<p>Sınırlar:</p>
<p>Veritabanı için en fazla büyüklük nedir?<br>Sınırsız (32 TB'lık veritabanı bulunmaktadır)<br><br>
Bir tablo için en fazla büyüklük nedir?<br>32 TB<br><br>
Bir satır için en fazla büyüklük nedir?<br>1.6 TB<br><br>
Bir alan için en fazla büyüklük nedir?<br>1 GB<br><br>
Tabloda en fazla satır sayısı kaçtır?<br>Sınırsız<br><br>
Bir tabloda olabilecek en fazla kolon sayısı kaçtır?<br>Kolon tiplerine bağlı olarak 250-1600<br><br>
Bir tabloda olabilecek en fazla <i>index</i> sayısı kaçtır?<br>Sınırsız</p>
<p>Tabii ki bunlar aslında sınırsız degildir. Burada belirtilen sınırlar, fiziksel
sınırların haricindeki sınırlardır. Boş disk alanı, hafıza/takas alanı na bağlı
sınırlamalar vardır. Başarım, sınır değerlere yaklaştıkça, ya da değerler çok büyük
olduğunda düşebilir.</p>
<p>Bir tablo için büyüklük sınırı olan 32 TB, işletim sisteminin büyük dosya desteği olup
olmamasından bağımsızdır. Büyük tablolar, 1 GB'lik dosyalarda saklandığı için, dosya
sistemi sınırlarınin bir önemi yoktur.</p>
<p>Tablo ve kolon sayısı büyüklükleri, ön tanımlı blok büyüklüğü 32k ya çıkarılarak
arttırılabilir.</p>
<h4><a name="4.6">4.6</a>) Tipik bir metin dosyasındaki veriyi saklamak için ne
kadar disk alanı gereklidir?</h4>
<p>Bir PostgreSQL veritabanı, veriyi "<i>flat</i>" metin dosyasında saklamak için
gereken alanın 5 kat fazla disk alanına gereksinim duyabilir.</p>
<p>Her satırında bir tamsayı ve metin (<i>text</i>) içeren, 100.000 satırlık bir
dosya düşünün. Her satırın ortalama 20 byte olduğunu farzedelim. Metin dosyası
2.8 MB olacaktır. Bu veriyi tutan PostgreSQL veritabanı
yaklaşık 6.4 MB yer kaplayacaktır.</p>
<pre>
36 byte: Her bir satır başlığı (yaklaşık)
+ 24 byte: Bir tamsayı (int) alanı ve bir metin (text) alanı
+ 4 byte: Sayfada tuple a pointer
----------------------------------------
64 byte -> kayıt başına</pre>
<p>PostgreSQL'de veri sayfası (data page) büyüklüğü 8192 byte (8k)dır, dolayısıyla:</p>
<pre>
8192 byte -> page başına
------------------------- = Her bir veritabanı <i>page</i>'ı başına 128 satır (yaklaşık)
Satır başına 64 byte
100000 veri satırı
-------------------- = 782 veritabanı sayfası
128 satır</pre>
<p>782 veritabanı sayfası <code>*</code> sayfa başına <code>8192 byte =
6,406,144 bytes (6.4 MB)</code></p>
<p><i>Index</i>'ler çok fazla yere gereksinim duymazlar, ama <i>index</i>'lenmiş
veriyi tutacaklarından büyük olabilirler.</p>
<p><code>NULL</code> değerler bitmapler içinde tutulur; dolayısıyla çok az yer kaplarlar.</p>
<h4><a name="4.7">4.7</a>) Veritabanında hangi tablo ya da <i>index</i>'lerin
tanımlandığını nasıl görebilirim?</h4>
<p>psql, bu tür bilgileri göstermek için, <code>\</code> ile başlayan bir çok
komut sunmaktadır. <code>\?</code> komutu ile bu komutları görebilirsiniz. Ayrıca,
bunları açıklayan ve <code>pg_</code> ile başlayan çok sayıda sistem tablosu
bulunmaktadır. Aynı zamanda, <code>psql -l</code> ile tüm veritabanlarını
listeyelebirsiniz.</p>
<p>Ayrıca, <code>pgsql/src/tutorial/syscat.source</code> kodunu inceleyebilirsiniz.
Bu dosya, veritabanı sistem dosyalarından bilgiyi almak için gereksinim duyulan
bir çok <code>SELECT</code>'leri gösterir.</p>
<h4><a name="4.8">4.8</a>) Sorgularım cok yavaş, ya da <i>index</i>'lerimi
kullanmıyorlar. Neden?</h4>
<p>Indexler her sorgu tarafından otomatik olarak kullanılmazlar. Indexler eğer bir
tablonun büyüklüğü minimum bir büyüklükten fazla ise ve sorgu tablodaki satırların sadece küçük bir
yüzdesini seçiyorsa kullanılır. Bunun nedeni, index erişiminin neden olduğu raslansal disk erişimi
nin diskin ya da tablonun sıralı okunmasından daha yavas olabilmesidir.</p>
<p>Bir index'in kullanılıp kullanılmayacağını belirlemek için, PostgreSQL tablo hakkındaki
istatistiklere gereksinmesi vardır. Bu istatistikler, <small>VACUUM ANALYZE</small> kullanılarak
toplanırlar. Optimizer, istatistikleri kullanarak, tabloda kaç satır olduğunu ve bilir ve indexin
kullanılıp kullanılmayacağına daha iyi karar verir. Istatistikler, aynı zamanda en uygun join
sırasını ve yöntemini belirlemekte çok önemlidir. İstatistik toplanması, tablo içerikleri
değiştikçe periyodik olarak yapılmalıdır.</p>
<p>Indexler normalde <small>ORDER BY</small> sorguları ya da join işlemlerini gerçekleştirmek için
kullanılmazlar. Açık bir sıralamayı takip eden sıralı bir arama (sequential scan), büyük bir tabloda index
araması yapmaktan genelde daha hızlıdır.</p>
Ancak, <small>ORDER BY</small> ile birleşmiş <small>LIMIT</small>
genellikle bir index kullanacaktır; çünkü tablonun sadece belirli bir miktarı döndürülecektir.
Aslında, MAX() ve MIN() fonksiyonlarının index kullanmamalarından dolayı, bu gibi değerleri ORDER BY ve LIMIT
kullanarak da almak olasıdır:
<pre>
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
</pre>
<p>Eğer optimizer'ın sıralı arama yapmasının yanlış olduğuna inanıyorsanız, <code>SET enable_seqscan TO
'off'</code> kullanın ve index kullanan aramaların hala daha hızlı olup olmadığını görün.</p>
<p><code>LIKE</code> ya da <code>~</code> gibi operatörler kullanıyorsanız,
<i>index</i>'ler sadece aşağıdaki koşullarda kullanılabilir:</p>
<ul>
<li>Arama dizininin başı, dizinin başı ile bağlanmalıdır. Yani,
<ul><li><code>LIKE</code> sorguları <code>%</code> ile başlamamalıdır.</li>
<li>Düzenli ifade sorguları <code>^</code> işe başlamamalıdır.</li></ul></li>
<li>Arama metni bir karakter sınıfı ile başlayamaz. Örnek: <code>[a-e]</code></li>
<li><code>ILIKE</code> ve <code>~*</code> gibi büyük/küçük harfe duyarsız
aramalar <i>index</i>'lerden yararlanmazlar. Onun yerine, bölüm 4.12'de anlatılan
fonksiyonel <i>index</i>'leri kullanabilirsiniz.</li>
<li><i>initdb</i> sırasında öntanımlı <i>C locale</i>'i kullanılmalıdır.</li>
</ul>
<h4><a name="4.9">4.9</a>) <i>query-optimizer</i>'ın sorgularımı nasıl
değerlendirdiğini, işleme soktuğunu nasıl görebilirim?</h4>
<p><code>EXPLAIN</code> yardım sayfasına bakınız.</p>
<h4><a name="4.10">4.10</a>) <i>R-tree index</i> nedir?</h4>
<p>R-tree index, uzaysal (spatial) verileri indexlemek için kullanılır. Bir hash
index, dizi aramalarında (range search) kullanılamaz. B-tree index dizi aramalarında sadece tek
boyutlu çalışmaktadır. R-tree, çok boyutlu veriyi destekler. Örneğin, eğer bir R-tree index point
veri tipi üzerinde inşa edililebilirse, sistem "select all points within a bounding rectangle"
gibi sorgulara daha verimli yanıtlar verecektir.</p>
<p>Orijinal R-tree tasarımını açıklayan belge:</p>
<p>Guttman, A. "R-trees: A Dynamic Index Structure for Spatial Searching."
Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.</p>
<p>Bu belgeyi, Stonebraker'ın "Readings in Database Systems" kitabında bulabilirsiniz.</p>
<p>Gömülü R-tree indexleri poligon ve boxları kullanabilir. Teorik olarak,
R-tree indexlerin özelliklerini genişletmek bir miktar çaba gerektirir ve bunun nasıl
yapılacağına dair bir belgemiz henüz bulunmamaktadır.</p>
<h4><a name="4.11">4.11</a>) <i>Genetic Query Optimizer</i> nedir?</h4>
<p><i>GEQO</i> modülü, <i>Genetic Algorithm(GA)</i> kullanılarak tablolar
birleştirildiğinde sorgu optimizasyonunu hızlandırır. </p>
<h4><a name="4.12">4.12</a>) Düzenli ifade (<i>Regular Expression</i>) aramalarını
ve büyük/küçük harfe duyarsız aramaları nasıl yapabilirim?
Bu büyük(küçük harfe duyarlı aramalar için <i>index</i>'i nasıl kullanabilirim?</h4>
<p><code>~</code> operatörü düzenli ifade eşleşmesi ve <code>~*</code> büyük/küçük
harfe duyarsız düzenli ifade eşleşmesi yapar. Büyük/küçük harfe duyarlı olan
<code>LIKE</code>'ın büyük/küçük harfe duyarsız olan biçimi <code>ILIKE</code>'tır
ve PostgreSQL 7.1 sürümü ile birlikte gelmiştir.</p>
<p>Büyük-küçük harfe duyarsız eşitlik karşılaştırmaları aşağıdaki gibi ifade edilir:</p>
<pre>
SELECT *
FROM tab
WHERE lower(col) = 'abc'
</pre>
<p>Bu standart bir <i>index</i> yaratmayacaktır. Ancak eğer fonksiyonel bir
<i>index</i> yaratırsanız; o kullanılacaktır:</p>
<pre>CREATE INDEX tabindex on tab (lower(col));</pre>
<h4><a name="4.13">4.13</a>) Bir sorguda, bir alanin "<code>NULL</code>" olduğunu
nasıl ortaya çıkarabilirim?</h4>
<p>Kolonu, <code>IS NULL</code> ve <code>IS NOT NULL</code> ile test edebilirsiniz.</p>
<h4><a name="4.14">4.14</a>) Çesitli karakter tipleri arasındaki farklar nelerdir?</h4>
<pre>
Veri Tipi İç Adı Not
--------------------------------------------------
VARCHAR(n) varchar boyut en büyük uzunluğu verir; sadece verilen kadar veri tutulur.
CHAR(n) bpchar belirtilen uzunluğa kadar sonuna boşluk eklenir.
TEXT text uzunlukta herhangi bir üst sınır yoktur.
BYTEA bytea variable-length byte array (null-byte safe)
"char" char bir karakter
</pre>
<p>İç adları (<i>internal name</i>) sistem kataloglarını ve
bazı hata mesajlarını incelerken göreceksiniz.</p>
<p>İlk dört veri tipi "<i>varlena</i>" tipidir (yani, diskteki ilk 4 bayt uzunluktur;
devamı da veridir.) Dolayısıyla, kullanılan gerçek alan, belirtilen alandan biraz
daha büyüktür. Ancak, bu veri tipleri, sıkıştırılmaya tabi tutulabilir; dolayısıyla
disk alanı beklenilenden küçük olabilir. <code>VARCHAR(<i>n</i>)</code> büyüklüğü
artabilen ama en büyük uzunluğu sınırlı olan verileri saklamak için en uygun yöntemdir.
<code>TEXT</code>, 1 GB büyüklüğe kadar olan verileri tutmak için kullanılır.</p>
<p><code>CHAR(<i>n</i>)</code>, aynı uzunluktaki dizilerin saklanması için kullanımır.
<code>CHAR(<i>n</i>)</code> belirtilen uzunluğa kadar boşluk ile doldurur; ancak
<code>VARCHAR(<i>n</i>)</code> sadece verilen karakterleri saklar. <code>BYTEA</code>
binary veri saklamak içindir; ayrıca "<code>NULL</code>" bayt içeren değerleri de saklar.
Burada anlatılan üç veri tipi de benzer başarım karakteristiklere sahiptir.</p>
<h4><a name="4.15.1">4.15.1</a>) Nasıl <i>serial</i>/otomatik artan
(<i>auto-incrementing</i>) bir alan yaratabilirim?</h4>
<p>PostgreSQL'de <code>SERIAL</code> veri tipi vardır. Bu veri tipi bir
<i>sequence</i> ve kolon üzerinde bir <i>index</i> yaratır.</p>
<p>Örnek, aşağıdaki sorgu:</p>
<pre>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</pre>
<p>buna çevrilir:</p>
<pre>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
</pre>
<p><i>Sequenceler</i> hakkında daha fazla bilgi için <i>create_sequence</i>
yardım sayfasına bakabilirsiniz. Her satırın <code>OID</code> alanını tekil bir sayı
olarak alabilirsiniz. Ancak, veritabanınızın <i>dump</i>'ını alıp yeniden yüklerseniz,
<code>OID</code> değerlerini koruyabilmek için <code>pg_dump</code>'ın <code>-o</code>
parametresini ya da "<code>COPY WITH OIDS</code>" seçeneğini kullanmanız gerekecektir.</p>
<h4><a name="4.15.2">4.15.2</a>) <code>SERIAL</code> girişinin degerini nasıl alabilirim?</h4>
<p>Bir yaklaşım, sequence nesnesindeki SERIAL değerini, veriyi girmeden önce nextval() ile alıp,
aldığınız değeri kendinizin girmesidir. 4.15.1'deki örnek tabloyu kullanarak bir örnek verelim:</p>
<pre>new_id = execute("SELECT nextval('person_id_seq')");<BR>
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");</pre>
<P>Diğer sorgular için new_id'de yeni değerin saklanması gerekir. Otomatik olarak yaratılan SEQUENE nesnesinin adı,
&lt;tablo adı&gt;_&lt;serial kolonu adı&gt;_seq şeklinde olacaktır (&lt; &gt; işaretleri olmadan).</p>
<p>Alternatif olarak, atanmış SERIAL değerini, değer girildikten sonra currval()
fonksiyonu ile alabilirsiniz:</p>
<pre>
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
</pre>
<p>Son olarak, ön tanımlı değeri bulmak için <code>INSERT</code> ifadesinden
dönen <code>OID</code> değerini kullanabilirsiniz; ancak bu en az taşınabilir
çözüm olacaktır. Perl'de, Edmund Mergl'in <i>DBD:Pg</i> mödülü ile birlikte
<i>DBI</i> kullanarak, <code>OID</code> değeri <code>$sth->execute()</code>
çalıştırıldıktan sonra <code>$sth->(pg_oid_status)</code> ile alınabilir.</p>
<h4><a name="4.15.3">4.15.3</a>) <code>currval()</code> ve <code>nextval()</code>
diğer kullanıcılara sorun yaratmaz mı?</h4>
<p>Hayır. <code>curval()</code>, tüm kullanıcılar değil, backend
tarafından atanan geçerli değeri döndürür.</p>
<h4><a name="4.15.4">4.15.4</a>) Neden <i>sequence</i> sayıları <i>transaction</i>
işleminin iptalinden sonra yeniden kullanılıyor? Neden <i>sequence/SERIAL</i>
kolonumdaki sayılarda atlamalar oluyor?</h4>
<p>Uyumluluğu arttırmak için, <i>sequence</i> değerleri çalışan
<i>transaction</i>'lara gerektiği şekilde aktarılır ve <i>transaction</i>
bitene kadar o değer kilitlenmez. Bu, iptal edilen <i>transaction</i>
işlemleri nedeniyle boşluklara neden olur.</p>
<h4><a name="4.16">4.16</a>) OID nedir? TID nedir?</h4>
<p>OIDler, tekil satır numaralarına PostgreSQL'in yanıtıdır. PostgreSQL'de yaratılan
her sayı, tekil bir OID alır. initdb işlemi sırasında yaratılan tüm OID'ler 16384'ten küçüktür
(backend/access/transam.h). Kullanıcılar tarafından yaratılan tüm OID'ler bu sayıya eşit ya da bu
sayıdan büyüktür. Varsayılan durumda, tüm bu OIDler sadece bir tablo ya da veritabanında değil, tüm
PostgreSQL kurulumunda tekildir.</p>
<p> PostgreSQL OIDleri, tablolar arasında satırları ilişkilendirmek için kendi iç tablolarında
kullanır. Bu OIDler belirli kullanıcı satırlarını belirtmek için kullanabilir ve join işlemlerinde
kullanılır. OID değerlerini saklamak için OID kolon tipini kullanmanız önerinir. Daha hızlı bir
erişim için, OID alanında bir index yaratabilirsiniz.</p>
<p>OID'ler yeni satırlara, tüm veritabanları tarafında kullanılan ortak bir alandan atanırlar. Eğer
OID'i başka bir değere eşitlemek isterseniz ya da tablonun bir kopyasını orijinal OIDler ile
çıkarmak isterseniz, bu mümkündür:</p>
<pre>
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
</pre>
<p>OIDler 4-bit tamsayı olarak saklanırlar ve 4 milyarda overflow olacaktır. Kimse
bu sayıya ulaştığına dair bir bilgi iletmedi ve bu sınırı kimse bu sınıra ulaşmadan kaldıracağız.</p>
<p>TIDler, belirli fiziksel satırlar block ve offset değerleri ile belirtmekte kullanılır. TIDler,
satırlar değiştiğinde ya da yeniden yüklendiğinde değişirler. Index girdileri tarafından fiziksel
satırları göstermek için kullanılırlar.</p>
<h4><a name="4.17">4.17</a>) PostgreSQL'de kullanılan bazı
terimlerin anlamları nelerdir?</h4>
<p>Kaynak kodun bir kısmı ve eski belgeler, daha geniş kullanım alanı olan terimleri
kullanırlar. Bunların bazıları:</p>
<ul><li>table, relation, class</li>
<li>row, record, tuple</li>
<li>column, field, attribute</li>
<li>retrieve, select</li>
<li>replace, update</li>
<li>append, insert</li>
<li>OID, serial value</li>
<li>portal, cursor</li>
<li>range variable, table name, table alias</li></ul>
<p>Genel veritabanı terimleri,
<i><a href="http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</a></i>
adresinde bulunabilir.</p>
<h4><a name="4.18">4.18</a>) Neden "<i>ERROR: Memory exhausted in AllocSetAlloc()</i>"
hatasını alıyorum?</h4>
<p>Sisteminizde sanal belleğinizi tüketmiş olabilirsiniz, ya da çekirdeğiniz
belli kaynaklar icin düşük bir sınıra sahip olabilir. <i>postmaster</i>
başlatmadan önce aşağıdakileri deneyebilirsiniz:</p>
<pre>
ulimit -d 262144
limit datasize 256m
</pre>
<p>Kabuğunuza bağlı olarak, bunlardan sadece biri olumlu sonuç verecektir, ama
bu işlem veri segment sınırınızı arttıracak, ve belki de sorgunuzun tamamlanmasını
sağlayacaktır. Bu komut, varolan işleme (<i>current process</i>) ve komut çalıştırıldıktan
sonraki tüm alt işlemlere uygulanır. Eğer SQL istemcinizle, <i>backend</i>'in çok
fazla veri döndürmesi nedeniyle bir sorun yaşıyorsanız, bunu istemciyi başlatmadan
önce deneyiniz.</p>
<h4><a name="4.19">4.19</a>) Hangi PostgreSQL sürümünü çalıştırdığımı nasıl görebilirim?</h4>
<p>psql arabiriminde, <code>select version();</code> yazınız.</p>
<h4><a name="4.20">4.20</a>) Neden <i>large-object</i> işlemlerim, "<i>invalid large obj
descriptor</i>" hatasını veriyor?</h4>
<p><i>Large object</i> işlemlerinizin uçlarına, yani <code>lo_open</code> ...
<code>lo_close</code> komutlarının çevresine, <code>BEGIN WORK</code> ve
<code>COMMIT</code> koymanız gerekmektedir;</p>
<p>Şu anda, PostgreSQL kuralları large objectleri transaction commit edildiğinde kapatarak
uygulamaktadır. Dolayısıyla handle ile yapılacak ilk şey <i>invalid large obj descriptor</i> hatası
ile sonuçlanacaktır.Dolayısıyla çalışan kodunuz eğer transaction kullanmazsanız hata mesajları
üretecektir.</p>
<p>Eğer ODBC gibi bir istemci arabirimi kullanıyorsanız, <i>auto-commit</i>'i
kapatmanız gerekebilir.</p>
<h4><a name="4.21">4.21</a>) Şu andaki zamanı öntanımlı değer olarak
kabul eden <b>How do I create a column that will default to the current time?</b></h4>
<p>Alttakini kullanabilirsiniz:</p>
<pre>
CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</pre>
<h4><a name="4.22">4.22</a>) Neden <code>IN</code> kullanan <i>subquery</i>'lerim
çok yavas?</h4>
<p>7.4 sürümünden önce, subqueryler. Eğer subquery sadece birkaç satır ve outer query bol
sayıda satır döndürüyorsa, IN en hızlısıdır. Sorguları hızlandırmak için IN yerine EXISTS
kullanın:</p>
<pre>
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
</pre>
<p>sorgusunu, aşağıdaki ile değiştirin:</p>
<pre>
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
</pre>
<p>Bu işlemin hızlı olması için, subcol'un indexlenmiş bir kolon olması gerekmektedir.</p>
<p>7.4 sürümü ve sonrasında, IN aslında normal sorgularla aynı karmaşık join tekniklerini kullanır ve
EXISTS'e tercih edilir.</p>
<h4><a name="4.23">4.23</a>) <i>Outer join</i> işlemini nasıl yapabilirim?</h4>
<p>PostgreSQL outer joins islemlerini SQL standartlarını kullanarak
gerçekleştirmektedir. Aşağıda 2 örnek bulunmaktadır:</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre>
<p>ya da</p>
<pre>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</pre>
<p>Bu özdeş sorgular t1.col' i t2.col'ye <i>join</i> ederler ve aynı zamanda t1'deki
<i>unjoined</i> satırları (t2'de eşlenmemiş olanlarla) döndürürler. <code>RIGHT
JOIN t2</code>'nin <i>unjoined</i> satırlarını ekleyecektir. Bir FULL join, eşleşmiş
bütün satırları ve t1 ile t2'den tüm bağlanmamış (<i>unjoined</i>) satırları alır.
<code>OUTER</code> sözcüğü seçimseldir ve <code>LEFT</code>, <code>RIGHT</code> ve
<code>FULL</code> <i>join</i> işlemlerinde olduğu kabul edilir. Sıradan <i>join</i>
işlemleri <code>INNER JOIN</code> olarak adlandırılır.</p>
<p>Önceki sürümlerde, <code>OUTER JOIN</code>ler <code>UNION</code> ve <code>NOT IN</code>
kullanılarak simüle edilebiliyordu. Örneğin, tab1 ve tab2'yi birleştirirken, aşağıdaki
sorgu iki tablonun dıştan bağlanmasını sağlar:</p>
<pre>
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
</pre>
<h4><a name="4.24">4.24</a>) Aynı andan birden fazla veritabanında nasıl
işlem yapabilirim?</h4>
<p>Mevcut veritabanınız dışındaki başka bir veritabanınızı sorgulamanızın
bir yolu bulunmamaktadır. Bunun nedeni, PostgreSQL'in veritabanına özel sistem
katalogları yüklemesidir. Bu nedenle, cross-database bir sorgunun nasıl
davranacağını kestirmek zordur.</p>
<p>contrib/dblink fonksiyon çağrılarını kullanarak cross-database sorgulara
izin verir. Tabii ki, bir istemci değişik veritabanlarına aynı anda erişim
sağlayabilir ve bilgiyi bu şekilde birleştirebilir.</p>
<h4><a name="4.25">4.25</a>) Bir fonksiyondan nasıl çoklu satır ya da
kolon döndürebilirim?</h4>
<p>7.3 sürümünde, bir fonksiyondan kolaylıkla çoklu satır ya da sütun
döndürebilirsiniz.
(<i><a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</a></i>)</p>
<h4><a name="4.26">4.26</a>) Neden Pl/PgSQL fonksiyonları içinden
güvenli bir şekilde tablo yaratma/kaldırma işlemlerini yapamıyoruz?</h4>
<p>PL/PgSQL fonksiyon içerikleri <i>cache</i>'ler. Bunun istenmeyen bir tarafı,
eğer bir PL/PgSQL fonksiyonu geçici bir tabloya erişiyorsa ve bu tablo ileride
kaldırılıp yeniden oluşturulduktan sonra fonksiyon yeniden çağrılırsa, fonksiyon
çalışmayacaktır; çünkü <i>cache</i>'lenmiş fonksiyon hala eski geçici tabloyu
gösteriyor olacaktır. Çözüm, geçici tablo erişimleri için PL/PgSQL'de
<code>EXECUTE</code> kullanmaktır. Bu, sorgunun her seferinde yeniden işlenmesini
sağlayacaktır.</p>
<h4><a name="4.27">4.27</a>) 4.28) Hangi şifreleme seçenekleri bulunmaktadır?</h4>
<ul><li>contrib/pgcrypto SQL sorgularında kullanılabilmesi için
şifreleme fonksiyonları içermektedir.</li>
<li> İstemciden sunucuya iletişimi şifrelemek için, sunucuda ssl seçeneği postgresql.conf içinde
açık olmalıdır. Ayrıca,pg_hba.conf dosyası içinde host ya da hostssl kaydı mutlaka olmalıdır ve
istemci sslmode kapatılmamalıdır. (Aynı zamanda,PostgreSQL'in doğal SSL bağlantıları dışında ssh ya
da ssl gibi 3.parti şifrelenmiş veri iletimi de mümkündür.)</li>
<li>Veritabanı kullanıcı adı ve şifreleri 7.3 sürümü ile birlikte
otomatik olarak şifrelenirler. Önceki sürümlerde, postgresql.conf
içindeki PASSWORD_ENCRYPTION seçeneğini aktif hale getirmeniz gerekmektedir.</li>
<li>Sunucunun kendisini şifreli dosya sistemi üzerinde çalıştırabilirsiniz.</li></ul>
<hr>
<h2 align="center">PostgreSQL Özelliklerini Genişletmek</h2>
<h4><a name="5.1">5.1</a>) Kullanıcı-tanımlı bir fonksiyon yazdım.
psql'de çalıştırdığım zaman neden core dump ediyor?</h4>
<p>Sorunun nedeni birden fazla şey olabilir. Kullanıcı-tanımlı fonksiyonunuzu
stand-alone bir programda çalıştırmayı deneyiniz.</p>
<h4><a name="5.2">5.2</a>) PostgreSQL'e nasıl yeni tipler/fonksiyonlar ekleyebilirim?</h4>
<p>Çalışmalarınızı pgsql-hackers e-posta listesine gönderiniz. Kodunuz
incelendikten sonra contrib dizinine konacaktır.</p>
<h4><a name="5.3">5.3</a>) Bir <i>tuple</i> dondürmek icin bir C fonksiyonunu nasil yazarım?</h4>
<p>PostgreSQL 7.3 sürümü ile birlikte, C, PL/PgSQL ve SQL kullanılarak tablo-döndüren
fonksiyonlar tamamen desteklenmektedir. Ayrıntılı bilgi için
<i><a href="http://www.postgresql.com/docs/7.3/interactive/user.html">PostgreSQL 7.3.2
Kullanıcı Rehberi</a></i>'ne bakabilrisiniz. Bir örneği contrib/tablefunc
içinde bulabilirsiniz.</p>
<h4><a name="5.4">5.4</a>) Bir kaynak dosyasında değişiklik yaptım. Yeniden derlememe
rağmen değişiklik geçerli olmuyor. Neden?</h4>
<p>Makefile'lar include dosyaları için tam bir bağımlılık içermezler.
Öncelikle make clean, ardından da baska bir make işlemi yapmanız gerekir.
GCC kullanıyorsanız, configure betiğinin --enable-depend seçeneğini, derleyicinin
bağımlılıkları otomatik olarak hesaplaması için kullanabilirsiniz.</p>
</body></html>
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*
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment