1,2d0 < Často kladené dotazy (FAQ) PostgreSQL < ===================================== 4,15c2 < 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? --- > Často kladené dotazy (FAQ) PostgreSQL 17,21c4 < 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? --- > Poslední aktualizace: Středa 23. června 21:10:00 EST 2004 23,28c6 < 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? --- > Současný správce: Bruce Momjian (pgman@candle.pha.pa.us) 30,37c8 < 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? --- > Přeložil: Pavel Stěhule (stehule@kix.fsv.cvut.cz) 39,41c10,801 < 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? --- > Aktuální verzi tohoto dokumentu naleznete na adrese: > http://www.PostgreSQL.org/docs/faqs/FAQ.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. > > 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-2004, 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. Více pgsql/doc/FAQ_MSWIN v > distribuci bebo 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 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) 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 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. 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)); 43,44c803 < 3.10 Proč je požadováno dump a obnovení (load) databáze během upgrade < mezi velkými verzemi PostgreSQL? --- > 4.13) Jak v dotazu detekovat, že položka je NULL? 46,56c805 < 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? --- > Určíte pomocí IS NULL nebo IS NOT NULL 58,851c807 < 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? < --------------------------------------------------- --- > 4.14) Jaké jsou rozdíly mezi různými znakovými typy? 861,906c817,818 < 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? < -------------------------------------------------- --- > S interními názvy se setkáte v systémovém katalogu a v některých > chybových hlášeních. 908,910c820,971 < 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 --- > 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 > /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ťe 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é. 912,913c973,974 < newid = execute("SELECT nextval('person_id_seq')"); < execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')"); --- > Pokud používáte interface podobné ODBC musíte nastavit set > auto_commit off 915,917c976 < 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. --- > 4.21) Jak vytvořit sloupec obsahující implicitně aktuální datum? 919,1038c978 < 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 --- > Použijte CURRENT_TIMESTAMP 1042,1188c982 < 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é? 1189a984,1106 > 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 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í, 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.