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