
                     Často kladené dotazy (FAQ) PostgreSQL
                                       
   Poslední aktualizace: Středa 23. června 21:10:00 EST 2004
   
   Současný správce: Bruce Momjian (pgman@candle.pha.pa.us)
   
   Přeložil: Pavel Stěhule (stehule@kix.fsv.cvut.cz)
   
   Aktuální verzi tohoto dokumentu naleznete na adrese:
   http://www.PostgreSQL.org/docs/faqs/FAQ.html. Český překlad na adrese:
   http://www.PostgreSQL.org/docs/faqs/FAQ_czech.html.
   
   Odpovědi na dotazy relevantní ke konkrétním platformám lze nalézt na
   adrese: http://www.PostgreSQL.org/docs/index.html.
     _________________________________________________________________
   
                               Obecné otázky
                                      
   1.1) Co je PostgreSQL? Jak se vyslovuje?
   1.2) Jaká je licence na PostgreSQL?
   1.3) Na kterých Unixex lze spustit PostgreSQL?
   1.4) Které ne-unixové platformy jsou podporované?
   1.5) Kde mohu získat PostgreSQL?
   1.6) Kde mohu získat podporu?
   1.7) Kde je poslední verze?
   1.8) Jaká je dostupná dokumentace?
   1.9) Kde najdu seznam známých chyb nebo nepodporovaných vlastností?
   1.10) Jak se mohu naučit SQL?
   1.11) Nemá PostgreSQL problémy s rokem 2000?
   1.12) Jak se připojit k vývojářskému týmu?
   1.13) Kam podat report o chybě?
   1.14) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
   1.15) Jak lze finančně pomoci PostgreSQL?
   
                             User client dotazy
                                      
   2.1) Kde naleznu ODBC ovladače pro PostgreSQL?
   2.2) Jaké nástroje lze použít pro PostgreSQL a web?
   2.3) Existuje grafické rozhraní pro PostgreSQL?
   2.4) Které programovací jazyky mají podporu pro PostgreSQL?
   
                           Administrativní dotazy
                                      
   3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?
   3.2) Při startu postmaster, dostanu chybové hlášení Bad System Call
   nebo core dump. Proč?
   3.3) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate.
   Proč?
   3.4) Při startu postmastera dostanu hlášení o chybě
   IpcSemaphoreCreate. Proč?
   3.5) Jak povolit nebo zakázat přístup z jiných stanic?
   3.6) Jak ladit databázový stroj na lepší výkon?
   3.7) Jaké jsou možnosti ladění?
   3.8) Proč dostanu "Sorry, too many clients", když se zkouším připojit?
   3.9) K čemu slouží adresář pgsql_tmp?
   3.10) Proč je požadováno dump a obnovení (load) databáze během upgrade
   mezi velkými verzemi PostgreSQL?
   
                              Provozní dotazy
                                      
   4.1) Čím se liší binární a normální kurzor?
   4.2) Jak získat pouze první řádek dotazu? Náhodný řádek?
   4.3) Jak získám seznam tabulek nebo jinak jak jej získá psql?
   4.4) Jak odstraním sloupec tabulky, jak změním jeho typ?
   4.5) Jaká je maximální velikost řádku, tabulky a databáze?
   4.6) Kolik diskového prostoru je potřeba k uložení dat z normálního
   textového souboru?
   4.7) Jak získám seznam vytvořených tabulek, indexů, databází?
   4.8) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?
   4.9) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz?
   4.10) Co to je R-tree index?
   4.11) Co je Genetic Query Optimizer?
   4.12) Jak provést vyhledávání regulárního výrazu case sensitiv,
   insensitiv? Jak použít index pro case insensitive vyhledávání?
   4.13) Jak v dotazu detekovat, že položka je NULL?
   4.14) Jaké jsou rozdíly mezi různými znakovými typy?
   4.15.1) Jak vytvořit serial/auto-increment pole?
   4.15.2) Jak získat hodnotu SERIAL po vložení řádku?
   4.15.3) Nepovede currval() a nextval() k rozhození podmínek při
   souběhu s jinými uživateli?
   4.15.4) Proč není vygenerované číslo použito při přerušení transakce?
   Proč vznikají díry v číslování vlastní sekvencí/SERIAL sloupce?
   4.16) Co to je OID? Co je to TID?
   4.17) Jaký je význam některých výrazů použitých v PostgreSQL?
   4.18) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in
   AllocSetAlloc()"?
   4.19) Jak se dozvím, kterou verzi PostgreSQL používám?
   4.20) Proč operace s velkými objekty končí "invalid large obj
   descriptor"?
   4.21) Jak vytvořit sloupec obsahující implicitně aktuální datum?
   4.22) Proč jsou moje vnořené dotazy používající IN tak pomalé?
   4.23) Jak provést vnější spojení (outer join)?
   4.24) Jak provést dotaz napříč několika databázemi?
   4.25) Může funkce vrátit více řádků nebo sloupců?
   4.26) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v
   PL/pgSQL funkcích?
   4.27) Jaké jsou možnosti replikace databází?
   4.28) Jaké jsou možnosti šifrování databází?
   
                           Rozšiřování PostgreSQL
                                      
   5.1) Napsal jsem UDF funkci, PostgreSQL však končí dump core?
   5.2) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do
   PostgreSQL?
   5.3) Jak napsat funkci v C vracející ntici?
   5.4) Modifikoval jsem zdrojové soubory. Tato změna nebyla při
   rekompilaci vzata v potaz. Proč?
     _________________________________________________________________
   
                               Obecné otázky
                                      
    1.1) Co je PostgreSQL? Jak se vyslovuje?
    
   PostgreSQL se vyslovuje Post-Gres-Q-L. Zvukový záznam je dostupný na
   adrese .
   
   PostgreSQL vychází z databáze POSTGRES (a stále je někdy označován
   zjednodušeně jako Postgres) - výzkumného prototypu DBMS nové generace.
   Z postgresu byl převzat silný datový model a bohatý soubor datových
   typů a jeho dotazovací jazyk PostQuel byl nahrazen rozšířenou
   podmnožinou jazyka SQL. PostgreSQL lze používat bez omezení a jeho
   zdrojové kódy jsou volně k dispozici.
   
   PostgreSQL vyvýjí tým vývojářů přihlášených do vývojářské konference
   PostgreSQL. Současným koordinátorem je Marc G. Fournier
   (scrappy@PostgreSQL.org). (viz 1.6 - jak se zapojit). Tento tým je
   zodpovědný za veškerý vývoj PostgreSQL. Jedná se o veřejný projekt,
   který není řízen žádnou firmou. Pokud se chcete zapojit, přečtěte si
   developer's FAQ na adrese
   http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html
   
   Autory první verze PostgreSQL 1.01 byli Andrew Yu and Jolly Chen. Do
   portace, testování, ladění a rozšiřování kódu se zapojilo mnoho
   dalších vývojářů . Původni kód Postgresu, ze kterého PostgreSQL
   vychází, je výsledkem úsilí mnoha studentů a programátorů pracujících
   pod vedením prof. Michaela Stonebrakera na University of California v
   Berkley.
   
   Původní název software z Berkley byl Postgres. Po přidání jazyka SQL
   se název změnil na Postgres95. Koncem roku 1996 byl RDBMS přejmenován
   na PostgreSQL.
   
    1.2) Jaká je licence na PostgreSQL?
    
   PostgreSQL je předmětem následujících autorských práv:
   
   Dílčí Copyright (c) 1996-2005, PostgreSQL Global Development Group
   Dílčí Copyright (c) 1994-6, Regents of the University of California
   
   Uděluje se oprávnění k užití, rozmnožování, provádění úprav a
   rozšiřování tohoto softwaru a dokumentace k němu, pro jakékoli účely,
   bez licenčního poplatku a bez písemné licenční smlouvy, za podmínky,
   že na všech jeho kopiích je uvedeno oznámení o výše uvedených právech,
   jakož i obsah tohoto a dvou následujících odstavců.
   
   THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ŽÁDNÉM
   PŘÍPADĚ ODPOVĚDNA ŽÁDNÉ TŘETÍ OSOBĚ ZA PŘÍMOU, NEPŘÍMOU, ZVLÁŠTNÍ,
   NAHODILOU NEBO VÝSLEDNOU ŠKODU, VČETNĚ UŠLÉHO ZISKU, ZPůSOBENOU UŽITÍM
   TOHOTO SOFTWARU A DOKUMENTACE K NĚMU, A TO I V PŘÍPADĚ, ŽE THE
   UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOŽNOSTI VZNIKU TAKOVÉ
   ŠKODY.
   
   HE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO
   NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VýROBKU KE
   SPECIFICKýM ÚČELůM. NÍŽE UVEDENý SOFTWARE JE POSKYTNUT "JAK STOJÍ A
   LEŽÍ" A THE UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO
   ÚDRŽBU, PODPORU, AKTUALIZACI, VYLEPŠENÍ NEBO MODIFIKACI.
   
   Výše uvedené je BSD licence, běžná licence otevřeného zdroje. Není zde
   žádné omezení ohledně užití kódu zdroje. Jsme s tím spokojeni a nemáme
   v úmyslu na této skutečnosti cokoli měnit.
   
    1.3) Na kterých Unixex lze spustit PostgreSQL?
    
   PostgreSQL běží na všech moderních unixových platformách. V
   instalačních instrukcích naleznete aktuální seznam všech platforem na
   kterých byla testováním ověřena funkcionalita PostgreSQL.
   
    1.4) Které ne-unixové platformy jsou podporované?
    
   Klient
   
   Knihovna libpq, psql a některé další moduly byly přeloženy pro MS
   Windows. Klienta lze provozovat na MS Windows, ten prostřednictvím
   TCP/IP protokolu komunikuje se serverem běžícím na některé z
   podporovaných Unixových platforem. K překladu lze použít win32.mak a
   Win32 knihovny libpq a psql. K databázi PostgerSQL lze přistupovat
   skrze rozhraní ODBC.
   
   Server
   
   Server může být na WindowsNT a Win2k provozován pouze s knihovnou
   Cygwin, Cygnus Unix/NT porting library. Více pgsql/doc/FAQ_MSWIN v
   distribuci nebo MS Windows FAQ na adrese
   http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN.
   
   Na nativním portu pro MS Win NT/2000/XP se pracuje. Další informace o
   aktuálním stavu PostgreSQL pro Windows naleznet na adrese
   http://techdocs.postgresql.org/guides/Windows a
   http://momjian.postgresql.org/main/writings/pgsql/win32.html.
   
   Existující port pro Novell Netware 6 naleznete na
   http://forge.novell.com.
   
    1.5) Kde mohu získat PostgreSQL?
    
   Primárním anonymním ftp serverem pro PostgreSQL je
   ftp://ftp.PostgreSQL.org/pub. Seznam zrcadel naleznete na našich
   webových stránkách.
   
    1.6) Kde mohu získat podporu?
    
   Hlavní mailová konference je: pgsql-general@PostgreSQL.org. Slouží k
   diskuzím ohledně PostgreSQL. Přihlásíte se zasláním mailu obsahující
   následující řádky v těle dopisu (nikoliv v záhlaví - subjectu):
    subscribe
    end

   na adresu pgsql-general-request@PostgreSQL.org.
   
   Můžete si vyžádat denní přehled (diggest), který má zhruba 30K denně
   zpráv.
   
   Konference psql-bugs je určena k zasílání zpráv o chybách. Pro
   přihlášení pošlete mail se stejným obsahem jako v předchozím případě
   na adresu pgsql-bugs-request@PostgreSQL.org.
   
   Do vývojářské konference se přihlásíte odesláním dopisu s již
   zmiňovaným obsahem na mailto:pgsql-hackers-request@PostgreSQL.org.
   
   Seznam dalších konferencí naleznete na stránkách PostgreSQL:
   
     http://www.postgresql.org
     
    1.7) Jaká je poslední verze?
    
   Poslední verze PostgreSQL je 7.4.3. Plánujeme uvolnit významnou verzi
   každých šest až osm měsíců.
   
    1.8) Jaká je dostupná dokumentace?
    
   Různé manuály, manuálové stránky a několik malých testovacích příkladů
   jsou součásti distribuce. Podívejte se do adresáře /doc. Manuály jsou
   přístupné online na http://www.PostgreSQL.org/docs.
   
   Na adresách http://www.PostgreSQL.org/docs/awbook.html a
   http://www.commandprompt.com/ppbook/ naleznezte dvě online knihy o
   PostgreSQL. Seznam dostupné literatury je na
   http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Soubor
   technických článků s tematikou PostgresQL najdete na
   http://techdocs.PostgreSQL.org/.
   
   psql má užitečný metapříkaz \d sloužící k zobrazení informací o
   typech, operátorech, funkcí, agregačních funkcí atd.
   
   Více dokumentace naleznete na našich webových stránkách.
   
    1.9) Kde najdu seznam známých chyb nebo nepodporovaných vlastností?
    
   PostgreSQL podporuje rozšířenou podmnožinu SQL-92. V našem TODO
   najdete seznam známých chyb, chybějících vlastností a seznam
   vlastností, které budou do systému implementovány v budoucnu (včetně
   priorit).
   
    1.10) Jak se mohu naučit SQL?
    
   V knize The PostgreSQL book na
   http://www.PostgreSQL.org/docs/awbook.html je vysvětlen jazyk SQL
   (vyšla česky). Další dostupnou knihou je
   http://www.commandprompt.com/ppbook. Kvalitní návody naleznete na
   http://www.intermedia.net/support/sql/sqltut.shtm, a na
   http://sqlcourse.com.
   
   Další je Teach Yourself SQL in 21 days, Second Edition na
   http://members.tripod.com/er4ebus/sql/index.htm.
   
   Mnoho uživatelů doporučuje The Practical SQL Handbook, Bowman, Judith
   S., et al., Addison-Wesley. Jiní preferují The Complete Reference SQL,
   Groff et al., McGraw-Hill.
   
    1.11) Nemá PostgreSQL problémy s rokem 2000?
    
   Nemá, můžeme pracovat s datumy po roce 2000 našeho letopočtu i před
   rokem 2000 př.n.l.
   
    1.12) Jak se připojit k vývojářskému týmu?
    
   Nejdříve si stáhněte nejnovější zdroje a přečtěte si vývojářskou
   dokumentaci na našem webu nebo v distribuci. Pak se přihlašte do
   konferencí pgsql-hackers a pgsql-patches. Kvalitní záplaty posílejte
   do pgsql-patches.
   
   Právo commit má v CVS archivu asi třinácti lidí. Každý z nich poslal
   mnoho kvalitních záplat, takže tehdejší commiters měli jistotu, že
   budou předkládat jenom kvalitní záplaty a mohli jim předělit větší
   práva.
   
    1.13) Kam podat report o chybě?
    
   Navštivte naši PostgreSQL BugTool stránku na
   http://www.PostgreSQL.org/bugs/bugs.php, která obsahuje návod a
   směrnice jak podat chybový report.
   
   Ověřte si na našem ftp serveru ftp://ftp.PostgreSQL.org/pub, zda-li
   máte nejnovější verzi PostgreSQL a zda-li k ní neexistují nějaké
   záplaty.
   
    1.14) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
    
   Existuje několik hledisek jak porovnávat software: vlastnosti, výkon,
   spolehlivost, podpora a cena.
   
   Vlastnosti
          PostgreSQL má hodně společných vlastností s velkými komerčními
          DBMS, např. transakce, vnořené dotazy, spouště, pohledy,
          kontrolu referenční integrity a sofistikované zamykání.
          Podporuje některé vlastnosti, které tyto systémy nemají,
          uživatelem definované typy, dědičnost, pravidla, MVCC
          redukující zamykání.
          
   Výkon
          Výkonnostně je na tom PostgreSQL podobně jako další komerční
          ale i open source databáze, v něčem je rychlejší, jindy
          pomalejší. V porovnání s MySQL a podobnými databázovými systémy
          je PostgreSQL rychlejší při víceuživatelském přístupu,
          složitějších dotazech a zatížení read/write dotazy. MySQL je
          rychlejší v jednodušších dotazech s malým počtem uživatelů.
          Navíc, MySQL nepodporuje mnohé vlatnosti zmíněné v sekci
          vlastnosti. Zapracovali jsme na spolehlivosti a podporovaných
          vlastnostech, a výkon zvyšujeme v každé verzi. Zajímavou
          stránku porovnávající PostgreSQL a MySQL naleznete na
          http://openacs.org/philosophy/why-not-mysql.html. Za vývojem
          MySQL není Open Source komunita, ale komerční společnost,
          přestože svoje produkty distribuuje jako Open Source.
          
   Spolehlivost
          Jsme si vědomi, že databáze musí být spolehlivá, jinak je
          nepoužitelná. Snažíme se zveřejňovat dobře otestovaný, stabilní
          kód s minimem chyb. Každá verze je více než měsíc v beta
          testování, a naše historie verzí ukazuje, že můžeme nabídnout
          stabilní, solidní verze, které jsou připraveny pro reálné
          nasazení. V této oblasti jsme srovnatelní s dalšími databázemi.
          
   Podpora
          Na naší mailové konferenci můžete kontaktovat velkou skupinu
          vývojářů a uživatelů.problémů. Nemůžeme garantovat opravu,
          nicméně komerční databáze také ne vždy nabídnou opravu. Podle
          ohlasů je naše podpora hodnocena lépe než u jiných DBMS a to
          díky přímému kontaktu s vývojáři, velkou komunitou uživatelů,
          kvalitními manuály a přístupným zdrojovým kódem. Pro uživatele,
          kteří vyžadují podporu ke konkrétním případům, existuje placená
          podpora (FAQ sekce 1.6).
          
   Cena
          PosgreSQL lze volně používat pro nekomerční i komerční použití.
          Můžete do svých produktů přidat náš kód bez omezení, respektive
          v souladu s podmínkami naší licenční smlouvy (v duchu BSD
          licence).
          
    1.15) Jak lze finančně pomoci PostgreSQL?
    
   PosgreSQL má prvotřídní infrastrukturu od našeho začátku v roce 1996.
   Vděčíme za to Marku Fournierovi, který založil a spravoval tuto
   infrastrukturu několik let.
   
   Kvalitní infrastruktura je velice důležitá pro každý open source
   projekt. Předchází nedorozuměním, která velice zdržují pokrok v
   projektu.
   
   Tato infrastruktura není laciná. K jejímu zajištění je třeba stále
   hradit určité měsíční a jednorázové částky. Pokud máte Vy nebo Vaše
   společnost peníze, které nám můžete darovat, obraťe se na
   http://store.pgsql.com/shopping/ a darujte je.
   
   Ačkoliv webová stránka zmiňuje PostgreSQL, Inc. vklady jsou určeny
   pouze k podpoře projektu PostgreSQL a nepodporují žádnou existující
   společnost. Pokud to vyžadujete, můžete poslat kontrolu na naši
   kontaktní adresu.
     _________________________________________________________________
   
   Pokud máte příklad úspěšného nasazení PostgreSQL, přihlaště se na náš
   advocacy site na http://advocacy.postgresql.org.
   
                             User client dotazy
                                      
    2.1) Kde naleznu ODBC ovladače pro PostgreSQL?
    
   Pro PostgreSQL existují dva ODBC ovladače - PsqlODBC a OpenLink ODBC.
   
   PsqlODBC je ke stažení na
   http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
   
   OpenLink můžete získat na http://www.openlinksw.com. Spolupracuje s
   jejich klientským programovým vybavením a je dostupný pro všechny jimi
   podporované platformy (Win, Mac, Unix, VMS).
   
   Tento ovladač je určen pro ty, kteří vyžadují podporu komerční
   kvality, nicméně freeware verze je dostupná a funkční. Dotazy
   zasílejte na postgres95@openlink.co.uk.
   
    2.2) Jaké nástroje lze použít pro PostgreSQL a web?
    
   Pěkný úvod do databázových technologií zabezpečujících chod webových
   stránek najdete na http://www.webreview.com.
   
   Pro tvorbu webu existuje excelentní rozhraní PHP, které naleznete na
   http://www.php.net.
   
   Pro složitější případy se často používá Perl a CGI.pm nebo mod_perl.
   
    2.3) Existuje grafické rozhraní pro PostgreSQL?
    
   Pro PostgreSQL existuje několik grafických rozhraní: PgAccess
   (http://www.php.net), PgAdmin III (http://www.php.net), RHDB Admin
   (http://sources.redhat.com/rhdb/) a Rekall (
   http://www.thekompany.com/products/rekall/). Dále ještě PhpPgAdmin
   (http://phppgadmin.sourceforge.net/) což je rozhraní PostgreSQL
   založené na web technologii.
   
   Úplnější seznam najdete na
   http://techdocs.postgresql.org/guides/GUITools.
   
    2.4) Které programovací jazyky mají podporu pro PostgreSQL?
    
   Většina programovacích jazyků obsahuje rozhraní pro PostgreSQL.
   Podívejte se do rozšiřujících modulů Vašeho programovacího jazyka.
   
   Distribuce PostgreSQL obsahuje tato rozhraní:
     * C (libpq)
     * Embbedded C (ecpg)
     * Java (jdbc)
     * Python (PyGreSQL)
     * TCL (libpgtcl)
       
   Další rozhraní jsou dostupná na http://gborg.postgresql.org v sekci
   Drivers/Interfaces.
     _________________________________________________________________
   
                           Administrativní dotazy
                                      
    3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?
    
   Použijte volbu --prefix při spuštění configure.
   
    3.2) Při startu postmaster, dostanu chybové hlášení Bad System Call nebo
    core dump. Proč?
    
   Důvody mohou být různé, ale nejprve zkontrolujte, zda Váš systém
   podporuje System V extensions. PostgreSQL vyžaduje v jádře podporu
   sdílené paměti a semaforů.
   
    3.3) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. Proč?
    
   Buďto nemáte správně nakonfigurovanou sdílenou paměť v jádře nebo
   musite zvětšit její velikost. Potřebná velikost je závislá na
   architektuře a na tom, kolik paměťových bufferů a backendů máte
   povoleno pro postmastera. Pro většinu systémů s předdefinovaným počtem
   backendů a paměťových bufferů je minimum zhruba 1MB. V PostgreSQL
   Administrator's Guide naleznete podrobnější informace o sdílené paměti
   a semaforech.
   
    3.4) Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate.
    Proč?
    
   Pokud dostane chybovou zprávu IpcSemaphoreCreate: semget failed (No
   space left on device), pak vaše jádro nemá dost volných semaforů.
   PostgreSQL vyžaduje jeden semafor pro každý backend v pozadí. Dočasným
   řešením je start postmaster s limitem backendů. Použijte přepínač -N s
   hodnotou menší než 32. Úplným řešením je zvýšení hodnot SEMMNS a
   SEMMNI jadra.
   
   Nefunkční semafory mohou způsobit pád během intenzivních databázových
   operací.
   
   Pokud se tato chyba vyskytuje ještě někde jinde, možná nemáte vůbec
   nakonfigurovány semafory ve vašem jádře. V PostgreSQL Administrator's
   Guide najdete podrobnější popis požadavků na sdílenou pamět a
   semafory.
   
    3.5) Jak povolit nebo zakázat přístup z jiných stanic?
    
   Při výchozím nastavení PostgreSQL odepře přístup z jiných stanic než
   lokální s použitím UDP. Přístup z jiných strojů není možný dokud jej
   nepovolíte nastavením tcpip_socket v postgresql.conf a určením způsobu
   autentifikace v $PGDATA/pg_hba.conf.
   
    3.6) Jak ladit databázový stroj na lepší výkon?
    
   Určitě pomohou indexy. Příkaz EXPLAIN ANALYZE Vám umožní sledovat jak
   PostgreSQL interpretuje Váš dotaz a které indexy používá.
   
   Při větší dávce INSERTů uvažujte o náhradě příkazem COPY. Ten je
   mnohem rychlejší nežli samotný INSERT. Každý příkaz mimo blok BEGIN
   WORK/COMMIT se provádí ve vlastní transakci. Zvažte, zda-li by se
   nedalo několik příkazů spojit do jedné transakce. Tím se sníží režie
   na transakce. Před provedením rozsáhlých změn zrušte indexy, které po
   dokončení změn opět vytvořte.
   
   Máte několik dalších možností, jak zlepšit výkon. Můžete zakázat
   fsyn() při startu postmastera přepínači -o -F. Tyto přepínače zabrání
   fsync(), tj. zápisu na disk po každé transakci.
   
   Můžete zvýšit velikost paměťových bufferů použitých backendy tj.
   parametr -B postmasteru. Pokud ale tato hodnota bude příliš velká, tak
   možná nespustíte postmastera jelikož dosáhnete limitu sdílené paměti.
   Každý buffer má 8K a implicitně je 64 bufferů.
   
   Dále můžete použít přepínač -S k zvýšení limitu paměti pro backendy na
   dočasné třídění. Hodnota je míněna v kilobytech a výchozí nastavení je
   512, tj. 512K.
   
   Můžete použít příkaz CLUSTER, který uspořádá fyzicky data v tabulkách
   podle indexu. Více na manuálových stránkách příkazu CLUSTER.
   
    3.7) Jaké jsou možnosti ladění?
    
   Máte několik možností jak se dostat k užitečným stavovým informacím.
   
   Zaprvé, při překladu použijte přepínač --enable-cassert, tím se zapne
   monitorování a následné zastavení aplikace, když se proces v backendu
   dostane do neočekávaného stavu.
   
   Jak postmaster tak postgres má několik přepínačů umožňujících ladění.
   Postmaster nastartujte tak, abyste si byli jisti, že je standartní
   výstup a standartní chybový výstup přesměrován do souboru logu,
   například:
    cd /usr/local/pgsql
    ./bin/postmaster > server.log 2>&1 &

   Tím se vytvoří log v adresáři PostgreSQL, Tento soubor obsahuje
   užitečné informace o problémech a chybách vyskytlých se na serveru.
   Postmaster má přepínač -d určující, jak podrobné mají být reportované
   informace, tj. debug level. Pozor, při velké hodnotě debug levelu
   rychle roste velikost souboru logu.
   
   Pokud neběží postmaster, můžete spustit backend PostgreSQL z příkazové
   řádky a napsat svůj SQL dotaz přímo v backendu (doporučeno pouze pro
   ladění). Dotaz je v tomto případě ukončen novou řádkou, nikoliv
   středníkem. Pokud máte aplikaci přeloženou s ladícími symboly, můžete
   použít debbuger k monitorování procesu. Pokud není backend spuštěn
   postmasterem, pak neběží ve svém obvyklém prostředí a tudíž některé
   problémy dané interakcí mezi backendy nemohou být nasimulovány.
   
   Pokud běží postmaster, spusťe psql v jednom okně a pak si zjistěte PID
   procesu postgres použitého psql. V debuggeru sepřipojte k postgresql
   PID. Pak nastavte breakpointy v debuggeru a zadejte dotaz v psql.
   Pokud ladíte startup postgresu, pak nastavte PGOPTIONS="-W n" a spusťe
   psql. Tento přepínač způsobí pauzu n sekund, takže budete mít čas se
   připojit k procesu, a nastavit breakpointy a pokračovat v startup
   posloupnosti.
   
   Pro ladění a měření výkonu mohou být užitečné přepínače -s, -A a -t
   programu postgres (backend).
   
   Můžete provést překlad s profilací, tak abyste viděli kolik času
   zabírají jednotlivé funkce. Soubory s profily backendů jsou uloženy v
   adresáři pgsql/data/base/dbname. Profil klienta pak v jeho aktuálním
   adresáři. Korektní profilace v prostředí Linux požaduje konfiguraci
   systému s parametrem -DLINUX_PROFILE.
   
    3.8) Proč dostanu "Sorry, too many clients", když se zkouším připojit?
    
   Zvyšte limit postmastera na maximální počet současně spuštěných
   backendů.
   
   Výchozí hodnota je 32 backendů. Tuto hodnotu zvýšíte zastavením a
   opětovným spuštěním postmastera s parametrem -N nebo úpravou
   postgresql.conf.
   
   Při zvýšení hodnoty -N nad 32 musíte zvýšit hodnotu -B nad výchozí 64,
   -B musí být minimálně dvakrát větší, nebo ještě lépe více.
   Pravděpodobně zjistíte, že pro velký počet procesů backendu je nutné
   zvýšit některé parametry jádra. Jsou to především maximální velikost
   sdílené paměti SHMMAX, maximální počet semafórů SEMMNS a SEMMNI,
   maximální počet procesů NPROC, maximální počet procesů uživatele
   MAXUPRC a maximální počet otevřených souborů NFILE a NINODE. Důvod pro
   omezení maximálního počtu backendů je fakt, že by mohlo dojít k
   vyčerpání zdrojů Vašeho systému.
   
    3.9) K čemu slouží adresář pgsql_tmp?
    
   Tento adresář obsahuje dočasné soubory vytvořené exekutorem dotazů.
   Například, když je nutné třídění k zajištění ORDER BY a třídění má
   větší nároky na prostor než povoluje parametr -S backendu, pak je
   vytvořen dočasný soubor k uložení extra údajů.
   
   Dočasné soubory jsou obvykle mazány automaticky, ale může se stát, že
   během třídění server spadne. Zastavení a další start postmastera
   zajistí odstranění souborů s těchto adresářů.
   
    3.10) Proč je požadováno dump a obnovení (load) databáze během upgrade mezi
    velkými verzemi PostgreSQL?
    
   PostgreSQL se minimálně mění během malých verzí, takže např. při
   upgrade z 7.2 na 7.2.1 není nutné dump a load databáze. Ale výynamné
   verze často mění interní formát systémových tabulek a datových
   souborů. Tyto změny jsou natolik rozsáhlé, že nelze zajistit zpětnou
   kompatibilitu pro datové soubory. Dump uloží data v obecném formátu,
   takže mohou být načtena a používána v novém interním formátu.
     _________________________________________________________________
   
                              Provozní dotazy
                                      
    4.1) Čím se liší binární a normální kurzor?
    
   Popis najdete v manuálové stránce DECLARE
   
    4.2) Jak získat pouze první řádek dotazu? Náhodný řádek?
    
   Podívejte se do man. stránky příkazu FETCH, nebo použijte SELECT ...
   LIMIT ...
   
   I když potřebujete získat pouze prvních několik řádků, je třeba
   zpracovat všechna data, např. pokud dotaz má ORDER BY. Pokud však
   existuje index, který odpovídá ORDER BY, PostgreSQL může získat pouze
   prvních n řádků a ukončit zpracování dotazu.
   
   K získání náhodného řádku použijte:
    SELECT col
    FROM tab
    ORDER BY random()
    LIMIT 1;

    4.3) Jak získám seznam tabulek nebo jinak jak jej získá psql?
    
   Příkaz \dt v psql zobrazí seznam tabulek. Úplný seznam příkazů psql
   dostanete příkazem \?. Také se můžete podívat do zdrojových kódů psql
   do souboru pgsql/src/bin/psql/describe.c. Ten obsahuje SQL příkazy,
   které se používají v psql metapříkazech. Dále můžete spustit psql s
   přepínačem -E, který způsobí zobrazení každého dotazu, které
   zpracování metapříkazu vyvolá. PostgreSQL nabízí SQLi INFORMATION
   SCHEMA s tabulkami obsahující informace o databázi.
   
    4.4) Jak odstraním sloupec tabulky, jak změním jeho typ?
    
   Počínaje verzí 7.3 můžete použít příkaz ALTER TABLE DROP COLUMN. Ve
   starších verzích můžete použít následující postup:
    BEGIN;
    LOCK TABLE old_table;
    SELECT ... -- mimo sloupec, který chceme odstranit
    INTO TABLE new_table;
    DROP TABLE old_table;
    ALTER TABLE new_table RENAME TO old_table;
    COMMIT;

   Pro změnu typu sloupce je třeba provést:
    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;

   Poté proveďte VACUUM FULL tab - uvolníte tím diskový prostor zabraný
   nyní již neplatnými řádky.
   
    4.5) Jaká je maximální velikost řá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 řádky:              1.6 TB
    Maximální velikost položky             1 GB
    Maximální počet řádků v tabulce:       neomezeno
    Maximální počet sloupců v tabulce:     250-1600 podle typů
    Maximální počet indexů na tabulce:     neomezeno

   Ve skutečnosti nic není neomezeno, limitem bývá vždy dostupná disková
   paměť nebo velikost operační paměti. Pokud máte některou z těchto
   hodnot neobvykle velkou, může dojít ke snížení výkonu.
   
   Maximální velikost tabulky je 32 TB a nevyžaduje podporu velkých
   souborů operačním systémem. Velké tabulky se ukládají do několika 1 GB
   souborů takže limity souborového systému nejsou podstatné.
   
   Maximální velikost tabulky a maximální počet sloupců můžeme
   zečtyřnásobit nastavením velikosti bloku na 32K.
   
    4.6) Kolik diskového prostoru je potřeba k uložení dat z
    
   normálního textového souboru?
   
   PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z
   textového souboru.
   
   Například, uvažujme soubor se 100 tisíci řádky obsahující na každé
   řádce celé číslo a textový popis. Text je v průměru dvacet bytů
   dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze
   obsahující odpovídající data bude zhruba 6.4 MB.
    36 bytů: hlavička řádku (přibližně)
    24 bytů: jedna celočíselná položka a jedna textová
   + 4 byty: ukazatel na stránku k ntici
   ------------------------------------------------------
    64 bytů na řádek

   Velikost datové stránky PostgreSQL je 8KB

    8192 bytů na stránce
    ---------------------- = 128 řádek na stránku
      64 bytů za řádek

    100000 řádek
    -------------------- = 782 stránek (zaokrouhleno nahoru)
       128 řádek na stránce

    782 * 8192 = 6, 406, 144 bytů (6.4 MB)

   Indexy nemají tak velkou režii, ale mohou být také velké, protože
   obsahují indexovaná data.
   
   Hodnoty NULL jsou uloženy v bitmapách, takže spotřebují jen velmi málo
   diskového prostoru.
   
    4.7) Jak získám seznam vytvořených tabulek, indexů, databází?
    
   psql má sadu metapříkazů k zobrazení těchto informací. Jejich seznam
   získáte příkazem \?. Dále se můžete podívat na obsah systémových
   tabulek začínajících pg_. Spuštění psql s parametrem -l provede výpis
   názvů všech databází.
   
   Soubor pgsql/src/tutorial/syscat.source obsahuje SELECTy přistupující
   k systémovým tabulkámm.
   
    4.8) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?
    
   Každý dotaz nemusí nutně použít existující indexy. Index se použije
   tehdy, když je tabulka větší než určitá minimální velikost, a dotaz
   vybírá pouze procentuálně malou část řádků tabulky. To proto, že
   náhodný přístup k disku daný čtením indexu může být pomalejší než
   lineární čtení tabulky nebo sekvenční čtení.
   
   PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k
   tabulce. Tyto statistiky se shromažďují příkazy VACUUM ANALYZE nebo
   ANALYZE. Díky statistikám má optimizer informaci o počtu řádek v
   tabulce a může lépe rozhodnout o použití indexů. Statistiky se uplatní
   při určení optimálního pořadí a metody spojení tabulek. Statistiky by
   se měli aktualizovat opakovaně, tak jak se mění obsah tabulek.
   
   Indexy nejsou obyčejně použity pro setřídění nebo spojení tabulek.
   Sekvenční zpracování následované explicitním tříděním je obyčejně
   rychlejší než indexní čtení na velké tabulce.
   
   Jinak je tomu v případě použití LIMIT a ORDER BY, při kterém se
   většinou index použije, výsledkem je pouze malá část tabulky. Funkce
   MAX() a MIN() nepoužívají indexy, ale je možné tutéž hodnotu získat:
    SELECT col
    FROM tab
    ORDER BY col [ DESC ]
    LIMIT 1;

   Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání
   tabulky, použijte příkaz SET enable_seqscan TO 'off' a zkuste zda je
   indexní prohledávání rychlejší.
   
   Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se
   indexy použíjí pouze za určitých skutečností:
     * začátek hledaného vzoru musí být ukotven k začátku, tj.
          + vzor LIKE nesmí začínat %
          + ~ regulární výraz musí začínat ^
     * vzor nesmí začínat intervalem, např. [a-e]
     * vyhledávaní, které není Case sensitiv jako je ILIKE nebo ~*
       nepoužívá indexy. Můžete ale použít funkcionální indexy, které
       jsou posány v sekci 4.12
     * při inicializaci databáze (initdb) musí být použito C locale
       (pozn. překladatele - tudíž v našich podmínkách nepoužitelné,
       nepracovalo by české třídění).
       
    4.9) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz?
    
   Podívejte se do manuálové stránky příkazu EXPLAIN.
   
    4.10) Co to je R-tree index?
    
   R-tree index se používá pro indexování prostorových dat. Hash index
   nemůže obsloužit prohledávání oblastí. B-tree index může řídit
   vyhledání oblastí v jedné dimenzi. R-tree index může podporovat
   hledání v multidimenzionálních datech. Použijeme-li například R-tree
   index na atributy typu point, pak systém může efektivně odpovědět na
   dotaz - vyber všechny body uvnitř obdélníků.
   
   Původní návrh R-tree je 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
   
   Tyto materiály naleznete v Stonebraker's "Readings in Database
   Systems".
   
   Vestavěné R-tree může sloužit k indexaci polygonů a oblastí.
   Teoreticky můžeme R-tree použít i pro více dimenzí (jiné než 3D). Ve
   skutečnosti ale takové rozšíření R-tree vyžaduje trochu práce a ve
   součastnosti chybí dokumentace jak na to.
   
    4.11) Co je Genetic Query Optimizer?
    
   GEQO modul urychluje optimalizaci dotazů při spojování množství
   tabulek metodou Genetických algoritmů (GA). To umožňuje získat velkého
   množství variant spojení při neúplném prohledáváním.
   
    4.12) Jak provést vyhledávání regulárního výrazu case sensitiv, insensitiv?
    Jak použít index pro case insensitive vyhledávání?
    
   Operátor ~ slouží k porování s regulárním výrazem, jeho modifikace *~
   představuje case insensitive vyhledávání. Jedná se o obdobu LIKE a
   ILIKE.
   
   Pro vyhledávání bez ohledu na velká malá písmena použijeme:
    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';

   V tomto případě se nepoužije standardní index. Nicméně, použije se
   funkcionální index, pokud jej vytvoříte:
    CREATE INDEX tabindex ON tab (lower(col));

    4.13) Jak v dotazu detekovat, že položka je NULL?
    
   Určíte pomocí IS NULL nebo IS NOT NULL
   
    4.14) Jaké jsou rozdíly mezi různými znakovými typy?
    
Typ         Interní název       Poznámka
--------------------------------------------------------------------------
VARCHAR(n)  varchar             omezeno maximální délkou, bez doplnění mezerami
CHAR(n)     bpchar              řetězec je doplněn mezerami do dané délky
TEXT        text                bez horního limitu na délku
BYTEA       bytea               pole bytů (bezpečně lze uložit i znak NULL)
"char"      char                jeden znak

   S interními názvy se setkáte v systémovém katalogu a v některých
   chybových hlášeních.
   
   První čtyři uvedené typy jsou tzv. varlena typy (tj. první čtyři byty
   na disku nesou údaj o délce, následují samotná data). Proto skutečný
   použitý prostor je vždy o něco málo větší než deklarovaná délka.
   Naopak, tyto datové typy jsou komprimovánty TOASTem, takže prostor na
   disku může být nižší než je očekáváno.
   
   VARCHAR(n) je vhodný pro ukládání textů promměné délky s pevně
   stanovenou maximální délkou. TEXT je pro řetězce bez omezení délky s
   maximem jeden gigabajt.
   
   CHAR(n) slouží k ukládání řetězců stejné délky. CHAR(n) doplní prázdné
   znaky do specifikované délky, zatímco VARCHAR(n) uloží pouze předané
   znaky. BYTEA je určeno pro ukládání binárních dat, včetně NULL byte.
   Všechny zde popsané typy mají podobné výkonnostní charakteristiky.
   
    4.15.1) Jak vytvořit serial/auto-increment pole?
    
   PostgreSQL podporuje typ SERIAL. Při jeho použití se automaticky
   vytvoří SEQUENCE. Například:
    CREATE TABLE person (
        id   SERIAL,
        name TEXT
    );

   je automaticky převedeno do
    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);

   Viz dokumentace create_sequence v manuálových stránkách. Dále můžete
   použít unikátní hodnotu OID každého řádku. Potom ale musíte spouštět
   pg_dump s přepínačem -o, tak aby zůstaly zachovány hodnoty OID (u
   příkazu copy COPY WITH OIDS).
   
    4.15.2) Jak získat hodnotu SERIAL po vložení řádku?
    
   Jednou z možností je získat budoucí hodnotu SERIAL funkcí nextval()
   před samotným vložením a pak ji vložit explicitně. Například v jakémsi
   pseudojazyku:
    newid = execute("SELECT nextval('person_id_seq')");
    execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");

   Můžete pak ještě použít hodnotu newid v dalších dotazech, např. jako
   hodnotu cizího klíče. Název automaticky vytvořené sekvence je
   tabulka_sloupec_seq.
   
   Alternativně můžete získat hodnotu posledně generovou sekvencí funkcí
   currval() po vložení:
    execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
    new_id = execute("SELECT currval('person_id_seq')");

   Konečně můžete použít OID hodnotu vrácenou příkazem INSERT, ale to je
   pravděpodobně nejméně přenositelné řešení. V Perlu při použití DBI
   modulu Edmunda Mergleho DBD:Pg oid hodnotu získáme
   $sth->{pg_oid_status} po každém $sth->execute().
   
    4.15.3) Nepovede currval() a nextval() k rozhození podmínek při souběhu s
    jinými uživateli?
    
   Nikoliv, currval() vrací hodnotu naposledy generovanou ve vašem
   backendu, a ta tudíž není společná všem uživatelům.
   
    4.15.4) Proč není vygenerované číslo použito při přerušení transakce? Proč
    vznikají díry v číslování vlastní sekvencí/SERIAL sloupce?
    
   K zajištění efektivnosti souběhu, jsou hodnoty posloupnosti, když se o
   ně požádá, a sekvence není zamčena do ukončení transakce. To způsobuje
   díry v číslování ze zrušených transakcí.
   
    4.16) Co to je OID? Co je to TID?
    
   Každý řádek vytvořený v PostgreSQL získá jedinečné OID. Všechna OID
   generovaná během inicializace databáze jsou menší než 16384
   (include/access/transam.h). Všechna OID generovaná na požadavek
   uživatele jsou rovna nebo vyšší této hodnotě. Normálně, všechna OID
   jsou jedinečná nejen uvnitř tabulky nebo databáze, ale v rámci celé
   instalace PostgreSQL
   
   PostgreSQL používá OID ve svém interním systému tabulek k vytvoření
   relací. Tato OID mohou být použita k identifikaci konkrétního
   uživatele a použita v spojení. Pro OID hodnoty je doporučen typ OID.
   Nad tímto sloupcem můžete vytvořit index pro urychlení přístupu.
   
   OID jsou dána všem řádkům z centrální oblasti a jsou použita v každé
   databázi. Pokud potřebujete změnit OID, nebo chcete zkopírovat tabulku
   s původními OID, lze použít:
        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';

   OID jsou uložena jako 4bajtový integer a přetečou po čtyřech
   miliardách. Nebylo hlášeno, že by se tak někdy stalo, přesto ale
   plánujeme odstranit tento limit dřív než se tak stane.
   
   TID se používají i identifikaci fyzických řádků s hodnotou bloku a
   offsetu. TIDs se mění modifikací řádků (používá se jako ukazatel
   indexu fyzického řádku).
   
    4.17) Jaký je význam některých výrazů použitých v PostgreSQL?
    
   V některých zdrojových kódech nebo starší dokumentaci se můžete setkat
   s následujícími výrazy, které mají širší význam. Zde je příklad
   nekterých:
     * tabulka, relace, třída (table, relation, class)
     * řádek, záznam, ntice (row, record, tuple)
     * sloupec, položka, atribut (column, field, attribute)
     * vyhledání, výběr (retrieve, select)
     * náhrada, úprava (replace, update)
     * přidání, vkládání (append, insert)
     * OID, serial value (OID, serial value)
     * portal, kurzor (portal, cursor)
     * range variable, jméno tabulky, alias tabulky (range variable,
       table name, table alias)
       
   seznam těchto výrazů můžete nalézt na
   http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary
   /glossary.html.
   
    4.18) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in
    AllocSetAlloc()"?
    
   Pravděpodobně došlo k vyčerpání virtuální paměťi na Vašem systému,
   nebo jádro má nízký limit pro určité zdroje. Vyzkoušejte před startem
   posmatera
    ulimit -d 262144
    limit datasize 256m

   Záleží na Vašem shellu, zda budou tyto příkazy úspěšné, měly by zvýšit
   limit datového segmentu pro Vaše procesy a umožnit tak dokončení
   dotazu. Tyto příkazy se aplikují na aktuální proces a všechny synovské
   procesy vytvořené po provedení příkazu. Pokud máte problémy s SQL
   klientem protože backend vrací příliš mnoho dat, zkuste zvýšit limity
   před startem klienta.
   
    4.19) Jak se dozvím, kterou verzi PostgreSQL používám?
    
   V psql spusťte SELECT version();
   
    4.20) Proč operace s velkými objekty končí "invalid large obj descriptor"?
    
   Všechny operace s velkými objekty - lo_open, lo_close, ... musíte
   spouštět v transakci, tj. mezi příkazy BEGIN WORK a COMMIT.
   
   PostgreSQL uvolňuje handle velkých objektů při skončení transakce.
   Pokud budete pracovat s velkými objekty mimo transakci, pravděpodobně
   dostanete toto chybové hlášení, protože handle již budou neplatné.
   Pokud používáte interface podobné ODBC musíte nastavit set auto_commit
   off.
   
    4.21) Jak vytvořit sloupec obsahující implicitně aktuální datum?
    
   Použijte CURRENT_TIMESTAMP:

CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );

    4.22) Proč jsou moje vnořené dotazy používající IN tak pomalé?
    
   Dřívější verze (před 7.4) spojovali vnořené dotazy k vnějším
   sekvenčním čtením výsledku poddotazu pro každý řádek vnějšího dotazu.
   Pokud poddotaz vrátil několik málo řádků IN bylo rychlé. Pro ostatní
   případy je vhodné nahradit IN EXISTS:
    SELECT *
    FROM tab
    WHERE col IN (SELECT subcol FROM subtab);

   na:
   SELECT *
   FROM tab
   WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);

   Pro urychlení vytvořete index pro subcol.
   
   Ve verzi 7.4 a pozdějších, IN používá stejně sofistikovanou techniku
   spojování tabulek jako ostatní dotazy a je preferovaný před EXISTS.
   
    4.23) Jak provést vnější spojení (outer join)?
    
   PostgreSQL podporuje vnější spojení tabulek standardními SQL příkazy.
   Zde jsou dva příklady:
    SELECT *
    FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

   nebo
    SELECT *
    FROM t1 LEFT OUTER JOIN USING (col);

   Tyto identické dotazy napojí t1.col na t2.col a ještě přidá
   nepřipojené řádky z t1 (které nemají obdoby v t2). Pravé spojení
   (RIGHT JOIN) přidá nepřipojené řádky z t2. FULL JOIN vrátí všechny
   řádky, včetně nepřipojených z tbulek t1 a t2. Klíčové slovo OUTER je
   nepovinné a váže se na LEFT, RIGHT a FULL join. Běžné spojení se
   nazývá INNER JOIN.
   
   V dřívějších verzích se vnější spojení tabulek mohlo simulovat pomocí
   UNION a NOT IN. Například pro spojení tabulek tab1 a tab2, je
   následující dotaz ekvivalentní k vnějšímu spojení dvou tabulek:
    SELECT tab1.col2, tab2.col2
    FROM tab1, tab2
    WHERE tab1.col1 = tab2.col1
    UNION ALL
    SELECT tab1.col2, NULL
    FROM tab1
    WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
    ORDER BY col1;

    4.24) Jak provést dotaz z více databází?
    
   PostgreSQL nepodporuje dotazy do jiné než aktuální databáze.
   
   contrib/dblink nabízí funkce umožňující provedení dotazu v jiné
   databázi. Klient si může otevřít simultální připojení do různých db
   bez omezení.
   
    4.25) Může funkce vrátit více řádků nebo sloupců?
    
   V PostgreSQL 7.3 můžete jednoduše vracet více řádků nebo sloupců z
   funkce, viz:
   http://techdocs.postgresql.org/guides/SetReturningFunctions.
   
    4.26) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v PL/pgSQL
    funkcích?
    
   Přeložený kód PL/pgSQL funkce je uložen ve vyrovnávací paměti, tj.
   funkce je překládána pouze při změně kódu, nikoliv před každým voláním
   funkce. Nechtěným vedlejším efektem je, že volání funkce selže, když
   se funkce odkazuje na dočasnou tabulku, pokud tato tabulka byla od
   překladu funkce zrušena (ačkoliv již byla znovu vytvořena a existuje).
   Jediným řešením problému je přístup k dočasné tabulce pomocí EXECUTE,
   tj. dynamické provádění dotazu. Tento příkaz zajistí opakovaný překlad
   dotazu při každém volání funkce.
   
    4.27) Jaké jsou možnosti replikace databází?
    
   Existuje několik dostupných řešení master/slave replikací, tj umožňují
   modifikace master databáze a slave databázím umožňují pouze čtení. Na
   konci http://gborg.PostgreSQL.org/genpage?replication_research najdete
   jejich seznam. Na řešení multi-master replikaci se pracuje na
   http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php.
   
    4.28) Jaké jsou možnosti šifrování databází?
    
     * contrib/pgcrypto obsahuje šifrovací funkce použitelné v SQL
       dotazech.
     * K šifrování přenosu dat z klienta na server, musí být server
       přeložen s podporou ssl a přepínač ssl v postgresql.conf musí být
       nastaven na hodnotu true. Klient musí mít vytvořen záznam hostssl
       v pg_hba.conf a také mít povolen režim ssl. Lze použít i jiné
       prostředky, nejen nativní podporu ssl v PostgreSQL, např. stunel a
       ssh.
     * Hesla uživatelů databáze jsou zašifrována počínaje verzí 7.3. Ve
       starších verzích toto chování muselo být vynuceno volbou
       PASSWORD_ENCRYPTION v postgresql.conf
     * Server může běžet na šifrovaném souborovém systému.
     _________________________________________________________________
   
                           Rozšiřování PostgreSQL
                                      
    5.1) Napsal jsem UDF funkci, PostgreSQL však končí dump core?
    
   Problém může být způsoben mnoha okolnostmi. Vyzkoušejte si svoji
   funkci nejdříve v nějaké jednoduché aplikaci.
   
    5.2) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do
    PostgreSQL?
    
   Pošlete své rozšíření do konference pgsql-hackers, a ono pak možná
   skončí v podadresáři contrib.
   
    5.3) Jak napsat funkci v C vracející ntici?
    
   Funkce vracející tabulky jsou podporované PostgreSQL 7.3 a vyšší pro
   jazyky C, PL/PgSQL a SQL. Více naleznete v The Programmer's Guide.
   Příklady těchto funkcí pro C naleznete v contrib/tablefunc.
   
    5.4) Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci
    vzata v potaz. Proč?
    
   Makefile nemá informace o závislostech mezi hlavičkovými soubory.
   Musíte provést make clean a pak make. Pokud používáte gcc, můžete
   použít přepínač --enable-depend příkazu configure k automatickému
   řešení závislostí překladačem.
