postgres/doc/FAQ_czech
Bruce Momjian b9de4a26cf Here's the patch to fix a lot of markup errors in the HTML FAQs. Doesn't
change content (at least not supposed to).

Magnus Hagander
2005-03-11 21:46:54 +00:00

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-2005, PostgreSQL Global Development Group
Dílčí Copyright (c) 1994-6, Regents of the University of California
Uděluje se oprávnění k užití, rozmnožování, provádění úprav a
rozšiřování tohoto softwaru a dokumentace k němu, pro jakékoli účely,
bez licenčního poplatku a bez písemné licenční smlouvy, za podmínky,
že na všech jeho kopiích je uvedeno oznámení o výše uvedených právech,
jakož i obsah tohoto a dvou následujících odstavců.
THE UNIVERSITY OF CALIFORNIA ("KALIFORNSKÁ UNIVERZITA") NENÍ V ŽÁDNÉM
PŘÍPADĚ ODPOVĚDNA ŽÁDNÉ TŘETÍ OSOBĚ ZA PŘÍMOU, NEPŘÍMOU, ZVLÁŠTNÍ,
NAHODILOU NEBO VÝSLEDNOU ŠKODU, VČETNĚ UŠLÉHO ZISKU, ZPůSOBENOU UŽITÍM
TOHOTO SOFTWARU A DOKUMENTACE K NĚMU, A TO I V PŘÍPADĚ, ŽE THE
UNIVERSITY OF CALIFORNIA BYLA INFORMOVÁNA O MOŽNOSTI VZNIKU TAKOVÉ
ŠKODY.
HE UNIVERSITY OF CALIFORNIA ZEJMÉNA NEPOSKYTUJE JAKÉKOLI ZÁRUKY, A TO
NEJEN ZÁRUKY OBCHODOVATELNOSTI A VHODNOSTI TOHOTO VýROBKU KE
SPECIFICKýM ÚČELůM. NÍŽE UVEDENý SOFTWARE JE POSKYTNUT "JAK STOJÍ A
LEŽÍ" A THE UNIVERSITY OF CALIFORNIA NENÍ POVINNA ZAJISTIT JEHO
ÚDRŽBU, PODPORU, AKTUALIZACI, VYLEPŠENÍ NEBO MODIFIKACI.
Výše uvedené je BSD licence, běžná licence otevřeného zdroje. Není zde
žádné omezení ohledně užití kódu zdroje. Jsme s tím spokojeni a nemáme
v úmyslu na této skutečnosti cokoli měnit.
1.3) Na kterých Unixex lze spustit PostgreSQL?
PostgreSQL běží na všech moderních unixových platformách. V
instalačních instrukcích naleznete aktuální seznam všech platforem na
kterých byla testováním ověřena funkcionalita PostgreSQL.
1.4) Které ne-unixové platformy jsou podporované?
Klient
Knihovna libpq, psql a některé další moduly byly přeloženy pro MS
Windows. Klienta lze provozovat na MS Windows, ten prostřednictvím
TCP/IP protokolu komunikuje se serverem běžícím na některé z
podporovaných Unixových platforem. K překladu lze použít win32.mak a
Win32 knihovny libpq a psql. K databázi PostgerSQL lze přistupovat
skrze rozhraní ODBC.
Server
Server může být na WindowsNT a Win2k provozován pouze s knihovnou
Cygwin, Cygnus Unix/NT porting library. Více pgsql/doc/FAQ_MSWIN v
distribuci nebo MS Windows FAQ na adrese
http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN.
Na nativním portu pro MS Win NT/2000/XP se pracuje. Další informace o
aktuálním stavu PostgreSQL pro Windows naleznet na adrese
http://techdocs.postgresql.org/guides/Windows a
http://momjian.postgresql.org/main/writings/pgsql/win32.html.
Existující port pro Novell Netware 6 naleznete na
http://forge.novell.com.
1.5) Kde mohu získat PostgreSQL?
Primárním anonymním ftp serverem pro PostgreSQL je
ftp://ftp.PostgreSQL.org/pub. Seznam zrcadel naleznete na našich
webových stránkách.
1.6) Kde mohu získat podporu?
Hlavní mailová konference je: pgsql-general@PostgreSQL.org. Slouží k
diskuzím ohledně PostgreSQL. Přihlásíte se zasláním mailu obsahující
následující řádky v těle dopisu (nikoliv v záhlaví - subjectu):
subscribe
end
na adresu pgsql-general-request@PostgreSQL.org.
Můžete si vyžádat denní přehled (diggest), který má zhruba 30K denně
zpráv.
Konference psql-bugs je určena k zasílání zpráv o chybách. Pro
přihlášení pošlete mail se stejným obsahem jako v předchozím případě
na adresu pgsql-bugs-request@PostgreSQL.org.
Do vývojářské konference se přihlásíte odesláním dopisu s již
zmiňovaným obsahem na mailto:pgsql-hackers-request@PostgreSQL.org.
Seznam dalších konferencí naleznete na stránkách PostgreSQL:
http://www.postgresql.org
1.7) Jaká je poslední verze?
Poslední verze PostgreSQL je 7.4.3. Plánujeme uvolnit významnou verzi
každých šest až osm měsíců.
1.8) Jaká je dostupná dokumentace?
Různé manuály, manuálové stránky a několik malých testovacích příkladů
jsou součásti distribuce. Podívejte se do adresáře /doc. Manuály jsou
přístupné online na http://www.PostgreSQL.org/docs.
Na adresách http://www.PostgreSQL.org/docs/awbook.html a
http://www.commandprompt.com/ppbook/ naleznezte dvě online knihy o
PostgreSQL. Seznam dostupné literatury je na
http://techdocs.PostgreSQL.org/techdocs/bookreviews.php. Soubor
technických článků s tematikou PostgresQL najdete na
http://techdocs.PostgreSQL.org/.
psql má užitečný metapříkaz \d sloužící k zobrazení informací o
typech, operátorech, funkcí, agregačních funkcí atd.
Více dokumentace naleznete na našich webových stránkách.
1.9) Kde najdu seznam známých chyb nebo nepodporovaných vlastností?
PostgreSQL podporuje rozšířenou podmnožinu SQL-92. V našem TODO
najdete seznam známých chyb, chybějících vlastností a seznam
vlastností, které budou do systému implementovány v budoucnu (včetně
priorit).
1.10) Jak se mohu naučit SQL?
V knize The PostgreSQL book na
http://www.PostgreSQL.org/docs/awbook.html je vysvětlen jazyk SQL
(vyšla česky). Další dostupnou knihou je
http://www.commandprompt.com/ppbook. Kvalitní návody naleznete na
http://www.intermedia.net/support/sql/sqltut.shtm, a na
http://sqlcourse.com.
Další je Teach Yourself SQL in 21 days, Second Edition na
http://members.tripod.com/er4ebus/sql/index.htm.
Mnoho uživatelů doporučuje The Practical SQL Handbook, Bowman, Judith
S., et al., Addison-Wesley. Jiní preferují The Complete Reference SQL,
Groff et al., McGraw-Hill.
1.11) Nemá PostgreSQL problémy s rokem 2000?
Nemá, můžeme pracovat s datumy po roce 2000 našeho letopočtu i před
rokem 2000 př.n.l.
1.12) Jak se připojit k vývojářskému týmu?
Nejdříve si stáhněte nejnovější zdroje a přečtěte si vývojářskou
dokumentaci na našem webu nebo v distribuci. Pak se přihlašte do
konferencí pgsql-hackers a pgsql-patches. Kvalitní záplaty posílejte
do pgsql-patches.
Právo commit má v CVS archivu asi třinácti lidí. Každý z nich poslal
mnoho kvalitních záplat, takže tehdejší commiters měli jistotu, že
budou předkládat jenom kvalitní záplaty a mohli jim předělit větší
práva.
1.13) Kam podat report o chybě?
Navštivte naši PostgreSQL BugTool stránku na
http://www.PostgreSQL.org/bugs/bugs.php, která obsahuje návod a
směrnice jak podat chybový report.
Ověřte si na našem ftp serveru ftp://ftp.PostgreSQL.org/pub, zda-li
máte nejnovější verzi PostgreSQL a zda-li k ní neexistují nějaké
záplaty.
1.14) Jak je na tom PostgreSQL v porovnání s jinými databázemi?
Existuje několik hledisek jak porovnávat software: vlastnosti, výkon,
spolehlivost, podpora a cena.
Vlastnosti
PostgreSQL má hodně společných vlastností s velkými komerčními
DBMS, např. transakce, vnořené dotazy, spouště, pohledy,
kontrolu referenční integrity a sofistikované zamykání.
Podporuje některé vlastnosti, které tyto systémy nemají,
uživatelem definované typy, dědičnost, pravidla, MVCC
redukující zamykání.
Výkon
Výkonnostně je na tom PostgreSQL podobně jako další komerční
ale i open source databáze, v něčem je rychlejší, jindy
pomalejší. V porovnání s MySQL a podobnými databázovými systémy
je PostgreSQL rychlejší při víceuživatelském přístupu,
složitějších dotazech a zatížení read/write dotazy. MySQL je
rychlejší v jednodušších dotazech s malým počtem uživatelů.
Navíc, MySQL nepodporuje mnohé vlatnosti zmíněné v sekci
vlastnosti. Zapracovali jsme na spolehlivosti a podporovaných
vlastnostech, a výkon zvyšujeme v každé verzi. Zajímavou
stránku porovnávající PostgreSQL a MySQL naleznete na
http://openacs.org/philosophy/why-not-mysql.html. Za vývojem
MySQL není Open Source komunita, ale komerční společnost,
přestože svoje produkty distribuuje jako Open Source.
Spolehlivost
Jsme si vědomi, že databáze musí být spolehlivá, jinak je
nepoužitelná. Snažíme se zveřejňovat dobře otestovaný, stabilní
kód s minimem chyb. Každá verze je více než měsíc v beta
testování, a naše historie verzí ukazuje, že můžeme nabídnout
stabilní, solidní verze, které jsou připraveny pro reálné
nasazení. V této oblasti jsme srovnatelní s dalšími databázemi.
Podpora
Na naší mailové konferenci můžete kontaktovat velkou skupinu
vývojářů a uživatelů.problémů. Nemůžeme garantovat opravu,
nicméně komerční databáze také ne vždy nabídnou opravu. Podle
ohlasů je naše podpora hodnocena lépe než u jiných DBMS a to
díky přímému kontaktu s vývojáři, velkou komunitou uživatelů,
kvalitními manuály a přístupným zdrojovým kódem. Pro uživatele,
kteří vyžadují podporu ke konkrétním případům, existuje placená
podpora (FAQ sekce 1.6).
Cena
PosgreSQL lze volně používat pro nekomerční i komerční použití.
Můžete do svých produktů přidat náš kód bez omezení, respektive
v souladu s podmínkami naší licenční smlouvy (v duchu BSD
licence).
1.15) Jak lze finančně pomoci PostgreSQL?
PosgreSQL má prvotřídní infrastrukturu od našeho začátku v roce 1996.
Vděčíme za to Marku Fournierovi, který založil a spravoval tuto
infrastrukturu několik let.
Kvalitní infrastruktura je velice důležitá pro každý open source
projekt. Předchází nedorozuměním, která velice zdržují pokrok v
projektu.
Tato infrastruktura není laciná. K jejímu zajištění je třeba stále
hradit určité měsíční a jednorázové částky. Pokud máte Vy nebo Vaše
společnost peníze, které nám můžete darovat, obraťe se na
http://store.pgsql.com/shopping/ a darujte je.
Ačkoliv webová stránka zmiňuje PostgreSQL, Inc. vklady jsou určeny
pouze k podpoře projektu PostgreSQL a nepodporují žádnou existující
společnost. Pokud to vyžadujete, můžete poslat kontrolu na naši
kontaktní adresu.
_________________________________________________________________
Pokud máte příklad úspěšného nasazení PostgreSQL, přihlaště se na náš
advocacy site na http://advocacy.postgresql.org.
User client dotazy
2.1) Kde naleznu ODBC ovladače pro PostgreSQL?
Pro PostgreSQL existují dva ODBC ovladače - PsqlODBC a OpenLink ODBC.
PsqlODBC je ke stažení na
http://gborg.postgresql.org/project/psqlodbc/projdisplay.php.
OpenLink můžete získat na http://www.openlinksw.com. Spolupracuje s
jejich klientským programovým vybavením a je dostupný pro všechny jimi
podporované platformy (Win, Mac, Unix, VMS).
Tento ovladač je určen pro ty, kteří vyžadují podporu komerční
kvality, nicméně freeware verze je dostupná a funkční. Dotazy
zasílejte na postgres95@openlink.co.uk.
2.2) Jaké nástroje lze použít pro PostgreSQL a web?
Pěkný úvod do databázových technologií zabezpečujících chod webových
stránek najdete na http://www.webreview.com.
Pro tvorbu webu existuje excelentní rozhraní PHP, které naleznete na
http://www.php.net.
Pro složitější případy se často používá Perl a CGI.pm nebo mod_perl.
2.3) Existuje grafické rozhraní pro PostgreSQL?
Pro PostgreSQL existuje několik grafických rozhraní: PgAccess
(http://www.php.net), PgAdmin III (http://www.php.net), RHDB Admin
(http://sources.redhat.com/rhdb/) a Rekall (
http://www.thekompany.com/products/rekall/). Dále ještě PhpPgAdmin
(http://phppgadmin.sourceforge.net/) což je rozhraní PostgreSQL
založené na web technologii.
Úplnější seznam najdete na
http://techdocs.postgresql.org/guides/GUITools.
2.4) Které programovací jazyky mají podporu pro PostgreSQL?
Většina programovacích jazyků obsahuje rozhraní pro PostgreSQL.
Podívejte se do rozšiřujících modulů Vašeho programovacího jazyka.
Distribuce PostgreSQL obsahuje tato rozhraní:
* C (libpq)
* Embbedded C (ecpg)
* Java (jdbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
Další rozhraní jsou dostupná na http://gborg.postgresql.org v sekci
Drivers/Interfaces.
_________________________________________________________________
Administrativní dotazy
3.1) Jak nainstalovat PostgreSQL jinam než do /usr/local/pgsql?
Použijte volbu --prefix při spuštění configure.
3.2) Při startu postmaster, dostanu chybové hlášení Bad System Call nebo
core dump. Proč?
Důvody mohou být různé, ale nejprve zkontrolujte, zda Váš systém
podporuje System V extensions. PostgreSQL vyžaduje v jádře podporu
sdílené paměti a semaforů.
3.3) Při startu postmastera dostanu hlášení o chybě IpcMemoryCreate. Proč?
Buďto nemáte správně nakonfigurovanou sdílenou paměť v jádře nebo
musite zvětšit její velikost. Potřebná velikost je závislá na
architektuře a na tom, kolik paměťových bufferů a backendů máte
povoleno pro postmastera. Pro většinu systémů s předdefinovaným počtem
backendů a paměťových bufferů je minimum zhruba 1MB. V PostgreSQL
Administrator's Guide naleznete podrobnější informace o sdílené paměti
a semaforech.
3.4) Při startu postmastera dostanu hlášení o chybě IpcSemaphoreCreate.
Proč?
Pokud dostane chybovou zprávu IpcSemaphoreCreate: semget failed (No
space left on device), pak vaše jádro nemá dost volných semaforů.
PostgreSQL vyžaduje jeden semafor pro každý backend v pozadí. Dočasným
řešením je start postmaster s limitem backendů. Použijte přepínač -N s
hodnotou menší než 32. Úplným řešením je zvýšení hodnot SEMMNS a
SEMMNI jadra.
Nefunkční semafory mohou způsobit pád během intenzivních databázových
operací.
Pokud se tato chyba vyskytuje ještě někde jinde, možná nemáte vůbec
nakonfigurovány semafory ve vašem jádře. V PostgreSQL Administrator's
Guide najdete podrobnější popis požadavků na sdílenou pamět a
semafory.
3.5) Jak povolit nebo zakázat přístup z jiných stanic?
Při výchozím nastavení PostgreSQL odepře přístup z jiných stanic než
lokální s použitím UDP. Přístup z jiných strojů není možný dokud jej
nepovolíte nastavením tcpip_socket v postgresql.conf a určením způsobu
autentifikace v $PGDATA/pg_hba.conf.
3.6) Jak ladit databázový stroj na lepší výkon?
Určitě pomohou indexy. Příkaz EXPLAIN ANALYZE Vám umožní sledovat jak
PostgreSQL interpretuje Váš dotaz a které indexy používá.
Při větší dávce INSERTů uvažujte o náhradě příkazem COPY. Ten je
mnohem rychlejší nežli samotný INSERT. Každý příkaz mimo blok BEGIN
WORK/COMMIT se provádí ve vlastní transakci. Zvažte, zda-li by se
nedalo několik příkazů spojit do jedné transakce. Tím se sníží režie
na transakce. Před provedením rozsáhlých změn zrušte indexy, které po
dokončení změn opět vytvořte.
Máte několik dalších možností, jak zlepšit výkon. Můžete zakázat
fsyn() při startu postmastera přepínači -o -F. Tyto přepínače zabrání
fsync(), tj. zápisu na disk po každé transakci.
Můžete zvýšit velikost paměťových bufferů použitých backendy tj.
parametr -B postmasteru. Pokud ale tato hodnota bude příliš velká, tak
možná nespustíte postmastera jelikož dosáhnete limitu sdílené paměti.
Každý buffer má 8K a implicitně je 64 bufferů.
Dále můžete použít přepínač -S k zvýšení limitu paměti pro backendy na
dočasné třídění. Hodnota je míněna v kilobytech a výchozí nastavení je
512, tj. 512K.
Můžete použít příkaz CLUSTER, který uspořádá fyzicky data v tabulkách
podle indexu. Více na manuálových stránkách příkazu CLUSTER.
3.7) Jaké jsou možnosti ladění?
Máte několik možností jak se dostat k užitečným stavovým informacím.
Zaprvé, při překladu použijte přepínač --enable-cassert, tím se zapne
monitorování a následné zastavení aplikace, když se proces v backendu
dostane do neočekávaného stavu.
Jak postmaster tak postgres má několik přepínačů umožňujících ladění.
Postmaster nastartujte tak, abyste si byli jisti, že je standartní
výstup a standartní chybový výstup přesměrován do souboru logu,
například:
cd /usr/local/pgsql
./bin/postmaster > server.log 2>&1 &
Tím se vytvoří log v adresáři PostgreSQL, Tento soubor obsahuje
užitečné informace o problémech a chybách vyskytlých se na serveru.
Postmaster má přepínač -d určující, jak podrobné mají být reportované
informace, tj. debug level. Pozor, při velké hodnotě debug levelu
rychle roste velikost souboru logu.
Pokud neběží postmaster, můžete spustit backend PostgreSQL z příkazové
řádky a napsat svůj SQL dotaz přímo v backendu (doporučeno pouze pro
ladění). Dotaz je v tomto případě ukončen novou řádkou, nikoliv
středníkem. Pokud máte aplikaci přeloženou s ladícími symboly, můžete
použít debbuger k monitorování procesu. Pokud není backend spuštěn
postmasterem, pak neběží ve svém obvyklém prostředí a tudíž některé
problémy dané interakcí mezi backendy nemohou být nasimulovány.
Pokud běží postmaster, spusťe psql v jednom okně a pak si zjistěte PID
procesu postgres použitého psql. V debuggeru sepřipojte k postgresql
PID. Pak nastavte breakpointy v debuggeru a zadejte dotaz v psql.
Pokud ladíte startup postgresu, pak nastavte PGOPTIONS="-W n" a spusťe
psql. Tento přepínač způsobí pauzu n sekund, takže budete mít čas se
připojit k procesu, a nastavit breakpointy a pokračovat v startup
posloupnosti.
Pro ladění a měření výkonu mohou být užitečné přepínače -s, -A a -t
programu postgres (backend).
Můžete provést překlad s profilací, tak abyste viděli kolik času
zabírají jednotlivé funkce. Soubory s profily backendů jsou uloženy v
adresáři pgsql/data/base/dbname. Profil klienta pak v jeho aktuálním
adresáři. Korektní profilace v prostředí Linux požaduje konfiguraci
systému s parametrem -DLINUX_PROFILE.
3.8) Proč dostanu "Sorry, too many clients", když se zkouším připojit?
Zvyšte limit postmastera na maximální počet současně spuštěných
backendů.
Výchozí hodnota je 32 backendů. Tuto hodnotu zvýšíte zastavením a
opětovným spuštěním postmastera s parametrem -N nebo úpravou
postgresql.conf.
Při zvýšení hodnoty -N nad 32 musíte zvýšit hodnotu -B nad výchozí 64,
-B musí být minimálně dvakrát větší, nebo ještě lépe více.
Pravděpodobně zjistíte, že pro velký počet procesů backendu je nutné
zvýšit některé parametry jádra. Jsou to především maximální velikost
sdílené paměti SHMMAX, maximální počet semafórů SEMMNS a SEMMNI,
maximální počet procesů NPROC, maximální počet procesů uživatele
MAXUPRC a maximální počet otevřených souborů NFILE a NINODE. Důvod pro
omezení maximálního počtu backendů je fakt, že by mohlo dojít k
vyčerpání zdrojů Vašeho systému.
3.9) K čemu slouží adresář pgsql_tmp?
Tento adresář obsahuje dočasné soubory vytvořené exekutorem dotazů.
Například, když je nutné třídění k zajištění ORDER BY a třídění má
větší nároky na prostor než povoluje parametr -S backendu, pak je
vytvořen dočasný soubor k uložení extra údajů.
Dočasné soubory jsou obvykle mazány automaticky, ale může se stát, že
během třídění server spadne. Zastavení a další start postmastera
zajistí odstranění souborů s těchto adresářů.
3.10) Proč je požadováno dump a obnovení (load) databáze během upgrade mezi
velkými verzemi PostgreSQL?
PostgreSQL se minimálně mění během malých verzí, takže např. při
upgrade z 7.2 na 7.2.1 není nutné dump a load databáze. Ale výynamné
verze často mění interní formát systémových tabulek a datových
souborů. Tyto změny jsou natolik rozsáhlé, že nelze zajistit zpětnou
kompatibilitu pro datové soubory. Dump uloží data v obecném formátu,
takže mohou být načtena a používána v novém interním formátu.
_________________________________________________________________
Provozní dotazy
4.1) Čím se liší binární a normální kurzor?
Popis najdete v manuálové stránce DECLARE
4.2) Jak získat pouze první řádek dotazu? Náhodný řádek?
Podívejte se do man. stránky příkazu FETCH, nebo použijte SELECT ...
LIMIT ...
I když potřebujete získat pouze prvních několik řádků, je třeba
zpracovat všechna data, např. pokud dotaz má ORDER BY. Pokud však
existuje index, který odpovídá ORDER BY, PostgreSQL může získat pouze
prvních n řádků a ukončit zpracování dotazu.
K získání náhodného řádku použijte:
SELECT col
FROM tab
ORDER BY random()
LIMIT 1;
4.3) Jak získám seznam tabulek nebo jinak jak jej získá psql?
Příkaz \dt v psql zobrazí seznam tabulek. Úplný seznam příkazů psql
dostanete příkazem \?. Také se můžete podívat do zdrojových kódů psql
do souboru pgsql/src/bin/psql/describe.c. Ten obsahuje SQL příkazy,
které se používají v psql metapříkazech. Dále můžete spustit psql s
přepínačem -E, který způsobí zobrazení každého dotazu, které
zpracování metapříkazu vyvolá. PostgreSQL nabízí SQLi INFORMATION
SCHEMA s tabulkami obsahující informace o databázi.
4.4) Jak odstraním sloupec tabulky, jak změním jeho typ?
Počínaje verzí 7.3 můžete použít příkaz ALTER TABLE DROP COLUMN. Ve
starších verzích můžete použít následující postup:
BEGIN;
LOCK TABLE old_table;
SELECT ... -- mimo sloupec, který chceme odstranit
INTO TABLE new_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
COMMIT;
Pro změnu typu sloupce je třeba provést:
BEGIN;
ALTER TABLE tab ADD COLUMN new_col new_data_type;
UPDATE tab SET new_col = CAST(old_col AS new_data_type;
ALTER TABLE tab DROP COLUMN old_col;
COMMIT;
Poté proveďte VACUUM FULL tab - uvolníte tím diskový prostor zabraný
nyní již neplatnými řádky.
4.5) Jaká je maximální velikost řádku, tabulky a databáze?
PostgreSQL má tato omezení:
Maximální velikost databáze: neomezena (existují 32TB db)
Maximálné velikost tabulky: 32 TB
Maximální velikost řádky: 1.6 TB
Maximální velikost položky 1 GB
Maximální počet řádků v tabulce: neomezeno
Maximální počet sloupců v tabulce: 250-1600 podle typů
Maximální počet indexů na tabulce: neomezeno
Ve skutečnosti nic není neomezeno, limitem bývá vždy dostupná disková
paměť nebo velikost operační paměti. Pokud máte některou z těchto
hodnot neobvykle velkou, může dojít ke snížení výkonu.
Maximální velikost tabulky je 32 TB a nevyžaduje podporu velkých
souborů operačním systémem. Velké tabulky se ukládají do několika 1 GB
souborů takže limity souborového systému nejsou podstatné.
Maximální velikost tabulky a maximální počet sloupců můžeme
zečtyřnásobit nastavením velikosti bloku na 32K.
4.6) Kolik diskového prostoru je potřeba k uložení dat z
normálního textového souboru?
PostgreSQL vyžaduje až pětinásobek diskového prostoru k uložení dat z
textového souboru.
Například, uvažujme soubor se 100 tisíci řádky obsahující na každé
řádce celé číslo a textový popis. Text je v průměru dvacet bytů
dlouhý. Textový soubor bude 2.8 MB dlouhý. Velikost databáze
obsahující odpovídající data bude zhruba 6.4 MB.
36 bytů: hlavička řádku (přibližně)
24 bytů: jedna celočíselná položka a jedna textová
+ 4 byty: ukazatel na stránku k ntici
------------------------------------------------------
64 bytů na řádek
Velikost datové stránky PostgreSQL je 8KB
8192 bytů na stránce
---------------------- = 128 řádek na stránku
64 bytů za řádek
100000 řádek
-------------------- = 782 stránek (zaokrouhleno nahoru)
128 řádek na stránce
782 * 8192 = 6, 406, 144 bytů (6.4 MB)
Indexy nemají tak velkou režii, ale mohou být také velké, protože
obsahují indexovaná data.
Hodnoty NULL jsou uloženy v bitmapách, takže spotřebují jen velmi málo
diskového prostoru.
4.7) Jak získám seznam vytvořených tabulek, indexů, databází?
psql má sadu metapříkazů k zobrazení těchto informací. Jejich seznam
získáte příkazem \?. Dále se můžete podívat na obsah systémových
tabulek začínajících pg_. Spuštění psql s parametrem -l provede výpis
názvů všech databází.
Soubor pgsql/src/tutorial/syscat.source obsahuje SELECTy přistupující
k systémovým tabulkámm.
4.8) Můj dotaz je pomalý a nepoužívá vytvořené indexy. Proč?
Každý dotaz nemusí nutně použít existující indexy. Index se použije
tehdy, když je tabulka větší než určitá minimální velikost, a dotaz
vybírá pouze procentuálně malou část řádků tabulky. To proto, že
náhodný přístup k disku daný čtením indexu může být pomalejší než
lineární čtení tabulky nebo sekvenční čtení.
PostgreSQL rozhoduje o použití indexů na základě statistiky přístupů k
tabulce. Tyto statistiky se shromažďují příkazy VACUUM ANALYZE nebo
ANALYZE. Díky statistikám má optimizer informaci o počtu řádek v
tabulce a může lépe rozhodnout o použití indexů. Statistiky se uplatní
při určení optimálního pořadí a metody spojení tabulek. Statistiky by
se měli aktualizovat opakovaně, tak jak se mění obsah tabulek.
Indexy nejsou obyčejně použity pro setřídění nebo spojení tabulek.
Sekvenční zpracování následované explicitním tříděním je obyčejně
rychlejší než indexní čtení na velké tabulce.
Jinak je tomu v případě použití LIMIT a ORDER BY, při kterém se
většinou index použije, výsledkem je pouze malá část tabulky. Funkce
MAX() a MIN() nepoužívají indexy, ale je možné tutéž hodnotu získat:
SELECT col
FROM tab
ORDER BY col [ DESC ]
LIMIT 1;
Pokud si myslíte, že optimizer mylně zvolil sekvenční prohledávání
tabulky, použijte příkaz SET enable_seqscan TO 'off' a zkuste zda je
indexní prohledávání rychlejší.
Při vyhledávání na základě vzoru jako je např. operátor LIKE nebo ~ se
indexy použíjí pouze za určitých skutečností:
* začátek hledaného vzoru musí být ukotven k začátku, tj.
+ vzor LIKE nesmí začínat %
+ ~ regulární výraz musí začínat ^
* vzor nesmí začínat intervalem, např. [a-e]
* vyhledávaní, které není Case sensitiv jako je ILIKE nebo ~*
nepoužívá indexy. Můžete ale použít funkcionální indexy, které
jsou posány v sekci 4.12
* při inicializaci databáze (initdb) musí být použito C locale
(pozn. překladatele - tudíž v našich podmínkách nepoužitelné,
nepracovalo by české třídění).
4.9) Jak zjistím, jak optimizer dotazu vyhodnocuje můj dotaz?
Podívejte se do manuálové stránky příkazu EXPLAIN.
4.10) Co to je R-tree index?
R-tree index se používá pro indexování prostorových dat. Hash index
nemůže obsloužit prohledávání oblastí. B-tree index může řídit
vyhledání oblastí v jedné dimenzi. R-tree index může podporovat
hledání v multidimenzionálních datech. Použijeme-li například R-tree
index na atributy typu point, pak systém může efektivně odpovědět na
dotaz - vyber všechny body uvnitř obdélníků.
Původní návrh R-tree je Guttman, A. "R-trees: A Dynamic Index
Structure for Spatial Searching." Proceedings of the 1984 ACM SIGMOD
Int'l Conf on Mgmt of Data, 45-57
Tyto materiály naleznete v Stonebraker's "Readings in Database
Systems".
Vestavěné R-tree může sloužit k indexaci polygonů a oblastí.
Teoreticky můžeme R-tree použít i pro více dimenzí (jiné než 3D). Ve
skutečnosti ale takové rozšíření R-tree vyžaduje trochu práce a ve
součastnosti chybí dokumentace jak na to.
4.11) Co je Genetic Query Optimizer?
GEQO modul urychluje optimalizaci dotazů při spojování množství
tabulek metodou Genetických algoritmů (GA). To umožňuje získat velkého
množství variant spojení při neúplném prohledáváním.
4.12) Jak provést vyhledávání regulárního výrazu case sensitiv, insensitiv?
Jak použít index pro case insensitive vyhledávání?
Operátor ~ slouží k porování s regulárním výrazem, jeho modifikace *~
představuje case insensitive vyhledávání. Jedná se o obdobu LIKE a
ILIKE.
Pro vyhledávání bez ohledu na velká malá písmena použijeme:
SELECT *
FROM tab
WHERE lower(col) = 'abc';
V tomto případě se nepoužije standardní index. Nicméně, použije se
funkcionální index, pokud jej vytvoříte:
CREATE INDEX tabindex ON tab (lower(col));
4.13) Jak v dotazu detekovat, že položka je NULL?
Určíte pomocí IS NULL nebo IS NOT NULL
4.14) Jaké jsou rozdíly mezi různými znakovými typy?
Typ Interní název Poznámka
--------------------------------------------------------------------------
VARCHAR(n) varchar omezeno maximální délkou, bez doplnění mezerami
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.