# Frequently Asked Questions

Často kladené dotazy (FAQ) PostgreSQL

Poslední aktualizace: 29. října 2007 (aktualizováno pro PostgreSQL 8.3)

Současný správce: Bruce Momjian (bruce@momjian.us)

Přeložil: Pavel Stěhule (pavel.stehule@gmail.com)

Nejaktuálnější verzi tohoto dokumentu naleznete na adrese http://www.postgresql.org/files/documentation/faqs/FAQ.html

Odpovědi 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 ří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 naučit SQL?
1.12) Jak se mohu připojit k týmu vývojářů?
1.13) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
1.14) Je PostgreSQL připraven na aktuální zavádění letního času v některých zemích?

## Dotazy na klientská rozhraní

2.1) Která rozhraní jsou použitelná pro PostgreSQL?
2.2) Jaké nástroje lze použít pro PostgreSQL a web?
2.3) Existuje grafické rozhraní pro PostgreSQL?

## Administrativní dotazy

3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?
3.2) Jak nastavit pravidla pro přístup z jiných stanic?
3.3) Jak vyladit databázi na vyšší výkon?
3.4) Jaké mám ladící prostředky?
3.5) Co znamená "Sorry, too many clients", když se zkouším připojit?
3.6) Proč je nutný dump a obnovení (load) databáze při upgradu PostgreSQL?
3.7) Jaký hardware bych měl používat?

## Provozní dotazy

4.1) Jak získat pouze první řádek dotazu? Náhodný řádek?
4.2) Jak získám seznam tabulek, indexů, databází, a definovaných uživatelů. Mohu vidět dotazy, které používá psql pro zobrazení těchto informací?
4.3) Jak změnit datový typ sloupce?
4.4) Jaká je maximální velikost řádku, tabulky a databáze?
4.5) Kolik diskového prostoru je potřeba k uložení dat z normálního textového souboru?
4.6) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?
4.7) Jak zjistím, jak se vyhodnocuje můj dotaz?
4.8) Jak použít case-(in)sensitive regulární výraz? Jak použít index pro case insensitive hledání?
4.9) Jak v dotazu detekovat, že položka je NULL? Jak bezpečně spojit dva řetězce, pokud mohou obsahovat NULL? Lze třídit podle toho, jestli je položka NULL nebo ne?
4.10) Jaké jsou rozdíly mezi různými znakovými typy?
4.11.1) Jak vytvořit serial/auto-increment položku?
4.11.2) Jak získat hodnotu SERIAL po vložení řádku?
4.11.3) Nezpůsobí currval() a nextval() problémy ve více uživatelském prostředí?
4.11.4) Proč není vygenerované číslo použito při přerušení transakce?Proč vznikají díry v číslování prostřednictvím sekvence nebo typu SERIAL?
4.12) Co to je OID? Co je to CTID?
4.13) Co znamená chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"?
4.14) Jak zjistím, kterou verzi PostgreSQL používám?
4.15) Jak vytvořit sloupec, který bude implicitně obsahovat aktuální čas?
4.16) Jak provést vnější spojení (outer join)?
4.17) Jak provést dotaz napříč několika databázemi?
4.18) Může funkce vrátit více řádků nebo sloupců?
4.19) Co je příčinou chyby "relation with OID xxxxx does not exist"?
4.20) Jaké jsou možnosti replikace databází?
4.21) Proč v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí? Proč jsou velká písmena v názvech automaticky převedena 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 zjednodušeně Postgres . V řadě jazyků je slovo PostgreSQL obtížně vyslovitelný, proto se v hovoru často používá zjednodušená forma názvu. Pro ty, kteří by si rádi poslechli výslovnost, je k dispozici audiozáznam v MP3 formátu.

PostgreSQL je relační databáze s některými objektovými rysy, která má možnosti tradičních komerčních databázových systémů s několika rozšířeními, které lze najít v DBMS systémech příští generace. Používání PostgreSQL není omezené a veškeré zdrojové kódy jsou volně dostupné.

Za vývojem PostgreSQL je mezinárodní skupina nezávislých vývojářů navzájem komunikujících prostřednictvím internetu. Tento projekt není řízen žádnou obchodní organizací. Pokud se chcete přidat k projektu, přečtěte si vývojářské FAQ na adrese http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html .

### 1.2) Kdo řídí vývoj PostgreSQL?

Pokud budete hledat organizaci řídící vývoj PostgreSQL, budete zklamáni. Nic takového neexistuje. Existují pouze "core" a CVS skupiny uživatelů, ale ty existují více z administrátorských důvodů než z organizačních. Projekt je směrován komunitou vývojářů a uživatelů, ke které se kdokoliv může připojit. Jediné co potřebuje, je přihlásit se do elektronické konference. Více ve vývojářském FAQ.

### 1.3) Pod jakou licencí je PostgreSQL?

PostgreSQL je předmětem následujících autorských práv:

Dílčí Copyright (c) 1996-2008, 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.

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 ÚČ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.4) Na kterých platformách lze provozovat PostgreSQL?

Stručně řečeno, PostgreSQL běží na všech moderních unixových systémech. Seznam těch, u kterých proběhlo testování, naleznete v instalačních instrukcích.

PostreSQL také běží nativně na všech Microsof Windows systémech odvozených z Microsoft Windows NT jako jsou Windows 2000SP4, WindowsXP a Windows2003. Instalační balíček naleznete na adrese http://pgfoundry.org/projects/pginstaller. Na starších systémech s ještě MS-DOS jádrem lze spustit PostgreSQL s emulační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=postgreSQL&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?

Nejnovější verzí PostgreSQL je verze 8.2.5

V plánu je uvolňovat každoročně jednu velkou verzi a každých několik měsíců malé verze.

### 1.7) Kde mohu získat podporu?

Nejčastější forma podpory uživatelům PostgreSQL komunitou je prostřednictvím e-mailů. Na našem webovém serveru naleznete odkaz na stránky,kde se můžete přihlásit do elektronické konference. Pro začátek jsou doporučené konference general nebo bugs.

Další cestou je IRC kanál #postgresql na Freenode (irc.freenode.net). K připojení použijte Unixový příkaz irc -x '#postgresql' "$USER" irc.freenode.net nebo jakékoholiv jiného IRC klienta. V této síti existuje ještě španělská (#postgresql-es) a francouzská (#postgresqlfr) verze. Další PostgreSQL kanál naleznete na EFNet.

Seznam společností poskytující komerční podporu naleznete na adrese http://techdocs.postgresql.org/companies.php.

### 1.8) Jak a kam hlásit chyby?

Vyplňte formulář na adrese http://www.postgresql.org/support/submitbug. Na našem ftp serveru ftp://ftp.postgresql.org/pub/ si ověřte, že používáte aktuální verzi PostreSQL.

Chyby reportované prostřednictvím chybového formuláře nebo zasláním mailu do PostgreSQL konference obvykle generuje následující odezvu:

- Nejedná se o chybu, a proč
- Jedná se o známou chybu, která je již v seznamu úkolů TODO
- Tato chyba byla opravena v aktuální verzi
- Tato chyba byla již opravena ve verzi, která zatím nebyla oficiálně uvolněna
- Požadavek na další doplňující informace:
  - Operační systém
  - Verze PostgreSQL
  - Test reprodukující chybu
  - Ladící informace
  - Backtrace výstup debuggeru
- Jedná se o zatím nezjištěnou chybu, pak můžete čekat
  - Záplatu odstraňující chybu, která bude vložena do další velké nebo malé verze
  - Informaci, že se jedná o chybu, kterou nelze okamžitě řešit a je proto přidána do TODO

### 1.9) Kde najdu informace o známých chybách nebo nepodporovaných vlastnostech?

PostgreSQL podporuje rozšířenou podmnožinu SQL:2003. V našem TODO naleznete seznam známých chyb, chybějících vlastností, a plány do budoucna.

Odezva na požadavek na novou vlastnost PostgreSQL je obvykle:

- Požadavek je již v TODO
- Požadovaná funkce není chtěná protože
  - Duplikuje již existující funkci, která respektuje SQL standard
  - Implementací funkce by se příliš zkomplikoval kód bez relevantního přínosu
  - Funkce by mohla být nebezpečná nebo nespolehlivá
- Požadavek je přidán do TODO

PostgreSQL nepožívá systém pro sledování chyb, protože jsme zjistili, že je efektivnější přímo reagovat na maily a udržovat aktuální TODO. V praxi je snaha o co nejrychlejší řešení chyb, a chyby, které by se mohly projevit u mnoha uživatelů jsou opravovány velice rychle. Jediné místo, kde lze dohledat všechny změny, rozšíření a opravy v PostgreSQL je CVS log. Poznámky k verzi "Release notes" nezachycují všechny změny, k němž došlo.

### 1.10) Jaká je dostupná dokumentace?

PostgreSQL obsahuje vynikající dokumentaci zahrnující manuál, manuálové stránky a testovací příklady. Podívejte se do adresáře /doc. Manuál je přístupný online na http://www.postgresql.org/docs.

K dispozici jsou zdarma dvě online knihy na adresách http://www.postgresql.org/docs/books/awbook.html a http://www.commandprompt.com/ppbook/. Další literaturu lze zakoupit. Nejpopulárnější je od Kerryho Douglase. Seznam dostupné literatury je na http://techdocs.postgresql.org/techdocs/bookreviews.php. Ještě je kolekce technicky orientovaných článků tematicky spojených s PostgreSQL na adrese http://techdocs.postgresql.org/.

Řádkový klient psql má \d příkazy pro zobrazení informací o typech, operátorech, funkcích, agregačních funkcí, atd. Použijte \? pro zobrazení dostupných příkazů.

Další dokumentaci najdete na našem webu.

### 1.11) Jak se mohu naučit SQL?

Podívejte se do výše uvedené dokumentace. Další online knihou je "Teach Yourself SQL in 21 Days, Second Edition" na adrese http://members.tripod.com/er4ebus/sql/index.htm. Mnoho našich uživatelů doporučuje knihu The Practical SQL Handbook, Bowman, Judith S., et al., Addison-Wesley. Další The Complete Reference SQL, Groff et al., McGraw-Hill.

Další 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 připojit k týmu vývojářů?

Prostudujte si Developer's FAQ.

### 1.13) Jak je na tom PostgreSQL v porovnání s jinými databázemi?

Software můžeme porovnávat z několika různých pohledů: vlastnosti, výkon, spolehlivost, podpora a cena.

#### Vlastnosti

PostgreSQL nabízí většinu funkcí funkcionality velkých komerčních DBMS systémů jako jsou: transakce, vnořené dotazy, spouště, referenční integrita a sofistikovaný systém zamykání. Poskytujeme určité funkce, které ostatní systémy běžně nepodporují. Např. uživatelem definované typy, dědičnost, pravidla (rules), a MVCC architekturu.

#### Výkon

Výkon PostgreSQL je srovnatelný s ostatními komerčními nebo Open Source databázemi. V některých případech je rychlejší, jindy pomalejší. Náš výkon je obvykle +/-10% vůči ostatním databázím.

#### Spolehlivost

Uvědomujeme si, že databáze musí být stoprocentně spolehlivá, jinak je nepoužitelná. Snažíme se, aby každá verze byla dobře otestována a obsahovala minimum chyb. Každá verze je minimálně několik měsíců v beta testovacím režimu. Do produkčního režimu se dostane, až když nedochází k dalším změnám nebo opravám. Věříme, že jsem více než srovnatelní s ostatními databázemi v této oblasti.

#### Podpora

Na našich internetových konferencích se setkává velká skupina vývojářů a uživatelů při řešení vyskytujících se problémů. Naše internetové konference umožňují kontakt velké skupiny vývojářů a uživatelů. Nemůžeme garantovat opravu chyby, ale komerční DBMSs také vždy negarantují řešení problémů. Věříme ale, že díky přímému kontaktu na vývojáře, naši uživatelskou komunitu, manuálům, a dostupným zdrojovým kódům máme lepší podporu než ostatní DBMSs. Pro ty, kteří preferují komerční "per-incident" podporu, existuje společností, kteří ji nabízejí (FAQ sekce 1.7.)

#### Cena

PostgreSQL lze používat bezplatně (a to i pro komerční použití). Také můžete neomezeně používat náš kód ve svých produktech s výjimkami specifikovanými v naší licenci (přebíráme BSD licenci).

### 1.14) Je PostgreSQL připraven na aktuální zavádění letního času v některých zemích?

Počínaje verzí 8.0.[4+] podporuje PostgreSQL letní čas také pro USA. Podpora letního času (daylight saving time) pro Kanadu a Západní Austrálii je obsažena ve verzích 8.0.[10+] a 8.1.[6+] a všech následujících verzích. Starší verze používaly systémovou databázi časových zón obsahující, kromě jiného, informaci o tom, zda se pro danou časovou zónu rozlišuje mezi letním a zimním časem.

## Dotazy na klientská rozhraní

### 2.1) Která rozhraní jsou použitelná pro PostgreSQL?

PostgreSQL se distribuuje pouze s rozhraním pro jazyk C a embedded C. Všechna další rozhraní představují nezávislé projekty, které je třeba stáhnout z internetu samostatně. Osamostatnění těchto projektů umožňuje nezávislost vývojových týmů a možnost vydávat nové verze bez ohledu na vydání nové verze PostgreSQL.

Některé programovací jazyky jako je např. PHP obsahují rozhraní pro PostgreSQL. Rozhraní pro jazyky jako je Perl, Tcl, Python a mnoho dalších jsou dostupné na adrese: http://gborg.postgresql.org v sekci Drivers/Interfaces.

### 2.2) Jaké nástroje lze použít pro PostgreSQL a web?

Dobrým úvodem do problematiky databází v prostředí webových stránek může být web http://www.webreview.com.

PHP (http://www.php.net) je vynikajícím rozhraním pro tvorbu webů.

Pro složitější úlohy se často použí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 řada grafických nástrojů podporujících PostgreSQL a to od komerčních nebo open source vývojářů. Podrobný seznam naleznete na adrese http://www.postgresql.org/docs/techdocs.54.

## Administrativní dotazy

### 3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?

Při spouštění configure nastavte parametr --prefix

### 3.2) Jak nastavit pravidla pro přístup z jiných stanic?

Ve výchozí konfiguraci, PostgreSQL umožňuje pouze připojení z lokálního uživatele prostřednictví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 připojit k PostgreSQL z ostatních stanic. Změna výše zmíněných parametrů vyžaduje restart databázového serveru.

### 3.3) Jak vyladit databázi na vyšší výkon?

Výkon systému můžete ovlivnit ve třech oblastech:

#### Změny dotazu

- Použitím indexů včetně částečných a funkcionálních
- Použitím COPY místo opakovaných INSERTů
- Sloučením mnoha SQL příkazů do jedné transakce snížením režie na commit
- Používáním CLUSTERU, pokud načítáte větší počet řádek podle indexu
- Použitím klauzule LIMIT v poddotazech
- Použitím předpřipravených dotazů
- Používáním ANALYZE. Tento příkaz aktualizuje statistiky, které se používají při optimalizaci dotazu
- Pravidelné použití VACUUM nebo používání pg_autovacuum
- Odstraněním indexů před rozsáhlými změnami v datech

#### Konfigurace serveru

Určité parametry v souboru postgresql.conf mají vliv na výkon serveru. Detaily naleznete v příručce Administrátora v Server Run-time Environment/Run-time Configuration. Další komentáře naleznete v http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html a http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html.

#### Výběr 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í prostředky?

Nastavením log_* proměnných v konfiguraci serveru si vynutíte logování dotazů a procesních statistik, které Vám mohou pomoci při ladění a optimalizaci výkonu.

### 3.5) Co znamená "Sorry, too many clients", když se zkouším připojit?

Překročil jste výchozí limit, který je 100 současně připojených uživatelů. V konfiguraci serveru v postgresql.conf tuto hodnotu můžete zvětšit změnou hodnoty max_connection. Nezapomeňte restartovat server.

### 3.6) Proč je nutný dump a obnovení (load) databáze při upgradu PostgreSQL?

Způsob číslování je popsán v dokumentaci na http://www.postgresql.org/support/versioning. Instrukce k provedení migrace na vyšší verzi jsou taktéž v dokumentaci na adrese http://www.postgresql.org/docs/current/static/install-upgrading.html.

### 3.7) Jaký hardware bych měl používat?

Jelikož PC jsou většinou kompatibilní, lidé mají tendence věřit, že všechna PC jsou stejně kvalitní. Což není pravda. Paměti ECC, SCSI a kvalitní základní desky jsou mnohem spolehlivější a výkonnější než lacinější hardware. PostgreSQL poběží na většině hardwaru, nicméně pokud je pro Vás spolehlivost a výkon systému důležitá, je dobré věnovat čas nalezení vhodné hardwarové konfigurace. Na našich elektronických konferencích můžete diskutovat o vhodných konfiguracích a značkách.

## Provozní dotazy

### 4.1) Jak získat pouze první řádek dotazu? Náhodný řádek?

Pokud potřebujete pouze několik řádků a pokud víte kolik, použijte SELECT LIMIT. Pokud bude možné použít index shodující se s ORDER BY, je možné, že se nebude provádět celý dotaz. Pokud neznáte počet záznamů, použijte kurzor a příkaz FETCH.

Pro výběr náhodného řádku použijte příkaz ve tvaru:

    SELECT col
    FROM tab
    ORDER BY random()
    LIMIT 1;

### 4.2) Jak získám seznam tabulek, indexů, databází, a definovaných uživatelů. Mohu vidět dotazy, které používá psql pro zobrazení těchto informací?

V psql příkazem \dt získáte seznam tabulek. Úplný seznam příkazů psql získáte příkazem \?. Alternativně si můžete prostudovat zdrojový kód psql - soubor pgsql/src/bin/psql/describe.c, který obsahuje SQL příkazy, které jsou generovány pro získání výstupu psql "backslash" příkazů. Také můžete nastartovat psql s parametrem -E, který způsobí zobrazení všech SQL příkazů, které se odesílají na server. PostgreSQL také podporuje SQL standard INFORMAČNÍ SCHÉMATA (standardní systémové tabulky). Klasickým dotazem do systémových tabulek získáte požadované informace o struktuře databáze.

Systémové tabulky PostgreSQL (mimo rámec SQL standardů) používají prefix pg_. Pro zjištění struktury databáze je můžete použít také, i když preferovány jsou dotazy do informačního schématu.

Seznam všech databází získáte příkazem psql -l

Další inspiraci najdete v souboru pgsql/src/tutorial/syscat.source. Obsahuje ilustrační SELECTy potřebné k získání informací z systémových tabulek databáze.

### 4.3) Jak změnit datový typ sloupce?

Ve verzích 8.0 a pozdějších jednoduše:

    ALTER TABLE ALTER COLUMN TYPE

V starší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 změně spusťte příkaz VACUUM FULL, aby došlo k uvolnění diskového prostoru použitého v tu chvíli již neplatnými záznamy.

### 4.4) 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: | 480GB
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.

Indexy jsou povolené pouze na sloupcích jejichž délka je menší než 2000 znaků. Pokud tuto délku překročíme a index potřebujeme pro zajištění jednoznačnosti, je vhodnější použít funkcionální index nad MD5 funkcí nebo fulltextový index.

### 4.5) 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ěrně dvacet bytů dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze obsahující odpovídající data bude zhruba 5.2 MB.

        24 bytů: hlavička řádku (přibližně)
        24 bytů: jedna celočíselná položka a jedna textová
       + 4 byty: ukazatel na stránku k entici
       ------------------------------------------------------
        52 bytů na řádek

Velikost datové stránky PostgreSQL je 8192 bytů (8KB)

     8192 bytů na stránce
    ---------------------- = 158 řádek na stránku
      52 bytů za řádek

    100000 řádek
    ----------------------- = 633 stránek (zaokrouhleno nahoru)
       158 řádek na stránce

    633 datových stránek * 8192 bytů na každou stránku = 5,185,536 bytů (5.2 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 zabírají jen velmi málo diskového prostoru.

### 4.6) 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ž použití indexu 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, jelikož je výsledkem pouze malá část tabulky.

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 prohledávání s indexem rychlejší.

Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se indexy použijí 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 popsány v sekci 4.8
- při inicializaci databáze (initdb) musí být použito C locale nebo vytvořte speciální text_pattern_index, který umožní, při respektování zmíněných podmínek použití indexu operací LIKE. Pro vyhledávání celých slov je možné a výhodné použít fulltext.

### 4.7) Jak zjistím, jak se vyhodnocuje můj dotaz?

Podívejte se do nápovědy k příkazu EXPLAIN.

### 4.8) Jak použít case-(in)sensitive regulární výraz? Jak použít index pro case insensitive hledání?

Vyhledávání prostřednictvím regulárních vzorů zajišťuje 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 řeší:

    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';

Tento dotaz nepoužije standardní index. Musíte použít tzv. funkcionální index:

    CREATE INDEX tabindex ON tab (lower(col));

Pokud index vytvoříme jako unikátní, tak můžeme ukládat řetězce obsahující malá i velká písmena, ale nikoliv řetězce, které se od sebe odlišují jen v malých a velkých písmenech. K zajištění zápisu řetězce obsahující pouze malá nebo pouze velká písmena použijte CHECK kontroly nebo triggery.

### 4.9) Jak v dotazu detekovat, že položka je NULL? Jak bezpečně spojit dva řetězce, pokud mohou obsahovat NULL? Lze třídit podle toho, jestli je položka NULL nebo ne?

Pokud chcete testovat hodnotu NULL použijte operátor IS:

       SELECT *
       FROM tab
       WHERE col IS NULL;

K spojení řetězců, které mohou obsahovat hodnotu NULL, používejte funkci COALESCE(), např.:

       SELECT COALESCE(col1, '') || COALESCE(col2, '')
       FROM tab

Pokud chcete třídit podle hodnoty NULL, použijte výraz IS NULL nebo IS NOT NULL v klauzuli ORDER. Hodnota pravda má přednost před hodnotou false a tedy pokud použijete:

       SELECT *
       FROM tab
       ORDER BY (col IS NOT NULL)

tak záznamy s NULL budou na začátku setříděných dat.

### 4.10) Jaké jsou rozdíly mezi různými znakovými typy?

Typ | Interní název | Poznámky
VARCHAR(n) | varchar | n určuje maximální délku
CHAR(n) | bpchar | řetězec je do dané délky rozšířen mezerami
TEXT | text | bez omezení délky
BYTEA | bytea | pole bytů nespecifikované délky
"char" | char | jeden znak

Na interní názvy můžete narazit v systémovém katalogu nebo v některých chybových hlášeních.

Čtyři první typy jsou tzv. varlena typy (první čtyři byty na disku jsou obsahují délku, ostatní obsahují vlastní data). Skutečně obsazený prostor je tedy o něco málo větší než deklarovaná velikost. Na druhou stranu, delší řetězce jsou komprimovány, takže obsazený prostor na disku může být menší než se čeká.

VARCHAR(n) je vhodný pro ukládání různě dlouhých řetězců u kterých známe délkové omezení, TEXT pro řetězce bez omezení délky (maximum je jeden gigabyte).

CHAR(n) se používá pro uložení stejně dlouhých řetězců. 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. Všechny zmíněné typy mají podobné výkonové charakteristiky.

### 4.11.1) Jak vytvořit serial/auto-increment položku?

V PostgreSQL můžete použít datový typ SERIAL. Jeho použitím se automaticky vytvoří sekvence. Napří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
    );

Podrobnější informace najdete v manuálu v popisu příkazu create_sequence.

### 4.11.2) Jak získat hodnotu SERIAL po vložení řádku?

Nejjednodušším způsob, jak získat vygenerovanou hodnotu typu SERIAL, je využít klauzuli RETURNING. Pro tabulku z 4.11.1 vypadá takto:

    INSERT INTO person (name) VALUES ('Blaise Pascal') RETURNING id;

Také můžete použít funkci nextvall() a její výsledek použít v příkazu INSERT, nebo zavolat currval() po provedení příkazu INSERT.

### 4.11.3) Nezpůsobí currval() a nextval() problémy ve více uživatelském prostředí?

Ne, currval vrací vždy hodnotu, která byla vygenerována pro vás.

### 4.11.4) Proč není vygenerované číslo použito při přerušení transakce?Proč vznikají díry v číslování prostřednictvím sekvence nebo typu SERIAL?

Poté co sekvence vygeneruje nové číslo, tak se nedochází k zamčení sekvence a nečeká se na úspěšné nebo neúspěšné dokončení transakce. Odvoláním transakce, která si vyžádala čísla sekvence se tato čísla nenávratně ztratí.

### 4.12) Co to je OID? Co je to CTID?

V případě, že tabulku nezaložíme s atributem WITHOUT OIDS, tak má každý řádek unikátní identifikační číslo OID. Toto číslo je 4 bajtové celé číslo, které je jedinečné v celé instalaci. Přeteče po 4 miliardách řádků. PostgreSQL používá OIDs jako interní linky v interních systémových tabulkách.

K získání unikátního čísla v nesystémových tabulkách je vhodnější použití typu SERIAL než OID, jelikož sekvence SERIAL se používá pouze pro jednu tabulku a je tudíž méně náchylná na přetečení. Pokud byste se toho obávali, použijte typ SERIAL8.

CTID se používá k identifikaci konkrétního fyzického řádku. CTID se mění pokud je řádek modifikován nebo znovu načten. Používají ho indexy jako adresaci fyzických řádků.

### 4.13) Co znamená chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"?

Pravděpodobně jste vyčerpal dostupnou virtuální paměť, nebo tvůj kernel má příliš nízké limity u určitých zdrojů. Před startem PostgreSQL vyzkoušejte:

    ulimit -d 262144
    limit datasize 256m

Možná, že se projde pouze jeden příkaz - záleží to na vašem shellu. Měl by zvednout limity datových segmentů vašich procesů na dostatečně velkou hodnotu a snad umožnit dokončení dotazu. Změna limitů se bude aplikovat pouze na aktuální proces a na všechny nově vytvořené procesy. Jestliže máte problém s SQL klientem, protože vám server vrátil příliš dat, zkuste to před startem klienta.

### 4.14) Jak zjistím, kterou verzi PostgreSQL používám?

V psql napište:

    SELECT version();

### 4.15) Jak vytvořit sloupec, který bude implicitně obsahovat aktuální čas?

Použijte CURRENT_TIMESTAMP:

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

### 4.16) Jak provést vnější spojení (outer join)?

PostgreSQL podporuje standardní SQL syntaxi pro vnější spojení. Zde jsou dva pří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 ještě vrátí všechny nespárované řádky t2 (ty, které nedohledá v t2). RIGHT JOIN by připojil všechny nespárované řádky z t2. FULL JOIN vrátí všechny spárované řádky i všechny zbývající řádky z obou tabulek. Klíčové slovo OUTER je volitelné. Běžná operace JOIN se také označuje jako vnitřní spojení.

### 4.17) Jak provést dotaz napříč několika databázemi?

Neexistuje žádný způsob, jak se v dotazu odkazovat na tabulky z jiné než aktuální databáze. A to protože má systémové tabulky uložené nezávisle v každé databázi a není tak úplně zřejmé, jak by se dotaz provedený napříč databázemi měl chovat.

Jeden z doplňků dblink umožňuje dotaz nad několika tabulkami pomocí funkcí. Druhý způsob je simultální připojení klienta ke všem relevantním databázím a sloučení výsledku na straně klienta.

### 4.18) Může funkce vrátit více řádků nebo sloupců?

Jde to jednoduše pomocí set-returning funkce. Více na http://www.postgresql.org/docs/techdocs.17.

### 4.19) Co je příčinou chyby "relation with OID xxxxx does not exist"?

Nechtěným vedlejším efektem kešování SQL dotazů v PL/pgSQL funkci je problém s neplatnými odkazy na dočasné tabulky, které byly od prvního spuštění funkce zrušeny a znovu vytvořeny před dalším spuštěním PL/pgSQL funkce. Řešením je použít příkaz EXECUTE a to proto, že prováděcí plán SQL příkazu spouštěného příkazem EXECUTE se vytváří pokaždé znovu (neukládá se do cache).

Tento problém by se neměl vyskytovat u PostgreSQL verze 8.3 a vyšších verzích.

### 4.20) Jaké jsou možnosti replikace databází?

Replikaci databáze umožňuje několik technoligií. Každá má určité výhody a nevýhody.

Master/Slave replikaci podporuje jeden hlavní server, který přijímá požadavky na zápis a čtení, a několik podřízených serverů, které umožňují pouze čtení (SELECT). Nejrozšířenějším volně dostupným řešením tohoto typu je Slony-I.

Replikace typu Multi-master podporuje existenci několika serverů s povoleným zápisem na více replikovaných serverech. Toto řešení zvyšuje zátěž serverů, protože je nutná synchronizace serverů. Nejrozšířenějším volně dostupným řešením je PGCluster.

Ještě existuje několik komerčních a hardware řešení replikací podporujících různé modely replikace.

### 4.21) Proč v dotazu nejsou rozpoznány názvy mých tabulek nebo funkcí? Proč jsou velká písmena v názvech automaticky převedena na malá písmena?

Nejčastějším důvodem nerozpoznání názvu objektu bylo použití vložení názvu sloupce nebo tabulky mezi uvozovky při zakládání tabulky. Pokud se název zapíše mezi uvozovky, pak je case sensitive, a v důsledku toho je nutné názvy těchto sloupců nebo tabulek v SQL příkazech také vkládat mezi uvozovky (pokud obsahují velká písmena). Některé programy, jako je například pgAdmin, automaticky používají uvozovky. Takže pokud chcete, aby systém identifikoval identifikátor, musíte:

- nepoužívat uvozovky v příkazu CREATE TABLE
- v identifikátoru použít pouze malá písmena
- v dotazech vkládat identifikátory do uvozovek