1167 lines
56 KiB
HTML
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> |