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