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
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
|
PostgreSQL GyIK
Utolsó módosítás dátuma: 2002 Okt 20.
Fordítás aktualizálása: 2003 január
A GyIK karbantartója: Bruce Momjian (pgman@candle.pha.pa.us)
Fordító: Hornyák László (hornyakl.NOSPAM@inf.elte.hu)
A legfrissebb verzió itt érhető el (angol):
http://www.PostgreSQL.org/docs/faq-english.html.
Legfrissebb magyar nyelvű verzió:
http://www.rootshell.be/~hornyakl/downloads/postgres_faq/
Platform specifikus kérdések:
http://www.PostgreSQL.org/users-lounge/docs/faq.html.
_________________________________________________________________
Általános kérdések
1.1) Mi a PostgreSQL? Hogy kell kimondani?
1.2) Mik a PostgreSQL felhasználási feltételei?
1.3) Milyen UNIX operációs rendszereken fut PostgreSQL?
1.4) Milyen nem UNIX operációs rendszerek elérhetőek?
1.5) Hogyan tudok PostgreSQL-t szerezni?
1.6) Hogyan kapok terméktámogatást?
1.7) Melyik a legfrissebb kiadás?
1.8) Milyen dokumentáció áll rendelkezésre?
1.9) Hogyan találok információt hibákról vagy hiányzó funkcionalításról?
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 küldjek hibajelentést?
1.14) Milyen a PostgreSQL más DBMS-ekkel összehasonlítva?
1.15) Hogyan tudom üzletileg segiteni a PostgreSQL-t?
Felhasználói kliens kérdések
2.1) Van ODBC meghajtó PostgreSQL-hez?
2.2) Milyen eszközök állnak rendelkezésre PostgreSQL Web fejlesztésekhez?
2.3) Van a PostgreSQL-hez grafikus felhasználói felület ? Riport
generátor? Beágyazott lekérdező nyelv felület?
2.4) Milyen programozási nyelvekkel lehet elérni a PostgreSQL szervert?
Adminisztrációs kérdések
3.1) Hogyan tudom a PostgreSQL-t /usr/local/pgsql -től eltérő helyre
installálni?
3.2) AMikor elindítom a postmaster-t, egy "Bad System Call"-t vagy core
dump-ot kapok. Miért?
3.3) Amikor megpróbálom inditani a postmaster-t, "IpcMemoryCreate" hibákat
kapok. Miért?
3.4) Amikor megpróbálom inditani a postmaster-t, "IpcSemaphoreCreate" hibákat
kapok. Miért?
3.5) Hogyan tudom kontrollálni a más gépekről érkező kapcsolat kéréseket?
3.6) Hogyan tudom nagyobb teljesítményre hangolni az adatbázisomat?
3.7) Milyen hibakereső lehetőségek érhetőek el?
3.8) Miért kapok "Sorry, too many clients" hibát csatlakozásnál?
3.9) Mi van pgsql_tmp könyvtárban?
3.10) Miért kell dumpolni és újratölteni PostgreSQL kiadás váltásánál?
Működtetési kérdések
4.1) Mi a különbség a bináris és a normál kurzorok között?
4.2) Hogyan tudom select-elni a lekérdezés első pár sorát?
4.3) Hogy tudom kilistázni a táblákat vagy más dolgokat a PostgreSQL-ben?
4.4) Hogyan tudok eltávolítani egy oszlopot egy táblából?
4.5) Mi a maximális mérete egy sornak, egy táblának vagy egy adatbázisnak?
4.6) Mekkora adatbázis lemez terület szükséges egy tipikus szöveg állomány
tárolásához?
4.7) Hogy tudhatom meg milyen táblák, indexek, adatbázisok vagy felhasználók
vannak definiálva?
4.8) A lekérdezéseim lassúak, vagy nem használják az indexeket. Miért?
4.9) Hogy tudom ellenőrizni, hogy optimalizálta a lekérdezés optimalizáló a
lekérdezésem?
4.10) Mi az R-tree index?
4.11) Mi a Genetic Query Optimizer?
4.12) Hogyan tudok regexp keresést és case-insensitive regexp keresést
használni? Hogyan tudok indexet használni case-insensitive kereséshez?
4.13) Hogyan tudom észlelni egy lekérdezésban, ha egy mező NULL?
4.14) Mi a különbség a különböző karaktertípusok között?
4.15.1) Hogyan tudok létrehozni automatikusan növekvő értékű mezőt?
4.15.2) Hogyan kaphatom meg egy SERIAL beszúrás értékét?
4.15.3) A currval() és a nextval() nem teremt holtpont veszélyes helyzetet
a felhasználók között?
4.15.4) Miért nem használódnak fel újra a sequence számok tranzakció abort
esetén?
Miért vannak problémák a serial oszlopok számozásával?
4.16) Mi a OID? Mi a TID?
4.17) Mi a PostgreSQL-ben használt kifejezések jelentése?
4.18) Miért kapom ezt a hibát: "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.19) Hogyan tudhatom meg PostgreSQL, milyen verziót futtatok?
4.20) Miért kapok "invalid large obj descriptor" hibát nagy objektumok
kezelésénél?
4.21) Hogy hozhatok létre olyan oszlopot, aminek alapértelmezett érétke a
jelenlegi idő?
4.22) Miért olyan lassúak az al-lekérdezéseim IN-nel?
4.23) Hogyan tudok outer join-t végrehajtani?
4.24) Hogyan tudok több adatbázison végrehajtani lekérdezést?
4.25) Hogy tudok több soros vagy oszlopos eredményt visszaadni egy
funkcióból?
4.26) Miért nem tudom megbizhatóan létrehozni és törölni az átmeneti
táblákat a PL/pgSQL funkciókban?
4.27) Milyen replikációs lehetőségek vannak?
4.28) Milyen kódolási lehetőségek vannak?
A PostgreSQL kiterjesztése
5.1) Írtam egy felhasználói funkciót. Miért core dumpol az adatbázis amikor
használom?
5.2) Hogyan lehet új adattípusokat és funkciókat hozzáadni a PostgreSQL
disztribúcióhoz?
5.3) Hogyan lehet olyan C funkciót írni, ami Tuple-t ad vissza?
(több soros több oszlopos eredmények)
5.4) Megváltoztattam egy forrás állományt. Miért nem változik a bináris
újrafordítás után?
_________________________________________________________________
Általános kérdések
1.1) Mi a PostgreSQL? Hogy kell kimondani?
Így ejstd ki: Post-Gres-Q-L.
(Vagy talán inkább töltsd le a kis mp3-at a PostgreSQL homepage-ről)
A PostgreSQL a POSTGRES adatbázis management rendszer egy kiegészítése,
ami egy következő generációs DBMS kutatási prototípus. Megtartja a
POSTGRES adatmodellét és gazdag adattípus választékát, de a PostQuel
lekérdező nyelvet az SQL egy kiterjesztett verziójával helyettesíti.
A PostgreSQL szabad és a teljes forráskód hozzáférhető.
A PostgreSQL fejlesztését egy csapat végzi, amelynek minden tagja
megtalálható a PostgreSQL fejlesztői levelezési listán. A jelenlegi
koordinátor Marc G. Fournier (scrappyp@PostgreSQL.org). Ez a csapat
felelős minden fejlesztésért.
A PostgreSQL 1.01 alkotói Andrew Yu és Jolly Chen voltak. Sokan
járultak hozzá portolással, teszteléssel, hibakereséssel és
fejlesztéssel. Az eredeti Postgres kód, amiből a PostgreSQL származik
Michael Stonebraker professzor irányítása alatt fejlesztettek az
egyetem programozói, tanulói és végzett tanulói.
A szoftver ereeti neve Postgres volt. Amikor SQL funkcionalítással
egészítették ki 1995-ben, a nevét Postgres95-re változtatták. 1996
végén kapta mai nevét.
1.2) Mik a PostgreSQL felhasználási feltételei?
Az eredeti angol copyright szöveg:
--------------------
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.
The above is the BSD license, the classic open-source license. It has
no restrictions on how the source code may be used. We like it and
have no intention of changing it.
--------------------
Ami nagyon leegyszerűsítve azt jelenti, hogy jogod van használni a
szoftvert mindenféle ellenszolgáltatás (pénz, stb) nélkül, a forrás
kódot módosíthatod, és továbbadhatod, DE semmilyen, a szoftver használatából
következő károsodásért nem vállal garanciát a fejlesztő.
A fenti a BSD licensz, egy klasszikus nyilt-forráskód licensz. Nem
tartalmaz megszorításokat arra, hogy a forráskódot hogyan használod fel.
Kedveljük ezt a licensz formát és nem áll szándékunkban megváltoztatni.
1.3) Milyen UNIX operációs rendszereken fut PostgreSQL?
Általában minden UNIX-kompatibilis operációs rendszer képes arra hogy
futtassa a PostgreSQL-t. Azokat a platformokat, amiken tesztelték a
kiadást megtalálhatod a installációs utasítások között.
1.4) Milyen nem UNIX operációs rendszerek elérhetőek?
Kliens
A libpq C függvénykönyvtárat, a psql-t és más felületeket le lehet úgy
fordítani, hogy fussanak MS Windows operációs rendszereken. Ebben az esetben
a kliens MS Windows-on fut és TCP/IP segítségével kommunikál a Unixon
futó szerverrel. A "win32.mak" állomány a kiadás része, ennek segítségével
lehet Win32 platformokra lefordítani a libpq-t és a psql-t. A PostgreSQL
ODBC kliensekkel is képes kommunikálni.
Szerver
Az adatbázis szerver Cygwin segítségével fut Windows NT és Win2k
rendszereken. További információ található a pgsql/doc/FAQ_MSWIN
állományban és a MS Windows FAQ-ban a következő helyen:
http://www.PostgreSQL.org/docs/faq-mswin.html.
Natív MS Windows NT/2000/XP portok jelenleg fejlesztés alatt állnak.
1.5) Hogyan tudok PostgreSQL-t szerezni?
Az elsődleges anonim ftp oldal:
ftp://ftp.PostgreSQL.org/pub.
A tükör oldalak listája megtalálható a fő weboldalunkon.
1.6) Hogyan kapok terméktámogatást?
Az elsődleges lista a pgsql-general@postgresql.org. Ez használható
a PostgreSQL-lel kapcsolatos párbeszédekre. Ha fel szeretnél íratkozni,
küldj egy levelet a következő tartalommal (nem tárggyal) a
pgsql-general-request@postgresql.org címre:
subscribe
end
Van egy hibákkal kapcsolatos levelezési lista is:
pgsql-bugs-request@PostgreSQL.org a következő tartalommal:
subscribe
end
A fejleszt?i levelezési lista:
pgsql-hackers-request@PostgreSQL.org a következő tertalommal:
subscribe
end
Egyéb levelezési listák találhatóak a weboldalunkon:
http://www.PostgreSQL.org
Van egy IRC csatorna is #PostgreSQL néven ahol felteheted kérédseid.
A következő unix paranccsal csatlakozhatsz:
irc -c '#PostgreSQL' "$USER" irc.phoenix.net.
A kereskedelmi terméktámogatást nyújtó cégek listája elérhetö itt:
http://www.PostgreSQL.org/users-lounge/commercial-support.html
1.7) Melyik a legfrissebb kiadás?
A legfrissebb PostgreSQL kiadás a 7.3.
A tervek szerint minden negyedik hónapban van új kiadás.
1.8) Milyen dokumentáció áll rendelkezésre?
Számos kézikönyv, man oldalak és kis teszt példák találhatóak a kiadásban
a doc/ könyvtár alatt. Az interneten is olvashatod a dokumentációt a
következő címen:
http://www.PostgreSQL.org/users-lounge/docs/.
Két PostgreSQL könyv érhető el az interneten a
http://www.PostgreSQL.org/docs/awbook.html és a
http://www.commandprompt.com/ppbook/ címeken.
A megvásárolható könyvek listája itt található:
http://www.ca.PostgreSQL.org/books/.
A PostgreSQL-lel kapcsolatos technikai jellegű cikkek gyűjteménye:
http://techdocs.PostgreSQL.org/.
A psql parancs rendelkezik néhány \d utasítással, amellyekkel listázhatóak
az operátorok, a funkciók, stb.
A website is tartalmaz további dokumentációkat.
1.9) Hogyan találok információt hibákról vagy hiányzó funkcionalításról?
A PostgreSQLaz SQL-92 szabvány egy kiegészítése. Nézd meg a TODO listákat
ha érdekelnek az ismert hibák.
1.10) Hogy tanuljam meg az SQL nyelvet?
A PostgreSQL könyv a http://www.PostgreSQL.org/docs/awbook.html
címen tartalmaz SQL alapokat. Elérhető egy másik SQL könyv is a
http://www.commandprompt.com/ppbook címen. Egy szép oktató anyag
található 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 másik lehetőség a "Tanítsd magad 21 nap alatt SQL-re, második
kiadás" a http://members.tripod.com/er4ebus/sql/index.htm.
Sok felhasználónak tetszett a gyakorlati SQL könyv ("The Practical
SQL Handbook").
1.11) A PostgreSQL 2000. év kompatibilis?
Igen, könnyedén kezeli a 2000 utáni és időszámításunk elött 2000 elötti
dátumokat is.
1.12) Hogyan lehet csatlakozni a fejlesztő csapathoz?
Elösször is töltsd le a forráskódot, és olvasd el a PostgreSQL
fejlesztői dokumnetációt a web oldalunkon vagy a kiadásban. Ezután
íratkozz fel a pgsql-hackers és a pgsql-patches levelezési listákra.
Végül pedig küldj be magas szinvonalú patch-eket a pgsql-patches listára.
Van egy pár ember, akiknek commit privilégiumuk a PostgreSQL CVS fán.
Ők olyan sok magas szinvonalú patch-et küldtek be, hogy az addigi
csapat már nem tudta követni, és nem volt kétségünk arról, hogy a
patch-ek amiket ők küldenek jó minőségű.
1.13) Hogyan küldjek hibajelentést?
Látogass el a BugTool oldalra:
http://www.PostgreSQL.org/bugs/bugs.php
Itt megtalálod követendő utasításokat.
Ellenőrizd az ftp oldalunkon is, hogy nincs-e újabb verzió vagy folt.
ftp://ftp.PostgreSQL.org/pub
1.14) Milyen a PostgreSQL más DBMS-ekkel összehasonlítva?
Számos nézőpontból lehet vizsgálni a szoftvert: képességek, teljesítmény
megbízhatóság, támogatottság és ár.
Képességek
A PostgreSQL rendelkezik a nagy, kereskedelmi DBMS-ek képességeivel:
tranzakciók, al-lekérdezések, triggerek, nézetek, külső kulcsok,
integrítás és kifinoult zármechanizmusok. Van néhány képessége,
ami a kereskedelmi adatbázisokból hiányzik, mint például a
felhasználó által definiált típusok, öröklődés, szabályok és
verzió kontroll a zárolási viták redukálásáért.
Teljesítmény
A PostgreSQL teljesítménye hasonlít a kereskedelmi és más nyílt
adatbázis szerverekéhez. Lehet bizonyos esetekben lassabb, másokban
gyorsabb. A MySQL nevű tanuló RDBMS például gyorsabban hajt végre
insert/update műveleteket, mivel a tranzakciókat elsumákolja.
Persze a MySQL nem rendelkezik a képességek részben felsoroltak
nagy részével. Mi a megbízhatóságra és a képességekre építünk, bár
a teljesítmény is nő minden kiadással. Van egy érdekes oldal a
MySQL és a PostgreSQL összehasonlításával a
http://openacs.org/philosophy/why-not-mysql.html címen.
Megbízhatóság
Tudjuk hogy ha egy DBMS nem megbízható, akkor teljesen haszontalan.
Igyekszünk jól tesztelt, stabil kódot kiadni, amiben a lehető
legkevesebb hiba van. Minden kiadás elött eltellik legalább 1
hónap béta teszt, és a kiadási történet is azt mutatja, hogy
stabil kódot adunk ki, ami készen áll a produktív felhasználásra.
Úgy gondoljuk, felülmúlunk más adatbázis szoftvereket ezen a téren.
Támogatás
A levelezési listáink kapcsolatot teremtenek a fejlesztők
és felhasználók csoportjával , akik segítenek a problémák
megoldásában. Bár nem tudjuk garantálni hogy ki tudjuk
javítani a hibát, más, kereskedelmi adatbázis cégek sem tudják.
A fejlesztő csoport közvetlen elérési lehetősége, a közösség,
a dokumentáció és a forráskód gyakran támogatást biztosít,
mint más adatbázisoknál. Van kereskedelmi, alkalmi támogatás
azoknak, akiknek szüksége van rá (lásd: 1.6).
Ár
A PostgreSQL szabad bármilyen felhasználásra, akár kereskedelmire
is. A termékhez hozzáadhatod a saját forráskódjaidat korlátozás
nélkül,
1.15) Hogyan tudom üzletileg segiteni a PostgreSQL-t?
A PostgreSQL első osztályú infrastruktúrával rendelkezik, amit 1996-ban
indítottunk el. Mindent Marc Fourniernek köszönhetünk, aki létrehozta
és karbantartja a rendszert.
A minőségi infrastruktúra nagyon fontos egy nyilt forrású szoftver
esetében. Megvéd az olyan fennakadásoktól, amelyek komoly késéseket
okoznak a fejlesztésekben.
Természetesen ez az infrastruktúra nem olcsó. Számos havi és állandó
kiadásunk van. Ha a cégednek van pénze, amivel támogatná erőfeszítéseinket,
kérlek látogass el a http://store.pgsql.com/shopping/ oldalra.
Bár a weboldal "PostgreSQL, Inc"-ként említi, a hozzájárulások kizárólag
a PostgreSQL fejlesztésre értendóek, és nem egy meghatározott cégnek. Ha
jobban tetszik, küldhetsz csekket is a kapcsolati címek bármelyikére.
_________________________________________________________________
Felhasználói kliens kérdések
2.1) Van ODBC meghajtó PostgreSQL-hez?
Két ODBC meghajtó érhető el: PsqlODBC és a OpenLink ODBC.
A PsqlODBC a PostgreSQL kiadás része. További információ található a
ftp://ftp.PostgreSQL.org/pub/odbc/ oldalon.
Az OpenLink ODBC-t a http://www.openlinksw.com címről töltheted le.
Ez az ő szabványos ODBC kliens szoftverükkel működik, így minden
általuk támogatott platformon (Win, Mac, Unix, VMS) elérhető lesz
a PostgreSQL szerver.
Talán olyan vevőknek fogják eladni, akik kereskedelmi minőségű terméket
szeretnének kapni, de a freeware verzió mindig elérhető lesz. Kérdéseidet
a termékkel kapcsolatban a postgres95@openlink.co.uk címen teheted fel.
Olvasd el az ODBC fejezetet is a programozók kézikönyvében!
2.2) Milyen eszközök állnak rendelkezésre PostgreSQL Web fejlesztésekhez?
Egy szép bemutató olvasható az adatbázissal támogatott web oldalanról
a http://www.webreview.com weboldalon.
A web integrációhoz a PHP egy kiválló szoftver. Letölthető a
http://www.php.net címről.
Komplexebb esetekre sokan használják a Perl felületet és a CGI.pm vagy a
mod_perl-t.
2.3) Van a PostgreSQL-hez grafikus felhasználói felület? Riport
generátor? Beágyazott lekérdező nyelv felület?
Van egy szép PgAccess nevű grafikus felületünk, ami riport generátorként
is használható. A weboldalát megtalálod a http://www.pgaccess.org/ címen.
A disztribúció tartalmazza az ecpg programot is, ami egy beágyazott SQL
lekérdezési felület C nyelvhez.
2.4) Milyen programozási nyelvekkel lehet elérni a PostgreSQL szervert?
A következök:
* 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)
További programozási felületek érhetőek el a
http://www.PostgreSQL.org/interfaces.html és a
http://gborg.PostgreSQL.org oldalakon.
_________________________________________________________________
Adminisztrációs kérdések
3.1) Hogyan tudom a PostgreSQL-t /usr/local/pgsql -től eltérő helyre
installálni?
A configure script --prefix paraméterének használatával.
3.2) AMikor elindítom a postmaster-t, egy "Bad System Call"-t vagy core
dump-ot kapok.
Miért?
Számos probléma lehet, de legelösször ellenőrizd le, hogy a kerneled
System V kiegészítésekkel rendelkezik-e. A PostgreSQL használja a
kernel osztott memória és szemafor API-ját.
3.3) Amikor megpróbálom inditani a postmaster-t, "IpcMemoryCreate" hibákat
kapok. Miért?
Vagy nincs megfelelően konfigurálva a kerneled osztott memória támogatása
vagy meg kell nagyobbítanod a maximális osztott memória méretet.
A pontos méret szükséglet függ az architektúrádtól és attól hogy hány
buffert és processzt konfigurálsz a postmasternek. Legalább 1 MB
területre szükséged van. A PostgreSQL Adminisztráció kézikönyvben
olvashatsz részletesebb információkat az osztott memóriáról és a
szemaforokról.
3.4) Amikor megpróbálom inditani a postmaster-t, "IpcSemaphoreCreate"
hibákat kapok. Miért?
Ha a hibaüzenet ez: " IpcSemaphoreCreate: semget failed (No space
left on device)", akkor a kerneled konfigurációja nem tesz lehetővé
elegendő szemafort. A PostgreSQL szerver processzenként 1 szemafort
igényel. Egy átmeneti megoldás lehet az hogy a postmastert kevesebb
maximális processz számmal inditod el. Használd a -D paramétert.
Egy sokkal megfelelőbb megoldás az ha növeled a kerneled SEMMNS
és SEMMNI paramétereit.
A hibás szemaforok is adatázis lerobbanásához is vezethet nagy terhelés
esetén.
Ha a hibaüzenet valami más, lehet hogy nincs szemaforok támogatás
forditva a kerneledbe. Olvasd el a PostgreSQL adminisztrátorok
kézikönyvében az osztott memóriáról és a szemaforokról szóló fejezetet.
3.5) Hogyan tudom kontrollálni a más gépekről érkező kapcsolat kéréseket?
Alapértelmezésben a PostgreSQL a helyi kapcsolatokat Unix socketekkel
valósítja meg. Más gépek nem lesznek képesek csatlakozni, ha nem
engedélyezed azt -i opcióval a postmasternek, és nem állítod be host a
alapú azonosítást a pg_hba.conf állományban. Ezzel válnak lehetővé a TCP/IP
kapcsolatok.
3.6) Hogyan tudom nagyobb teljesítményre hangolni az adatbázisomat?
Az indexelés feltétlenül gyorsítja a lekérdezéseket. Az EXPLAIN
parancs lehetővé teszi hogy lásd, hogy a PostgreSQL miként interpretálja
a lekérdezést és melyik indexet használja.
Ha sok INSERT műveletet hajtassz végre, csináld nagy kötegekben a COPY
paranccsal. Ez sokkal gyorsabb mint az egyedi INSERT parancsok. Másodszor:
Azok a műveletek, amelyek nincsenek tranzakció blokkon belül, azok saját
tranzakciót indítanak. Sok műveletet érdemes egy tranzakción belül
végrehajtani. Ez csökkenti a tranzakció kezelés többletidejét. Az indexeket
javasolt a nagy adatváltozások elött eltávolítani, majd újra létrehizni.
Számos teljesítmény javító lehetőség van. Kikapcsolhatod az fsync()
műveletet a postmaster -o -F opciókval való indításakor. Így nem fog
az amugy lassú fsync() függvény meghívódni minden tranzakció végén.
Használhatod a postmaster -B opcióját is az osztott memória szegmens
méretének növeléséhez. Ha az értéket túl magasra állítod, lehet hogy
a postmaster nem indul el, mert túllépted az operációs rendszer által
megengedett méretet. Minden buffer 8K méretű és alapértelmezésban 64
buffer van.
A -S opcióval növelheted a szerver átmeneti rendezésekre fenntartott
memória területét. Az értéket kilobyteban add meg. Az alapértelmezett
érték 512K.
Használhatod a CLUSTER utasítást is, hogy a táblákat egy indexnek
megfelelően csoportosítsd. Olvasd el a CLUSTER kézikönyv oldalt további
részletekért.
3.7) Milyen hibakereső lehetőségek érhetőek el?
A PostgreSQL számos lehetöséggel rendelkezik ami értékes lehet a hiba-
keresésnél.
Elösször is, futtathatod a configure scriptet --enable-cassert
opcióval, sok assert() funkcióhivás ellenörzi a program futását és
megállitja ha valami vératlan hiba történik.
Mind a postmaster és a postgres számos hibakeresö lehetüséggel rendelkezik.
Mindig amikor elinditod a postmastert, gyözödj meg róla, hogy a kimenetet
log állományba küldöd. Igy:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
Ez egy server.log állományt hoz létre a felsö PostgreSQL könyvtárban.
Ez az állomány tartlamaz majd számos hasznos információt a szerverrel
kapcsolatos problémákról és hibákról. A postmaster -d opciójával lehet
részletesebb hibakeresö információt kapni. A -d opcióhoz meg kell
határozni egy hiba szintet. Vigyázz, a magas hibakeresö szint nagy
log állományt okozhat.
Ha a postmaster nem fut, akkor futtathatod a postgres szervert
parancssorból is, és az SQL kifejezést közvetlenül ennek adhatod át.
Ez csak hibakeresés esetében javasolt. Az új sor a kifejezés végét jelenti,
nem a pontosvesszö. Ha hibakeresö opciókkal forditottad a szervert,
használhatsz egy debuggert is hogy lásd hogy mi történik. Mivel igy a
szervert nem a postmaster inditotta, nem többfelhasználós környezetként
fut, igy a zárolási és a szerverek közötti kommunikációs hiba jelenségek
nem jelentkeznek.
Ha már fut a postmaster, indits egy psql-t, és nézd meg a szerver processz
PID-jét! Egy debuggert használhatsz a processzhez csatlakozáshoz.
Beállithatsz töréspontokat és elindithatsz lekérdezéseket. Ha a postgres
inditásban keresel hibát, a PGOPTIONS környezeti változót állitsd be "-W n"
értékre. Ez n másodperc várakozást idéz elö, igy tudsz csatlakozni a
processzhez, el tdsz hejezni töréspontokat, majd folytathatod a indítást.
A postgres program -s, -A és -t opciói is nagyon hasznosak lehetnek
hibakeresésnél és teljesítmény mérésnél.
Profiling lehtöséggel is fordithatod a szervert, hogy lásd melyik
funkciók foglalják el a futási időt. A szerver profile állományai
a pgsql/data/base/dbname könzvtárba kerülnek, a kliens profile
állományok az aktuális könyvtárba. Linuxon ehhez szükséges a
-DLINUX_PROFILE fordítási direktiva.
3.8) Miért kapok "Sorry, too many clients" (Túl sok kliens)
hibát csatlakozásnál?
Növelned kell a postmaster egyidejűleg futtatott szerver processz szám
korlátját.
Az alapértelmezett korlát 32 processz. Ezt növelhetjed úgy, hogy
újrainditod a postmastert és -N opcióval meghatárotod az új értéket,
vagy módositod a postgresql.conf-ot.
Ne felejtsd el, hogy ha növeled a szerver processzek maximális számát,
akkor bufferek számát is növelned kell, legalább a processzek számának
kétszeresére. Nagy processz számokesetében valószinüleg a Unix
konfigurációs paramétereken is növelni kell. Ellenörizd a SHMMAX
(az osztott memória szegmensek maximális mérete), a SEMMNS és a SEMMNI
(a szemaforok maximális száma), az NPROC (a processzek maximális száma),
a MAXUPRC (felhasználónkénti maximális processz szám) és a NFILE és NINODE
(a megnzitott állománzok maximális száma) paramétereket. A PostgreSQL
azért korlátozza külön a processz számot, hogy a rendszeredet ne terhelhesse
meg túlságosan.
A PostgreSQL 6.5 verzióban a maximális szerver processz szám 64 volt és
a módositáshoz bele kellett irni a include/storage/sinvaladt.h állományba
és újra kellett forditani a servert.
3.9) Mi van pgsql_tmp könyvtárban?
Ez a könyvtár a lekérdezés végrehajtó által létrehezott átmeneti
állományokat tartalmazza. Például ha egy rendezést kell végrehajtani
egy ORDER BY kifejezés miatt és a m?velet több memóriát vesz
igénybe, mint amennyit a -S paraméter megenged, akkor az átmeneti
könyvtárban hoz létre egy állományt a fennmaradó adat tárolására.
Az átmeneti állományok többnyire törl?dnek, de meg is maradhat ha
például váratlan hibával leáll a szerver egy rendezés közben. Inditáskor
és leállitáskor ezeket az állományokat törli a postmaster.
3.10) Miért kell dumpolni és újratölteni PostgreSQL kiadás váltásánál?
A PostgreSQL csapat csak apróbb változtatásokat hajt végre a kisebb
kiadások között, igy ha 7.2 verzióról állsz át 7.2.1 verzióra, akkor nem
szükséges kidumplonod az adatbázist. A nagy kiadások esetében (például
verzióról 7.3-ra áttérésnél) változik a belsiő adatstruktúrák és
adatállományok formátuma. Ezek a változások gyakran nagyon összetettek,
ezért inkáb nem tartunk fenn visszafelé kompatibilitást. A dump
az adatot általános formátumban irja ki, majd az új formátumban lehet
azt visszatöleni.
Azokban a kiadásokban, amelyek között az adat formátum nem változik,
a pg_upgrade program használható dumpolás és helzreállitás nélkül.
_________________________________________________________________
Működtetési kérdések
4.1) Mi a különbség a bináris és a normál kurzorok között?
Nézd meg a DECLARE dokumentációját.
4.2) Hogyan tudom select-elni a lekérdezés első pár sorát?
Olvasd el a FETCH dokumentációját, vagy használd a SELECT
LIMIT-et.
Az egész lekérdezést végre kell hajtani, még akkor is, ha csak az első
pár sort akarod megkapni. Gondolj arra, hogy a lekérdezésben lehet ORDER BY
is. Ha van olyan index, ami megfelel az ORDER BY kifejezésednek, a
PostgreSQL képes lehet az elsö néhány rekord visszaadására, vagy a teljes
lekérdezésnek le kell futnia, amig a kért rekordok le nem generálódnak.
4.3) Hogy tudom kilistázni a táblákat vagy más dolgokat a PostgreSQL-ben?
Elolvashatod a psql forrás kódjában a pgsql/src/bin/psql/describe.c
állományban. Ez SQL parancsokat tartalmaz, amelyek azokat a kimeneteket
állitják elö, amiket a per jellel kezdödö parancsok adnak vissza.
4.4) Hogyan tudok eltávolítani egy oszlopot egy táblából?
Ez a funkcionalitás a 7.3 verziótül kezdve érhetö el az ALTER TABLE
DROP COLUMN -nal. A régebbi vertiókban igy lehet végrehajtani:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- minden oszlopot, kivétel amit törölni szeretnél
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
4.5) Mi a maximális mérete egy sornak, egy táblának vagy egy adatbázisnak?
A korlátok:
adatbázis: korlátlan (1 TB az általunk ismert lagnagyobb)
tábla: 16 TB
rekord/sor 1.6TB
mezö 1 GB
a tábla sorainak száma: korlátlan
a tábla oszlopainak száma: 250-1600 az oszlop nevektől függöen
A tábla indexeinek száma: korlátlan
Természetesen nem igazán korlátlan, de a tárterület, memória és egyéb
külsö tényezök korlátozzák. A teljesitmény romolhat, ha ezek az értékek
szokatlanul nagyok.
A 16 TB-os legnagyobb tábla méret nem igényel nagy állomány támogatást.
A nagy táblák több 1 GB méretü állományba kerölnek, igy az állomány
rendszer korlátai nem lényegesek.
A maximális tábla méret és az oszlopok maximális oszlop szám növelhetö,
ha az alapértelmezett blokkméretet 32k-ra növeled.
4.6) Mekkora adatbázis lemez terület szükséges egy tipikus szöveg állomány
tárolásához?
A PostgreSQL akár a szöveg állomány helyigénzének ötszörösét is elfoglalhaja.
Képzelj el például, egy 100.000 soros szöveget, aminek minde sora
egy számból és egy szövegből áll. Tegyük el, hogy átlagosan 20 byte hosszú
szövegek. Ez a szövegállomány körülbelül 2.8 MB helyet foglalna el.
A tábla ami a fenti adatszerkezetet eltárolná, körülbelül 6.4 MB-os lenne.
Ezt a következöképpen számolhatjuk ki:
36 byte: sor fejléc
24 byte: egy int mezö + egy szöveg mezö
4 byte: mutato
---------------------------------------
64 byte soronkent.
Az adat oldal mérete a PostgreSQL-ben 8192 byte, igy
8192 / 64 = 128 rekord adatbázis oldalanként (lefelé kerekitve).
100000 rekord / 128 rekord oldalanként = 782 adat oldal (felelé kerekitve).
782 adatbázis oldal * 8192 byte olalanként = 6,406,144 byte (6.4 MB)
Az indexek nem foglalnak túl sokat, de tartalmazzák az indexelt adatot,
igy ezek is lehetnek nagyok.
A NULL értékek bittérképben vannak tárolva, igy kevés helyet foglanak.
4.7) Hogy tudhatom meg milyen táblák, indexek, adatbázisok vagy felhasználók
vannak definiálva?
A psql-ben találsz számos '\' karakterrel kezdödö utasítást az ilyen
információk listázására. A '\?' segitségével tudot kilistázni ezeket
a parancsokat. Ezen kivül vannak rendszer táblák, amelyek nevei 'pg_'
-vel kezdödnek.
Próbáld ki a pgsql/src/tutorial/syscat.source állományt is. Ez sok
példát tartalmaz az rendszertáblákon végrehajtott SELECT-ekröl.
4.8) A lekérdezéseim lassúak, vagy nem használják az indexeket. Miért?
Az indexeket nem használja a szerver minden lekérdezésnél automatikusan.
Csak akkor használ indexet, ha a tábla mérete egy megadott alsó határ
felett van, és a lekérdezés csak a sorok egy kis részét érinti. Ez azért
van, mert a véletlen hozzáférés még mindig lassabb lehet mint az tábla
szekvenciális olvasása.
Hogy a PostgreSQL meg tudja határozni hogy kell-e indexet használni,
léteznie kell egy statisztikának a tábláról. Ez a statisztikai adatok a
VAACUM ANALYZE vagy az egyszerű ANALYZE műveletek során
jönnek létre. A statisztikai adatok felhasználásával az optimalizáló
meg tudja határozni, hogy hány sor van a táblában, és el tudja dönteni,
hogy használjon-e indexet. A statisztiaki adatgyüjtést időnként végre
kell hajtani, ahogy a tábla adatai változnak.
Az indexeket normális esetben nem használja az ORDER BY vagy
az OUTER JOIN. A szekvenciális olvasás általában gyorsabb, mint az
index keresés egy nagy táblában.
Bár a LIMIT az ORDER BY-val kombinálva használhat indexet, mert
a tábla csak kis része érintett. Bár a MIN és MAX SQL funkciók sem
használják az indexeket, ezeket az értékeket egy ORDER BY + LIMIT
lekérdezéssel is le lehet kérdezni:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Amikor helyettesítő jel operátorokat használsz, mint a LIKE kulcsszó
vagy a ~, az indexeket csak bizonyos körülmények között lehet használni:
* A kereső string kezdete a keresési minta elején kell hogy legyen.
például:
+ A LIKE minták nem kezdődhetnek % jellel.
+ ~ (regexp) kifejezések nem kezdődhetnek ^ jellel.
* A keresési kifejezés nem kezdődhet karakter osztállyal.
* A case-insensitive keresés (ILIKE, ~*) nem használnak indexet
ehelyett funkcionális indexet használnak, amit a 4.12 pontban
találhatsz.
* Az alapértelmezett C hellyel kell futtatni az initdb-t.
4.9) Hogy tudom ellenőrizni, hogy optimalizálta a lekérdezés optimalizáló
a lekérdezésem?
Olvasd el a dokumentáció EXPLAIN-ról szóló részét.
4.10) Mi az R-tree index?
Az R-tree index a térbeli adat indexelésére alkalmas. Egy hash
index nem képes tartomány keresésekre. A B-tree index csak egy
dimenzión kezeli a tartomány kereséseket. Például ha az indexet
egy pont (point adattípus) típusú mez.re építjük, gyorsabban
kezeli az olyan jellegü lekérdezéseket, mint egy adott körben
található pontok.
Az R-tree tervezési mintát eredetileg leíró szö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.
Ezt olvashatod Stonebraker "Readings in Database Systems" c.
könyvében.
A beépített R-tree kezelni tudják a sokszögeket (polygon adattípus)
és a dobozokat (box). Elméletileg, az R-tree kiterjeszthető további
dimenziókra is. Gyakorlatilag ezen dolgoznod kell egy kicsit, és
még nincs dokumentációnk arról hogy az hogyan működik.
4.11) Mi a Genetic Query Optimizer?
A GEQO modul a lekérdezés optimalizáció sebességét növeli nagy
mennyiségű tábla összekapcsolása esetén. Lehetővé teszi a nagy
lekérdezések végrehajtását nem teljes kereséssel.
4.12) Hogyan tudok regexp keresést és case-insensitive regexp keresést
használni? Hogyan tudok indexet használni case-insensitive kereséshez?
A ~ operátor hajt végre reguláris kifejezés (regexp) értelmezést,
a ~* ennek case-insensitive változata. A LIKE case-insensitive
változata az ILIKE.
A case-insensitive egyenlőség műveleteket általában igy hajtjuk
végre:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
Ez nem fog indexet használni, bár létrehozhatsz egy funkció indexet:
CREATE INDEX tabindex ON tab (lower(col));
4.13) Hogyan tudom észlelni egy lekérdezésben, ha egy mező NULL?
Használd "IS NULL"-t és az "IS NOT NULL"-t.
4.14) Mi a különbség a különböző karaktertípusok között?
Type Internal Name Notes
--------------------------------------------------
"char" char 1 character
CHAR(n) bpchar blank padded to the specified fixed length
VARCHAR(n) varchar size specifies maximum length, no padding
TEXT text no specific upper limit on length
BYTEA bytea variable-length byte array (null-byte safe)
Látni fogod a belső elnevezésüket, ha tanulmányozod a rendszertáblákat
és néhány hibaüzenetet.
Az utóbbi négy a "varlena" típusok, ami a tárolásuk módjára utal:
az első 4 byte a lemezen a hosszúság, a többi az adat. A valódi méret
tehát nagyobb mint a deklarált hosszúság.Ezek azadatok tömöritve
tárolódnak el, igy kevesebb helyet foglalnek el az elöre számitottnál.
A CHAR(n) a legjobb megoldás, ha stabil hosszúságú stringet tárolsz.
A VARCHAR(n) jó arra az esetekre, ha a hosszúság változik, de van
felső korlátja. A TEXT típus korlátlan hosszúságú (1 GB-ig) szövegek
tárolására alklamas. A BYTEA bináris adatok tárolására van. A
teljesitmény mutatói hasonlóak ezenek a típusoknak.
4.15.1) Hogyan tudok létrehozni automatikusan növekvő értékű mezőt?
A PostgreSQL rendelkezik egy SERIAL adattípussal. Ez egy szekvenciát
és egy indexet hoz létre az oszlopon. Például 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 szekvenciákkal kapcsolatban olvasd el a create_sequence man
oldalt. A sor OID-jét is használhatod egyedi azonositóként, bár
ebben az esetben figyelj a pg_gump használatánál a -o opcióra
(COPY WITH OIDS, másolás OID-dal), hogy meg?rizd az értékeket.
4.15.2) Hogyan kaphatom meg egy SERIAL beszúrás értékét?
Egy megoldás erre az, ha a nextval() funkcióval megszerzed az
értéket még mielött beszúrnád az adatot a táblába. Erre itt láthatsz
egy példát:
new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
Esetleg lekérdezheted a szekvencia állapotát a sor beszúrása után.
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
Végül pedig, használhatod a visszaadott OID értéket is, bár ez a lehető
legkevésbé portolható. Perl DBI-ben, Edmund Mergl DBD::Pg moduljában
az OID érték használható a $sth->execute() után ($sth->{pg_oid_status}).
4.15.3) A currval() és a nextval() nem teremt holtpont veszélyes helyzetet
a felhasználók között?
Nem. A currval() funkció a szerver processzed által adott értéket adja
vissza, nem pedig a többi szerver processz által adottat.
4.15.4) Miért nem használódnak fel újra a sequence számok tranzakció
abort esetén?
Miért vannak problémák a serial oszlopok számozásával?
A párhuzamosság fejlesztése érdekében a sorozat számokat kérésre
adja ki a szerver futó tranzakcióknak, és azokat nem zárja, amig
a tranzakció véget nem ér. Ez jukakat okoz a számozásokban a
visszaforditott tranzakciók miatt.
4.16) Mi a OID? Mi a TID?
Az OID a PostgreSQL egyedi sor azonositója. Minden sor, ami létrejön
a szerveren, kap egy OID-t. Minden OID, amit az initdb alatt jön létre
16384 alatt van (lásd include/access/transam.h). Minden, felhasználó
által létrehozott OID legalább ennyi. Alapértelmezésben, az OID
nem csak a táblában vagy az adatbázisban egyedi, hanem a teljes
PostgreSQL adatbázis rendszerben.
A PostgreSQL az OID-okat a belsö tábláiban használja a sorok táblák
között összekapcsolásához. Ezek az OID-k használhatóak a rekordok
azonositására is amikor táblákat csatol össze a szerver (JOIN).
Az OID-ot használhatod mezö típusként is, és indexelheted is.
Az OID érték egy központi területröl származik, amit minden szerver
processz használ. Ha az OID-ot valami másra szeretnéd cserélni:
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 értékként tárolódik, igy 4 milliárdnál túlcsordul.
Még soha senki nem jelezte hogy ez történt volna, és ezt a korlátot
igyekszünk eltávolitani, még mielött bárki észrevenné.
A TID a fizikai sorok blokk és offszet címmel való azonositására szolgál.
A TID változik minden rekord módositás és törlés alkalmával. Ezeket az
indexek használják hogy a fizikai sort gyorsan megtalálják.
4.17) Mi a PostgreSQL-ben használt kifejezések jelentése?
Néhol a forrás kódban és a dokumnetációban találhatóak kifejezések,
amelyek általánosabb jelentéssel bírnak. Itt van néhány:
* tábla (table), reláció (relation), osztály (class)
* sor (row), rekord (record), tuple (nincs magyar jelentés)
* oszlop (column), mezö (field), attributum (attribute)
* retrieve, select
* helyettesit (replace), módosit (update)
* hozzáfűz (append), beszúr (insert)
* OID, sorozat érték (serial value)
* portal, cursor
* range variable, tábla név, tábla alias
Az általános adatbázis kifejezések összefoglalóját itt olvasható:
http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
/glossary.html
4.18) Miért kapom ezt a hibát: "ERROR: Memory exhausted in
AllocSetAlloc()"?
Lehet hogy elfogyott a virtuális memóriád, vagy a kerneled erőforrás
korlátai alacsonyak. Próbáld ki ezt mielött elinditanád a postmastert:
ulimit -d 262144
limit datasize 256m
A shelltől függően ezek közül csak az egyik fut majd le, de a
processzek adatszegmensét sokkal magasabbra állitja, ami talán
elég lesz a lekérdezés végrehajtásához. Ez az utasítás a jelenlegi
processzre (a shelled) érvényes, és minden általa létrehozott
processzre. Ha problémád van az SQL klienssel, mert a szerver
túl nagy adatot küld vissza, próbáld meg e klienssel is ugyanezt.
4.19) Hogyan tudhatom meg PostgreSQL, milyen verziót futtatok?
A psql programban select version();
4.20) Miért kapok "invalid large obj descriptor" hibát nagy objektumok
kezelésénél?
A nagy objektumok kezelését egy tranzakciós blokkban helyezd el.
(BEGIN és COMMIT között)
Jelenleg a PostgreSQL ezt a szabályt azzal teszi kötelezővé, hogy a
tranzakció végén a nagy objektumokat lezárja, igy a tranzakció után
az első művelet amit az objektumon végrahajtanál hibás lesz.
Ha olyan programozási felületet használsz mint az ODBC vagy a JDBC
akkor valószinűleg ki kell kapcsolnod az auto-commit-ot.
4.21) Hogy hozhatok létre olyan oszlopot, aminek alapértelmezett
érétke a jelenlegi idő?
Használd a CURRENT_TIMESTAMP -ot:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Miért olyan lassúak az al-lekérdezéseim IN-nel?
Jelenleg az al-lekérdezéseket a külső lekérdezéshez csatoljuk. Ha
az allekérdezés csak kevés sort eredményez és a külső lekérdezés
sokat, akkor az IN is gyors. Az EXISTS kulcsszó használatával
gyorsithatod a lekérdezéseket.
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
EXISTS használatával:
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. Reméljük ezt a korlátot sikerül hamarosan legyőznünk.
4.23) Hogyan tudok outer join-t végrehajtani?
A PostgreSQL a szabványos SQL szintaktikát követi. Itt van két példa:
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 lekérdezések összekapcsolják a t1.col és a t2.col
mezőket, és a t1 bármelyik kapcsolatlan sorát is visszadják. A RIGHT
JOIN a t2 kapcsolatlan sorait adta volna vissza, a FULL JOIN pedig
a kapcsolt, és mindkét tábla kapcsolatlan sorait adja. Az OUTER
kulcsszó opcionális, a LEFT, RIGHT és FULL JOIN szintaktikailag
helyes. Az átlagos összekapcsolásokat INNER JOIN-nak nevezzük.
Az előző kiadásokban a OUTER JOIN lekérdezéseket UNION és NOT IN
kulcsszavakkal lehetett szimulálni. Például a tab1 és a tab2
összekapcsolása:
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 több adatbázison végrehajtani lekérdezést?
Arra nincs lehetőség, hogy más adatbázisból kérdezz le adatot.
Mivel a PostgreSQL adatbázis specifikus rendszer táblákat tölt
be, bizonytalan hogy egy adatbázisok közötti lekérdezésnek hogyan
kellene viselkednie.
A contrib/dblink könyvtárban találsz egy megoldást erre, ami
funkció hivások segitségével működik. Persze, a kliens hozhat létre
szimultán kapcsolatot több adatbázissal, és összefésülheti az
eredményeket.
4.25) Hogy tudok több soros vagy oszlopos eredményt visszaadni egy
funkcióból?
A PL/pgSQL tárolt eljárás nyelvvel refcursor használatával.
Részletesen itt:
http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html
4.26) Miért nem tudom megbizhatóan létrehozni és törölni az átmeneti
táblákat a PL/pgSQL funkciókban?
A PL/pgSQL cacheli a funkciók tartalmát, aminek az a szerencsétlen
mellékhatása, hogy ha egy PL/pgSQL funkció használ egy átmeneti
táblát, ami kés?bb törlődik majd ujra létrejön, akkor az újra lefutó
funkció nem fogja megtalálni a táblát, mert a cache változat a régi
táblára tartalmaz mutatót. A megoldás erre az EXECUTE utasítás
használata az átmeneti táblák kezelésére PL/pgSQL-ben. Ez a
lekérdezés újrafordítását fogja előidézni minden alkalommal.
4.27) Milyen replikációs lehetőségek vannak?
Számos master/slave replikációs lehetőség létezik. Ez csak a master
adatbázis számára teszi lehetővé, hogy az adatokat változtassa. Egy
Listát olvashatsz ezekről itt:
http://gborg.PostgreSQL.org/genpage?replication_research
Egy többfelhasználós replikációs rendszer készül itt:
http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
4.28) Milyen kódolási lehetőségek vannak?
- A contrib/pgcrypto tartlamaz számos SQL lekérdezésben használható kódolást.
- A kliens-szerver kommunikáció rejtjelezésére a hostssl használható.
Ezt a pg_hba.conf-ben engedélyeztheted.
- Az adatbázis felhsználók jelszavait tároláskor kódolja a rendszer.
Régebbi verziókban a PASSWORD_ENCRYPTION opcióval lehetett
bekapcsolni.
- A szerveren használhatsz kódolt fájrendszert.
_________________________________________________________________
A PostgreSQL kiterjesztése
5.1) Írtam egy felhasználói funkciót. Miért core dumpol az adatbázis amikor
használom?
Számos probléma lehet. Elöbb probáld ki a funkciódat egy különálló
alkalmazásban.
5.2) Hogyan lehet új adattípusokat és funkciókat hozzáadni a PostgreSQL
disztribúcióhoz?
Küldd el a kiegészítéseid a pgsql-hackers levelezési listára és a
forráskodjaid végül a contrib-ban kötnek ki.
5.3) Hogyan lehet olyan C funkciót írni, ami Tuple-t ad vissza?
A 7.3 verziótól kezdve a PostgreSQL támogatja a táblázatokat
viszzaadó funkciókat C, PL/pgSQL és SQL nyelveken. Bővebb
dokumentációt a Programozó kézikönyvben találsz. Egy C példa
funkció található a contrib/tablefunc könyvtárban.
5.4) Megváltoztattam egy forrás állományt. Miért nem változik a bináris
újrafordítás után?
A Makefile-ok nem ismerik a include állományok megfelelő függőségeit.
Végre kell hajtanod egy make clean-t, majd újra egy make-t. Ha GCC-t
használsz felhasználhatod a configure script --enable-depend opcióját,
így a compiler maga fogja ellenőrizni a függőségeket.
|