postgres/doc/src/FAQ/FAQ_czech.html
Bruce Momjian 233afe6a90 New Czech FAQ.
Pavel Stehule
2004-07-12 00:22:51 +00:00

1167 lines
56 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META name="generator" content="HTML Tidy, see www.w3.org">
<META http-equiv="Content-Type" content="text/html; charset="iso-8859-2">
<META http-equiv="Content-language" content="cs">
<META name="description" lang="en" content="Czech translation of FAQ for PostgreSQL">
<META name="description" lang="cs" content="Český překlad FAQ PostgreSQL">
<TITLE>PostgreSQL FAQ</TITLE>
</HEAD>
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
alink="#0000ff">
<H1>Často kladené dotazy (FAQ) PostgreSQL</H1>
<P>Poslední aktualizace: Středa 23. června 21:10:00 EST 2004</P>
<P>Současný správce: Bruce Momjian (<A href=
"mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)</P>
<P>Přeložil: Pavel Stěhule (<A href=
"mailto:stehule@kix.fsv.cvut.cz">stehule@kix.fsv.cvut.cz</A>)</P>
<P>Aktuální verzi tohoto dokumentu naleznete na adrese: <A href=
"http://www.PostgreSQL.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html</A>.
Český překlad na adrese: <A href="http://www.PostgreSQL.org/docs/faqs/FAQ_czech.html">
http://www.PostgreSQL.org/docs/faqs/FAQ_czech.html</A>.</P>
<P>Odpovědi na dotazy relevantní ke konkrétním platformám
lze nalézt na adrese: <A href="http://www.PostgreSQL.org/docs/index.html">
http://www.PostgreSQL.org/docs/index.html</A>.</P>
<HR>
<H2 align="center">Obecné otázky</H2>
<A href="#1.1">1.1</A>) Co je PostgreSQL? Jak se vyslovuje?<BR>
<A href="#1.2">1.2</A>) Jaká je licence na PostgreSQL?<BR>
<A href="#1.3">1.3</A>) Na kterých Unixex lze spustit PostgreSQL?<BR>
<A href="#1.4">1.4</A>) Které ne-unixové platformy jsou podporované?<BR>
<A href="#1.5">1.5</A>) Kde mohu získat PostgreSQL?<BR>
<A href="#1.6">1.6</A>) Kde mohu získat podporu?<BR>
<A href="#1.7">1.7</A>) Kde je poslední verze?<BR>
<A href="#1.8">1.8</A>) Jaká je dostupná dokumentace?<BR>
<A href="#1.9">1.9</A>) Kde najdu seznam známých chyb nebo nepodporovaných vlastností?<BR>
<A href="#1.10">1.10</A>) Jak se mohu naučit SQL?<BR>
<A href="#1.11">1.11</A>) Nemá PostgreSQL problémy s rokem 2000?<BR>
<A href="#1.12">1.12</A>) Jak se připojit k vývojářskému týmu?<BR>
<A href="#1.13">1.13</A>) Kam podat report o chybě?<BR>
<A href="#1.14">1.14</A>) Jak je na tom PostgreSQL v porovnání s jinými databázemi?<BR>
<A href="#1.15">1.15</A>) Jak lze finančně pomoci PostgreSQL?<BR>
<H2 align="center">User client dotazy</H2>
<A href="#2.1">2.1</A>) Kde naleznu ODBC ovladače pro PostgreSQL?<BR>
<A href="#2.2">2.2</A>) Jaké nástroje lze použít pro PostgreSQL a web?<BR>
<A href="#2.3">2.3</A>) Existuje grafické rozhraní pro PostgreSQL?<BR>
<A href="#2.4">2.4</A>) Které programovací jazyky mají podporu pro PostgreSQL?<BR>
<H2 align="center">Administrativní dotazy</H2>
<A href="#3.1">3.1</A>) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?<BR>
<A href="#3.2">3.2</A>) Při startu postmaster, dostanu chybové hlášení Bad System Call nebo
core dump. Proč?<BR>
<A href="#3.3">3.3</A>) Při startu postmastera dostanu hlášení o chybě
IpcMemoryCreate. Proč?<BR>
<A href="#3.4">3.4</A>) Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate.
Proč?<BR>
<A href="#3.5">3.5</A>) Jak povolit nebo zakázat přístup z jiných stanic?<BR>
<A href="#3.6">3.6</A>) Jak ladit databázový stroj na lepší výkon?<BR>
<A href="#3.7">3.7</A>) Jaké jsou možnosti ladění?<BR>
<A href="#3.8">3.8</A>) Proč dostanu "Sorry, too many clients", když se zkouším připojit?<BR>
<A href="#3.9">3.9</A>) K čemu slouží adresář pgsql_tmp?<BR>
<A href="#3.10">3.10</A>) Proč je požadováno dump a obnovení (load) databáze během upgrade
mezi velkými verzemi PostgreSQL?<BR>
<H2 align="center">Provozní dotazy</H2>
<A href="#4.1">4.1</A>) Čím se liší binární a normální kurzor?<BR>
<A href="#4.2">4.2</A>) Jak získat pouze první řádek dotazu? Náhodný řádek?<BR>
<A href="#4.3">4.3</A>) Jak získám seznam tabulek nebo jinak jak jej získá psql?<BR>
<A href="#4.4">4.4</A>) Jak odstraním sloupec tabulky, jak změním jeho typ?<BR>
<A href="#4.5">4.5</A>) Jaká je maximální velikost řádku, tabulky a databáze?<BR>
<A href="#4.6">4.6</A>) Kolik diskového prostoru je potřeba k uložení dat z normálního
textového souboru?<BR>
<A href="#4.7">4.7</A>) Jak získám seznam vytvořených tabulek, indexů,
databází?<BR>
<A href="#4.8">4.8</A>) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?<BR>
<A href="#4.9">4.9</A>) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz?<BR>
<A href="#4.10">4.10</A>) Co to je R-tree index?<BR>
<A href="#4.11">4.11</A>) Co je Genetic Query Optimizer?<BR>
<A href="#4.12">4.12</A>) Jak provést vyhledávání regulárního výrazu case sensitiv,
insensitiv? Jak použít index pro case insensitive vyhledávání?<BR>
<A href="#4.13">4.13</A>) Jak v dotazu detekovat, že položka je NULL?<BR>
<A href="#4.14">4.14</A>) Jaké jsou rozdíly mezi různými znakovými typy?<BR>
<A href="#4.15.1">4.15.1</A>) Jak vytvořit serial/auto-increment pole?<BR>
<A href="#4.15.2">4.15.2</A>) Jak získat hodnotu SERIAL po vložení řádku?<BR>
<A href="#4.15.3">4.15.3</A>) Nepovede currval() a nextval() k rozhození podmínek při souběhu s
jinými uživateli?<BR>
<A href="#4.15.4">4.15.4</A>) Proč není vygenerované číslo použito při přerušení transakce?
Proč vznikají díry v číslování vlastní sekvencí/SERIAL sloupce?<BR>
<A href="#4.16">4.16</A>) Co to je OID? Co je to TID?<BR>
<A href="#4.17">4.17</A>) Jaký je význam některých výrazů použitých v PostgreSQL?<BR>
<A href="#4.18">4.18</A>) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in
AllocSetAlloc()"?<BR>
<A href="#4.19">4.19</A>) Jak se dozvím, kterou verzi PostgreSQL používám?<BR>
<A href="#4.20">4.20</A>) Proč operace s velkými objekty končí "invalid large obj descriptor"?<BR>
<A href="#4.21">4.21</A>) Jak vytvořit sloupec obsahující implicitně aktuální datum?<BR>
<A href="#4.22">4.22</A>) Proč jsou moje vnořené dotazy používající IN tak pomalé?<BR>
<A href="#4.23">4.23</A>) Jak provést vnější spojení (outer join)?<BR>
<A href="#4.24">4.24</A>) Jak provést dotaz napříč několika databázemi?<BR>
<A href="#4.25">4.25</A>) Může funkce vrátit více řádků nebo sloupců?<BR>
<A href="#4.26">4.26</A>) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky
v PL/pgSQL funkcích?<BR>
<A href="#4.27">4.27</A>) Jaké jsou možnosti replikace databází?<BR>
<A href="#4.28">4.28</A>) Jaké jsou možnosti šifrování databází?<BR>
<H2 align="center">Rozšiřování PostgreSQL</H2>
<A href="#5.1">5.1</A>) Napsal jsem UDF funkci, PostgreSQL však končí dump core?<BR>
<A href="#5.2">5.2</A>) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do
PostgreSQL?<BR>
<A href="#5.3">5.3</A>) Jak napsat funkci v C vracející ntici?<BR>
<A href="#5.4">5.4</A>) Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci
vzata v potaz. Proč?<BR>
<HR>
<H2 align="center">Obecné otázky</H2>
<H4><A name="1.1">1.1</A>) Co je PostgreSQL? Jak se vyslovuje?</H2>
<P>PostgreSQL se vyslovuje <I>Post-Gres-Q-L</I>. Zvukový záznam je
dostupný na adrese <A href="http://www.postgresql.org/postgresql.mp3"></A>.</P>
<P>PostgreSQL vychází z databáze POSTGRES (a stále je někdy označován
zjednodušeně jako Postgres) - výzkumného prototypu <SMALL>DBMS</SMALL> 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 <SMALL>SQL</SMALL>. PostgreSQL lze používat bez omezení a jeho
zdrojové kódy jsou volně k dispozici.</P>
<P>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 (<A href=
"mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A>).
(viz <A href="#1.6">1.6</A> - 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 <A href=
"http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html">http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html</A></P>
<P>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>
<P>Původní název software z Berkley byl Postgres. Po přidání jazyka <SMALL>SQL</SMALL> se
název změnil na Postgres95. Koncem roku 1996 byl RDBMS přejmenován na
PostgreSQL.</P>
<H4><A name="1.2">1.2</A>) Jaká je licence na PostgreSQL?</H4>
<P>PostgreSQL je předmětem následujících autorských práv:</P>
<P>Dílčí copyright (c) 1996-2004, PostgreSQL Global Development Group
Dílčí copyright (c) 1994-6, Regents of the University of California</P>
<P>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ů.</P>
<P>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.</P>
<P>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.</P>
<P>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.</P>
<H4><A name="1.3">1.3</A>) Na kterých Unixex lze spustit PostgreSQL?</H4>
<P>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.</P>
<H4><A name="1.4">1.4</A>) Které ne-unixové platformy jsou podporované?</H4>
<P><STRONG>Klient</STRONG></P>
<P>Knihovna <I>libpq</I>, 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 <I>win32.mak</I> a
Win32 knihovny <I>libpq</I> a <I>psql</I>. K databázi PostgerSQL lze přistupovat skrze
rozhraní <SMALL>ODBC</SMALL>.</P>
<P><STRONG>Server</STRONG><P>
<P>Server může být na WindowsNT a Win2k provozován pouze s knihovnou
Cygwin, Cygnus Unix/NT porting library. Více <I>pgsql/doc/FAQ_MSWIN</I> v
distribuci nebo MS Windows FAQ na adrese
<A href="http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN">http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN</A>.
<P>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
<A href="http://techdocs.postgresql.org/guides/Windows">http://techdocs.postgresql.org/guides/Windows</A> a
<A href="http://momjian.postgresql.org/main/writings/pgsql/win32.html">
http://momjian.postgresql.org/main/writings/pgsql/win32.html</A>.
<P>Existující port pro Novell Netware 6 naleznete na
<A href="http://forge.novell.com">http://forge.novell.com</A>.</P>
<H4><A name="1.5">1.5</A>) Kde mohu získat PostgreSQL?</H4>
<P>Primárním anonymním ftp serverem pro PostgreSQL je
<A href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
Seznam zrcadel naleznete na našich webových stránkách.</P>
<H4><A name="1.6">1.6</A>) Kde mohu získat podporu?</H4>
<P>Hlavní mailová konference je: <A href="mailto:pgsql-general@PostgreSQL.org">
pgsql-general@PostgreSQL.org</A>. 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):</P>
<PRE>
subscribe
end
</PRE>
na adresu <A href="mailto:pgsql-general-request@PostgreSQL.org">
pgsql-general-request@PostgreSQL.org</A>.</P>
<P>Můžete si vyžádat denní přehled (diggest), který má zhruba 30K denně
zpráv.</P>
<P>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 <A href="mailto:pgsql-bugs-request@PostgreSQL.org">
pgsql-bugs-request@PostgreSQL.org</A>.</P>
<P>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.</P>
<P>Seznam dalších konferencí naleznete na stránkách PostgreSQL:</P>
<BLOCKQUOTE>
<A href="http://www.postgresql.org">http://www.postgresql.org</A>
</BLOCKQUOTE>
<H4><A name="1.7">1.7</A>) Jaká je poslední verze?</H4>
<P>Poslední verze PostgreSQL je 7.4.3. Plánujeme uvolnit významnou verzi
každých šest až osm měsíců.</P>
<H4><A name="1.8">1.8</A>) Jaká je dostupná dokumentace?</H4>
<P>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 <I>/doc</I>. Manuály jsou
přístupné online na <A href="http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</A>.</P>
<P>Na adresách <A href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A> a
<A href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>
naleznezte dvě online knihy o PostgreSQL. Seznam dostupné literatury je na
<A href="http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</A>. Soubor
technických článků s tematikou PostgresQL najdete na <A href=
"http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</A>.</P>
<P><I>psql</I> má užitečný metapříkaz \d sloužící k zobrazení informací o typech,
operátorech, funkcí, agregačních funkcí atd.</P>
<P>Více dokumentace naleznete na našich webových stránkách.</P>
<H4><A name="1.9">1.9</A>) Kde najdu seznam známých chyb nebo nepodporovaných vlastností?</H4>
<P>PostgreSQL podporuje rozšířenou podmnožinu <SMALL>SQL-92</SMALL>. V našem
<A href="http://developer.PostgreSQL.org/todo.php">TODO</A>
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).</P>
<H4><A name="1.10">1.10</A>) Jak se mohu naučit SQL?</H4>
<P>V knize The PostgreSQL book na <A href=
"http://www.PostgreSQL.org/docs/awbook.html">
http://www.PostgreSQL.org/docs/awbook.html</A> je vysvětlen jazyk SQL (vyšla
česky). Další dostupnou knihou je <A href=
"http://www.commandprompt.com/ppbook">http://www.commandprompt.com/ppbook</A>.
Kvalitní návody naleznete na <A href=
"http://www.intermedia.net/support/sql/sqltut.shtm">
http://www.intermedia.net/support/sql/sqltut.shtm</A>, a na
<A href="http://sqlcourse.com">http://sqlcourse.com</A>.</P>
<P>Další je Teach Yourself SQL in 21 days, Second Edition na <A href=
"http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A>.</P>
<P>Mnoho uživatelů doporučuje <I>The Practical SQL Handbook</I>, Bowman, Judith
S., et al., Addison-Wesley. Jiní preferují <I>The Complete Reference SQL</I>,
Groff et al., McGraw-Hill.</P>
<H4><A name="1.11">1.11</A>) Nemá PostgreSQL problémy s rokem 2000?</H4>
<P>Nemá, můžeme pracovat s datumy po roce 2000 našeho letopočtu i před
rokem 2000 př.n.l.</P>
<H4><A name="1.12">1.12</A>) Jak se připojit k vývojářskému týmu?</H4>
<P>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í <I>pgsql-hackers</I> a <P>pgsql-patches</I>. Kvalitní záplaty posílejte do
pgsql-patches.</P>
<P>Právo commit má v <SMALL>CVS</SMALL> 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.</P>
<H4><A name="1.13">1.13</A>) Kam podat report o chybě?</H4>
<P>Navštivte naši PostgreSQL BugTool stránku na <A href=
"http://www.PostgreSQL.org/bugs/bugs.php">http://www.PostgreSQL.org/bugs/bugs.php</A>,
která obsahuje návod a směrnice jak podat chybový report.</P>
<P>Ověřte si na našem ftp serveru <A href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>,
zda-li máte nejnovější verzi PostgreSQL a zda-li k ní neexistují nějaké záplaty.</P>
<H4><A name="1.14">1.14</A>) Jak je na tom PostgreSQL v porovnání s jinými databázemi?</H4>
<P>Existuje několik hledisek jak porovnávat software: vlastnosti, výkon,
spolehlivost, podpora a cena.</P>
<DL>
<DT><B>Vlastnosti</B></DT>
<DD>PostgreSQL má hodně společných vlastností s velkými komerčními
<SMALL>DBMS</SMALL>, 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í.</BR></BR></DD>
<DT><B>Výkon</B></DT>
<DD>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 <I>vlastnosti</I>. 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 <A href="http://openacs.org/philosophy/why-not-mysql.html">http://openacs.org/philosophy/why-not-mysql.html</A>.
Za vývojem MySQL není Open Source komunita, ale komerční společnost,
přestože svoje produkty distribuuje jako Open Source.<BR><BR></DD>
<DT><B>Spolehlivost</B></DT>
<DD>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.</BR></BR></DD>
<DT><B>Podpora</B></DT>
<DD>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 <SMALL>DBMS</SMALL> 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 (<A href="#1.6">FAQ sekce 1.6</A>).<BR><BR></DD>
<DT><B>Cena</B><DT>
<DD>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).<BR>
<BR></DD>
</DL>
<H4><A name="1.15">1.15</A>) Jak lze finančně pomoci PostgreSQL?</H4>
<P>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.</P>
<P>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.</P>
<P>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 <A href=
"http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</A> a darujte je.</P>
<P>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.</P>
<HR>
<P>Pokud máte příklad úspěšného nasazení PostgreSQL, přihlaště se na náš
advocacy site na <A href="http://advocacy.postgresql.org">http://advocacy.postgresql.org</A>.</P>
<H2 align="center">User client dotazy</H2>
<H4><A name="2.1">2.1</A>) Kde naleznu <SMALL>ODBC</SMALL> ovladače pro PostgreSQL?</H4>
<P>Pro PostgreSQL existují dva <SMALL>ODBC</SMALL> ovladače - PsqlODBC a OpenLink ODBC.</P>
<P>PsqlODBC je ke stažení na <A href=
"http://gborg.postgresql.org/project/psqlodbc/projdisplay.php">
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php</A>.</P>
<P>OpenLink můžete získat na <A href="http://www.openlinksw.com">http://www.openlinksw.com</A>.
Spolupracuje s jejich klientským programovým vybavením a je dostupný pro všechny jimi
podporované platformy (Win, Mac, Unix, VMS).</P>
<P>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 <A href=
"mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</A>.</P>
<H4><A name="2.2">2.2</A>) Jaké nástroje lze použít pro PostgreSQL a web?</H4>
<P>Pěkný úvod do databázových technologií zabezpečujících chod webových
stránek najdete na <A href="http://www.webreview.com">http://www.webreview.com</A>.</P>
<P>Pro tvorbu webu existuje excelentní rozhraní PHP, které naleznete na
<A href="http://www.php.net">http://www.php.net</A>.</P>
<P>Pro složitější případy se často používá Perl a CGI.pm nebo mod_perl.</P>
<H4><A name="2.3">2.3</A>) Existuje grafické rozhraní pro PostgreSQL?</H4>
<P>Pro PostgreSQL existuje několik grafických rozhraní: PgAccess
(<A href="http://www.php.net">http://www.php.net</A>), PgAdmin III
(<A href="http://www.php.net">http://www.php.net</A>), RHDB Admin
(<A href="http://sources.redhat.com/rhdb/">http://sources.redhat.com/rhdb/</A>) a Rekall (
<A href="http://www.thekompany.com/products/rekall/">http://www.thekompany.com/products/rekall/</A>).
Dále ještě PhpPgAdmin
(<A href="http://phppgadmin.sourceforge.net/">http://phppgadmin.sourceforge.net/</A>) což je rozhraní PostgreSQL
založené na web technologii.</P>
<P>Úplnější seznam najdete na <A href=
"http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</A>.</P>
<H4><A name="2.4">2.4</A>) Které programovací jazyky mají podporu pro PostgreSQL?</H4>
<P>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.</P>
<P>Distribuce PostgreSQL obsahuje tato rozhraní:</P>
<UL>
<LI>C (libpq)</LI>
<LI>Embbedded C (ecpg)</LI>
<LI>Java (jdbc)</LI>
<LI>Python (PyGreSQL)</LI>
<LI>TCL (libpgtcl)</LI>
</UL>
<P>Další rozhraní jsou dostupná na <A href="http://gborg.postgresql.org">http://gborg.postgresql.org</A>
v sekci <I>Drivers/Interfaces</I>.</P>
<HR>
<H2 align="center">Administrativní dotazy</H2>
<H4><A name="3.1">3.1</A>) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?</H4>
<P>Použijte volbu <I>--prefix</I> při spuštění configure.</P>
<H4><A name="3.2">3.2</A>) Při startu postmaster, dostanu chybové hlášení Bad System Call
nebo core dump. Proč?</H4>
<P>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ů.</P>
<H4><A name="3.3">3.3</A>) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. Proč?</H4>
<P>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.</P>
<H4><A name="3.4">3.4</A>) Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate.
Proč?</H4>
<P>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 <I>postmaster</I> s limitem backendů. Použijte přepínač <I>-N</I> s
hodnotou menší než 32. Úplným řešením je zvýšení hodnot <SMALL>SEMMNS</SMALL>
a <SMALL>SEMMNI</SMALL> jadra.</P>
<P>Nefunkční semafory mohou způsobit pád během intenzivních databázových
operací.</P>
<P>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.</P>
<H4><A name="3.5">3.5</A>) Jak povolit nebo zakázat přístup z jiných stanic?</H4>
<P>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 <B>a</B> určením
způsobu autentifikace v <I>$PGDATA/pg_hba.conf</I>.</P>
<H4><A name="3.6">3.6</A>) Jak ladit databázový stroj na lepší výkon?</H4>
<P>Určitě pomohou indexy. Příkaz <SMALL>EXPLAIN ANALYZE</SMALL> Vám umožní sledovat
jak PostgreSQL interpretuje Váš dotaz a které indexy používá.</P>
<P>Při větší dávce INSERTů uvažujte o náhradě příkazem <SMALL>COPY</SMALL>. Ten je mnohem
rychlejší nežli samotný <SMALL>INSERT</SMALL>. Každý příkaz mimo blok <SMALL>BEGIN WORK/COMMIT</SMALL>
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.</P>
<P>Máte několik dalších možností, jak zlepšit výkon. Můžete zakázat <I>fsyn()</I>
při startu postmastera přepínači <I>-o -F</I>. Tyto přepínače zabrání <I>fsync()</I>,
tj. zápisu na disk po každé transakci.</P>
<P>Můžete zvýšit velikost paměťových bufferů použitých backendy tj.
parametr <I>-B</I> 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ů.</P>
<P>Dále můžete použít přepínač <I>-S</I> 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.</P>
<P>Můžete použít příkaz <SMALL>CLUSTER</SMALL>, který uspořádá fyzicky data v tabulkách
podle indexu. Více na manuálových stránkách příkazu <SMALL>CLUSTER</SMALL>.</P>
<H4><A name="3.7">3.7</A>) Jaké jsou možnosti ladění?</H4>
<P>Máte několik možností jak se dostat k užitečným stavovým informacím.</P>
<P>Zaprvé, při překladu použijte přepínač <I>--enable-cassert</I>, tím se zapne
monitorování a následné zastavení aplikace, když se proces v backendu
dostane do neočekávaného stavu.</P>
<P>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:</P>
<PRE>
cd /usr/local/pgsql
./bin/postmaster > server.log 2>&1 &
</PRE>
<P>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č <I>-d</I> 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.</P>
<P>Pokud neběží postmaster, můžete spustit backend PostgreSQL z příkazové
řádky a napsat svůj <SMALL>SQL</SMALL> dotaz přímo v backendu (doporučeno <B>pouze</B> 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.</P>
<P>Pokud běží <I>postmaster</I>, spusťe <I>psql</I> v jednom okně a pak si zjistěte <SMALL>PID</SMALL>
procesu postgres použitého psql. V debuggeru sepřipojte k postgresql
<SMALL>PID</SMALL>. Pak nastavte breakpointy v debuggeru a zadejte dotaz v psql. Pokud
ladíte startup postgresu, pak nastavte PGOPTIONS="-W n" a spusťe <I>psql</I>.
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.</P>
<P>Pro ladění a měření výkonu mohou být užitečné přepínače <I>-s, -A</I> a <I>-t</I>
programu postgres (backend).</P>
<P>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 <I>pgsql/data/base/dbname</I>. Profil klienta pak v jeho aktuálním
adresáři. Korektní profilace v prostředí Linux požaduje konfiguraci
systému s parametrem <I>-DLINUX_PROFILE</I>.</P>
<H4><A name="3.8">3.8</A>) Proč dostanu "Sorry, too many clients", když se zkouším připojit?</H4>
<P>Zvyšte limit postmastera na maximální počet současně spuštěných
backendů.</P>
<P>Výchozí hodnota je 32 backendů. Tuto hodnotu zvýšíte zastavením a
opětovným spuštěním postmastera s parametrem <I>-N</I> nebo úpravou
<I>postgresql.conf</I>.</P>
<P>Při zvýšení hodnoty <I>-N</I> nad 32 musíte zvýšit hodnotu <I>-B</I> nad výchozí 64,
<I>-B</I> 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
<SMALL>SHMMAX</SMALL>, maximální počet semafórů <SMALL>SEMMNS</SMALL> a <SMALL>SEMMNI</SMALL>, maximální počet
procesů <SMALL>NPROC</SMALL>, maximální počet procesů uživatele <SMALL>MAXUPRC</SMALL> a maximální
počet otevřených souborů <SMALL>NFILE</SMALL> a <SMALL>NINODE</SMALL>. 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.</P>
<H4><A name="3.9">3.9</A>) K čemu slouží adresář pgsql_tmp?</H4>
<P>Tento adresář obsahuje dočasné soubory vytvořené exekutorem dotazů.
Například, když je nutné třídění k zajištění <SMALL>ORDER BY</SMALL> a třídění má větší
nároky na prostor než povoluje parametr <I>-S</I> backendu, pak je vytvořen
dočasný soubor k uložení extra údajů.</P>
<P>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ářů.</P>
<H4><A name="3.10">3.10</A>) Proč je požadováno dump a obnovení (load) databáze během
upgrade mezi velkými verzemi PostgreSQL?</H4>
<P>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.</P>
<HR>
<H2 align="center">Provozní dotazy</H2>
<H4><A name="4.1">4.1</A>) Čím se liší binární a normální kurzor?</H4>
<P>Popis najdete v manuálové stránce <SMALL>DECLARE</SMALL></P>
<H4><A name="4.2">4.2</A>) Jak získat pouze první řádek dotazu? Náhodný řádek?</H4>
<P>Podívejte se do man. stránky příkazu <SMALL>FETCH</SMALL>, nebo použijte <SMALL>SELECT</SMALL> ...
<SMALL>LIMIT</SMALL> ...</P>
<P>I když potřebujete získat pouze prvních několik řádků, je třeba
zpracovat všechna data, např. pokud dotaz má <SMALL>ORDER BY</SMALL>. Pokud však
existuje index, který odpovídá <SMALL>ORDER BY</SMALL>, PostgreSQL může získat
pouze prvních n řádků a ukončit zpracování dotazu.</P>
<P>K získání náhodného řádku použijte:</P>
<PRE>
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
</PRE>
<H4><A name="4.3">4.3</A>) Jak získám seznam tabulek nebo jinak jak jej získá psql?</H4>
<P>Příkaz \dt v psql zobrazí seznam tabulek. Úplný seznam příkazů <I>psql</I>
dostanete příkazem \?. Také se můžete podívat do zdrojových kódů <I>psql</I>
do souboru <I>pgsql/src/bin/psql/describe.c</I>. Ten obsahuje <SMALL>SQL</SMALL> příkazy,
které se používají v psql metapříkazech. Dále můžete spustit <I>psql</I>
s přepínačem <I>-E</I>, 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.</P>
<H4><A name="4.4">4.4</A>) Jak odstraním sloupec tabulky, jak změním jeho typ?</H4>
<P>Počínaje verzí 7.3 můžete použít příkaz <SMALL>ALTER TABLE DROP COLUMN</SMALL>. Ve
starších verzích můžete použít následující postup:</P>
<PRE>
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;
</PRE>
<P>Pro změnu typu sloupce je třeba provést:</P>
<PRE>
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;
</PRE>
Poté proveďte <I>VACUUM FULL tab</I> - uvolníte tím diskový prostor zabraný
nyní již neplatnými řádky.
<H4><A name="4.5">4.5</A>) Jaká je maximální velikost řádku, tabulky a databáze?</H4>
<P>PostgreSQL má tato omezení:</P>
<PRE>
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
</PRE>
<P>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.</P>
<P>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é.</P>
<P>Maximální velikost tabulky a maximální počet sloupců můžeme
zečtyřnásobit nastavením velikosti bloku na 32K.</P>
<H4><A name="4.6">4.6</A>) Kolik diskového prostoru je potřeba k uložení dat z </H4>
normálního textového souboru?
<P>PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z
textového souboru.</P>
<P>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.</P>
<PRE>
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)
</PRE>
<P>Indexy nemají tak velkou režii, ale mohou být také velké, protože
obsahují indexovaná data.</P>
<P>Hodnoty <SMALL>NULL</SMALL> jsou uloženy v bitmapách, takže spotřebují jen velmi málo
diskového prostoru.</P>
<H4><A name="4.7">4.7</A>) Jak získám seznam vytvořených tabulek, indexů, databází?</H4>
<P><I>psql</I> 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 <I>pg_</I>. Spuštění <I>psql</I> s parametrem <I>-l</I> provede výpis názvů
všech databází.</P>
<P>Soubor <I>pgsql/src/tutorial/syscat.source</I> obsahuje <SMALL>SELECT</SMALL>y přistupující k
systémovým tabulkámm.</P>
<H4><A name="4.8">4.8</A>) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?</H4>
<P>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í.</P>
<P>PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k
tabulce. Tyto statistiky se shromažďují příkazy <SMALL>VACUUM ANALYZE</SMALL> nebo
<SMALL>ANALYZE</SMALL>. 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.</P>
<P>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.</P>
<P>Jinak je tomu v případě použití <SMALL>LIMIT</SMALL> a <SMALL>ORDER BY</SMALL>, 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:
<PRE>
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
</PRE>
<P>Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání
tabulky, použijte příkaz <CODE>SET enable_seqscan TO 'off'</CODE> a zkuste zda je
indexní prohledávání rychlejší.</P>
<P>Při vyhledávání na základě vzoru jako je např. operátor <SMALL>LIKE</SMALL> nebo <I>~</I> se
indexy použíjí pouze za určitých skutečností:</P>
<UL>
<LI>začátek hledaného vzoru musí být ukotven k začátku, tj.
<UL>
<LI>vzor <SMALL>LIKE</SMALL> nesmí začínat <I>%</I></LI>
<LI><I>~</I> regulární výraz musí začínat <I>^</I></LI>
</UL>
<LI>vzor nesmí začínat intervalem, např. [a-e]</LI>
<LI>vyhledávaní, které není Case sensitiv jako je <SMALL>ILIKE</SMALL> nebo <I>~*</I>
nepoužívá indexy. Můžete ale použít funkcionální indexy, které jsou
posány v sekci <A href="#4.12">4.12</A></LI>
<LI>při inicializaci databáze (<I>initdb</I>) 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í).</LI>
</UL>
<H4><A name="4.9">4.9</A>) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz?</H4>
Podívejte se do manuálové stránky příkazu <SMALL>EXPLAIN</SMALL>.
<H4><A name="4.10">4.10</A>) Co to je R-tree index?</H4>
<P>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 <I>point</I>, pak systém může efektivně odpovědět na dotaz -
vyber všechny body uvnitř obdélníků.</P>
<P>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</P>
<P>Tyto materiály naleznete v Stonebraker's "Readings in Database Systems".</P>
<P>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.</P>
<H4><A name="4.11">4.11</A>) Co je Genetic Query Optimizer?</H4>
<P><SMALL>GEQO</SMALL> 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.</P>
<H4><A name="4.12">4.12</A>) Jak provést vyhledávání regulárního výrazu case sensitiv,
insensitiv? Jak použít index pro case insensitive vyhledávání?</H4>
<P>Operátor <I>~</I> slouží k porování s regulárním výrazem, jeho modifikace <I>*~</I>
představuje case insensitive vyhledávání. Jedná se o obdobu <SMALL>LIKE</SMALL> a
<SMALL>ILIKE</SMALL>.</P>
<P>Pro vyhledávání bez ohledu na velká malá písmena použijeme:</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc';
</PRE>
V tomto případě se nepoužije standardní index. Nicméně, použije se
funkcionální index, pokud jej vytvoříte:
<PRE>
CREATE INDEX tabindex ON tab (lower(col));
</PRE>
<H4><A name="4.13">4.13</A>) Jak v dotazu detekovat, že položka je NULL?</H4>
<P>Určíte pomocí <SMALL>IS NULL</SMALL> nebo <SMALL>IS NOT NULL</SMALL></P>
<H4><A name="4.14">4.14</A>) Jaké jsou rozdíly mezi různými znakovými typy?</H4>
<PRE>
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
</PRE>
<P>S interními názvy se setkáte v systémovém katalogu a v některých
chybových hlášeních.</P>
<P>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 <SMALL>TOAST</SMALL>em, takže prostor na disku může
být nižší než je očekáváno.</P>
<P><SMALL>VARCHAR(n)</SMALL> je vhodný pro ukládání textů promměné délky s pevně
stanovenou maximální délkou. <SMALL>TEXT</SMALL> je pro řetězce bez omezení délky s
maximem jeden gigabajt.</P>
<P><SMALL>CHAR(n)</SMALL> slouží k ukládání řetězců stejné délky. <SMALL>CHAR(n)</SMALL> doplní prázdné
znaky do specifikované délky, zatímco VARCHAR(n) uloží pouze předané
znaky. <SMALL>BYTEA</SMALL> je určeno pro ukládání binárních dat, včetně <SMALL>NULL</SMALL> byte.
Všechny zde popsané typy mají podobné výkonnostní charakteristiky.</P>
<H4><A name="4.15.1">4.15.1</A>) Jak vytvořit serial/auto-increment pole?</H4>
<P>PostgreSQL podporuje typ <SMALL>SERIAL</SMALL>. Při jeho použití se automaticky vytvoří
SEQUENCE. Například:</P>
<PRE>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</PRE>
je automaticky převedeno do
<PRE>
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);
</PRE>
Viz dokumentace <I>create_sequence</I> v manuálových stránkách. Dále můžete
použít unikátní hodnotu <I>OID</I> každého řádku. Potom ale musíte spouštět
<I>pg_dump</I> s přepínačem <I>-o</I>, tak aby zůstaly zachovány hodnoty <SMALL>OID</SMALL> (u
příkazu copy <SMALL>COPY WITH OIDS</SMALL>).
<H4><A name="4.15.2">4.15.2</A>) Jak získat hodnotu <SMALL>SERIAL</SMALL> po vložení řádku?</H4>
<P>Jednou z možností je získat budoucí hodnotu <SMALL>SERIAL</SMALL> funkcí <I>nextval()</I> před
samotným vložením a pak ji vložit explicitně. Například v jakémsi
pseudojazyku:</P>
<PRE>
newid = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
</PRE>
<P>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
<I>tabulka_sloupec_seq</I>.</P>
<P>Alternativně můžete získat hodnotu posledně generovou sekvencí funkcí
<I>currval()</I> po vložení:</P>
<PRE>
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");
</PRE>
<P>Konečně můžete použít <SMALL>OID</SMALL> hodnotu vrácenou příkazem <SMALL>INSERT</SMALL>, 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 <I>$sth->{pg_oid_status}</I>
po každém <I>$sth->execute()</I>.
<H4><A name="4.15.3">4.15.3</A>) Nepovede <I>currval()</I> a <I>nextval()</I> k rozhození
podmínek při souběhu s jinými uživateli?</H4>
<P>Nikoliv, <I>currval()</I> vrací hodnotu naposledy generovanou ve vašem
backendu, a ta tudíž není společná všem uživatelům.</P>
<H4><A name="4.15.4">4.15.4</A>) Proč není vygenerované číslo použito při přerušení transakce?
Proč vznikají díry v číslování vlastní sekvencí/SERIAL sloupce?</H4>
<P>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í.</P>
<H4><A name="4.16">4.16</A>) Co to je <SMALL>OID</SMALL>? Co je to <SMALL>TID</SMALL>?</H4>
<P>Každý řádek vytvořený v PostgreSQL získá jedinečné <SMALL>OID</SMALL>. Všechna <SMALL>OID</SMALL>
generovaná během inicializace databáze jsou menší než 16384
(include/access/transam.h). Všechna <SMALL>OID</SMALL> generovaná na požadavek
uživatele jsou rovna nebo vyšší této hodnotě. Normálně, všechna <SMALL>OID</SMALL> jsou
jedinečná nejen uvnitř tabulky nebo databáze, ale v rámci celé instalace
PostgreSQL</P>
<P>PostgreSQL používá <SMALL>OID</SMALL> ve svém interním systému tabulek k vytvoření
relací. Tato <SMALL>OID</SMALL> mohou být použita k identifikaci konkrétního uživatele
a použita v spojení. Pro <SMALL>OID</SMALL> hodnoty je doporučen typ <SMALL>OID</SMALL>. Nad tímto
sloupcem můžete vytvořit index pro urychlení přístupu.</P>
<P><SMALL>OID</SMALL> 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 <SMALL>OID</SMALL>, nebo chcete zkopírovat tabulku s
původními <SMALL>OID</SMALL>, lze použít:</P>
<PRE>
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';
</PRE>
<P><SMALL>OID</SMALL> 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.</P>
<P><SMALL>TID</SMALL> 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).</P>
<H4><A name="4.17">4.17</A>) Jaký je význam některých výrazů použitých v PostgreSQL?</H4>
<P>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:</P>
<UL>
<LI> tabulka, relace, třída (table, relation, class)</LI>
<LI> řádek, záznam, ntice (row, record, tuple)</LI>
<LI> sloupec, položka, atribut (column, field, attribute)</LI>
<LI> vyhledání, výběr (retrieve, select)</LI>
<LI> náhrada, úprava (replace, update)</LI>
<LI> přidání, vkládání (append, insert)</LI>
<LI> OID, serial value (OID, serial value)</LI>
<LI> portal, kurzor (portal, cursor)</LI>
<LI> range variable, jméno tabulky, alias tabulky (range</LI>
variable, table name, table alias)</LI>
</UL>
<P>seznam těchto výrazů můžete nalézt na
<A href="http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</A>.</P>
<H4><A name="4.18">4.18</A>) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"?</H4>
<P>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</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
<P>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.</P>
<H4><A name="4.19">4.19</A>) Jak se dozvím, kterou verzi PostgreSQL používám?</H4>
<P>V psql spusťte <CODE>SELECT version();</CODE></P>
<H4><A name="4.20">4.20</A>) Proč operace s velkými objekty končí "invalid large obj descriptor"?</H4>
<P>Všechny operace s velkými objekty - <CODE>lo_open</CODE>, <CODE>lo_close</CODE>, ... musíte
spouštět v transakci, tj. mezi příkazy <CODE>BEGIN WORK</CODE> a <CODE>COMMIT</CODE>.</P>
<P>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é.</P>
Pokud používáte interface podobné <SMALL>ODBC</SMALL> musíte nastavit <CODE>set
auto_commit off</CODE>.
<H4><A name="4.21">4.21</A>) Jak vytvořit sloupec obsahující implicitně aktuální datum?</H4>
<P>Použijte <I>CURRENT_TIMESTAMP</I>:</P>
<PRE>
<CODE>
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</CODE>
</PRE>
<H4><A name="4.22">4.22</A>) Proč jsou moje vnořené dotazy používající IN tak pomalé?</H4>
<P>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ů <SMALL>IN</SMALL> bylo rychlé. Pro ostatní případy je vhodné
nahradit <SMALL>IN</SMALL> <SMALL>EXISTS</SMALL>:
<PRE>
SELECT *
FROM tab
WHERE col IN (SELECT subcol FROM subtab);
</PRE>
na:
<PRE>
SELECT *
FROM tab
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
</PRE>
<P>Pro urychlení vytvořete index pro subcol. </P>
<P>Ve verzi 7.4 a pozdějších, <SMALL>IN</SMALL> používá stejně sofistikovanou techniku
spojování tabulek jako ostatní dotazy a je preferovaný před <SMALL>EXISTS</SMALL>.</P>
<H4><A name="4.23">4.23</A>) Jak provést vnější spojení (outer join)?</H4>
<P>PostgreSQL podporuje vnější spojení tabulek standardními SQL příkazy.
Zde jsou dva příklady:</P>
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</PRE>
nebo
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN USING (col);
</PRE>
<P>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í (<SMALL>RIGHT JOIN</SMALL>) přidá
nepřipojené řádky z t2. <SMALL>FULL JOIN</SMALL> vrátí všechny řádky, včetně
nepřipojených z tbulek t1 a t2. Klíčové slovo <SMALL>OUTER</SMALL> je nepovinné a váže
se na <SMALL>LEFT</SMALL>, <SMALL>RIGHT</SMALL> a <SMALL>FULL</SMALL> join. Běžné
spojení se nazývá <SMALL>INNER JOIN</SMALL>.</P>
<P>V dřívějších verzích se vnější spojení tabulek mohlo simulovat pomocí
<SMALL>UNION</SMALL> a <SMALL>NOT IN</SMALL>. Například pro spojení tabulek tab1 a tab2, je
následující dotaz ekvivalentní k vnějšímu spojení dvou tabulek:</P>
<PRE>
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;
</PRE>
<H4><A name="4.24">4.24</A>) Jak provést dotaz z více databází?</H4>
<P>PostgreSQL nepodporuje dotazy do jiné než aktuální databáze.</P>
<P><I>contrib/dblink</I> 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í.</P>
<H4><A name="4.25">4.25</A>) Může funkce vrátit více řádků nebo sloupců?</H4>
<P>V PostgreSQL 7.3 můžete jednoduše vracet více řádků nebo sloupců z
funkce, viz:
<A href="http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions</A>.
<H4><A name="4.26">4.26</A>) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v PL/pgSQL funkcích?</H4>
<P>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í <SMALL>EXECUTE</SMALL>, tj.
dynamické provádění dotazu. Tento příkaz zajistí opakovaný překlad
dotazu při každém volání funkce.</P>
<H4><A name="4.27">4.27</A>) Jaké jsou možnosti replikace databází?</H4>
<P>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 <A href="http://gborg.PostgreSQL.org/genpage?replication_research">http://gborg.PostgreSQL.org/genpage?replication_research</A> najdete
jejich seznam. Na řešení multi-master replikaci se pracuje na
<A href="http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php</A>.</P>
<H4><A name="4.28">4.28</A>) Jaké jsou možnosti šifrování databází?</H4>
<UL>
<LI><I>contrib/pgcrypto</I> obsahuje šifrovací funkce použitelné v SQL
dotazech.</LI>
<LI>K šifrování přenosu dat z klienta na server, musí být server
přeložen s podporou <I>ssl</I> a přepínač <I>ssl</I> v <I>postgresql.conf</I> musí být
nastaven na hodnotu true. Klient musí mít vytvořen záznam hostssl v
<I>pg_hba.conf</I> a také mít povolen režim <I>ssl</I>. Lze použít i jiné
prostředky, nejen nativní podporu ssl v PostgreSQL, např. stunel a
ssh.</LI>
<LI>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
<I>PASSWORD_ENCRYPTION</I> v <I>postgresql.conf</I></LI>
<LI> Server může běžet na šifrovaném souborovém systému.</LI>
</UL>
<HR>
<H2 align="center">Rozšiřování PostgreSQL</H2>
<H4><A name="5.1">5.1</A>) Napsal jsem UDF funkci, PostgreSQL však končí dump core?</H4>
<P>Problém může být způsoben mnoha okolnostmi. Vyzkoušejte si svoji funkci
nejdříve v nějaké jednoduché aplikaci.</P>
<H4><A name="5.2">5.2</A>) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do PostgreSQL?</H4>
<P>Pošlete své rozšíření do konference pgsql-hackers, a ono pak možná
skončí v podadresáři contrib.</P>
<H4><A name="5.3">5.3</A>) Jak napsat funkci v C vracející ntici?</H4>
<P>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 <I>contrib/tablefunc</I>.</P>
<H4><A name="5.4">5.4</A>) Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci vzata v potaz. Proč?</H4>
<P><I>Makefile</I> nemá informace o závislostech mezi hlavičkovými soubory. Musíte
provést <I>make clean</I> a pak <I>make</I>. Pokud používáte <SMALL>gcc</SMALL>, můžete použít
přepínač <I>--enable-depend</I> příkazu <I>configure</I> k automatickému řešení
závislostí překladačem.</P>
</BODY>
</HTML>