1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
|
Perguntas Frequentes (FAQ) sobre PostgreSQL
Última atualização: Sáb Out 14 19:08:19 EDT 2006
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?
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?
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 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?
_________________________________________________________________
Perguntas Gerais
1.1) O que é PostgreSQL? Como ele é pronunciado?
PostgreSQL é pronunciado Post-Gres-Q-L, e é, às vezes, referido apenas
como Postgres. Um arquivo de áudio está disponível em formato MP3 para
aqueles que gostariam de ouvir a pronúncia.
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/files/documentation/faqs/FAQ_DEV.html
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-2007, 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.1.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 (TODO)
* O bug foi corrigido na versão atual
* O bug foi corrigido mas não foi empacotado em um versão oficial
* Um pedido foi feito para obter informações detalhadas:
+ Sistema Operacional
+ Versão do PostgreSQL
+ Exemplo de teste que reproduz o bug
+ Informações sobre depuração
+ Saída reconstituidora de vestígios (backtrace) do depurador
* O bug é novo. O seguinte pode ocorrer:
+ Uma correção é criada e será incluída na próxima versão
+ O bug não pode ser corrigido imediatamente e é adicionado a
lista de AFAZERES (TODO)
1.9) Como eu posso saber quais são os bugs conhecidos ou funcionalidades
ausentes?
O PostgreSQL suporta um subconjunto extendido do SQL:2003. Veja nossa
lista de AFAZERES (TODO) que contém bugs conhecidos, funcionalidades
ausentes e planos futuros.
Uma solicitação de funcionalidade geralmente resulta em uma das
seguintes respostas:
* A funcionalidade já está na lista de AFAZERES (TODO)
* A funcionalidade não é desejável porque:
+ Ela duplica uma funcionalidade existente que já segue o
padrão SQL
+ A funcionalidade aumentará a complexidade do código mas
adicionará pouco benefício
+ A funcionalidade será insegura ou não-confiável
* A nova funcionalidade é adicionada a lista de AFAZERES (TODO)
O PostgreSQL não utiliza sistema de acompanhamento de bugs porque nós
achamos mais eficiente responder diretamente o e-mail e manter a lista
de AFAZERES (TODO) atualizada. Na prática, bugs não duram muito no
programa; e bugs que afetam uma grande quantidade de usuários são
corrigidos rapidamente. O único lugar para encontrar todas as
mudanças, melhorias e correções em uma versão do PostgreSQL é ler as
mensagens de log do CVS. Até mesmo as notas de lançamento não listam
todas as mudanças feitas no programa.
1.10) Que documentação está disponível?
O PostgreSQL inclui vasta documentação, incluindo um manual extenso,
páginas de manuais (man pages) e alguns exemplos teste. Veja o
diretório /doc. Você também pode pesquisar os manuais online em
http://www.PostgreSQL.org/docs.
Há dois livros sobre PostgreSQL disponíveis online em
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://techdocs.PostgreSQL.org/techdocs/bookreviews.php.
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. Outro é o "Teach Yourself SQL in 21 Days, Second Edition" e
http://members.tripod.com/er4ebus/sql/index.htm. 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.
_________________________________________________________________
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://gborg.postgresql.org na seção de
Drivers/Interfaces ou via busca na Internet.
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 que é de 100 sessões. Você precisa
aumentar o limite do postmaster, 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?
O time do PostgreSQL faz somente pequenas mudanças entre versões
corretivas, então atualizar da versão 7.4.8 para 7.4.9 não requer uma
exportação e uma importação; basta para o servidor de banco de dados,
instalar os binários atualizados e reiniciar o servidor.
Todos os usuários devem atualizar para as versões corretivas mais
recentes assim que elas estiverem disponíveis. Enquanto cada
atualização tem algum risco, versões corretivas do PostgreSQL são
projetadas para corrigir somente bugs comuns com um risco mínimo. A
comunidade considera não atualizar mais perigoso do que atualizar.
Versões novas (i.e. da 7.3 para 7.4) geralmente muda-se o formato
interno das tabelas de sistema e dos arquivo de dados. Essas mudanças
geralmente são complexas, então nós não mantemos compatibilidade para
os arquivos de dados. Uma exportação/importação de um banco de dados é
necessária para atualizações entre versões.
3.7) Que tipo de hardware eu devo usar?
Por causa do hardware de PC ser em sua maioria compatível, pessoas
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,6 MB:
28 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
-------------------------------------------
56 bytes por registro
O tamanho de uma página de dados no PostgreSQL é 8192 bytes (8 KB), então:
8192 bytes por página
------------------------ = 146 registros por página do banco de dados (arredondado para baixo)
56 bytes por registro
100000 registros de dados
---------------------------- = 685 páginas do banco de dados (arredondadopara cima)
146 registros por página
685 páginas do banco de dados * 8192 bytes por página = 5.611.520 bytes (5,6MB)
Índices não requerem muito espaço, mas contém dados que foram
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.
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
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 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
);
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?
Uma abordagem é obter o próximo valor SERIAL de uma sequência com a
função nextval() antes de inserir e então inserir com o valor
explicitamente. Utilizando o exemplo da tabela em 4.11.1, um exemplo
em pseudo-linguagem se pareceria com isto:
novo_id = execute("SELECT nextval('pessoa_id_seq')");
execute("INSERT INTO pessoa (id, nome) VALUES (novo_id, 'Blaise Pascal')");
Você poderia então ter também o novo valor armazenado em novo_id para
utilizar em outras consultas (i.e., como uma chave estrangeira da
tabela pessoa). Note que o nome da SEQUENCE criada automaticamente
será <tabela>_<coluna>_seq, onde tabela e coluna são os nomes da
tabela e da coluna SERIAL, respectivamente.
Alternativamente, você poderia obter o valor SERIAL atribuído com a
função currval() depois de tê-lo inserido por padrão, i.e.,
execute("INSERT INTO pessoa (nome) VALUES ('Blaise Pascal')");
novo_id = execute("SELECT currval('pessoa_id_seq')");
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.16) O que é um OID? O que é um CTID?
Cada registro que é criado no PostgreSQL recebe um OID único a menos
que seja criado com WITHOUT OIDS. 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 postmaster:
ulimit -d 262144
limit datasize 256m
Dependendo da sua shell, somente um desses comando terá sucesso, mas
ele definirá o segmento de dados do seu processo com um limite maior e
talvez permita que a consulta seja feita. Este comando é aplicado ao
processo atual e todos os subprocessos criados depois do comando ser
executado. Se você tiver problemas com o cliente SQL porque o 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.23) Como eu faço uma junção externa (outer join)?
PostgreSQL suporta junções externas utilizando a sintaxe padrão do
SQL. Aqui temos dois exemplos:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
or
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Essas duas consultas indênticas juntam t1.col com t2.col, e também
retornam qualquer registro que não foi juntado em t1 (aqueles que não
combinaram com t2). Uma junção a direita RIGHT adicionaria registros
que não foram juntados da tabela t2. Uma junção completa (FULL)
retornaria os registros combinados mais todos os registros não
combinados de t1 e t2. A palavra OUTER é opcional e é assumida nas
junções LEFT, RIGHT e FULL. Junções ordinárias são chamadas junções
naturais (INNER).
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://techdocs.postgresql.org/guides/SetReturningFunctions.
4.19) Por que eu obtenho erros "relation with OID ###### does not exist" ao
acessar tabelas temporárias em funções PL/PgSQL?
PL/PgSQL armazena o conteúdo da função, e o efeito indesejado é que se
uma função PL/PgSQL acessa uma tabela temporária, e aquela tabela é
removida e criada novamente, e a função é chamada novamente, a função
irá falhar porque o conteúdo armazenado da função ainda apontará para
a tabela temporária antiga. A solução é utilizar o EXECUTE para acesso
a tabelas temporárias no PL/PgSQL. Isto irá fazer com que a consulta
seja avaliada toda vez.
4.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?
O caso mais comum é 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 coloca 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
|