diff options
Diffstat (limited to 'doc/FAQ_czech')
-rw-r--r-- | doc/FAQ_czech | 2282 |
1 files changed, 1105 insertions, 1177 deletions
diff --git a/doc/FAQ_czech b/doc/FAQ_czech index 1fd6627b8a5..1a2b33cb687 100644 --- a/doc/FAQ_czech +++ b/doc/FAQ_czech @@ -1,855 +1,823 @@ -Často kladené dotazy (FAQ) PostgreSQL -===================================== - -Obecné otázky -============= -1.1 Co je PostgreSQL? Jak se vyslovuje? -1.2 Jaká je licence na PostgreSQL? -1.3 Na kterých Unixex lze spustit PostgreSQL? -1.4 Které ne-unixové platformy jsou podporované? -1.5 Kde mohu získat PostgreSQL? -1.6 Kde mohu získat podporu? -1.7 Kde je poslední verze? -1.8 Jaká je dostupná dokumentace? -1.9 Kde najdu seznam známých chyb nebo nepodporovaných vlastností? -1.10 Jak se mohu naučit SQL? - -1.11 Nemá PostgreSQL problémy s rokem 2000? -1.12 Jak se připojit k vývojářskému týmu? -1.13 Kam podat report o chybě? -1.14 Jak je na tom PostgreSQL v porovnání s jinými databázemi? -1.15 Jak lze finančně pomoci PostgreSQL? - -User client dotazy -================== -2.1 Kde naleznu ODBC ovladače pro PostgreSQL? -2.2 Jaké nástroje lze použít pro PostgreSQL a web? -2.3 Existuje grafické rozhraní pro PostgreSQL? -2.4 Které programovací jazyky mají podporu pro PostgreSQL? - -Administrativní dotazy -====================== -3.1 Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql? -3.2 Při startu postmaster, dostanu chybové hlášení Bad System Call nebo -core dump. Proč? 3.3 Při startu postmastera dostanu hlášení o chybě -IpcMemoryCreate. Proč? 3.4 Při startu postmastera dostanu hlášení o -chybě IpcSemaphoreCreate. Proč? 3.5 Jak povolit nebo zakázat přístup z -jiných stanic? 3.6 Jak ladit databázový stroj na lepší výkon? - -3.7 Jaké jsou možnosti ladění? -3.8 Proč dostanu "Sorry, too many clients", když se zkouším připojit? -3.9 K čemu slouží adresář pgsql_tmp? - -3.10 Proč je požadováno dump a obnovení (load) databáze během upgrade -mezi velkými verzemi PostgreSQL? - -Provozní dotazy -=============== -4.1 Čím se liší binární a normální kurzor? -4.2 Jak získat pouze první řádek dotazu? Náhodný řádek? -4.3 Jak získám seznam tabulek nebo jinak jak jej získá psql? -4.4 Jak odstraním sloupec tabulky, jak změním jeho typ? -4.5 Jaká je maximální velikost řádku, tabulky a databáze? -4.6 Kolik diskového prostoru je potřeba k uložení dat z normálního -textového souboru? 4.7 Jak získám seznam vytvořených tabulek, indexů, -databází? 4.8 Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč? -4.9 Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz? - -4.10 Co to je R-tree index? -4.11 Co je Genetic Query Optimizer? -4.12 Jak provést vyhledávání regulárního výrazu case sensitiv, -insensitiv? Jak použít index pro case insensitive vyhledávání? 4.13 Jak -v dotazu detekovat, že položka je NULL? 4.14 Jaké jsou rozdíly mezi -různými znakovými typy? 4.15.1 Jak vytvořit serial/auto-increment pole? -4.15.2 Jak získat hodnotu SERIAL po vložení řádku? - -4.15.3 Nepovede currval() a nextval() k rozhození podmínek při souběhu s -jinými uživateli? 4.15.4 Proč není vygenerované číslo použito při -přerušení transakce? Proč vznikají díry v číslování vlastní -sekvencí/SERIAL sloupce? 4.16 Co to je OID? Co je to TID? - -4.17 Jaký je význam některých výrazů použitých v PostgreSQL? -4.18 Proč jsem získal chybové hlášení "ERROR: Memory exhausted in -AllocSetAlloc()"? 4.19 Jak se dozvím, kterou verzi PostgreSQL používám? -4.20 Proč operace s velkými objekty končí "invalid large obj -descriptor"? 4.21 Jak vytvořit sloupec obsahující implicitně aktuální -datum? 4.22 Proč jsou moje vnořené dotazy používající IN tak pomalé? -4.23 Jak provést vnější spojení (outer join)? - -4.24 Jak provést dotaz napříč několika databázemi? -4.25 Může funkce vrátit více řádků nebo sloupců? -4.26 Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v PL/pgSQL -funkcích? 4.27 Jaké jsou možnosti replikace databází? - -4.28 Jaké jsou možnosti šifrování databází? - -Rozšiřování PostgreSQL -====================== -5.1 Napsal jsem UDF funkci, PostgreSQL však končí dump core? -5.2 Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do -PostgreSQL? 5.3 Jak napsat funkci v C vracející ntici? - -5.4 Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci -vzata v potaz. Proč? ------------------------------------------------------------------------- - -Obecné otázky -============= - -1.1 Co je PostgreSQL? Jak se vyslovuje? ---------------------------------------- - -PostgreSQL se vyslovuje Post-Gres-Q-L. - -PostgreSQL vychází z databáze POSTGRES - výzkumného prototypu DBMS nové -generace. Z postgresu byl převzat silný datový model a bohatý soubor -datových typů a jeho dotazovací jazyk PostQuel byl nahrazen rozšířenou -podmnožinou jazyka SQL. PostgreSQL lze používat bez omezení a jeho -zdrojové kódy jsou volně k dispozici. - -PostgreSQL vyvýjí tým vývojářů přihlášených do vývojářské konference -PostgreSQL. Současným koordinátorem je Marc G. Fournier. (Odpověď 1.6. - -jak se zapojit). Tento tým je zodpovědný za veškerý vývoj PostgreSQL. - -Autory první verze PostgreSQL 1.01 byli Andrew Yu and Jolly Chen. Do -portace, testování, ladění a rozšiřování kódu se zapojilo mnoho dalších -vývojářů . Původni kód Postgresu, ze kterého PostgreSQL vychází, je -výsledkem úsilí mnoha studentů a programátorů pracujících pod vedením -prof. Michaela Stonebrakera na University of California v Berkley. - -Původní název software z Berkley byl Postgres. Po přidání jazyka SQL se -název změnil na Postgres95. Koncem roku 1996 byl RDBMS přejmenován na -PostgreSQL. - -1.2 Jaká je licence na PostgreSQL? ----------------------------------- - -PostgreSQL je předmětem následujících autorských práv: - -Dílčí copyright (c) 1996-2002, PostgreSQL Global Development Group - -Dílčí copyright (c) 1994-6, Regents of the University of California - -Uděluje se oprávnění k užití, rozmnožování, provádění úprav a -rozšiřování tohoto softwaru a dokumentace k němu, pro jakékoli účely, -bez licenčního poplatku a bez písemné licenční smlouvy, za podmínky, že -na všech jeho kopiích je uvedeno oznámení o výše uvedených právech, -jakož i obsah tohoto a dvou následujících odstavců. - -THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ŽÁDNÉM -PŘÍPADĚ ODPOVĚDNA ŽÁDNÉ TŘETÍ OSOBĚ ZA PŘÍMOU, NEPŘÍMOU, ZVLÁŠTNÍ, -NAHODILOU NEBO VýSLEDNOU ŠKODU, VČETNĚ UŠLÉHO ZISKU, ZPůSOBENOU UŽITÍM -TOHOTO SOFTWARU A DOKUMENTACE K NĚMU, A TO I V PŘÍPADĚ, ŽE THE -UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOŽNOSTI VZNIKU TAKOVÉ -ŠKODY. - -THE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO -NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VýROBKU KE SPECIFICKýM -ÚČELůM. NÍŽE UVEDENý SOFTWARE JE POSKYTNUT "JAK STOJÍ A LEŽÍ" A THE -UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO ÚDRŽBU, PODPORU, -AKTUALIZACI, VYLEPŠENÍ NEBO MODIFIKACI. - -Výše uvedené je BSD licence, běžná licence otevřeného zdroje. Není zde -žádné omezení ohledně užití kódu zdroje. Jsme s tím spokojeni a nemáme v -úmyslu na této skutečnosti cokoli měnit. - -1.3 Na kterých Unixex lze spustit PostgreSQL? ---------------------------------------------- - -PostgreSQL běží na všech moderních unixových platformách. V instalačních -instrukcích naleznete aktuální seznam všech platforem na kterých byla -testováním ověřena funkcionalita PostgreSQL. - -1.4 Které ne-unixové platformy jsou podporované? ------------------------------------------------- - -Klient ------- - -Knihovna libpq, psql a některé další moduly byly přeloženy pro MS -Windows. Klienta lze provozovat na MS Windows, ten prostřednictvím -TCP/IP protokolu komunikuje se serverem běžícím na některé z -podporovaných Unixových platforem. K překladu lze použít win32.mak a -Win32 knihovny libpq a psql. K databázi PostgerSQL lze přistupovat skrze -rozhraní ODBC. - -Server ------- - -Server může být na WindowsNT a Win2k provozován pouze s knihovnou -Cygwin, Cygnus Unix/NT porting library. Na nativním portu pro MS Win -NT/2000/XP se pracuje. Existující port pro Novell Netware 6 naleznete na -http://forge.novell.com. - -1.5 Kde mohu získat PostgreSQL? -------------------------------- - -Primárním anonymním ftp serverem pro PostgreSQL je -ftp://ftp.PostgreSQL.org/pub . Seznam zrcadel naleznete na našich -webových stránkách. - -1.6 Kde mohu získat podporu? ----------------------------- - -Hlavním mailová konference je pgsql-general@PostgreSQL.org. Slouží k -diskuzím ohledně PostgreSQL. Přihlásíte se zasláním mailu obsahující -následující řádky v těle dopisu (nikoliv v záhlaví - subjectu) - -subscribe -end - -na adresu mailto:pgsql-general-request@PostgreSQL.org. - -Můžete si vyžádat denní přehled (diggest), který má zhruba 30K denně -zpráv. - -Konference psql-bugs je určena k zasílání zpráv o chybách. Pro -přihlášení pošlete mail se stejným obsahem jako v předchozím případě na -adresu mailto:pgsql-bugs-request@PostgreSQL.org. - -Do vývojářské konference se přihlásíte odesláním dopisu s již zmiňovaným -obsahem na mailto:pgsql-hackers-request@PostgreSQL.org. - -Seznam dalších konferencí naleznete na stránkách PostgreSQL -http://www.postgresql.org - -1.7 Kde je poslední verze? --------------------------- - -Poslední verzí je PostgreSQL 7.4.. Plánujeme uvolnit velkou verzi -každých šest až osm měsíců. - -1.8 Jaká je dostupná dokumentace? ---------------------------------- - -Různé manuály, manuálové stránky a několik malých testovacích příkladů -jsou součásti distribuce. Podívejte se do adresáře /doc. Manuály jsou -přístupné online na http://www.PostgreSQL.org/docs. - -Na adresách http://www.PostgreSQL.org/docs/awbook.html a -http://www.commandprompt.com/ppbook/ naleznezte dvě online knihy o -PostgreSQL. Seznam dostupné literatury je na -http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Soubor -technických článků s tematikou PostgresQL najdete na -http://techdocs.PostgreSQL.org/. - -psql má užitečný metapříkaz \d sloužící k zobrazení informací o typech, -operátorech, funkcí, agregačních funkcí atd. - -Více dokumentace naleznete na našich webových stránkách. - -1.9 Kde najdu seznam známých chyb nebo nepodporovaných vlastností? ------------------------------------------------------------------- - -PostgreSQL podporuje rozšířenou podmnožinu SQL-92. V našem TODO [1] -najdete seznam známých chyb, chybějících vlastností a seznam vlastností, -které budou do systému implementovány v budoucnu (včetně priorit). - -1.10 Jak se mohu naučit SQL? ----------------------------- - -V knize The PostgreSQL book na -http://www.PostgreSQL.org/docs/awbook.html je vysvětlen jazyk SQL (vyšla -česky). Další dostupnou knihou je http://www.commandprompt.com/ppbook. -Kvalitní návody naleznete na -http://www.intermedia.net/support/sql/sqltut.shtm, na -http://www.intermedia.net/support/sql/sqltut.shtm [2] , a na -http://sqlcourse.com. - -Další je Teach Yourself SQL in 21 days, Second Edition na -http://members.tripod.com/er4ebus/sql/index.htm. - -Mnoho uživatelů doporučuje The Practical SQL Handbook, Bowman, Judith -S., et al., Addison-Wesley. Jiní preferují The Complete Reference SQL, -Groff et al., McGraw-Hill. - -1.11 Nemá PostgreSQL problémy s rokem 2000? -------------------------------------------- - -Nemá, můžeme pracovat s datumy po roce 2000 našeho letopočtu i před -rokem 2000 př.n.l. - -1.12 Jak se připojit k vývojářskému týmu? ------------------------------------------ - -Nejdříve si stáhněte nejnovější zdroje a přečtěte si vývojářskou -dokumentaci na našem webu nebo v distribuci. Pak se přihlašte do -konferencí pgsql-hackers a pgsql-patches. Kvalitní záplaty posílejte do -pgsql-patches. - -Právo commit má v cvs archivu asi třinácti lidí. Každý z nich poslal -mnoho kvalitních záplat, takže tehdejší commiters měli jistotu, že budou -předkládat jenom kvalitní záplaty a mohli jim předělit větší práva. - -1.13 Kam podat report o chybě? ------------------------------- - -Navštivte naši PostgreSQL BugTool stránku na -http://www.PostgreSQL.org/bugs/bugs.php, která obsahuje návod a směrnice -jak podat chybový report. - -Ověřte si na našem ftp serveru ftp://ftp.PostgreSQL.org/pub, zda-li máte -nejnovější verzi PostgreSQL a zda-li k ní neexistují nějaké záplaty. - -1.14 Jak je na tom PostgreSQL v porovnání s jinými databázemi? --------------------------------------------------------------- - -Existuje několik hledisek jak porovnávat software: vlastnosti, výkon, -spolehlivost, podpora a cena. - -Vlastnosti ----------- - -PostgreSQL má hodně společných vlastností s velkými komerčními DBMS, -např. transakce, vnořené dotazy, spouště, pohledy, kontrolu referenční -integrity a sofistikované zamykání. Podporuje některé vlastnosti, které -tyto systémy nemají, uživatelem definované typy, dědičnost, pravidla, -MVCC redukující zamykání. - -Výkon ------ - -Výkonnostně je na tom PostgreSQL podobně jako další komerční ale i open -source databáze, v něčem je rychlejší, jindy pomalejší. V porovnání s -MySQL a podobnými databázovými systémy je PostgreSQL rychlejší při -víceuživatelském přístupu, složitějších dotazech a zatížení read/write -dotazy. MySQL je rychlejší v jednodušších dotazech s malým počtem -uživatelů. Navíc, MySQL nepodporuje mnohé vlatnosti zmíněné v sekci -vlastnosti. Zapracovali jsme na spolehlivosti a podporovaných -vlastnostech, a výkon zvyšujeme v každé verzi. Zajímavou stránku -porovnávající PostgreSQL a MySQL naleznete na -http://openacs.org/philosophy/why-not-mysql.html. Za vývojem MySQL není -Open Source komunita, ale komerční společnost, přestože svoje produkty -distribuuje jako Open Source. - -Spolehlivost ------------- - -Jsme si vědomi, že databáze musí být spolehlivá, jinak je nepoužitelná. -Snažíme se zveřejňovat dobře otestovaný, stabilní kód s minimem chyb. -Každá verze je více než měsíc v beta testování, a naše historie verzí -ukazuje, že můžeme nabídnout stabilní, solidní verze, které jsou -připraveny pro reálné nasazení. V této oblasti jsme srovnatelní s -dalšími databázemi. - -Podpora -------- - -Na naší mailové konferenci můžete kontaktovat velkou skupinu vývojářů a -uživatelů.problémů. Nemůžeme garantovat opravu, nicméně komerční -databáze také ne vždy nabídnou opravu. Podle ohlasů je naše podpora -hodnocena lépe než u jiných DBMS a to díky přímému kontaktu s vývojáři, -velkou komunitou uživatelů, kvalitními manuály a přístupným zdrojovým -kódem. Pro uživatele, kteří vyžadují podporu ke konkrétním případům, -existuje placená podpora (FAQ sekce 1.6). - -Cena ----- - -PosgreSQL lze volně používat pro nekomerční i komerční použití. Můžete -do svých produktů přidat náš kód bez omezení, respektive v souladu s -podmínkami naší licenční smlouvy (v duchu BSD licence). - -1.15 Jak lze finančně pomoci PostgreSQL? ----------------------------------------- - -PosgreSQL má prvotřídní infrastrukturu od našeho začátku v roce 1996. -Vděčíme za to Marku Fournierovi, který založil a spravoval tuto -infrastrukturu několik let. - -Kvalitní infrastruktura je velice důležitá pro každý open source -projekt. Předchází nedorozuměním, která velice zdržují pokrok v -projektu. - -Tato infrastruktura není laciná. K jejímu zajištění je třeba stále -hradit určité měsíční a jednorázové částky. Pokud máte Vy nebo Vaše -společnost peníze, které nám můžete darovat, obraťe se na -http://store.pgsql.com/shopping/ a darujte je. - -Ačkoliv webová stránka zmiňuje PostgreSQL, Inc. vklady jsou určeny pouze -k podpoře projektu PostgreSQL a nepodporují žádnou existující -společnost. Pokud to vyžadujete, můžete poslat kontrolu na naši -kontaktní adresu. - -Pokud máte příklad úspěšného nasazení PostgreSQL, přihlaště se na náš -advocacy site na http://advocacy.postgresql.org. - ------------------------------------------------------------------------- - -User client dotazy -================== - -2.1 Kde naleznu ODBC ovladače pro PostgreSQL? ---------------------------------------------- - -Pro PostgreSQL existují dva ODBC ovladače - PsqlODBC a OpenLink ODBC. - -PsqlODBC je ke stažení na -http://gborg.postgresql.org/project/psqlodbc/projdisplay.php. - -OpenLink můžete získat na http://www.openlinksw.com. Spolupracuje s -jejich klientským programovým vybavením a je dostupný pro všechny jimi -podporované platformy (Win, Mac, Unix, VMS). - -Tento ovladač je určen pro ty, kteří vyžadují podporu komerční kvality, -nicméně freeware verze je dostupná a funkční. Dotazy zasílejte na -postgres95@openlink.co.uk. - -2.2 Jaké nástroje lze použít pro PostgreSQL a web? --------------------------------------------------- - -Pěkný úvod do databázových technologií zabezpečujících chod webových -stránek najdete na http://www.webreview.com. - -Pro tvorbu webu existuje excelentní rozhraní PHP, které naleznete na -http://www.php.net. - -Pro složitější případy se často používá Perl a CGI.pm nebo mod_perl. - -2.3 Existuje grafické rozhraní pro PostgreSQL? ----------------------------------------------- - -Pro PostgreSQL existuje několik grafických rozhraní: PgAccess -(http://www.php.net), PgAdmin (http://www.php.net), RHDB Admin -(http://sources.redhat.com/rhdb/) a Rekall ( -http://www.thekompany.com/products/rekall/). Dále existuje PHPPgAdmin -(http://phppgadmin.sourceforge.net/) rozhraní PostgreSQL založené na web -technologii. - -Úplnější seznam najdete na -http://techdocs.postgresql.org/guides/GUITools. - -2.4 Které programovací jazyky mají podporu pro PostgreSQL? ----------------------------------------------------------- - -Většina programovacích jazyků obsahuje rozhraní pro PostgreSQL. -Podívejte se do rozšiřujících modulů Vašeho programovacího jazyka. - -Distribuce PostgreSQL obsahuje tato rozhraní: - - - C (libpq) - - Embbedded C (ecpg) - - Java (jdbc) - - Python (PyGreSQL) - - TCL (libpgtcl) - -Další rozhraní jsou dostupná na http://gborg.postgresql.org v sekci -Drivers/Interfaces. - ------------------------------------------------------------------------- - -Administrativní dotazy -====================== - -3.1 Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql? --------------------------------------------------------------- - -Použijte volbu --prefix při spuštění configure - -3.2 Při startu postmaster, dostanu chybové hlášení Bad System Call nebo core dump. Proč? ----------------------------------------------------------------------------------------- - -Důvody mohou být různé, ale nejprve zkontrolujte, zda Váš systém -podporuje System V extensions. PostgreSQL vyžaduje v jádře podporu -sdílené paměti a semaforů. - -3.3 Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. Proč? -------------------------------------------------------------------------- - -Buďto nemáte správně nakonfigurovanou sdílenou paměť v jádře nebo musite -zvětšit její velikost. Potřebná velikost je závislá na architektuře a na -tom, kolik paměťových bufferů a backendů máte povoleno pro postmastera. -Pro většinu systémů s předdefinovaným počtem backendů a paměťových -bufferů je minimum zhruba 1MB. V -http://www.postgresql.org/docs/view.php?version=current&idoc=1&file=kern -el-resources.html [3] naleznete podrobnější informace o sdílené paměti a -semaforech. - -3.4 Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate. Proč? ----------------------------------------------------------------------------- - -Pokud dostane chybovou zprávu IpcSemaphoreCreate: semget failed (No -space left on device), pak vaše jádro nemá dost volných semaforů. -PostgreSQL vyžaduje jeden semafor pro každý backend v pozadí. Dočasným -řešením je start postmastera s limitem backendů. Použijte přepínač -N s -hodnotou menší než 32. Úplným řešením je zvýšení hodnot SEMMNS a SEMMNI -jadra. - -Nefunkční semafory mohou způsobit pád během intenzivních databázových -operací. - -Pokud se tato chyba vyskytuje ještě někde jinde, možná nemáte vůbec -nakonfigurovány semafory ve vašem jádře. V PostgreSQL Administrator's -Guide najdete podrobnější popis požadavků na sdílenou pamět a semafory. - -3.5 Jak povolit nebo zakázat přístup z jiných stanic? ------------------------------------------------------ - -Při výchozím nastavení PostgreSQL odepře přístup z jiných stanic než -lokální s použitím UDP. Databáze se zpřístupní jiným stanicím nastavením -přepínače -i postmastera a povolením stanice a určením režimu -autentifikace v $PGDATA/pg_hba.conf. Tím se povolí TCP/IP spojení. -ZASTARALÉ - -3.6 Jak ladit databázový stroj na lepší výkon? ----------------------------------------------- - -Určitě pomohou indexy. Příkaz EXPLAIN zobrazí způsob interpretace Vašeho -dotazu a použití indexů. - -Při větší dávce INSERTů uvažujte o náhradě příkazem COPY. Ten je mnohem -rychlejší nežli samotný INSERT. Každý příkaz mimo blok BEGIN WORK/COMMIT -se provádí ve vlastní transakci. Zvažte, zda-li by se nedalo několik -příkazů spojit do jedné transakce. Tím se sníží režie na transakce. Před -provedením rozsáhlých změn zrušte indexy, které po dokončení změn opět -vytvořte. - -Máte několik dalších možností, jak zlepšit výkon. Můžete zakázat fsyn() -při startu postmastera přepínači -o -F. Tyto přepínače zabrání fsync(), -tj. zápisu na disk po každé transakci. - -Můžete zvýšit velikost paměťových bufferů použitých backendy tj. -parametr -B postmasteru. Pokud ale tato hodnota bude příliš velká, tak -možná nespustíte postmastera jelikož dosáhnete limitu sdílené paměti. -Každý buffer má 8K a implicitně je 64 bufferů. - -Dále můžete použít přepínač -S k zvýšení limitu paměti pro backendy na -dočasné třídění. Hodnota je míněna v kilobytech a výchozí nastavení je -512, tj. 512K. - -Můžete použít příkaz CLUSTER, který uspořádá fyzicky data v tabulkách -podle indexu. Více na manuálových stránkách příkazu CLUSTER. - -3.7 Jaké jsou možnosti ladění? ------------------------------- - -Máte několik možností jak se dostat k užitečným stavovým informacím. - -Zaprvé, při překladu použijte přepínač --enable-cassert, tím se zapne -monitorování a následné zastavení aplikace, když se proces v backendu -dostane do neočekávaného stavu. - -Jak postmaster tak postgres má několik přepínačů umožňujících ladění. -Postmaster nastartujte tak, abyste si byli jisti, že je standartní -výstup a standartní chybový výstup přesměrován do souboru logu, -například: - -cd /usr/local/pgsql -./bin/postmaster > server.log 2>&1 & - -Tím se vytvoří log v adresáři PostgreSQL, Tento soubor obsahuje užitečné -informace o problémech a chybách vyskytlých se na serveru. Postmaster má -přepínač -d určující, jak podrobné mají být reportované informace, tj. -debug level. Pozor, při velké hodnotě debug levelu rychle roste velikost -souboru logu. - -Pokud neběží postmaster, můžete spustit backend PostgreSQL z příkazové -řádky a napsat svůj SQL dotaz přímo v backendu (doporučeno pouze pro -ladění). Dotaz je v tomto případě ukončen novou řádkou, nikoliv -středníkem. Pokud máte aplikaci přeloženou s ladícími symboly, můžete -použít debbuger k monitorování procesu. Pokud není backend spuštěn -postmasterem, pak neběží ve svém obvyklém prostředí a tudíž některé -problémy dané interakcí mezi backendy nemohou být nasimulovány. - -Pokud běží postmaster, spusťe psql v jednom okně a pak si zjistěte PID -procesu postgres použitého psql. V debuggeru sepřipojte k postgresql -PID. Pak nastavte breakpointy v debuggeru a zadejte dotaz v psql. Pokud -ladíte startup postgresu, pak nastavte PGOPTIONS="-W n" a spusťe psql. -Tento přepínač způsobí pauzu n sekund, takže budete mít čas se připojit -k procesu, a nastavit breakpointy a pokračovat v startup posloupnosti. - -Pro ladění a měření výkonu mohou být užitečné přepínače -s, -A a -t -programu postgres (backend). - -Můžete provést překlad s profilací, tak abyste viděli kolik času -zabírají jednotlivé funkce. Soubory s profily backendů jsou uloženy v -adresáři pgsql/data/base/dbname. Profil klienta pak v jeho aktuálním -adresáři. Korektní profilace v prostředí Linux požaduje konfiguraci -systému s parametrem -DLINUX_PROFILE. - -3.8 Proč dostanu "Sorry, too many clients", když se zkouším připojit? ---------------------------------------------------------------------- - -Zvyšte limit postmastera na maximální počet současně spuštěných -backendů. - -Výchozí hodnota je 32 backendů. Tuto hodnotu zvýšíte zastavením a -opětovným spuštěním postmastera s parametrem -N nebo úpravou -postgresql.conf. - -Při zvýšení hodnoty -N nad 32 musíte zvýšit hodnotu -B nad výchozí 64, --B musí být minimálně dvakrát větší, nebo ještě lépe více. Pravděpodobně -zjistíte, že pro velký počet procesů backendu je nutné zvýšit některé -parametry jádra. Jsou to především maximální velikost sdílené paměti -SHMMAX, maximální počet semafórů SEMMNS a SEMMNI, maximální počet -procesů NPROC, maximální počet procesů uživatele MAXUPRC a maximální -počet otevřených souborů NFILE a NINODE. Důvod pro omezení maximálního -počtu backendů je fakt, že by mohlo dojít k vyčerpání zdrojů Vašeho -systému. - -3.9 K čemu slouží adresář pgsql_tmp? ------------------------------------- - -Tento adresář obsahuje dočasné soubory vytvořené exekutorem dotazů. -Například, když je nutné třídění k zajištění ORDER BY a třídění má větší -nároky na prostor než povoluje parametr -S backendu, pak je vytvořen -dočasný soubor k uložení extra údajů. - -Dočasné soubory jsou obvykle mazány automaticky, ale může se stát, že -během třídění server spadne. Zastavení a další start postmastera zajistí -odstranění souborů s těchto adresářů. - -3.10 Proč je požadováno dump a obnovení (load) databáze během upgrade mezi velkými verzemi PostgreSQL? ------------------------------------------------------------------------------------------------------- - -PostgreSQL se minimálně mění během malých verzí, takže např. při upgrade -z 7.2 na 7.2.1 není nutné dump a load databáze. Ale velké verze často -mění interní formát systémových tabulek a datových souborů. Tyto změny -jsou natolik rozsáhlé, že nelze zajistit zpětnou kompatibilitu pro -datové soubory. Dump uloží data v obecném formátu, takže mohou být -načtena a používána v novém interním formátu. - ------------------------------------------------------------------------- - -Provozní dotazy -=============== - -4.1 Čím se liší binární a normální kurzor? ------------------------------------------- - -Popis najdete v manuálové stránce DECLARE - -4.2 Jak získat pouze první řádek dotazu? Náhodný řádek? -------------------------------------------------------- - -Podívejte se do man. stránky příkazu FETCH, nebo použijte SELECT ... -LIMIT ... - -Není nutné zpracovávat celý dotaz, když potřebujete pouze několik -prvních řádků. Pokud existuje index ORDER BY, PostgreSQL je schopen -přerušit zpracování dotazu po získání požadovaného počtu řádků. - -K získání náhodného řádku použijte: - -SELECT col FROM tab - ORDER BY random() LIMIT 1; - -4.3 Jak získám seznam tabulek nebo jinak jak jej získá psql? ------------------------------------------------------------- - -Podívejte se do zdrojových kódů psql do souboru -pgsql/src/bin/psql/describe.c. Ten obsahuje SQL příkazy, které se -používají v psql metapříkazech. Dále můžete spustit psql s přepínačem --E, který způsobí zobrazení každého dotazu, které zpracování metapříkazu -vyvolá. - -4.4 Jak odstraním sloupec tabulky, jak změním jeho typ? -------------------------------------------------------- - -Počínaje verzí 7.3 můžete použít příkaz ALTER TABLE DROP COLUMN. Ve -starších verzích můžete použít následující postup: - -BEGIN; -LOCK TABLE old_table; -SELECT ... -- mimo sloupec, který chceme odstranit - INTO TABLE new_table; -DROP TABLE old_table; -ALTER TABLE new_table RENAME TO old_table; -COMMIT; - -Pro změnu typu sloupce je třeba provést: - -BEGIN; -ALTER TABLE tab ADD COLUMN new_col new_data_type; -UPDATE tab SET new_col = CAST(old_col AS new_data_type; -ALTER TABLE tab DROP COLUMN old_col; -COMMIT; - -Poté proveďte VACUUM FULL tab - uvolníte tím diskový prostor zabraný -nyní již neplatnými řádky. - -4.5 Jaká je maximální velikost řádku, tabulky a databáze? ---------------------------------------------------------- - -PostgreSQL má tato omezení: - - Maximální velikost databáze: neomezena (existují 32TB db) - - Maximálné velikost tabulky: 32 TB - - Maximální velikost řádky: 1.6 TB - - Maximální velikost položky 1 GB - - Maximální počet řádků v tabulce: neomezeno - - Maximální počet sloupců v tabulce: 250-1600 podle typů - - Maximální počet indexů na tabulce: neomezeno - -Ve skutečnosti nic není neomezeno, limitem bývá vždy dostupná disková -paměť nebo velikost operační paměti. Pokud máte některou z těchto hodnot -neobvykle velkou, může dojít ke snížení výkonu. - -Maximální velikost tabulky je 32 TB a nevyžaduje podporu velkých souborů -operačním systémem. Velké tabulky se ukládají do několika 1 GB souborů -takže limity souborového systému nejsou podstatné. - -Maximální velikost tabulky a maximální počet sloupců můžeme -zečtyřnásobit nastavením velikosti bloku na 32K. - -4.6 Kolik diskového prostoru je potřeba k uložení dat z normálního textového souboru? -------------------------------------------------------------------------------------- - -PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z -textového souboru. - -Například, uvažujme soubor se 100 tisíci řádky obsahující na každé řádce -celé číslo a textový popis. Text je v průměru dvacet bytů dlouhý. -Textový soubor bude 2.8 MB dlouhý. Velikost databáze obsahující -odpovídající data bude zhruba 6.4 MB. - - 36 bytů: hlavička řádku (přibližně) - 24 bytů: jedna celočíselná položka a jedna textová - 4 byty: ukazatel na stránku k ntici ------------------------------------------------------- - 64 bytů na řádek - -Velikost datové stránky PostgreSQL je 8KB - - 8192 bytů na stránce ----------------------- = 128 řádek na stránku - 64 bytů za řádek - -100000 řádek --------------------- = 782 stránek (zaokrouhleno nahoru) -128 řádek na stránce - -782 * 8192 = 6, 406, 144 bytů (6.4 MB) - -Indexy nemají tak velkou režii, ale mohou být také velké, protože -obsahují indexovaná data. - -Hodnoty NULL jsou uloženy v bitmapách, takže spotřebují jen velmi málo -diskového prostoru. - -4.7 Jak získám seznam vytvořených tabulek, indexů, databází? ------------------------------------------------------------- - -psql má sadu metapříkazů k zobrazení těchto informací. Jejich seznam -získáte příkazem \?. Dále se můžete podívat na obsah systémových tabulek -začínajících pg_. Spuštění psql s parametrem -l provede výpis názvů -všech databází. - -Soubor pgsql/src/tutorial/syscat.source obsahuje SELECTy přistupující k -systémovým tabulkámm. - -4.8 Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč? ------------------------------------------------------------ - -Každý dotaz nemusí nutně použít existující indexy. Index se použije -tehdy, když je tabulka větší než určitá minimální velikost, a dotaz -vybírá pouze procentuálně malou část řádků tabulky. To proto, že náhodný -přístup k disku daný čtením indexu může být pomalejší než lineární čtení -tabulky nebo sekvenční čtení, - -PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k -tabulce. Tyto statistiky se shromažďují příkazy VACUUM ANALYZE nebo -ANALYZE. Díky statistikám má optimizer informaci o počtu řádek v tabulce -a může lépe rozhodnout o použití indexů. Statistiky se uplatní při -určení optimálního pořadí a metody spojení tabulek. Statistiky by se -měli aktualizovat opakovaně, tak jak se mění obsah tabulek. - -Indexy nejsou obyčejně použity pro setřídění nebo spojení tabulek. -Sekvenční zpracování následované explicitním tříděním je obyčejně -rychlejší než indexní čtení na velké tabulce. - -Jinak je tomu v případě použití LIMIT a ORDER BY, při kterém se většinou -index použije, výsledkem je pouze malá část tabulky. Funkce MAX() a -MIN() nepoužívají indexy, ale je možné tutéž hodnotu získat - -SELECT col FROM tab - ORDER BY col [ DESC ] LIMIT 1; - -Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání -tabulky, použijte příkaz SET enable_seqscan TO 'off' a zkuste zda je -indexní prohledávání rychlejší. - -Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se -indexy použíjí pouze za určitých skutečností: - - - začátek hledaného vzoru musí být ukotven k začátku, tj. - - * vzor LIKE nesmí začínat % - * regulární výraz musí začínat ^ - - - vzor nesmí začínat intervalem, např. [a-e] - - - vyhledávaní, které není Case sensitiv nepoužívá indexy. - Můžete ale použít funkcionální indexy, které jsou posány v sekci - 4.12 - - při inicializaci databáze (initdb) musí být použito C locale - (pozn. překladatele - tudíž v našich podmínkách nepoužitelné, - nepracovalo by české třídění). - -4.9 Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz? ------------------------------------------------------------- - -Podívejte se do manuálové stránky příkazu EXPLAIN. - -4.10 Co to je R-tree index? ---------------------------- - -R-tree index se používá pro indexování prostorových dat. Hash index -nemůže obsloužit prohledávání oblastí. B-tree index může řídit vyhledání -oblastí v jedné dimenzi. R-tree index může podporovat hledání v -multidimenzionálních datech. Použijeme-li například R-tree index na -atributy typu point, pak systém může efektivně odpovědět na dotaz - -vyber všechny body uvnitř obdélníků. - -Původní návrh R-tree je Guttman, A. "R-trees: A Dynamic Index Structure -for Spatial Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on -Mgmt of Data, 45-57 - -Tyto materiály naleznete v Stonebraker's "Readings in Database Systems". - -Vestavěné R-tree může sloužit k indexaci polygonů a oblastí. Teoreticky -můžeme R-tree použít i pro více dimenzí (jiné než 3D). Ve skutečnosti -ale takové rozšíření R-tree vyžaduje trochu práce a ve součastnosti -chybí dokumentace jak na to. - -4.11 Co je Genetic Query Optimizer? ------------------------------------ - -GEQO modul urychluje optimalizaci dotazů při spojování množství tabulek -metodou Genetických algoritmů (GA). To umožňuje získat velkého množství -variant spojení při neúplném prohledáváním. - -4.12 Jak provést vyhledávání regulárního výrazu case sensitiv, -insensitiv? Jak použít index pro case insensitive vyhledávání? - -Operátor ~ slouží k porování s regulárním výrazem, jeho modifikace *~ -představuje case insensitive vyhledávání. Jedná se o obdobu LIKE a -ILIKE. - -Pro vyhledávání bez ohledu na velká malá písmena použijeme - -SELECT * FROM tab - WHERE lower(col) = 'abc'; - -V tomto případě se nepoužije standardní index. Nicméně, použije se -funkcionální index, pokud jej vytvoříte - -CREATE INDEX tabindex ON tab (lower(col)); - -4.13 Jak v dotazu detekovat, že položka je NULL? ------------------------------------------------- - -Určíte pomocí IS NULL nebo IS NOT NULL - -4.14 Jaké jsou rozdíly mezi různými znakovými typy? ---------------------------------------------------- + Často kladené dotazy (FAQ) PostgreSQL + + Poslední aktualizace: Středa 23. června 21:10:00 EST 2004 + + Současný správce: Bruce Momjian (pgman@candle.pha.pa.us) + + Přeložil: Pavel Stěhule (stehule@kix.fsv.cvut.cz) + + Aktuální verzi tohoto dokumentu naleznete na adrese: + http://www.PostgreSQL.org/docs/faqs/FAQ.html. Český překlad na adrese: + http://www.PostgreSQL.org/docs/faqs/FAQ_czech.html. + + Odpovědi na dotazy relevantní ke konkrétním platformám lze nalézt na + adrese: http://www.PostgreSQL.org/docs/index.html. + _________________________________________________________________ + + Obecné otázky + + 1.1) Co je PostgreSQL? Jak se vyslovuje? + 1.2) Jaká je licence na PostgreSQL? + 1.3) Na kterých Unixex lze spustit PostgreSQL? + 1.4) Které ne-unixové platformy jsou podporované? + 1.5) Kde mohu získat PostgreSQL? + 1.6) Kde mohu získat podporu? + 1.7) Kde je poslední verze? + 1.8) Jaká je dostupná dokumentace? + 1.9) Kde najdu seznam známých chyb nebo nepodporovaných vlastností? + 1.10) Jak se mohu naučit SQL? + 1.11) Nemá PostgreSQL problémy s rokem 2000? + 1.12) Jak se připojit k vývojářskému týmu? + 1.13) Kam podat report o chybě? + 1.14) Jak je na tom PostgreSQL v porovnání s jinými databázemi? + 1.15) Jak lze finančně pomoci PostgreSQL? + + User client dotazy + + 2.1) Kde naleznu ODBC ovladače pro PostgreSQL? + 2.2) Jaké nástroje lze použít pro PostgreSQL a web? + 2.3) Existuje grafické rozhraní pro PostgreSQL? + 2.4) Které programovací jazyky mají podporu pro PostgreSQL? + + Administrativní dotazy + + 3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql? + 3.2) Při startu postmaster, dostanu chybové hlášení Bad System Call + nebo core dump. Proč? + 3.3) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. + Proč? + 3.4) Při startu postmastera dostanu hlášení o chybě + IpcSemaphoreCreate. Proč? + 3.5) Jak povolit nebo zakázat přístup z jiných stanic? + 3.6) Jak ladit databázový stroj na lepší výkon? + 3.7) Jaké jsou možnosti ladění? + 3.8) Proč dostanu "Sorry, too many clients", když se zkouším připojit? + 3.9) K čemu slouží adresář pgsql_tmp? + 3.10) Proč je požadováno dump a obnovení (load) databáze během upgrade + mezi velkými verzemi PostgreSQL? + + Provozní dotazy + + 4.1) Čím se liší binární a normální kurzor? + 4.2) Jak získat pouze první řádek dotazu? Náhodný řádek? + 4.3) Jak získám seznam tabulek nebo jinak jak jej získá psql? + 4.4) Jak odstraním sloupec tabulky, jak změním jeho typ? + 4.5) Jaká je maximální velikost řádku, tabulky a databáze? + 4.6) Kolik diskového prostoru je potřeba k uložení dat z normálního + textového souboru? + 4.7) Jak získám seznam vytvořených tabulek, indexů, databází? + 4.8) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč? + 4.9) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz? + 4.10) Co to je R-tree index? + 4.11) Co je Genetic Query Optimizer? + 4.12) Jak provést vyhledávání regulárního výrazu case sensitiv, + insensitiv? Jak použít index pro case insensitive vyhledávání? + 4.13) Jak v dotazu detekovat, že položka je NULL? + 4.14) Jaké jsou rozdíly mezi různými znakovými typy? + 4.15.1) Jak vytvořit serial/auto-increment pole? + 4.15.2) Jak získat hodnotu SERIAL po vložení řádku? + 4.15.3) Nepovede currval() a nextval() k rozhození podmínek při + souběhu s jinými uživateli? + 4.15.4) Proč není vygenerované číslo použito při přerušení transakce? + Proč vznikají díry v číslování vlastní sekvencí/SERIAL sloupce? + 4.16) Co to je OID? Co je to TID? + 4.17) Jaký je význam některých výrazů použitých v PostgreSQL? + 4.18) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in + AllocSetAlloc()"? + 4.19) Jak se dozvím, kterou verzi PostgreSQL používám? + 4.20) Proč operace s velkými objekty končí "invalid large obj + descriptor"? + 4.21) Jak vytvořit sloupec obsahující implicitně aktuální datum? + 4.22) Proč jsou moje vnořené dotazy používající IN tak pomalé? + 4.23) Jak provést vnější spojení (outer join)? + 4.24) Jak provést dotaz napříč několika databázemi? + 4.25) Může funkce vrátit více řádků nebo sloupců? + 4.26) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v + PL/pgSQL funkcích? + 4.27) Jaké jsou možnosti replikace databází? + 4.28) Jaké jsou možnosti šifrování databází? + + Rozšiřování PostgreSQL + + 5.1) Napsal jsem UDF funkci, PostgreSQL však končí dump core? + 5.2) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do + PostgreSQL? + 5.3) Jak napsat funkci v C vracející ntici? + 5.4) Modifikoval jsem zdrojové soubory. Tato změna nebyla při + rekompilaci vzata v potaz. Proč? + _________________________________________________________________ + + Obecné otázky + + 1.1) Co je PostgreSQL? Jak se vyslovuje? + + PostgreSQL se vyslovuje Post-Gres-Q-L. Zvukový záznam je dostupný na + adrese . + + PostgreSQL vychází z databáze POSTGRES (a stále je někdy označován + zjednodušeně jako Postgres) - výzkumného prototypu DBMS nové generace. + Z postgresu byl převzat silný datový model a bohatý soubor datových + typů a jeho dotazovací jazyk PostQuel byl nahrazen rozšířenou + podmnožinou jazyka SQL. PostgreSQL lze používat bez omezení a jeho + zdrojové kódy jsou volně k dispozici. + + PostgreSQL vyvýjí tým vývojářů přihlášených do vývojářské konference + PostgreSQL. Současným koordinátorem je Marc G. Fournier + (scrappy@PostgreSQL.org). (viz 1.6 - jak se zapojit). Tento tým je + zodpovědný za veškerý vývoj PostgreSQL. Jedná se o veřejný projekt, + který není řízen žádnou firmou. Pokud se chcete zapojit, přečtěte si + developer's FAQ na adrese + http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html + + Autory první verze PostgreSQL 1.01 byli Andrew Yu and Jolly Chen. Do + portace, testování, ladění a rozšiřování kódu se zapojilo mnoho + dalších vývojářů . Původni kód Postgresu, ze kterého PostgreSQL + vychází, je výsledkem úsilí mnoha studentů a programátorů pracujících + pod vedením prof. Michaela Stonebrakera na University of California v + Berkley. + + Původní název software z Berkley byl Postgres. Po přidání jazyka SQL + se název změnil na Postgres95. Koncem roku 1996 byl RDBMS přejmenován + na PostgreSQL. + + 1.2) Jaká je licence na PostgreSQL? + + PostgreSQL je předmětem následujících autorských práv: + + Dílčí Copyright (c) 1996-2005, PostgreSQL Global Development Group + Dílčí Copyright (c) 1994-6, Regents of the University of California + + Uděluje se oprávnění k užití, rozmnožování, provádění úprav a + rozšiřování tohoto softwaru a dokumentace k němu, pro jakékoli účely, + bez licenčního poplatku a bez písemné licenční smlouvy, za podmínky, + že na všech jeho kopiích je uvedeno oznámení o výše uvedených právech, + jakož i obsah tohoto a dvou následujících odstavců. + + THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ŽÁDNÉM + PŘÍPADĚ ODPOVĚDNA ŽÁDNÉ TŘETÍ OSOBĚ ZA PŘÍMOU, NEPŘÍMOU, ZVLÁŠTNÍ, + NAHODILOU NEBO VÝSLEDNOU ŠKODU, VČETNĚ UŠLÉHO ZISKU, ZPůSOBENOU UŽITÍM + TOHOTO SOFTWARU A DOKUMENTACE K NĚMU, A TO I V PŘÍPADĚ, ŽE THE + UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOŽNOSTI VZNIKU TAKOVÉ + ŠKODY. + + HE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO + NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VýROBKU KE + SPECIFICKýM ÚČELůM. NÍŽE UVEDENý SOFTWARE JE POSKYTNUT "JAK STOJÍ A + LEŽÍ" A THE UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO + ÚDRŽBU, PODPORU, AKTUALIZACI, VYLEPŠENÍ NEBO MODIFIKACI. + + Výše uvedené je BSD licence, běžná licence otevřeného zdroje. Není zde + žádné omezení ohledně užití kódu zdroje. Jsme s tím spokojeni a nemáme + v úmyslu na této skutečnosti cokoli měnit. + + 1.3) Na kterých Unixex lze spustit PostgreSQL? + + PostgreSQL běží na všech moderních unixových platformách. V + instalačních instrukcích naleznete aktuální seznam všech platforem na + kterých byla testováním ověřena funkcionalita PostgreSQL. + + 1.4) Které ne-unixové platformy jsou podporované? + + Klient + + Knihovna libpq, psql a některé další moduly byly přeloženy pro MS + Windows. Klienta lze provozovat na MS Windows, ten prostřednictvím + TCP/IP protokolu komunikuje se serverem běžícím na některé z + podporovaných Unixových platforem. K překladu lze použít win32.mak a + Win32 knihovny libpq a psql. K databázi PostgerSQL lze přistupovat + skrze rozhraní ODBC. + + Server + + Server může být na WindowsNT a Win2k provozován pouze s knihovnou + Cygwin, Cygnus Unix/NT porting library. Více pgsql/doc/FAQ_MSWIN v + distribuci nebo MS Windows FAQ na adrese + http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN. + + Na nativním portu pro MS Win NT/2000/XP se pracuje. Další informace o + aktuálním stavu PostgreSQL pro Windows naleznet na adrese + http://techdocs.postgresql.org/guides/Windows a + http://momjian.postgresql.org/main/writings/pgsql/win32.html. + + Existující port pro Novell Netware 6 naleznete na + http://forge.novell.com. + + 1.5) Kde mohu získat PostgreSQL? + + Primárním anonymním ftp serverem pro PostgreSQL je + ftp://ftp.PostgreSQL.org/pub. Seznam zrcadel naleznete na našich + webových stránkách. + + 1.6) Kde mohu získat podporu? + + Hlavní mailová konference je: pgsql-general@PostgreSQL.org. Slouží k + diskuzím ohledně PostgreSQL. Přihlásíte se zasláním mailu obsahující + následující řádky v těle dopisu (nikoliv v záhlaví - subjectu): + subscribe + end + + na adresu pgsql-general-request@PostgreSQL.org. + + Můžete si vyžádat denní přehled (diggest), který má zhruba 30K denně + zpráv. + + Konference psql-bugs je určena k zasílání zpráv o chybách. Pro + přihlášení pošlete mail se stejným obsahem jako v předchozím případě + na adresu pgsql-bugs-request@PostgreSQL.org. + + Do vývojářské konference se přihlásíte odesláním dopisu s již + zmiňovaným obsahem na mailto:pgsql-hackers-request@PostgreSQL.org. + + Seznam dalších konferencí naleznete na stránkách PostgreSQL: + + http://www.postgresql.org + + 1.7) Jaká je poslední verze? + + Poslední verze PostgreSQL je 7.4.3. Plánujeme uvolnit významnou verzi + každých šest až osm měsíců. + + 1.8) Jaká je dostupná dokumentace? + + Různé manuály, manuálové stránky a několik malých testovacích příkladů + jsou součásti distribuce. Podívejte se do adresáře /doc. Manuály jsou + přístupné online na http://www.PostgreSQL.org/docs. + + Na adresách http://www.PostgreSQL.org/docs/awbook.html a + http://www.commandprompt.com/ppbook/ naleznezte dvě online knihy o + PostgreSQL. Seznam dostupné literatury je na + http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Soubor + technických článků s tematikou PostgresQL najdete na + http://techdocs.PostgreSQL.org/. + + psql má užitečný metapříkaz \d sloužící k zobrazení informací o + typech, operátorech, funkcí, agregačních funkcí atd. + + Více dokumentace naleznete na našich webových stránkách. + + 1.9) Kde najdu seznam známých chyb nebo nepodporovaných vlastností? + + PostgreSQL podporuje rozšířenou podmnožinu SQL-92. V našem TODO + najdete seznam známých chyb, chybějících vlastností a seznam + vlastností, které budou do systému implementovány v budoucnu (včetně + priorit). + + 1.10) Jak se mohu naučit SQL? + + V knize The PostgreSQL book na + http://www.PostgreSQL.org/docs/awbook.html je vysvětlen jazyk SQL + (vyšla česky). Další dostupnou knihou je + http://www.commandprompt.com/ppbook. Kvalitní návody naleznete na + http://www.intermedia.net/support/sql/sqltut.shtm, a na + http://sqlcourse.com. + + Další je Teach Yourself SQL in 21 days, Second Edition na + http://members.tripod.com/er4ebus/sql/index.htm. + + Mnoho uživatelů doporučuje The Practical SQL Handbook, Bowman, Judith + S., et al., Addison-Wesley. Jiní preferují The Complete Reference SQL, + Groff et al., McGraw-Hill. + + 1.11) Nemá PostgreSQL problémy s rokem 2000? + + Nemá, můžeme pracovat s datumy po roce 2000 našeho letopočtu i před + rokem 2000 př.n.l. + + 1.12) Jak se připojit k vývojářskému týmu? + + Nejdříve si stáhněte nejnovější zdroje a přečtěte si vývojářskou + dokumentaci na našem webu nebo v distribuci. Pak se přihlašte do + konferencí pgsql-hackers a pgsql-patches. Kvalitní záplaty posílejte + do pgsql-patches. + + Právo commit má v CVS archivu asi třinácti lidí. Každý z nich poslal + mnoho kvalitních záplat, takže tehdejší commiters měli jistotu, že + budou předkládat jenom kvalitní záplaty a mohli jim předělit větší + práva. + + 1.13) Kam podat report o chybě? + + Navštivte naši PostgreSQL BugTool stránku na + http://www.PostgreSQL.org/bugs/bugs.php, která obsahuje návod a + směrnice jak podat chybový report. + + Ověřte si na našem ftp serveru ftp://ftp.PostgreSQL.org/pub, zda-li + máte nejnovější verzi PostgreSQL a zda-li k ní neexistují nějaké + záplaty. + + 1.14) Jak je na tom PostgreSQL v porovnání s jinými databázemi? + + Existuje několik hledisek jak porovnávat software: vlastnosti, výkon, + spolehlivost, podpora a cena. + + Vlastnosti + PostgreSQL má hodně společných vlastností s velkými komerčními + DBMS, např. transakce, vnořené dotazy, spouště, pohledy, + kontrolu referenční integrity a sofistikované zamykání. + Podporuje některé vlastnosti, které tyto systémy nemají, + uživatelem definované typy, dědičnost, pravidla, MVCC + redukující zamykání. + + Výkon + Výkonnostně je na tom PostgreSQL podobně jako další komerční + ale i open source databáze, v něčem je rychlejší, jindy + pomalejší. V porovnání s MySQL a podobnými databázovými systémy + je PostgreSQL rychlejší při víceuživatelském přístupu, + složitějších dotazech a zatížení read/write dotazy. MySQL je + rychlejší v jednodušších dotazech s malým počtem uživatelů. + Navíc, MySQL nepodporuje mnohé vlatnosti zmíněné v sekci + vlastnosti. Zapracovali jsme na spolehlivosti a podporovaných + vlastnostech, a výkon zvyšujeme v každé verzi. Zajímavou + stránku porovnávající PostgreSQL a MySQL naleznete na + http://openacs.org/philosophy/why-not-mysql.html. Za vývojem + MySQL není Open Source komunita, ale komerční společnost, + přestože svoje produkty distribuuje jako Open Source. + + Spolehlivost + Jsme si vědomi, že databáze musí být spolehlivá, jinak je + nepoužitelná. Snažíme se zveřejňovat dobře otestovaný, stabilní + kód s minimem chyb. Každá verze je více než měsíc v beta + testování, a naše historie verzí ukazuje, že můžeme nabídnout + stabilní, solidní verze, které jsou připraveny pro reálné + nasazení. V této oblasti jsme srovnatelní s dalšími databázemi. + + Podpora + Na naší mailové konferenci můžete kontaktovat velkou skupinu + vývojářů a uživatelů.problémů. Nemůžeme garantovat opravu, + nicméně komerční databáze také ne vždy nabídnou opravu. Podle + ohlasů je naše podpora hodnocena lépe než u jiných DBMS a to + díky přímému kontaktu s vývojáři, velkou komunitou uživatelů, + kvalitními manuály a přístupným zdrojovým kódem. Pro uživatele, + kteří vyžadují podporu ke konkrétním případům, existuje placená + podpora (FAQ sekce 1.6). + + Cena + PosgreSQL lze volně používat pro nekomerční i komerční použití. + Můžete do svých produktů přidat náš kód bez omezení, respektive + v souladu s podmínkami naší licenční smlouvy (v duchu BSD + licence). + + 1.15) Jak lze finančně pomoci PostgreSQL? + + PosgreSQL má prvotřídní infrastrukturu od našeho začátku v roce 1996. + Vděčíme za to Marku Fournierovi, který založil a spravoval tuto + infrastrukturu několik let. + + Kvalitní infrastruktura je velice důležitá pro každý open source + projekt. Předchází nedorozuměním, která velice zdržují pokrok v + projektu. + + Tato infrastruktura není laciná. K jejímu zajištění je třeba stále + hradit určité měsíční a jednorázové částky. Pokud máte Vy nebo Vaše + společnost peníze, které nám můžete darovat, obraťe se na + http://store.pgsql.com/shopping/ a darujte je. + + Ačkoliv webová stránka zmiňuje PostgreSQL, Inc. vklady jsou určeny + pouze k podpoře projektu PostgreSQL a nepodporují žádnou existující + společnost. Pokud to vyžadujete, můžete poslat kontrolu na naši + kontaktní adresu. + _________________________________________________________________ + + Pokud máte příklad úspěšného nasazení PostgreSQL, přihlaště se na náš + advocacy site na http://advocacy.postgresql.org. + + User client dotazy + + 2.1) Kde naleznu ODBC ovladače pro PostgreSQL? + + Pro PostgreSQL existují dva ODBC ovladače - PsqlODBC a OpenLink ODBC. + + PsqlODBC je ke stažení na + http://gborg.postgresql.org/project/psqlodbc/projdisplay.php. + + OpenLink můžete získat na http://www.openlinksw.com. Spolupracuje s + jejich klientským programovým vybavením a je dostupný pro všechny jimi + podporované platformy (Win, Mac, Unix, VMS). + + Tento ovladač je určen pro ty, kteří vyžadují podporu komerční + kvality, nicméně freeware verze je dostupná a funkční. Dotazy + zasílejte na postgres95@openlink.co.uk. + + 2.2) Jaké nástroje lze použít pro PostgreSQL a web? + + Pěkný úvod do databázových technologií zabezpečujících chod webových + stránek najdete na http://www.webreview.com. + + Pro tvorbu webu existuje excelentní rozhraní PHP, které naleznete na + http://www.php.net. + + Pro složitější případy se často používá Perl a CGI.pm nebo mod_perl. + + 2.3) Existuje grafické rozhraní pro PostgreSQL? + + Pro PostgreSQL existuje několik grafických rozhraní: PgAccess + (http://www.php.net), PgAdmin III (http://www.php.net), RHDB Admin + (http://sources.redhat.com/rhdb/) a Rekall ( + http://www.thekompany.com/products/rekall/). Dále ještě PhpPgAdmin + (http://phppgadmin.sourceforge.net/) což je rozhraní PostgreSQL + založené na web technologii. + + Úplnější seznam najdete na + http://techdocs.postgresql.org/guides/GUITools. + + 2.4) Které programovací jazyky mají podporu pro PostgreSQL? + + Většina programovacích jazyků obsahuje rozhraní pro PostgreSQL. + Podívejte se do rozšiřujících modulů Vašeho programovacího jazyka. + + Distribuce PostgreSQL obsahuje tato rozhraní: + * C (libpq) + * Embbedded C (ecpg) + * Java (jdbc) + * Python (PyGreSQL) + * TCL (libpgtcl) + + Další rozhraní jsou dostupná na http://gborg.postgresql.org v sekci + Drivers/Interfaces. + _________________________________________________________________ + + Administrativní dotazy + + 3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql? + + Použijte volbu --prefix při spuštění configure. + + 3.2) Při startu postmaster, dostanu chybové hlášení Bad System Call nebo + core dump. Proč? + + Důvody mohou být různé, ale nejprve zkontrolujte, zda Váš systém + podporuje System V extensions. PostgreSQL vyžaduje v jádře podporu + sdílené paměti a semaforů. + + 3.3) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. Proč? + + Buďto nemáte správně nakonfigurovanou sdílenou paměť v jádře nebo + musite zvětšit její velikost. Potřebná velikost je závislá na + architektuře a na tom, kolik paměťových bufferů a backendů máte + povoleno pro postmastera. Pro většinu systémů s předdefinovaným počtem + backendů a paměťových bufferů je minimum zhruba 1MB. V PostgreSQL + Administrator's Guide naleznete podrobnější informace o sdílené paměti + a semaforech. + + 3.4) Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate. + Proč? + + Pokud dostane chybovou zprávu IpcSemaphoreCreate: semget failed (No + space left on device), pak vaše jádro nemá dost volných semaforů. + PostgreSQL vyžaduje jeden semafor pro každý backend v pozadí. Dočasným + řešením je start postmaster s limitem backendů. Použijte přepínač -N s + hodnotou menší než 32. Úplným řešením je zvýšení hodnot SEMMNS a + SEMMNI jadra. + + Nefunkční semafory mohou způsobit pád během intenzivních databázových + operací. + + Pokud se tato chyba vyskytuje ještě někde jinde, možná nemáte vůbec + nakonfigurovány semafory ve vašem jádře. V PostgreSQL Administrator's + Guide najdete podrobnější popis požadavků na sdílenou pamět a + semafory. + + 3.5) Jak povolit nebo zakázat přístup z jiných stanic? + + Při výchozím nastavení PostgreSQL odepře přístup z jiných stanic než + lokální s použitím UDP. Přístup z jiných strojů není možný dokud jej + nepovolíte nastavením tcpip_socket v postgresql.conf a určením způsobu + autentifikace v $PGDATA/pg_hba.conf. + + 3.6) Jak ladit databázový stroj na lepší výkon? + + Určitě pomohou indexy. Příkaz EXPLAIN ANALYZE Vám umožní sledovat jak + PostgreSQL interpretuje Váš dotaz a které indexy používá. + + Při větší dávce INSERTů uvažujte o náhradě příkazem COPY. Ten je + mnohem rychlejší nežli samotný INSERT. Každý příkaz mimo blok BEGIN + WORK/COMMIT se provádí ve vlastní transakci. Zvažte, zda-li by se + nedalo několik příkazů spojit do jedné transakce. Tím se sníží režie + na transakce. Před provedením rozsáhlých změn zrušte indexy, které po + dokončení změn opět vytvořte. + + Máte několik dalších možností, jak zlepšit výkon. Můžete zakázat + fsyn() při startu postmastera přepínači -o -F. Tyto přepínače zabrání + fsync(), tj. zápisu na disk po každé transakci. + + Můžete zvýšit velikost paměťových bufferů použitých backendy tj. + parametr -B postmasteru. Pokud ale tato hodnota bude příliš velká, tak + možná nespustíte postmastera jelikož dosáhnete limitu sdílené paměti. + Každý buffer má 8K a implicitně je 64 bufferů. + + Dále můžete použít přepínač -S k zvýšení limitu paměti pro backendy na + dočasné třídění. Hodnota je míněna v kilobytech a výchozí nastavení je + 512, tj. 512K. + + Můžete použít příkaz CLUSTER, který uspořádá fyzicky data v tabulkách + podle indexu. Více na manuálových stránkách příkazu CLUSTER. + + 3.7) Jaké jsou možnosti ladění? + + Máte několik možností jak se dostat k užitečným stavovým informacím. + + Zaprvé, při překladu použijte přepínač --enable-cassert, tím se zapne + monitorování a následné zastavení aplikace, když se proces v backendu + dostane do neočekávaného stavu. + + Jak postmaster tak postgres má několik přepínačů umožňujících ladění. + Postmaster nastartujte tak, abyste si byli jisti, že je standartní + výstup a standartní chybový výstup přesměrován do souboru logu, + například: + cd /usr/local/pgsql + ./bin/postmaster > server.log 2>&1 & + + Tím se vytvoří log v adresáři PostgreSQL, Tento soubor obsahuje + užitečné informace o problémech a chybách vyskytlých se na serveru. + Postmaster má přepínač -d určující, jak podrobné mají být reportované + informace, tj. debug level. Pozor, při velké hodnotě debug levelu + rychle roste velikost souboru logu. + + Pokud neběží postmaster, můžete spustit backend PostgreSQL z příkazové + řádky a napsat svůj SQL dotaz přímo v backendu (doporučeno pouze pro + ladění). Dotaz je v tomto případě ukončen novou řádkou, nikoliv + středníkem. Pokud máte aplikaci přeloženou s ladícími symboly, můžete + použít debbuger k monitorování procesu. Pokud není backend spuštěn + postmasterem, pak neběží ve svém obvyklém prostředí a tudíž některé + problémy dané interakcí mezi backendy nemohou být nasimulovány. + + Pokud běží postmaster, spusťe psql v jednom okně a pak si zjistěte PID + procesu postgres použitého psql. V debuggeru sepřipojte k postgresql + PID. Pak nastavte breakpointy v debuggeru a zadejte dotaz v psql. + Pokud ladíte startup postgresu, pak nastavte PGOPTIONS="-W n" a spusťe + psql. Tento přepínač způsobí pauzu n sekund, takže budete mít čas se + připojit k procesu, a nastavit breakpointy a pokračovat v startup + posloupnosti. + + Pro ladění a měření výkonu mohou být užitečné přepínače -s, -A a -t + programu postgres (backend). + + Můžete provést překlad s profilací, tak abyste viděli kolik času + zabírají jednotlivé funkce. Soubory s profily backendů jsou uloženy v + adresáři pgsql/data/base/dbname. Profil klienta pak v jeho aktuálním + adresáři. Korektní profilace v prostředí Linux požaduje konfiguraci + systému s parametrem -DLINUX_PROFILE. + + 3.8) Proč dostanu "Sorry, too many clients", když se zkouším připojit? + + Zvyšte limit postmastera na maximální počet současně spuštěných + backendů. + + Výchozí hodnota je 32 backendů. Tuto hodnotu zvýšíte zastavením a + opětovným spuštěním postmastera s parametrem -N nebo úpravou + postgresql.conf. + + Při zvýšení hodnoty -N nad 32 musíte zvýšit hodnotu -B nad výchozí 64, + -B musí být minimálně dvakrát větší, nebo ještě lépe více. + Pravděpodobně zjistíte, že pro velký počet procesů backendu je nutné + zvýšit některé parametry jádra. Jsou to především maximální velikost + sdílené paměti SHMMAX, maximální počet semafórů SEMMNS a SEMMNI, + maximální počet procesů NPROC, maximální počet procesů uživatele + MAXUPRC a maximální počet otevřených souborů NFILE a NINODE. Důvod pro + omezení maximálního počtu backendů je fakt, že by mohlo dojít k + vyčerpání zdrojů Vašeho systému. + + 3.9) K čemu slouží adresář pgsql_tmp? + + Tento adresář obsahuje dočasné soubory vytvořené exekutorem dotazů. + Například, když je nutné třídění k zajištění ORDER BY a třídění má + větší nároky na prostor než povoluje parametr -S backendu, pak je + vytvořen dočasný soubor k uložení extra údajů. + + Dočasné soubory jsou obvykle mazány automaticky, ale může se stát, že + během třídění server spadne. Zastavení a další start postmastera + zajistí odstranění souborů s těchto adresářů. + + 3.10) Proč je požadováno dump a obnovení (load) databáze během upgrade mezi + velkými verzemi PostgreSQL? + + PostgreSQL se minimálně mění během malých verzí, takže např. při + upgrade z 7.2 na 7.2.1 není nutné dump a load databáze. Ale výynamné + verze často mění interní formát systémových tabulek a datových + souborů. Tyto změny jsou natolik rozsáhlé, že nelze zajistit zpětnou + kompatibilitu pro datové soubory. Dump uloží data v obecném formátu, + takže mohou být načtena a používána v novém interním formátu. + _________________________________________________________________ + + Provozní dotazy + + 4.1) Čím se liší binární a normální kurzor? + + Popis najdete v manuálové stránce DECLARE + + 4.2) Jak získat pouze první řádek dotazu? Náhodný řádek? + + Podívejte se do man. stránky příkazu FETCH, nebo použijte SELECT ... + LIMIT ... + + I když potřebujete získat pouze prvních několik řádků, je třeba + zpracovat všechna data, např. pokud dotaz má ORDER BY. Pokud však + existuje index, který odpovídá ORDER BY, PostgreSQL může získat pouze + prvních n řádků a ukončit zpracování dotazu. + + K získání náhodného řádku použijte: + SELECT col + FROM tab + ORDER BY random() + LIMIT 1; + + 4.3) Jak získám seznam tabulek nebo jinak jak jej získá psql? + + Příkaz \dt v psql zobrazí seznam tabulek. Úplný seznam příkazů psql + dostanete příkazem \?. Také se můžete podívat do zdrojových kódů psql + do souboru pgsql/src/bin/psql/describe.c. Ten obsahuje SQL příkazy, + které se používají v psql metapříkazech. Dále můžete spustit psql s + přepínačem -E, který způsobí zobrazení každého dotazu, které + zpracování metapříkazu vyvolá. PostgreSQL nabízí SQLi INFORMATION + SCHEMA s tabulkami obsahující informace o databázi. + + 4.4) Jak odstraním sloupec tabulky, jak změním jeho typ? + + Počínaje verzí 7.3 můžete použít příkaz ALTER TABLE DROP COLUMN. Ve + starších verzích můžete použít následující postup: + BEGIN; + LOCK TABLE old_table; + SELECT ... -- mimo sloupec, který chceme odstranit + INTO TABLE new_table; + DROP TABLE old_table; + ALTER TABLE new_table RENAME TO old_table; + COMMIT; + + Pro změnu typu sloupce je třeba provést: + BEGIN; + ALTER TABLE tab ADD COLUMN new_col new_data_type; + UPDATE tab SET new_col = CAST(old_col AS new_data_type; + ALTER TABLE tab DROP COLUMN old_col; + COMMIT; + + Poté proveďte VACUUM FULL tab - uvolníte tím diskový prostor zabraný + nyní již neplatnými řádky. + + 4.5) Jaká je maximální velikost řádku, tabulky a databáze? + + PostgreSQL má tato omezení: + Maximální velikost databáze: neomezena (existují 32TB db) + Maximálné velikost tabulky: 32 TB + Maximální velikost řádky: 1.6 TB + Maximální velikost položky 1 GB + Maximální počet řádků v tabulce: neomezeno + Maximální počet sloupců v tabulce: 250-1600 podle typů + Maximální počet indexů na tabulce: neomezeno + + Ve skutečnosti nic není neomezeno, limitem bývá vždy dostupná disková + paměť nebo velikost operační paměti. Pokud máte některou z těchto + hodnot neobvykle velkou, může dojít ke snížení výkonu. + + Maximální velikost tabulky je 32 TB a nevyžaduje podporu velkých + souborů operačním systémem. Velké tabulky se ukládají do několika 1 GB + souborů takže limity souborového systému nejsou podstatné. + + Maximální velikost tabulky a maximální počet sloupců můžeme + zečtyřnásobit nastavením velikosti bloku na 32K. + + 4.6) Kolik diskového prostoru je potřeba k uložení dat z + + normálního textového souboru? + + PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z + textového souboru. + + Například, uvažujme soubor se 100 tisíci řádky obsahující na každé + řádce celé číslo a textový popis. Text je v průměru dvacet bytů + dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze + obsahující odpovídající data bude zhruba 6.4 MB. + 36 bytů: hlavička řádku (přibližně) + 24 bytů: jedna celočíselná položka a jedna textová + + 4 byty: ukazatel na stránku k ntici + ------------------------------------------------------ + 64 bytů na řádek + + Velikost datové stránky PostgreSQL je 8KB + + 8192 bytů na stránce + ---------------------- = 128 řádek na stránku + 64 bytů za řádek + + 100000 řádek + -------------------- = 782 stránek (zaokrouhleno nahoru) + 128 řádek na stránce + + 782 * 8192 = 6, 406, 144 bytů (6.4 MB) + + Indexy nemají tak velkou režii, ale mohou být také velké, protože + obsahují indexovaná data. + + Hodnoty NULL jsou uloženy v bitmapách, takže spotřebují jen velmi málo + diskového prostoru. + + 4.7) Jak získám seznam vytvořených tabulek, indexů, databází? + + psql má sadu metapříkazů k zobrazení těchto informací. Jejich seznam + získáte příkazem \?. Dále se můžete podívat na obsah systémových + tabulek začínajících pg_. Spuštění psql s parametrem -l provede výpis + názvů všech databází. + + Soubor pgsql/src/tutorial/syscat.source obsahuje SELECTy přistupující + k systémovým tabulkámm. + + 4.8) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč? + + Každý dotaz nemusí nutně použít existující indexy. Index se použije + tehdy, když je tabulka větší než určitá minimální velikost, a dotaz + vybírá pouze procentuálně malou část řádků tabulky. To proto, že + náhodný přístup k disku daný čtením indexu může být pomalejší než + lineární čtení tabulky nebo sekvenční čtení. + + PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k + tabulce. Tyto statistiky se shromažďují příkazy VACUUM ANALYZE nebo + ANALYZE. Díky statistikám má optimizer informaci o počtu řádek v + tabulce a může lépe rozhodnout o použití indexů. Statistiky se uplatní + při určení optimálního pořadí a metody spojení tabulek. Statistiky by + se měli aktualizovat opakovaně, tak jak se mění obsah tabulek. + + Indexy nejsou obyčejně použity pro setřídění nebo spojení tabulek. + Sekvenční zpracování následované explicitním tříděním je obyčejně + rychlejší než indexní čtení na velké tabulce. + + Jinak je tomu v případě použití LIMIT a ORDER BY, při kterém se + většinou index použije, výsledkem je pouze malá část tabulky. Funkce + MAX() a MIN() nepoužívají indexy, ale je možné tutéž hodnotu získat: + SELECT col + FROM tab + ORDER BY col [ DESC ] + LIMIT 1; + + Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání + tabulky, použijte příkaz SET enable_seqscan TO 'off' a zkuste zda je + indexní prohledávání rychlejší. + + Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se + indexy použíjí pouze za určitých skutečností: + * začátek hledaného vzoru musí být ukotven k začátku, tj. + + vzor LIKE nesmí začínat % + + ~ regulární výraz musí začínat ^ + * vzor nesmí začínat intervalem, např. [a-e] + * vyhledávaní, které není Case sensitiv jako je ILIKE nebo ~* + nepoužívá indexy. Můžete ale použít funkcionální indexy, které + jsou posány v sekci 4.12 + * při inicializaci databáze (initdb) musí být použito C locale + (pozn. překladatele - tudíž v našich podmínkách nepoužitelné, + nepracovalo by české třídění). + + 4.9) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz? + + Podívejte se do manuálové stránky příkazu EXPLAIN. + + 4.10) Co to je R-tree index? + + R-tree index se používá pro indexování prostorových dat. Hash index + nemůže obsloužit prohledávání oblastí. B-tree index může řídit + vyhledání oblastí v jedné dimenzi. R-tree index může podporovat + hledání v multidimenzionálních datech. Použijeme-li například R-tree + index na atributy typu point, pak systém může efektivně odpovědět na + dotaz - vyber všechny body uvnitř obdélníků. + + Původní návrh R-tree je Guttman, A. "R-trees: A Dynamic Index + Structure for Spatial Searching." Proceedings of the 1984 ACM SIGMOD + Int'l Conf on Mgmt of Data, 45-57 + + Tyto materiály naleznete v Stonebraker's "Readings in Database + Systems". + + Vestavěné R-tree může sloužit k indexaci polygonů a oblastí. + Teoreticky můžeme R-tree použít i pro více dimenzí (jiné než 3D). Ve + skutečnosti ale takové rozšíření R-tree vyžaduje trochu práce a ve + součastnosti chybí dokumentace jak na to. + + 4.11) Co je Genetic Query Optimizer? + + GEQO modul urychluje optimalizaci dotazů při spojování množství + tabulek metodou Genetických algoritmů (GA). To umožňuje získat velkého + množství variant spojení při neúplném prohledáváním. + + 4.12) Jak provést vyhledávání regulárního výrazu case sensitiv, insensitiv? + Jak použít index pro case insensitive vyhledávání? + + Operátor ~ slouží k porování s regulárním výrazem, jeho modifikace *~ + představuje case insensitive vyhledávání. Jedná se o obdobu LIKE a + ILIKE. + + Pro vyhledávání bez ohledu na velká malá písmena použijeme: + SELECT * + FROM tab + WHERE lower(col) = 'abc'; + + V tomto případě se nepoužije standardní index. Nicméně, použije se + funkcionální index, pokud jej vytvoříte: + CREATE INDEX tabindex ON tab (lower(col)); + + 4.13) Jak v dotazu detekovat, že položka je NULL? + + Určíte pomocí IS NULL nebo IS NOT NULL + + 4.14) Jaké jsou rozdíly mezi různými znakovými typy? + Typ Interní název Poznámka -------------------------------------------------------------------------- VARCHAR(n) varchar omezeno maximální délkou, bez doplnění mezerami @@ -858,332 +826,292 @@ TEXT text bez horního limitu na délku BYTEA bytea pole bytů (bezpečně lze uložit i znak NULL) "char" char jeden znak -S interními názvy se setkáte v systémovém katalogu a v některých -chybových hlášeních. - -První čtyři uvedené typy jsou tzv. varlena typy (tj. první čtyři byty na -disku nesou údaj o délce, následují samotná data). Proto skutečný -použitý prostor je vždy o něco málo větší než deklarovaná délka. Naopak, -tyto datové typy jsou komprimovánty TOASTem, takže prostor na disku může -být nižší než je očekáváno. - -VARCHAR(n) je vhodný pro ukládání textů promměné délky s pevně -stanovenou maximální délkou. TEXT je pro řetězce bez omezení délky s -maximem jeden gigabajt. - -CHAR(n) slouží k ukládání řetězců stejné délky. CHAR(n) doplní prázdné -znaky do specifikované délky, zatímco VARCHAR(n) uloží pouze předané -znaky. BYTEA je určeno pro ukládání binárních dat, včetně NULL byte. -Všechny zde popsané typy mají podobné výkonnostní charakteristiky. - -4.15.1 Jak vytvořit serial/auto-increment pole? ------------------------------------------------ - -PostgreSQL podporuje typ SERIAL. Při jeho použití se automaticky vytvoří -SEQUENCE a index na sloupci (Pro vyšší verze to neplatí OVĚŘIT). -Například: - -CREATE TABLE person ( - id SERIAL, - name TEXT -); - -je automaticky převedeno do - -CREATE SEQUENCE person_id_seq; -CREATE TABLE person ( - id INT4 NOT NULL DEFAULT nextval('person_id_seq'), - name TEXT -); -CREATE UNIQUE INDEX person_id_key ON person(id); - -Viz dokumentace create_sequence v manuálových stránkách. Dále můžete -použít unikátní hodnotu OID každého řádku. Potom ale musíte spouštět -pg_dump s přepínačem -o, tak aby zůstaly zachovány hodnoty OID (u -příkazu copy COPY WITH OIDS). - -4.15.2 Jak získat hodnotu SERIAL po vložení řádku? --------------------------------------------------- - -Jednou z možností je získat budoucí hodnotu SERIAL funkcí nextval před -samotným vložením a pak ji vložit explicitně. Například v jakémsi -pseudojazyku - -newid = execute("SELECT nextval('person_id_seq')"); -execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); - -Můžete pak ještě použít hodnotu newid v dalších dotazech, např. jako -hodnotu cizího klíče. Název automaticky vytvořené sekvence je -tabulka_sloupec_seq. - -Alternativně můžete získat hodnotu posledně generovou sekvencí funkcí -currval() po vložení - -execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); -new_id = execute("SELECT currval('person_id_seq')"); - -Konečně můžete použít OID hodnotu vrácenou příkazem INSERT, ale to je -pravděpodobně nejméně přenositelné řešení. V Perlu při použití DBI -modulu Edmunda Mergleho DBD:Pg oid hodnotu získáme $sth->{pg_oid_status} -po každém $sth->execute(). - -4.15.3 Nepovede currval() a nextval() k rozhození podmínek při souběhu s jinými uživateli? ------------------------------------------------------------------------------------------- - -Nikoliv, currval() vrací hodnotu naposledy generovanou ve vašem -backendu, a ta tudíž není společná všem uživatelům. - -4.15.4 Proč není vygenerované číslo použito při přerušení transakce? -Proč vznikají díry v číslování vlastní sekvencí/SERIAL sloupce? - -K zajištění efektivnosti souběhu, jsou hodnoty posloupnosti, když se o -ně požádá, a sekvence není zamčena do ukončení transakce. To způsobuje -díry v číslování ze zrušených transakcí. - -4.16 Co to je OID? Co je to TID? --------------------------------- - -Každý řádek vytvořený v PostgreSQL získá jedinečné OID. Všechna OID -generovaná během inicializace databáze jsou menší než 16384 -(include/access/transam.h). Všechna OID generovaná na požadavek -uživatele jsou rovna nebo vyšší této hodnotě. Normálně, všechna OID jsou -jedinečná nejen uvnitř tabulky nebo databáze, ale v rámci celé instalace -PostgreSQL - -PostgreSQL používá OID ve svém interním systému tabulek k vytvoření -relací. Tato OID mohou být použita k identifikaci konkrétního uživatele -a použita v spojení. Pro OID hodnoty je doporučen typ OID. Nad tímto -sloupcem můžete vytvořit index pro urychlení přístupu. - -OID jsou dána všem řádkům z centrální oblasti a jsou použita v každé -databázi. Pokud potřebujete změnit OID, nebo chcete zkopírovat tabulku s -původními OID, lze použít - -CREATE TABLE new_table(old_oid oid, mycol int); -SELECT old_oid, mycol INTO new FROM old; -COPY new TO '/tmp/pgtable'; -DELETE FROM new; -COPY new WITH OIDS FROM '/tmp/pgtable'; - -OID jsou uložena jako 4bajtový integer a přetečou po čtyřech miliardách. -Nebylo hlášeno, že by se tak někdy stalo, přesto ale plánujeme odstranit -tento limit dřív než se tak stane. - -TID se používají i identifikaci fyzických řádků s hodnotou bloku a -offsetu. TIDs se mění modifikací řádků (používá se jako ukazatel indexu -fyzického řádku). - -4.17 Jaký je význam některých výrazů použitých v PostgreSQL? ------------------------------------------------------------- - -V některých zdrojových kódech nebo starší dokumentaci se můžete setkat s -následujícími výrazy, které mají širší význam. Zde je příklad nekterých: - - - tabulka, relace, třída (table, relation, class) - - řádek, záznam, ntice (row, record, tuple) - - sloupec, položka, atribut (column, field, attribute) - - vyhledání, výběr (retrieve, select) - - - náhrada, úprava (replace, update) - - přidání, vkládání (append, insert) - - OID, serial value (OID, serial value) - - portal, kurzor (portal, cursor) - - range variable, jméno tabulky, alias tabulky (range - variable, table name, table alias) - -seznam těchto výrazů můžete nalézt na -http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/g -lossary.html. - -4.18 Proč jsem získal chybové hlášení "ERROR: Memory exhausted in AllocSetAlloc()"? ------------------------------------------------------------------------------------ - -Pravděpodobně došlo k vyčerpání virtuální paměťi na Vašem systému, nebo -jádro má nízký limit pro určité zdroje. Vyzkoušejte před startem -posmatera - -ulimit -d 262144 -limit datasize 256m - -Záleží na Vašem shellu, zda budou tyto příkazy úspěšné, měly by zvýšit -limit datového segmentu pro Vaše procesy a umožnit tak dokončení dotazu. -Tyto příkazy se aplikují na aktuální proces a všechny synovské procesy -vytvořené po provedení příkazu. Pokud máte problémy s SQL klientem -protože backend vrací příliš mnoho dat, zkuste zvýšit limity před -startem klienta. - -4.19 Jak se dozvím, kterou verzi PostgreSQL používám? ------------------------------------------------------ - -V psql spusťte - -SELECT version(); - -4.20 Proč operace s velkými objekty končí "invalid large obj descriptor"? -------------------------------------------------------------------------- - -Všechny operace s velkými objekty - lo_open, lo_close, ... musíte -spouštět v transakci, tj. mezi příkazy BEGIN WORK a COMMIT. - -PostgreSQL uvolňuje handle velkých objektů při skončení transakce. Pokud -budete pracovat s velkými objekty mimo transakci, pravděpodobně -dostanete toto chybové hlášení, protože handle již budou neplatné. - -Pokud používáte interface podobné ODBC musíte nastavit set auto_commit -off - -4.21 Jak vytvořit sloupec obsahující implicitně aktuální datum? ---------------------------------------------------------------- - -Použijte CURRENT_TIMESTAMP + S interními názvy se setkáte v systémovém katalogu a v některých + chybových hlášeních. + + První čtyři uvedené typy jsou tzv. varlena typy (tj. první čtyři byty + na disku nesou údaj o délce, následují samotná data). Proto skutečný + použitý prostor je vždy o něco málo větší než deklarovaná délka. + Naopak, tyto datové typy jsou komprimovánty TOASTem, takže prostor na + disku může být nižší než je očekáváno. + + VARCHAR(n) je vhodný pro ukládání textů promměné délky s pevně + stanovenou maximální délkou. TEXT je pro řetězce bez omezení délky s + maximem jeden gigabajt. + + CHAR(n) slouží k ukládání řetězců stejné délky. CHAR(n) doplní prázdné + znaky do specifikované délky, zatímco VARCHAR(n) uloží pouze předané + znaky. BYTEA je určeno pro ukládání binárních dat, včetně NULL byte. + Všechny zde popsané typy mají podobné výkonnostní charakteristiky. + + 4.15.1) Jak vytvořit serial/auto-increment pole? + + PostgreSQL podporuje typ SERIAL. Při jeho použití se automaticky + vytvoří SEQUENCE. Například: + CREATE TABLE person ( + id SERIAL, + name TEXT + ); + + je automaticky převedeno do + CREATE SEQUENCE person_id_seq; + CREATE TABLE person ( + id INT4 NOT NULL DEFAULT nextval('person_id_seq'), + name TEXT + ); + CREATE UNIQUE INDEX person_id_key ON person(id); + + Viz dokumentace create_sequence v manuálových stránkách. Dále můžete + použít unikátní hodnotu OID každého řádku. Potom ale musíte spouštět + pg_dump s přepínačem -o, tak aby zůstaly zachovány hodnoty OID (u + příkazu copy COPY WITH OIDS). + + 4.15.2) Jak získat hodnotu SERIAL po vložení řádku? + + Jednou z možností je získat budoucí hodnotu SERIAL funkcí nextval() + před samotným vložením a pak ji vložit explicitně. Například v jakémsi + pseudojazyku: + newid = execute("SELECT nextval('person_id_seq')"); + execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); + + Můžete pak ještě použít hodnotu newid v dalších dotazech, např. jako + hodnotu cizího klíče. Název automaticky vytvořené sekvence je + tabulka_sloupec_seq. + + Alternativně můžete získat hodnotu posledně generovou sekvencí funkcí + currval() po vložení: + execute("INSERT INTO person (name) VALUES ('Blaise Pascal')"); + new_id = execute("SELECT currval('person_id_seq')"); + + Konečně můžete použít OID hodnotu vrácenou příkazem INSERT, ale to je + pravděpodobně nejméně přenositelné řešení. V Perlu při použití DBI + modulu Edmunda Mergleho DBD:Pg oid hodnotu získáme + $sth->{pg_oid_status} po každém $sth->execute(). + + 4.15.3) Nepovede currval() a nextval() k rozhození podmínek při souběhu s + jinými uživateli? + + Nikoliv, currval() vrací hodnotu naposledy generovanou ve vašem + backendu, a ta tudíž není společná všem uživatelům. + + 4.15.4) Proč není vygenerované číslo použito při přerušení transakce? Proč + vznikají díry v číslování vlastní sekvencí/SERIAL sloupce? + + K zajištění efektivnosti souběhu, jsou hodnoty posloupnosti, když se o + ně požádá, a sekvence není zamčena do ukončení transakce. To způsobuje + díry v číslování ze zrušených transakcí. + + 4.16) Co to je OID? Co je to TID? + + Každý řádek vytvořený v PostgreSQL získá jedinečné OID. Všechna OID + generovaná během inicializace databáze jsou menší než 16384 + (include/access/transam.h). Všechna OID generovaná na požadavek + uživatele jsou rovna nebo vyšší této hodnotě. Normálně, všechna OID + jsou jedinečná nejen uvnitř tabulky nebo databáze, ale v rámci celé + instalace PostgreSQL + + PostgreSQL používá OID ve svém interním systému tabulek k vytvoření + relací. Tato OID mohou být použita k identifikaci konkrétního + uživatele a použita v spojení. Pro OID hodnoty je doporučen typ OID. + Nad tímto sloupcem můžete vytvořit index pro urychlení přístupu. + + OID jsou dána všem řádkům z centrální oblasti a jsou použita v každé + databázi. Pokud potřebujete změnit OID, nebo chcete zkopírovat tabulku + s původními OID, lze použít: + CREATE TABLE new_table(old_oid oid, mycol int); + SELECT old_oid, mycol INTO new FROM old; + COPY new TO '/tmp/pgtable'; + DELETE FROM new; + COPY new WITH OIDS FROM '/tmp/pgtable'; + + OID jsou uložena jako 4bajtový integer a přetečou po čtyřech + miliardách. Nebylo hlášeno, že by se tak někdy stalo, přesto ale + plánujeme odstranit tento limit dřív než se tak stane. + + TID se používají i identifikaci fyzických řádků s hodnotou bloku a + offsetu. TIDs se mění modifikací řádků (používá se jako ukazatel + indexu fyzického řádku). + + 4.17) Jaký je význam některých výrazů použitých v PostgreSQL? + + V některých zdrojových kódech nebo starší dokumentaci se můžete setkat + s následujícími výrazy, které mají širší význam. Zde je příklad + nekterých: + * tabulka, relace, třída (table, relation, class) + * řádek, záznam, ntice (row, record, tuple) + * sloupec, položka, atribut (column, field, attribute) + * vyhledání, výběr (retrieve, select) + * náhrada, úprava (replace, update) + * přidání, vkládání (append, insert) + * OID, serial value (OID, serial value) + * portal, kurzor (portal, cursor) + * range variable, jméno tabulky, alias tabulky (range variable, + table name, table alias) + + seznam těchto výrazů můžete nalézt na + http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary + /glossary.html. + + 4.18) Proč jsem získal chybové hlášení "ERROR: Memory exhausted in + AllocSetAlloc()"? + + Pravděpodobně došlo k vyčerpání virtuální paměťi na Vašem systému, + nebo jádro má nízký limit pro určité zdroje. Vyzkoušejte před startem + posmatera + ulimit -d 262144 + limit datasize 256m + + Záleží na Vašem shellu, zda budou tyto příkazy úspěšné, měly by zvýšit + limit datového segmentu pro Vaše procesy a umožnit tak dokončení + dotazu. Tyto příkazy se aplikují na aktuální proces a všechny synovské + procesy vytvořené po provedení příkazu. Pokud máte problémy s SQL + klientem protože backend vrací příliš mnoho dat, zkuste zvýšit limity + před startem klienta. + + 4.19) Jak se dozvím, kterou verzi PostgreSQL používám? + + V psql spusťte SELECT version(); + + 4.20) Proč operace s velkými objekty končí "invalid large obj descriptor"? + + Všechny operace s velkými objekty - lo_open, lo_close, ... musíte + spouštět v transakci, tj. mezi příkazy BEGIN WORK a COMMIT. + + PostgreSQL uvolňuje handle velkých objektů při skončení transakce. + Pokud budete pracovat s velkými objekty mimo transakci, pravděpodobně + dostanete toto chybové hlášení, protože handle již budou neplatné. + Pokud používáte interface podobné ODBC musíte nastavit set auto_commit + off. + + 4.21) Jak vytvořit sloupec obsahující implicitně aktuální datum? + + Použijte CURRENT_TIMESTAMP: CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP ); -4.22 Proč jsou moje vnořené dotazy používající IN tak pomalé? -------------------------------------------------------------- - -Aktuálně spojujeme tabulky se sekvenčním skenováním výsledku pro každý -řádek vnějšího dotazu. Pokud vnořený dotaz má pouze několik řádků a -vnější dotaz vrací hodně řádek, IN je rychlé. V jiných případech -nahraďte IN EXISTS: - -SELECT * FROM tab - WHERE col IN (SELECT subcol FROM subtab); - -takto - -SELECT * FROM tab - WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col); - -Pro urychlení vytvořete index pro subcol. Tento výkonnostní problém byl -odstraněn ve verzi 7.4. - -4.23 Jak provést vnější spojení (outer join)? ---------------------------------------------- - -PostgreSQL podporuje vnější spojení tabulek standardními SQL příkazy. -Zde jsou dva příklady: - -SELECT * FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); - -nebo - -SELECT * FROM t1 LEFT OUTER JOIN USING (col); - -Tyto identické dotazy napojí t1.col na t2.col a ještě přidá nepřipojené -řádky z t1 (které nemají obdoby v t2). Pravé spojení (RIGHT JOIN) přidá -nepřipojené řádky z t2. FULL JOIN vrátí všechny řádky, včetně -nepřipojených z tbulek t1 a t2. Klíčové slovo OUTER je nepovinné a váže -se na LEFT, RIGHT a FULL join. Běžné spojení se nazývá INNER JOIN. - -V dřívějších verzích se vnější spojení tabulek mohlo simulovat pomocí -UNION a NOT IN. Například pro spojení tabulek tab1 a tab2, je -následující dotaz ekvivalentní k vnějšímu spojení dvou tabulek: - -SELECT tab1.col2, tab2.col2 FROM tab1, tab2 - WHERE tab1.col1 = tab2.col1 -UNION ALL -SELECT tab1.col2, NULL FROM tab1 - WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2) -ORDER BY col1; - -4.24 Jak provést dotaz napříč několika databázemi? --------------------------------------------------- - -PostgreSQL nenabízí žádný způsob, jak se dotázat do jiné databáze než do -aktuální. Doplněk contrib/dblink umožňuje dotaz do cizí databáze -prostřednictvím funkce. Na straně klienta není problém si otevřít více -simultálních přístupů do různých databází a spojovat výsledek na straně -klienta. - -4.25 Může funkce vrátit více řádků nebo sloupců? ------------------------------------------------- - -V PostgreSQL 7.3 můžete jednoduše vracet více řádků nebo sloupců z -funkce, viz: -http://techdocs.postgresql.org/guides/SetReturningFunctions. - -4.26 Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v PL/pgSQL funkcích? --------------------------------------------------------------------------------- - -Přeložený kód PL/pgSQL funkce je uložen ve vyrovnávací paměti, tj. -funkce je překládána pouze při změně kódu, nikoliv před každým voláním -funkce. Nechtěným vedlejším efektem je, že volání funkce selže, když se -funkce odkazuje na dočasnou tabulku, pokud tato tabulka byla od překladu -funkce zrušena (ačkoliv již byla znovu vytvořena a existuje). Jediným -řešením problému je přístup k dočasné tabulce pomocí EXECUTE, tj. -dynamické provádění dotazu. Tento příkaz zajistí opakovaný překlad -dotazu při každém volání funkce. - -4.27 Jaké jsou možnosti replikace databází? -------------------------------------------- - -Existuje několik dostupných řešení master/slave replikací. Ty povolují -modifikace master databáze a slave databázím umožňují pouze čtení. Na -konci http://gborg.PostgreSQL.org/genpage?replication_research najdete -jejich seznam. Na řešení multi-master replikaci se pracuje na -http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php. - -4.28 Jaké jsou možnosti šifrování databází? -------------------------------------------- - - - - contrib/pgcrypto obsahuje šifrovací funkce použitelné v SQL - dotazech. - - - - - K šifrování přenosu dat z klienta na server, musí být server - přeložen s podporou ssl a přepínač sslv postgresql.conf musí být - nastaven na hodnotu true. Klient musí mít vytvořen záznam hostssl v - pg_hba.conf a také mít povolen režim ssl. Lze použít i jiné - prostředky, nejen nativní podporu ssl v PostgreSQL, např. stunel a - ssh. - - - - - Hesla uživatelů databáze jsou zašifrována počínaje verzí 7.3. Ve - starších verzích toto chování muselo být vynuceno volbou - PASSWORD_ENCRYPTION v postgresql.conf - - - - - Server může běžet na šifrovaném souborovém systému. - ------------------------------------------------------------------------- - -Rozšiřování PostgreSQL -====================== - -5.1 Napsal jsem UDF funkci, PostgreSQL však končí dump core? ------------------------------------------------------------- - -Problém může být způsoben mnoha okolnostmi. Vyzkoušejte si svoji funkci -nejdříve v nějaké jednoduché aplikaci. - -5.2 Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do PostgreSQL? -------------------------------------------------------------------------------- - -Pošlete své rozšíření do konference pgsql-hackers, a ono pak možná -skončí v podadresáři contrib. - -5.3 Jak napsat funkci v C vracející ntici? ------------------------------------------- - -Funkce vracející tabulky jsou podporované PostgreSQL 7.3 a vyšší pro -jazyky C, PL/PgSQL a SQL. Více naleznete v The Programmer's Guide. -Příklady těchto funkcí pro C naleznete v contrib/tablefunc. - -5.4 Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci vzata v potaz. Proč? ---------------------------------------------------------------------------------------------- - -Makefile nemá informace o závislostech mezi hlavičkovými soubory. Musíte -provést make clean a pak make. Pokud používáte gcc, můžete použít -přepínač --enable-depend příkazu configure k automatickému řešení -závislostí překladačem. - - -[1] http://developer.postgresql.org/todo.php -[2] http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM -[3] http://postgresql.ok.cz/PostgreSQL%20Administrator%27sGuide - + 4.22) Proč jsou moje vnořené dotazy používající IN tak pomalé? + + Dřívější verze (před 7.4) spojovali vnořené dotazy k vnějším + sekvenčním čtením výsledku poddotazu pro každý řádek vnějšího dotazu. + Pokud poddotaz vrátil několik málo řádků IN bylo rychlé. Pro ostatní + případy je vhodné nahradit IN EXISTS: + SELECT * + FROM tab + WHERE col IN (SELECT subcol FROM subtab); + + na: + SELECT * + FROM tab + WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col); + + Pro urychlení vytvořete index pro subcol. + + Ve verzi 7.4 a pozdějších, IN používá stejně sofistikovanou techniku + spojování tabulek jako ostatní dotazy a je preferovaný před EXISTS. + + 4.23) Jak provést vnější spojení (outer join)? + + PostgreSQL podporuje vnější spojení tabulek standardními SQL příkazy. + Zde jsou dva příklady: + SELECT * + FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); + + nebo + SELECT * + FROM t1 LEFT OUTER JOIN USING (col); + + Tyto identické dotazy napojí t1.col na t2.col a ještě přidá + nepřipojené řádky z t1 (které nemají obdoby v t2). Pravé spojení + (RIGHT JOIN) přidá nepřipojené řádky z t2. FULL JOIN vrátí všechny + řádky, včetně nepřipojených z tbulek t1 a t2. Klíčové slovo OUTER je + nepovinné a váže se na LEFT, RIGHT a FULL join. Běžné spojení se + nazývá INNER JOIN. + + V dřívějších verzích se vnější spojení tabulek mohlo simulovat pomocí + UNION a NOT IN. Například pro spojení tabulek tab1 a tab2, je + následující dotaz ekvivalentní k vnějšímu spojení dvou tabulek: + SELECT tab1.col2, tab2.col2 + FROM tab1, tab2 + WHERE tab1.col1 = tab2.col1 + UNION ALL + SELECT tab1.col2, NULL + FROM tab1 + WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2) + ORDER BY col1; + + 4.24) Jak provést dotaz z více databází? + + PostgreSQL nepodporuje dotazy do jiné než aktuální databáze. + + contrib/dblink nabízí funkce umožňující provedení dotazu v jiné + databázi. Klient si může otevřít simultální připojení do různých db + bez omezení. + + 4.25) Může funkce vrátit více řádků nebo sloupců? + + V PostgreSQL 7.3 můžete jednoduše vracet více řádků nebo sloupců z + funkce, viz: + http://techdocs.postgresql.org/guides/SetReturningFunctions. + + 4.26) Proč nelze spolehlivě vytvářet a rušit dočasné tabulky v PL/pgSQL + funkcích? + + Přeložený kód PL/pgSQL funkce je uložen ve vyrovnávací paměti, tj. + funkce je překládána pouze při změně kódu, nikoliv před každým voláním + funkce. Nechtěným vedlejším efektem je, že volání funkce selže, když + se funkce odkazuje na dočasnou tabulku, pokud tato tabulka byla od + překladu funkce zrušena (ačkoliv již byla znovu vytvořena a existuje). + Jediným řešením problému je přístup k dočasné tabulce pomocí EXECUTE, + tj. dynamické provádění dotazu. Tento příkaz zajistí opakovaný překlad + dotazu při každém volání funkce. + + 4.27) Jaké jsou možnosti replikace databází? + + Existuje několik dostupných řešení master/slave replikací, tj umožňují + modifikace master databáze a slave databázím umožňují pouze čtení. Na + konci http://gborg.PostgreSQL.org/genpage?replication_research najdete + jejich seznam. Na řešení multi-master replikaci se pracuje na + http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php. + + 4.28) Jaké jsou možnosti šifrování databází? + + * contrib/pgcrypto obsahuje šifrovací funkce použitelné v SQL + dotazech. + * K šifrování přenosu dat z klienta na server, musí být server + přeložen s podporou ssl a přepínač ssl v postgresql.conf musí být + nastaven na hodnotu true. Klient musí mít vytvořen záznam hostssl + v pg_hba.conf a také mít povolen režim ssl. Lze použít i jiné + prostředky, nejen nativní podporu ssl v PostgreSQL, např. stunel a + ssh. + * Hesla uživatelů databáze jsou zašifrována počínaje verzí 7.3. Ve + starších verzích toto chování muselo být vynuceno volbou + PASSWORD_ENCRYPTION v postgresql.conf + * Server může běžet na šifrovaném souborovém systému. + _________________________________________________________________ + + Rozšiřování PostgreSQL + + 5.1) Napsal jsem UDF funkci, PostgreSQL však končí dump core? + + Problém může být způsoben mnoha okolnostmi. Vyzkoušejte si svoji + funkci nejdříve v nějaké jednoduché aplikaci. + + 5.2) Jak mohu přispět nějakými šikovnými datovými typy a funkcemi do + PostgreSQL? + + Pošlete své rozšíření do konference pgsql-hackers, a ono pak možná + skončí v podadresáři contrib. + + 5.3) Jak napsat funkci v C vracející ntici? + + Funkce vracející tabulky jsou podporované PostgreSQL 7.3 a vyšší pro + jazyky C, PL/PgSQL a SQL. Více naleznete v The Programmer's Guide. + Příklady těchto funkcí pro C naleznete v contrib/tablefunc. + + 5.4) Modifikoval jsem zdrojové soubory. Tato změna nebyla při rekompilaci + vzata v potaz. Proč? + + Makefile nemá informace o závislostech mezi hlavičkovými soubory. + Musíte provést make clean a pak make. Pokud používáte gcc, můžete + použít přepínač --enable-depend příkazu configure k automatickému + řešení závislostí překladačem. |