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-2008, 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