Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
c763cfa9
Commit
c763cfa9
authored
Apr 29, 2002
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Polish FAQ from Marcin Mazurek.
parent
ea43fec2
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
2622 additions
and
0 deletions
+2622
-0
doc/FAQ_polish
doc/FAQ_polish
+1174
-0
doc/src/FAQ/FAQ_polish.html
doc/src/FAQ/FAQ_polish.html
+1448
-0
No files found.
doc/FAQ_polish
0 → 100644
View file @
c763cfa9
Frequently Asked Questions (FAQ) o PostgreSQL
Ostatnia aktualizacja: Thu Apr 18 00:44:51 EDT 2002
Obecny maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
Tl/umaczenie: Marcin Mazurek (m.mazurek@netsync.pl)
Najbardziej aktualna wersje tego dokumentu mozna znalezc pod adresem:
http://www.PostgreSQL.org/docs/faq-english.html.
Odpowiedzi na pytania dotyczace konkretnych systemw operacyjnych
mozna znalezc pod adresem:
http://www.PostgreSQL.org/users-lounge/docs/faq.html.
_________________________________________________________________
Pytania oglne
1.1) Co to jest PostgreSQL? Jak to wymawiac?
1.2) Jaka licencja chroniony jest PostgreSQL?
1.3) Na jakich systemach Unixowych dzial/a PostreSQL?
1.4) Na jakich nie-Unixowych systemach dzial/a PostgreSQL?
1.5) Skad moge sciagnac PostgreSQL?
1.6) Gdzie mozna szukac wsparcia technicznego?
1.7) Jaka jest ostatnia dostepna wersja?
1.8) Jaka dokumentacja jest dostepna?
1.9) Gdzie moge znalezc informacje o znanych bl/edach czy brakujacych
rozwiazanich?
1.10) Jak moge sie nauczyc SQL?
1.11) Czy PostgreSQL ma rozwiazany problem Y2K?
1.12) Jak moge sie przyl/aczyc do grupy osb bezposrednio pracujacych
nad rozwojem PostgreSQL?
1.13) Jak moge zgl/aszac bl/edy?
1.14) Jak mozna porwnac PostgreSQL w stosunku do innych DBMS?
1.15) W jaki sposb moge wesprzec finansowo PostgreSQL?
Pytania uzytkownikw
2.1) Czy sa jakies driwery ODBC dla PostgreSQL?
2.2) Jakie istnieja narzedzia pozwalajace na dostep do PostgreSQL
przez www?
2.3) Czy istnieje jakies GUI dla PostgreSQL? Narzedzie do
raportowania? Interfejs dla "embedded query language"?
2.4) Za pomoca jakich jezykw programowania mozna sie komunikowac z
PostgreSQL?
Pytania administratora
3.1) Jak moge zainstalowac PostgreSQL w innej lokalizacji niz
/usr/local/pgsql?
3.2) Podczas startu postmaster'a, otrzymuje komunikat: Bad System Call
lub "core dumped". Dlaczego?
3.3) Podczas startu postmaster'a, otrzymuje komunikato bl/edzie:
IpcMemoryCreate. Dlaczego?
3.4) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcSemaphoreCreate. Dlaczego?
3.5) W jaki sposb moge kontrolowac pol/aczenia z innych hostw?
3.6) Jak powinienem skonfigurowac system baz danych aby uzyskac lepsza
wydajnosc?
3.7) Jakie sa mozliwosci wyszukiwania bl/edw?
3.8) Skad sie bierze komunikat: "Sorry, too many clients" podczas
prby pol/aczenia sie z baza danych?
3.9) Co to za pliki typu pg_sorttempNNN.NN , ktre znajduja sie w
katalogu z plikami bazy danych?
Pytania dotyczace uzytkowania
4.1) Jaka jest rznica pomiedzy kursorami binarnymi (binary cursors) i
zwykl/ymi kursorami (normal cursors)?
4.2) Jak moge pobrac za pomoca SELECT jedynie kilka pierwszych wynikw
zapytania?
4.3) Jak moge uzyskac liste wszystkich tabel czy innych rzeczy pod
psql?
4.4) Jak usunac kolumne z tabeli?
4.5) Jaki jest maksymalny rozmiar dla rzedu, tabeli i bazy danych?
4.6) Jak duzo miejsca w bazie danych jest potrzebne aby przechowac
dane ze zwyczajnego pliku tekstowego?
4.7) Jak moge sprawdzic jakie tabele, klucze, bazy danych i
uzytkownicy sa utworzeni?
4.8) Moje zapytania sa wolne lub nie uzywaja kluczy. Dlaczego?
4.9) Jak moge sprawdzic w jakis sposb "query optimizer" wykonuje moje
zapytanie?
4.10) Co to jest "R-tree index"?
4.11) Co to jest "Genetic Query Optimizer"?
4.12) Jak moge uzywac wyrazen regularnych w zapytaniach i zapytan
case-insensitive w wyrazeniach regularnych? Jak korzystac z indeksw
dla zapytan case-insensitive?
4.13) Jak sprawdzic w zapytaniu czy pole ma wartosc NULL?
4.14) Jaka jest rznica pomiedzy rznymi typami tekstowymi (character
types)?
4.15.1) Jak moge utworzyc pole typu int, ktre samo zwieksza swoja
wartosc?
4.15.2) Jak pobrac wartosc pola typu SERIAL po wykonaniu insert'u?
4.15.3) Czy uzycie currval() i nextval() nie doprowadzi do "race
condition" z innymi uzytkownikami?
4.15.4) Dlaczego numery sekwencji nie sa ponownie uzywane przy
przerwaniu transakcji? Skad sie biora luki w numerowaniu kolumny
tabeli sekwencjami/SERIALem?
4.16) Co to jest OID? Co to jest TID?
4.17) Jakie jest znaczenie niektrych terminw w PostgreSQL?
4.18) Skad bierze sie ten bl/ad: "ERROR: Memory exhausted in
AllocSetAlloc()"?
4.19) Jak sprawdzic jakiej wersji PostgreSQL uzywam?
4.20) Dlaczego operacje, ktre wykonuje na duzych obiektach
"large-object" zwracaja komunikat: "invalid large obj descriptor"?
4.21) Jak stworzyc kolumne ktrej domyslna wartoscia bedzie biezacy
czas?
4.22) Dlaczego zapytania uzywajace IN sa takie wolne?
4.23) Jak wykonac "outer join"?
4.24) Jak wykonywac zapytanie uzywajace kilku baz danych jednoczesnie?
4.25) Jak zwrcic w funkcji wiele rzedw lub kolumn?
Rozwijanie PostgreSQL
5.1) Napisal/em wl/asna funkcje. Kiedy uzyje jej w psql, program
zrzuca pamiec (dump core)?
5.2) Jak moge dodac/zgl/osic nowe typy czy funkcje do PostgreSQL?
5.3) Jak napisac funkcje C zwracajaca krotke (tuple)?
5.4) Zmienil/em plik zrdl/owy. Dlaczego po rekompilacji nie widac
zmiany?
_________________________________________________________________
Pytania oglne
1.1) Co to jest PostgreSQL? Jak to wymawiac?
PostgreSQL wymawia sie Post-Gres-kju-el.
PostgreSQL jest rozszerzeniem systemu zarzadzania bazami danych -
POSTGRES, kolejna generacja rozwojowego prototypu DBMS. Mimo, ze
PostgreSQL zachowal/ bardzo dobrze zbudowany model danych (data model)
i bogaty zestaw typw danych POSTGRES'a, zastapil/ PostQuel'owy jezyk
zapytan z rozbudowanym podzbiorem jezyka SQL. PostgreSQL jest
oprogramowaniem darmowym z dostepnymi cal/ymi zrdl/ami.
Rozwj PostgreSQL jest prowadzony przez grupe ludzi z Internetu,
komunikujacych sie poprzez mailowe listy dyskusyjne PostgreSQL.
Obecnym koordynatorem jest Marc G. Fournier (scrappy@PostgreSQL.org).
(Zobacz ponizej jak sie przyl/aczyc). Ta grupa ludzi jest
odpowiedzialna za cal/y rozwj PostgreSQL.
Autorami PostgreSQL 1.01 byli Andrew Yu and Jolly Chen. Wiele innych
osb pomogl/o przy portowaniu, testowaniu, debugowaniu, i rozwijaniu
kodu. Oryginalny kod Postgresa, na ktrym zostal/ oparty PostgreSQL,
byl/ wysil/kiem studentw oraz pracownikw pracujacych pod
kierownictwem profesora Michael'a Stonebraker'a z University of
California w Berkeley.
Oryginalna nazwa oprogramowania w Berkeley byl/ Postgres. Po dodaniu
obsl/ugi SQL w 1995, nazwa zostal/a zmieniona na Postgres95. Pod
koniec roku 1996 nazwa zostal/a zmieniona na PostgreSQL.
1.2) Jaka licencja chroniony jest PostgreSQL?
PostgreSQL objety jest nastepujaca licencja:
PostgreSQL Data Base Management System
Portions copyright (c) 1996-2002, PostgreSQL Global Development Group
Portions Copyright (c) 1994-6 Regents of the University of California
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written
agreement is hereby granted, provided that the above copyright notice
and this paragraph and the following two paragraphs appear in all
copies.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND
ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
Tekst powyzej, jest klasyczna licencja BSD. Nie posiada ona zadnych
restrykcji co do uzywania kodu zrdl/owego. Podoba nam sie i nie
zamierzamy jej zmieniac.
1.3) Na jakich systemach Unixowych dzial/a PostreSQL?
PostgreSQL powinien dzial/ac na wszystkich nowych Unix-podobnych
systemach. Platformy, ktre zostal/y szczegl/owo przetestowane
podczas publikowania PostgreSQL sa wymienione w dokumentacji
opisujacej instalacje.
1.4) Na jakich nie-Unixowych systemach dzial/a PostgreSQL?
Klient
Mozliwa jest kompilacja bibliteki C libpq C, psql oraz innych
interfejsw i uruchamianie ich na platformie MS Windows. W tym wypadku
klient jest uruchamiany na MS Windows a z serwerem komunikuje sie
poprzez TCP/IP. Serwer moze dzial/ac na dowolnej wspieranej platformie
Unixowej. Plik win31.mak jest dol/aczony do zrdel/, aby mozna byl/o
stworzyc biblioteke libpq oraz program psql dzial/ajace w srodowisku
Win32. PostgreSQL moze sie takze komunikowac z klientami ODBC.
Serwer
Serwer moze byc uruchamiany na Windows NT i Win2k uzywajac bibliotek
Cygwin, Cygnus Unix/NT. W pliku pgsql/doc/FAQ_MSWIN znajdujacym sie w
zrdl/ach lub pod adresem: MS Windows FAQ na naszych stronach. Nie
planujemy tworzyc portu przeznaczonego docelowo dla platformy
Microsoft.
1.5) Skad mozna sciagnac PostgreSQL?
Gl/wny serwer ftp z dostepem "anonymous" dla PostgreSQL znajduje sie
ftp://ftp.PostgreSQL.org/pub. jesli szukasz mirrorw sprawdz nasza
gl/wna strone www.
1.6) Gdzie mozna szukac wsparcia technicznego?
Adres gl/wnej listy mailowej: pgsql-general@PostgreSQL.org. Jest ona
przeznaczona dyskusjom dotyczacym spraw zwiazanych z PostgreSQL. Zeby
zapisac sie na liste, wyslij email z nastepujacymi liniami w tresci
maila (nie w temacie):
subscribe
end
na adres: pgsql-general-request@PostgreSQL.org.
Dostepna jest takze lista wysyl/ajaca digesty. Aby zapisac sie na nia,
wyslij email na adres: pgsql-general-digest-request@PostgreSQL.org z
trescia maila zawierajaca:
subscribe
end
Digesty sa wysyl/ane do czl/onkw listy, kiedy na gl/wna liste dotrze
ok 30k wiadomosci.
Dostepna jest takze lista poswiecona bl/edom znalezionym w PostgreSQL.
Aby zapisac sie na nia wyslij email na adres:
pgsql-bugs-request@PostgreSQL.org z trescia maila zawierajaca:
subscribe
end
Lista poswiecona dyskusjom developerw jest dostepna pod adresem:
pgsql-hackers-request@PostgreSQL.org Aby sie na nia zapisac wyslij na
jej adres mail z trescia:
subscribe
end
Dodatkowe informacje o listach mailowych dotyczacych PostgreSQL mozna
znalezc na stronach WWW PostgreSQL pod adresem:
http://www.PostgreSQL.org
W sieci EFNet istnieje kanal/ IRC #PostgreSQL. Ja, do pol/aczenia sie
z kanal/em uzywam Unixowego polecenia irc -c '#PostgreSQL' "$USER"
irc.phoenix.net.
Lista firm oferujacych wsparcie na zasadach komercyjnych znajduje sie
pod adresem:
http://www.postgresql.org/users-lounge/commercial-support.html.
1.7) Jaka jest ostatnia dostepna wersja?
Ostatnia dostepna wersja PostgreSQL to 7.2.1.
Planujemy publikowanie kolejnych wersji co cztery miesiace.
1.8) Jaka dokumentacja jest dostepna?
Kilka manuali, stron podecznika man, oraz kilka przykl/adw do
testowania sa zal/aczone w samej dystrybucji. Znajduja sie one w
katalogu /doc. Manual moze byc takze przegladany poprzez strony www
pod adresem http://www.PostgreSQL.org/users-lounge/docs/.
Istnieja takze dwie ksiazki dostepne online pod adresami
http://www.PostgreSQL.org/docs/awbook.html i
http://www.commandprompt.com/ppbook/. Lista ksiazek o PostgreSQL,
ktre mozna kupic znajduje sie pod adresem
http://www.postgresql.org/books/. Zbir technicznych artykul/w o
PostgreSQL znajduje sie pod adresem http://techdocs.postgresql.org/.
psql posiada kilka wbudowanych polecen \d, za pomoca ktrych mozna
sprawdzic informacje dotyczace typw, operatorw, funkcji, aggregatw
itd.
Na naszej stronie mozna znalezc duzo wiecej dokumentacji.
1.9) Gdzie mozna znalezc informacje o znanych bl/edach czy brakujacych
rozwiazanich?
PostgreSQL wspiera rozszerzony podzbir standardu SQL-92. Sprawdz
nasza liste TODO aby znalezc informacje o znanych problemach,
brakujacych rozwiazaniach czy przyszl/ych planach.
1.10) Jak moge sie nauczyc SQL?
Ksiazka o PostgreSQL http://www.PostgreSQL.org/docs/awbook.html uczy
SQL. Jest jeszcze inna ksiazka o PostgreSQL dostepna pod adresem:
http://www.commandprompt.com/ppbook. Dobry tutorial mozesz znalezc pod
adresem: http://www.intermedia.net/support/sql/sqltut.shtm, oraz
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
i http://sqlcourse.com.
Jeszcze inny to "Teach Yourself SQL in 21 Days, Second Edition" pod
adresem: http://members.tripod.com/er4ebus/sql/index.htm
Wielu z naszych uzytkownikw poleca The Practical SQL Handbook,
Bowman, Judith S., et al., Addison-Wesley. Inni polecaja The Complete
Reference SQL, Groff et al., McGraw-Hill.
1.11) Czy PostgreSQL ma rozwiazany problem Y2K?
Tak, bez problemu radzimy sobie z datami po roku 2000 AD, oraz przed
rokiem 2000 BC.
1.12) Jak moge sie przyl/aczyc do grupy osb bezposrednio pracujacych nad
rozwojem PostgreSQL?
Przede wszystkim sciagnij ostatnie dostepne zrdl/a i przeczytaj
dokumentacje przeznaczona dla developerw na naszej stronie www lub
dostepna takze w zrdl/ach PostgreSQL. Nastepnie zapisz sie na listy
mailowe pgsql-hackers i pgsql-patches. I na koniec, wysyl/aj nam
wysokiej jakosci patch'e na liste pgsql-patches.
Jest okol/o 12 osb, ktre maja uprawnienia do commit'owania w CVS
PostgreSQL'a. Kazdy z nich submitowal/ tak wiele wysokiej jakosci
patchy, ze stal/o sie niemozliwe dla obecnych commiterw byc z nimi na
biezaco, majac pewnosc ze sa to poprawki wysokiej jakosci.
1.13) Jak moge zgl/aszac bl/edy?
Zajrzyj na strone PostgreSQL BugTool, na ktrej opisane sa wskazwki
jak zgl/aszac informacje o bl/edach.
Zajrzyj takze na nasz ftp ftp://ftp.PostgreSQL.org/pub, aby sprawdzic
czy nie ma nowszych wersji PostgreSQL czy patchy.
1.14) Jak mozna porwnac PostgreSQL w stosunku do innych DBMS?
Jest kilka sposobw oceny softwaru: mozliwosci, wydajnosc, stabilnosc,
wsparcie i cena.
Mozliwosci
PostgreSQL posiada mozliwosci dostepne w duzych, komercyjnych
systemach DBMS, takie jak transakcje, podzapytania
(subselects), triggery, widoki, klucze obce, referential
integrity, oraz wyrafinowany system blokowania. Mamy takze
wl/asciowsci ktrych inni nie posiadaja, jak typy definiowane
przez uzytkownika, dziedziczenie, rules, multi-version
concurrency control, ktra redukuje problemy z blokowaiem (lock
contention).
Wydajnosc
PostgreSQL dzial/a w dwch trybach. Standardowy tryb fsync
zrzuca kazda zakonczona transakcje na dysk, gwarantujac w ten
sposb to, ze jesli system operacyjny sie zawiesi lub straci
zasilanie wciagu kilku nastepnych sekund, wszystkie Twoje dane
zostana bezpiecznie zapisane na dysku. W tym trybie, jestesmy
wolniejsi niz wiekszosc komercyjnych baz danych, czesciowo
dlatego ze niewiele z nich wykonuje taki sposb zapisywania
danych jako domyslne ustawienie. W trybie no-fsync z regul/y
jestesmy szybsi niz komercyjne bazy danych, chociaz w tym
wypadku zawieszenie sie systemu moze spowodowac uszkodzenie
danych. Pracujemy nad tym, aby stworzyc posredni tryb, ktry
powoduje mniejsza redukcje wydajnosci niz tryb fsync i pozwoli
na integralnosc danych w przeciagu 30 sekund do zal/amania sie
systemu operacyjnego.
Porwnujac do MySQL czy innych prostych baz danych, jestesmy
wolniejsi przy wykonywaniu insertw/updatw przez narzut
spowodowany przez transakcje. Oczywiscie MySQL nie posiada
zadnej z wymienionych wyzej mozliwosci. PostgreSQL zostal/
zbudowany aby byc DBMS elastycznym i bogatym z rznorakie
mozliwosci, aczkolwiek dbamy, aby poprawiac jego wydajnosc
poprzez analize kodu zrdl/owego i profilowanie. Ciekawe
porwnanie PostgreSQL i MySQL mozna znalezc pod adresem
http://openacs.org/why-not-mysql.html
Kazde pol/aczenie klienta jest obsl/ugiwane przez nas poprzez
stworzenie nowego procesu Unixowego. Procesy backendu dziela
bufory danych oraz informacje o blokadach. Uzywajac wielu
procesorw, rzne backendy moga bez problemu dzial/ac na
rznych procesorach.
Stabilnosc
Zdajemy sobie sprawe, ze DBMS musi byc stabilny, w przeciwnym
wypadku jest bez wartosci. Staramy sie publikowac kod stabilny,
dobrze przetestowany, z minimum mozliwych bl/edw. Kazde
wydanie poprzedza conajmniej miesiac testw wersji beta.
Patrzac na historie wydan PostgreSQL widac, ze dostarczamy
stabilne, dobrze sprawdzone wersje, ktre sa gotowe do uzycia w
srodowisku produkcyjnym. Myslimy, ze proces publikowania
kolejnych wersji opracowany przez nas jest jednym z lepszych
wsrd innych twrcw oprogramowania bazodanowego.
Wsparcie
Dzieki naszym listom mailowym masz dostep do duzej liczby
programistw i uzytkownikw, ktrzy pomagaja rozwiazac kazdy
napotkany problem. Chociaz nie mozemy gwarantowac znalezienia
rozwiazania danego problemu, nie rznimy sie w tym od innych
komercyjnych systemw DBMS. Bezposredni kontakt z
programistami, uzytkownikami, dokumentacja i kodem zrdl/owym
sprawiaja, ze wsparcie oferowane PostgreSQL niejednokrotnie
jest lepsze niz w innych systemach DBMS. Istnieje takze
mozliwosc skorzystania z komercyjnego wsparcia dla tych,
ktrych takiego rozwiazania potrzebuja. (Sprawdz ten punkt
FAQ.)
Cena
Korzystanie z PostgreSQL jest darmowe, zarwno w przypadku
komercyjnym jak i niekomercyjnym. Mozesz korzystac z naszego
kodu zrdl/owego w Twoim produkcie bez zadnych ograniczen, poza
tymi wymienionymi w licencji BSD przytoczonej powyzej.
1.15) W jaki sposb moge wesprzec finansowo PostgreSQL?
PostgreSQL korzysta z najlepszej infrastruktury od samego poczatku
istnienia projektu, tzn. szesciu lat. Wszystko to zawdzieczamy
Marc'owi Fournier'owi, ktry stworzyl/ ta infrastrukture i zarzadza
nia od lat.
Wysokiej jakosci infrastruktura jest bardzo wazna dla kazdego projektu
open-source. Zapobiega przerwom w rozwoju projektu i jakimkolwiek
przestojom.
Oczywiscie korzystanie z wysokiej jakosci infrastruktury nie jest
tanie. Istnieje wiele rznych miesiecznych, czy jednorazowych
wydatkw, ktre trzeba ponosic aby wszystko dzial/al/o jak nalezy.
Jesli Ty, badz Twoja firma moze wspomc finansowo rozwj PostgreSQL
odwiedz adres: http://www.pgsql.com/pg_goodies gdzie opisane jest jak
to zrobic.
Chociaz na stronie wspomniana jest nazwa PostgreSQL Inc, "datki" sa
przeznaczone jedynie na rozwj projektu PostgreSQL i nie sa
przeznaczane na finansowanie jakiejkolwiek firmy. Jesli wolisz, mozesz
wysl/ac czek na adres kontaktowy.
_________________________________________________________________
User Client Questions
2.1) Czy sa jakies driwery ODBC dla PostgreSQL?
Dostepne sa dwa driwery ODBC: PsqlODBC i OpenLink ODBC.
PsqlODBC jest dol/aczony do zrdel/. Wiecej informacji na jego temat
mozesz znalezc pod adresem: ftp://ftp.PostgreSQL.org/pub/odbc/.
OpenLink ODBC moze byc pobrany z adresu: http://www.openlinksw.com.
Wspl/pracuje ze standardowym oprogramowaniem klienckim ODBC wiec w
ten sposb mozesz korzystac z PostgreSQL ODBC dostepnego na kazdej
plaformie ktra wspiera (Win, Mac, Unix, VMS).
Autorzy beda prawdopodobnie sprzedawac ten produkt osobom ktre
wymagaja komercyjnego wsparcia, ale wersja darmowa bedzie zawsze
dostepna. Wszystkie pytania mozesz wysyl/ac na adres:
postgres95@openlink.co.uk.
Sprawdz takze rozdzial/ o ODBC w "Programmer's Guide".
2.2) Jakie istnieja narzedzia pozwalajace na dostep do PostgreSQL przez
www?
Dobry podrecznik dla poczatkujacych o dostepie do bazy danych przez
www mozesz znalezc pod adresem: http://www.webreview.com
Inny znajduje sie pod adresem: http://www.phone.net/home/mwm/hotlist/.
Do integracji z www, swietnym rozwiazaniem jest PHP. Mozesz znalezc
wiecej informacji na ten temat pod adresem http://www.php.net.
Wiele osb w przypadku skomplikowanych rozwiazan uzywa Perl'a i
modul/u CGI.pl.
2.3) Czy istnieje jakies GUI dla PostgreSQL? Narzedzie do raportowania?
Interfejs dla "embedded query language"?
Mamy cal/kiem mil/y interfejs graficzny, ktry zostal/ nazwany
pgaccess i jest on dostarczany jako czesc zrdel/. pgaccess posiada
takze generator raportw. Mozna go znalezc pod adresem
http://www.flex.ro/pgaccess
Udostepnilismy takze ecpg, ktry jest "embedded SQL query language
interface" dla jezyka C.
2.4) Za pomoca jakich jezykw programowania mozna sie komunikowac z
PostgreSQL?
Mamy wsparcie dla:
* C (libpq)
* C++ (libpq++)
* Embedded C (ecpg)
* Java (jdbc)
* Perl (perl5)
* ODBC (odbc)
* Python (PyGreSQL)
* TCL (libpgtcl)
* C Easy API (libpgeasy)
* Embedded HTML (PHP z http://www.php.net)
_________________________________________________________________
Pytania administratora
3.1) Jak moge zainstalowac PostgreSQL w innej lokalizacji niz
/usr/local/pgsql?
Uzyj opcji --prefix podczas uruchamiania skryptu configure.
3.2) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie: Bad
System Call lub "core dumped". Dlaczego?
Ten bl/ad moze byc wynikiem wielu problemw, ale na poczatek sprawdz
czy masz zainstalowane rozszerzenia systemu V w jadrze systemu.
PostgreSQL wymaga do pracy zainstalowanej obsl/ugi pamieci dzielonej i
semaforw.
3.3) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcMemoryCreate. Dlaczego?
Albo nie masz poprawnie skonfigurowanej obsl/ugi pamieci dzielonej w
jadrze systemu, albo musisz zwiekszyc jej dostepny rozmiar. Dokl/adna
ilosc jaka potrzebujesz jest zalezna od architektury systemu na jakim
pracujesz, jak duzo buforw oraz jak duzo procesw backendu
skonfigurowal/es dla postmaster'a. Dla wiekszosci systemw, z domyslna
liczba buforw i procesw potrzebujesz minimum w przyblizeniu 1MB.
Zobacz PostgreSQL Administrator's Guide gdzie szczegl/owo zostal/o
opisane wykorzystanie pamieci dzielonej i semaforw.
3.4) Podczas startu postmaster'a, otrzymuje komunikat o bl/edzie:
IpcSemaphoreCreate. Dlaczego?
Jesli tresc bl/edu brzmi: IpcSemaphoreCreate: semget failed (No space
left on device) oznacza to, ze jadro systemu nie jest skonfigurowane
do obsl/ugi wystarczajacej liczby semaforw. Postgres wymaga jednego
semafor'a na potencjalny jeden proces backend. Tymczasowym
rozwiazaniem jest uruchomienie programu postmaster z mniejsza
maksymalna liczba procesw backend. Uzyj opcji -N z parameterem
mniejszym od domyslnego - 32. Bardziej trwal/ym rozwiazaniem jest
zwiekszenie parametrw SEMMNS i SEMMNI jadra twojego systemu.
Niedzial/ajace semafory moga spowodowac niepoprawne zamkniecie systemu
w czasie intensywnego korzystania z bazy.
Jesli tresc bl/edu jest inna, moze to oznaczac, ze obsl/uga semaforw
nie zostal/a wl/aczona do jadra wcale. Zobacz PostgreSQL
Administrator's Guide po bardziej szczegl/owe informacje o pamieci
dzielonej i semaforach.
3.5) W jaki sposb moge kontrolowac pol/aczenia z innych hostw?
Domyslnie PostgreSQL pozwala jedynie na pol/aczenia za pomoca socketw
Unixowych z lokalnego hosta. Inne hosty nie beda mogl/y sie pol/aczyc
z serwerem dopki nie zostanie dodana opcja -i do postmaster'a, oraz
nie umozliwi sie autoryzacji na podstawie adresu hostw modyfikujac
odpowiednio plik $PGDATA/pg_hba.conf. To zmiany pozwola na pol/aczenia
TCP/IP.
3.6) Jak powinienem skonfigurowac system baz danych aby uzyskac lepsza
wydajnosc?
Indeksy bez watpienia moga przyspieszyc wykonywanie zapytan. Polecenie
EXPLAIN pozwala zobaczyc jak PostgreSQL interpretuje Twoje zapytanie i
ktre indeksy sa uzywane.
Jesli wykonujesz bardzo duzo INSERTw, moze warto je wykonac za pomoca
jednego duzego pliku uzywajac polecenia COPY. Jest to duzo szybsze niz
pojedyncze INSERTy. Po drugie polecenia SQL nie zawarte w bloku
okreslajacym transakcje - BEGIN WORK/COMMIT, sa traktowane jako
pojedyncza transakcja. Rozwaz wykonanie kilku polecen/zdan SQL w
jednym bloku transakcji. To redukuje narzut powodowany przez
transakcje. Przy duzych zmianach w danych, warto usunac i stworzyc na
nowo indeksy.
Jest kilka opcji pozwalajacych na poprawienie wydajnosci. Mozesz
wyl/aczyc fsync() poprzez uruchomienie postmaster'a z opcjami -o -F.
To spowoduje, ze fsync() nie bedzie zrzucal/ danych na dysk po kazdej
transakcji.
Mozesz takze uruchomic postmaster'a z opcja -B aby zwiekszyc wielkosc
pamieci dzielonej uzywanej przez procesy backendw. Jesli ustawisz ta
wartosc zbyt wysoko i przekroczysz limity ustawione przez kernel na
pamiec dzielona, postmaster moze sie nie uruchomic. Kazdy bufor
zajmuje 8K a domyslna ilosc buforw to 64.
Mozesz takze uzyc opcji -S dla backendu aby zwiekszyc maksymalna
wartosc pamieci uzywana przez proces backendu podczas sortowania.
Opcja -S jest ustawiana wartoscia podawana w kilobajtach, domyslna
wartosc to 512K.
Mozesz takze uzyc polecenia CLUSTER aby pogrupowac dane w tabelach wg
indeksu. Zobacz opis polecenia CLUSTER w manualu zeby dowiedziec sie
wiecej.
3.7) Jakie sa mozliwosci wyszukiwania bl/edw?
PostgreSQL ma kilka mozliwosci na raportowanie informacji o jego
statusie, ktre moga byc przydatne przy debugowaniu procesu.
Przede wszystkim uruchom skrypt configure z opcja --enable-cassert,
wiele funkcji assert() monitoruja postep procesu backend i zatrzymuja
program kiedy wydarzy sie cos nieoczekiwanego.
Zarwno postmaster jak i postgres maja kilka opcji do debugowania. Za
kazdym razem kiedy uruchamiasz postmaster'a, upewnij sie, ze wysyl/asz
standardowe wyjscie i error do pliku z logami, np. w ten sposb:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
To utworzy plik server.log w gl/wnym katalogu PostgreSQL. Ten plik
zawiera pozyteczne informacje o problemach i bl/edach, ktre
wydarzyl/y sie podczas pracy serwera. Postmaster posiada opcje -d,
ktra pozwala na raportowanie bardzo szczeglowych informacji. Do
opcji -d podajemy liczbe, ktra okresla szczegl/owosc wysyl/anych
informacji. Musisz miec swiadomosc, ze wysoki poziom logowania bedzie
powodowal/ tworzenie bardzo duzych plikw z logami.
Jesli postmaster nie zostal/ uruchomiony, mozesz uruchomic
postgres'owy backend z linii polecen, i uruchomic Twoje polecenie SQL
bezposrednio na nim. Taki sposb jest polecany jedynie w przypadku
debugowania. Zwrc uwage, ze w tym wypadku zapytanie konczy znak nowej
linii a nie srednik. Jesli skompilowal/es z opcjami debugowania mozesz
uzyc debuggera aby sprawdzic co sie dzieje. Poniewz backend nie
zostal/ uruchomiony przez postmaster'a, nie dzial/a w identycznym
srodowisku, co oznacza ze powtrzenie warunkw w jakich wystapil/y
problemy moze byc problemem.
Jesli postmaster dzial/a, uruchom psql w jednym z okien, nastepnie
znajdz PID procesu postgres uzywanego przez psql. Uzyj debuggera aby
do PID'u postgres'a. Mozesz ustawiac pul/apki (breakpoints) w
debuggerze i wykonywac zapytania z psql. Jesli debugujesz uruchamianie
postgres'a, mozesz ustawic zmienna PGOPTIONS="-W n", nastepnie
uruchomic psql. Opcja ta pozwoli spowolnic uruchomienie na n sekund
abys mgl/ sie pol/aczyc z procesem za pomoca debugera, ustawic
jakiekolwiek pul/apki i kontynuowac proces uruchamiania.
postgres moze byc uruchamiany z opcjami -s, -A i -t, ktre moga byc
bardzo przydatne przy debuggowaniu i ocenie wydajnosci.
Mozesz takze skompilowac z profilingiem aby zobaczyc jakie funkcje ile
czasu wykonuja sie. Pliki profilowane dla backendu zostana umieszczone
w katalogu pgsql/data/base/dbname. Pliki profilu klienta zostana
umieszczone w biezacym katalogu klienta. Linux wymaga aby kompilowac z
opcja -DLINUX_PROFILE aby profilowanie odbywal/o sie poprawnie.
3.8) Skad sie bierze komunikat: "Sorry, too many clients" podczas prby
pol/aczenia sie z baza danych?
Musisz zwiekszyc limit ilosci jednoczesnych procesw bacekendu dla
procesu postmaster'a.
Domyslny limit to 32 procesy. Mozesz go zwiekszyc przez restart
postmaster z odpowiednia wartoscia ustawiana opcje -N w pliku
postgresql.conf.
Wez pod uwage, ze jesli zwiekszysz wartosc podana w opcji -N na wiecej
niz 32 musisz takze zwiekszyc wartosc w opcji -B ponad jej domyslna
wartosc 64; wartosc -B musi byc co najmniej dwa razy wieksza od
wartosci podanej w opcji -N, a prawdopodobnie powinna byc w
rzeczywistosci jeszcze wieksza dla optymalnej wydajnosci. Dla duzej
liczby procesw backendu na pewno zauwazysz, ze trzeba zwiekszyc rzne
parametry jadra Unixa. Rzeczy, ktre pownienes sprawdzic to maksymalna
liczba blokw pamieci dzielonej, SHMMAX; maksymalna liczba semaforw,
SEMMNS oraz SEMMNI; maksymalna liczba procesw, NPROC; maksymalna
liczba procesw na jednego uzytkownika, MAXUPRC; i maksymalna liczba
otwartych plikw, NFILE oraz NINODE. Powd dla ktrego PostgreSQL ma
limit na maksymalna liczbe procesw backendu to obawa o wyczerpanie
zasobw systemu.
W wersjach PostgreSQL wczesniejszych niz 6.5, maksymalna liczba
backendw byl/a ustawiona na 64, a zmiana tej wartosci wymaga
rekompliacji po zmianie stal/ej MaxBackendId w pliku
include/storage/sinvaladt.h.
3.9) Co to sa za pliki typu: pg_sorttempNNN.NN, ktre znajduja sie w
katalogu z plikami bazy danych?
Sa to tymczasowe pliki utworzone przez executor. Dla przykl/adu, jesli
jakas operacja sortowania jest wymagana do wykonania ORDER BY, a samo
sortowanie wymaga wiecej miejsca niz paratmetr backendu -S ustawil/ do
wykorzystania, wtedy tymczasowe pliki sa uzywane do przechowywania
tych danych.
Pliki tymczasowe powinny byc usuniete automatycznie, ale mogl/o sie to
nie stac jesli proces backendu w miedzyczasie nie zakonczyl/ sie
poprawnie podczas operacji sortowania. Jesli w danym momencie nie
dzial/aja zadne procesy backendw mozesz spokojnie usunac pliki
pg_tempNNN.NN.
_________________________________________________________________
Pytania dotyczace uzywania
4.1) Jaka jest rznica pomiedzy kursorami binarnymi (binary cursors) i
zwykl/ymi kursorami (normal cursors)?
Zobacz w manualu opis polecenia DECLARE.
4.2) Jak moge pobrac za pomoca SELECT jedynie kilka pierwszych wynikw
zapytania?
Zobacz w manualu opis polecenia FETCH lub uzyj polecenia SELECT ...
LIMIT....
Nawet jesli chesz pobrac kilka pierwszych rzedw z wyniku zapytania,
cal/e zapytanie musi zostac wykonane. Byc moze powinienes skorzystac z
polecenia ORDER BY. Jesli istnieje indeks ktry odpowiada polom
okreslonym przez ORDER BY, PostgreSQL moze wykorzystac jedynie kilka
pierwszych rzedw, byc moze bedzie koniecznosc wykonania zapytania do
momentu az zostana znalezione pozadane wyniki.
4.3) Jak moge uzyskac liste wszystkich tabel czy innych rzeczy pod psql?
Mozesz sprawdzic zawartosc zrdel/ psql, a konkretnie plik
pgsql/src/bin/psql/describe.c. Zawiera on polecenia SQL ktre generuja
wyniki komend z backslashem. Mozesz takze uruchomic psql z opcja -E
wtedy po wykonaniu polecenia z backslashem wyswietlane bedzie
zapytanie, ktre w rzeczywistosci jest wykonywane.
4.4) Jak usunac kolumne z tabeli?
Nie mamy zaimplementowanego ALTER TABLE DROP COLUMN, ale mozesz zrobic
tak:
SELECT ... -- wybierz zawartosc wszystkich kolumn poza ta jedna ktrej chc
esz sie pozbyc
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
4.5) Jaki jest maksymalny rozmiar dla rzedu, tabeli i bazy danych?
Oto wszystkie ograniczenia:
Maksymalny rozmiar dla bazdy danych? nieograniczony ( istnieja bazy dan
ych o wielkosci 500 GB databases )
Maksymalny rozmiar dla tabeli? 16 TB
Maksymalny rozmiar dla rzedu? nieograniczony w 7.1 i pzniejszyc
h
Maksymalny rozmiar pola? 1 GB w 7.1 and later
Maksymalna liczba rzedw w tabeli? nieograniczona
Maksymalna liczba kolumn w tabeli? 250-1600 w zalezonosci od typw kolum
n
Makasymalna liczba indeksw na tabeli? nieograniczona
Oczywiscie "nieograniczony" nie jest prawda tak do konca, istnieja
ograniczenia wynikajace z dostepnego miejsca na dysku, pamieci/swapa.
Kiedy wielkosci te beda bardzo duze moze odbic sie to na wydajnosci.
Maksymalny rozmiar tabeli, czyli 16 TB nie wymaga od systemu
operacyjnego wsparcia dla duzych plikw. Duze tabele sa przechowywane
jako pliki o rozmiarze 1 GB, wiec ograniczenia co do wielkosci plikw
narzucone przez system plikw nie sa istotne.
Masymalny rozmiar tabeli i maksymalna liczba kolumn moze byc
zwiekszona jesli zwiekszymy domyslny rozmiar bloku (block size) do
32k.
4.6) Jak duzo miejsca w bazie danych jest konieczne aby przechowywac dane
ze zwyczajnego pliku tekstowego?
Baza danych PostgreSQL moze potrzebowac do pieciu razy wiecej miejsca
na przechowywanie danych z plikw tekstowych niz ich objetosc.
Jako przykl/ad mozemy rozwazyc plik skl/adajacy sie z 100,000 linii
zbudowanych z liczby cal/kowitej oraz opisu tekstowego w kazdej.
Zal/zmy, ze srednio kazdy l/ancuch tekstu w linii zajmuje 20 bajtw.
Cal/y plik powinien zajmowac ok. 2.8 MB. Rozmiar pliku bazy danych w
PostgreSQL zawierajacego te dane mozna oszacowac na okol/o 6.4MB:
36 bajtw: nagl/wek kazdego rzedu w przyblizeniu)
24 bajty: jedno pole int i jedno pole typu text
+ 4 bajty: wkaznik na stronie do krotki
--------------------------------------------------
64 bajty w jednym rzedzie
Strona danych w PostgreSQL zajmuje 8192 bajtw (8 KB), wiec:
8192 bajtw na strone
--------------------- = 128 rzedw na jedna strone w bazie (zaokraglone w
dl/)
64 bajtw na rzad
100000 rzedw danych
----------------------- = 782 stron w bazie danych (zaokraglone w gre)
128 rzedw na strone
782 stron w bazie * 8192 bajtw na strone = 6,406,144 bajtw (6.4 MB)
Indeksy nie powoduja duzego narzutu na zajmowane miejsce, ale
zawieraja pewne dane, wiec w pewnych przypadkach moga byc cal/kiem
duze.
4.7) Jak moge sprawdzic jakie tabele, klucze, bazy danych i uzytkownicy sa
utworzeni?
psql ma cal/kiem duza ilosc polecen z backslashem aby wydobyc takie
informacje. Wprowadz \? aby zobaczyc ich spis. Istnieja takze tablice
systemowe rozpoczynajace sie od pg_, zawierajace interesujace Ciebie
informacje. Wykonanie psql -l pokaze spis wszystkich baz danych.
Obejrzyj takze plik pgsql/src/tutorial/syscat.source. Zawiera on wiele
z zapytan typu SELECT, ktre sa potrzebne aby wydobyc informacje z
tablic systemowych.
4.8) Moje zapytania sa wolne lub nie uzywaja kluczy. Dlaczego?
Indeksy nie sa uzywane automatycznie przez kazde z zapytan. Ideksy sa
uzywane jedynie gdy tabela jest odpowiedniego rozmiaru, wiekszego niz
wymagany minimalny, a zapytanie wybiera jedynie mal/y procent
zawartosci tabeli. Wynika to z tego, ze losowy dostep do dysku
powodowany przez ideksowane poszukiwanie jest czasami wolniejsze niz
poszukiwanie sekwencyjne bez uzycia kluczy.
Zeby zdecydowac czy indeks powinien byc uzywany, PostgreSQL musi miec
statystyki dotyczace danej tabeli. Sa one gromadzone przez uzycie
polecenia VACUUM ANALYZE, lub poprostu ANALYZE. uzywajac statystyk,
optymalizator wie ile rzedw jest w tabeli i moze lepiej okreslic czy
indeksy powinny byc uzyte. Statystyki moga byc takze pomocne w
okresleniu najlepszej kolejnosci wykonania zl/aczenia (join) i jego
sposobu. Gromadzenie statystyk powinno sie odbywac w okreslonych
interwal/ach czasu poniewaz dane w tabelach zmieniaja sie.
Indeksy nie sa zazwyczaj uzywane przez ORDER BY lub przy wykonywaniu
zl/aczen (join). Sekwencyjne przeszukiwanie po ktrym nastepuje
sortowanie jest zazwyczaj szybsze nie wyszukiwanie za pomoca indeksu
na duzej tabeli.
Jakkolwiek LIMIT w pol/aczeniu z ORDER BY czesto bedzie wykorzystywal/
indeksw poniewaz jedynie mal/a czesc z tabeli jest zwracana.
Kiedy uzywa sie operatorw dopasujacych takich jak LIKE lub ~, indeksy
beda uzywane jedynie jesli poczatek wyszukiwania jest oparty na
poczatku l/ancucha tekstu. Dlatego, aby uzywac indeksw, dopasowania
operatorem LIKE nie moga sie zaczynac %, a dopasowania operatorem ~
(dopasowania regularne) musza sie zaczynac znakiem specjalnym ^.
4.9) Jak moge sprawdzic w jakis sposb "query optimizer" wykonuje moje
zapytanie?
Zobacz manual dla polecenia EXPLAIN.
4.10) Co to jest "R-tree index"?
Indeks R-tree jest uzywany do indeksowania danych przestrzennych.
Indeks hasuujacy nie nadaje sie do wyszukiwania odlegl/osci. Natomiast
indeks typu B-tree moze wyszukiwac odleglosci jedynie w
jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
przestrzeniami wielo-wymiarowymi. Dla przykl/adu, jesli zostanie
zal/ozony indeks typu R-tree na polu typu point, system moze bardziej
wydajnie odpowiadac na zapytania typu "select all points within a
bounding rectangle."
Zrdl/owym dokumentem opisujacym oryginalnie projektowanie R-tree
indeksw jest:
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.
Ten dokument mozesz znalezc takze w pracy Stonebraker'a "Readings in
Database Systems".
Wbudowane indeksy R-trees radza sobie w wielobokami i boxes.
Teoretycznie, indeksy R-tree moga byc rozszerzone o mozliwosci
indeksowania w wiecej wymiarowych przestrzeniach. W praktyce,
rozbudowa indeksw R-tree wymaga troche pracy, a w tej chwili nie
dysponujemy jakakolwiek dokumentacja jak to zrobic.
4.11) Co to jest "Genetic Query Optimizer"?
Modul/ GEQO ma za zadanie przyspieszenie optymalizacji zapytan l/aczac
wiele tabel za pomoca algorytmw genetycznych (Genetic Algorithm
(GA)). Pozwala na uzywanie duzych zapytan l/aczacych tabele (join
queries) bez wykorzystywania zasobozernego wyszukiwania.
4.12) Jak moge uzywac wyrazen regularnych w zapytaniach i zapytan
case-insensitive w wyrazeniach regularnych? jak korzystac z indeksw dla
zapytan case-insensitive?
Operator ~ moze byc wykorzystywany do wyszukiwania za pomoca wyrazen
regularnych, a ~* do wyszukiwania case-insensitive z wyrazeniami
regularnymi. Wariant case-insensitive dla LIKE zostal/ nazwany ILIKE i
jest dostepny w PostgreSQL 7.1 i pzniejszych wersjach.
Porwnania case-insensitive sa zazwyczaj wykonywane w nastepujacy
sposb:
SELECT *
FROM tab
WHERE lower(col) = 'abc'
W tym wypadku standardowe indeksy nie beda uzywane. Mozesz utworzyc
indeks funkcyjny, poprzez:
CREATE INDEX tabindex on tab (lower(col));
4.13) Jak sprawdzic w zapytaniu czy pole ma wartosc NULL?
Mozesz to sprawdzic, testujac wartosc kolumny warunkiem IS NULL albo
IS NOT NULL.
4.14) Jaka jest rznica pomiedzy rznymi typami tekstowymi (character
types)?
Type Nazwa wewnetrzna Uwagi
--------------------------------------------------
"char" char 1 znak
CHAR(#) bpchar wypel/niane pustymi znakami do podanej dl/ug
osci
VARCHAR(#) varchar rozmiar okresla maksymalna dl/ugosc, nie ma
tutaj wypel/niania
TEXT text bez limitu na dl/ugosc l/ancucha
BYTEA bytea zmiennej dl/ugosci tablica bajtw (null-byte
safe)
Jesli bedziesz przegladac katalogi systemowe lub komunikaty o bl/edach
czesto spotkasz sie z podanymi powyzej nazwami wewnetrznymi.
Ostatnie cztery typy powyzej to tzw typy "varlena" (np. pierwsze
cztery bajty na dysku to dl/ugosc, po ktrych jest data). Dlatego
faktyczna dl/ugosc takiego l/ancucha jest troche wieksza niz
zadeklarowany rozmiar. Te typy takze podlegaja kompresji lub moga byc
przechowywane out-of-line jako TOAST, wiec faktyczne zuzycie miejsca
na dysku moze byc mniejsze niz oczekiwane.
CHAR() jast najlepszym typem do przechowywania l/ancuchw o tej samej
dl/ugosci. VARCHAR() jest najodpowiedniejszy do przechowywania
l/ancuchw o rznej dl/ugosci ale okresla on maksymalna jego dl/ugosc.
TEXT jest najlepszy dla l/ancuchw o dowolnej dl/ugosci, nie
przekraczajacej 1GB. BYTEA sl/uzy do przechowywania danych binarnych,
w szczeglnosci dla danych zawierajacych NULL bajty.
4.15.1) Jak moge utworzyc pole ktre samo zwieksza swoja wartosc?
PostgreSQL ma zaimplementowany typ SERIAL. Automatycznie tworzy
sekwencje i indeks na tej kolumnie. Dla przykladu:
CREATE TABLE person (
id SERIAL,
name TEXT
);
zostanie automatycznie prztl/umaczone na:
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 );
Wiecej informacji o sekwencjach znajdziesz w manualu o
create_sequence. Mozesz takze uzyc pola OID jako unikalnej wartosci
dla kazdego rzedu danych. Jesli bedziesz potrzebowal/ z backupowac
dane robiac dump bazy i odtworzyc ja, musisz uzyc pg_dump z opcja -o
lub polecenia COPY WITH OIDS aby zachowac OIDy.
4.15.2) Jak pobrac wartosc pola typu SERIAL po wykonaniu insert'u?
Jednym z podejsc jest pobranie kolejnej wartosci typu SERIAL z
sekwencji za pomoca funkcji nextval() zanim zostanie wstawiona, a
pzniej nalezy jej uzyc. Uzywajac przykl/adu z tabeli z punktu 4.15.1,
moze to wygladac w Perlu na przykl/ad w ten sposb:
new_id = output of "SELECT nextval('person_id_seq')"
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
Bedziesz mial/ wtedy ta wartosc przechowana w zmiennej new_id do
uzytku w innych zapytaniach (np. jako klucz obcy do tabeli person).
Warto zwrcic uwage, ze nazwa automatycznie utworzonej sekwencji
SEQUENCE bedzie nastepujaca: <tabela>_<kolumnatypuserial>_seq, gdzie
tabela i kolumnatypuserial sa nazwami Twojej tabeli i Twojej kolumny
typu SERIAL.
Inne rozwiazanie to uzycie funkcji currval() na pola typu SERIAL po
dodaniu nowej wartosci do rzedu zawierajacego kolumne typu SERIAL z
wstawiona domyslnie wartoscia, np.
INSERT INTO person (name) VALUES ('Blaise Pascal');
new_id = output of "SELECT currval('person_id_seq')";
Ostatecznie mozesz uzyc OID zwracanej po wykonaniu INSERT, chociaz to
jest najmniej przenosne rozwiazanie. W Perlu, wykorzystujac biblioteke
DBI z modul/em Edmunda Mergla DBD::Pg, oid jest dostepny poprzez
$sth->{pg_oid_status} po wykonaniu $sth->execute().
4.15.3) Czy uzycie currval() i nextval() nie doprowadzi do race condition z
innymi uzytkownikami?
Nie. currval() zwraca biezaca wartosc przypisana przez Twj backend, a
nie przez wszystkich uzytkownikw.
4.15.4) Dlaczego numery sekwencji nie sa ponownie uzywane przy przerwaniu
transakcji? Skad sie biora luki w numerowaniu kolumny tabeli
sekwancjami/SERIALem?
Aby poprawic zbieznosc (concurrency), wartosci sekwencji sa podawane
dzial/ajacym transakcjom kiedy tego potrzebuja i nie sa blokowane
dopki transakcja sie nie zakonczy. To spowoduje przerwy w numerowaniu
z przerwanych transakcji.
4.16) Co to jest OID? Co to jest TID?
OID sa PostgreSQL'owym rozwiazaniem problemu unikalnych numerw
rzedw. Kazdy rzad tworzony przez PostgreSQL otrzymuje unikalny OID.
Wszystkie OIDy generowane podczas procesu uruchamianego przez skrypt
initdb maja mniejsza wartosc niz 16384 (na podstawie pliku
backend/access/transam.h). Wszystkie OIDy tworzone przez uzytkownika
sa rwne lub wieksze podanej wczesniej wartosci. Domyslnie wszystkie
OIDy sa unikalne nie tylko w pojedynczej tabeli czy bazie danych ale w
cal/ej instalacji PostgreSQL.
PostgreSQL uzywa OIDw w swoim wewnetrznym systemie tabel, aby mozna
byl/o je l/aczyc. Te OIDy moga byc uzywane aby identyfikowac rzedy w
tabelach i wykorzystywac je w zl/aczeniach tych tabel. Zaleca sie abys
uzywal/ typu OID aby przechowywac wartosci OID. Mozesz utworzyc indeks
na polu OID aby dostep do niego byl/ szybszy.
OID sa przypisane do wszystkich rzedw z jednego gl/wnego miejsca i
uzywane sa przez wszystkie bazy danych. Jesli chcial/bys zmienic OID
na cos innego, lub jesli chcial/bys zrobic kopie tabeli, z orginalnymi
OIDami nie ma zadnego przeciwwskazania abys to zrobil/:
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';
OIDy sa przechowywane jako cztero-bajtowe liczby cal/kowite i skoncza
sie po osiagnieciu czterech miliardw. Nikt jak dotad nie zgl/osil/
aby cos takiego sie stalo, ale mamy zamiar pozbyc sie tego
ograniczenia zanim ktos to zgl/osi.
TID sa uzywane aby zidentyfikowac konkretne rzedy z blokami i
wartoscia ofsetw. TIDy zmieniaja sie wraz ze zmianami rzedw. Sa
uzywane przez indeksy, aby wskazywac do fizycznych rzedw.
4.17) Jakie jest znaczenie niektrych terminw w PostgreSQL?
W czesci kodu zrdl/owego i starszej dokumentacji uzywamy terminw,
ktre maja bardziej oglne znaczenie. Oto niektre z nich:
* table, relation, class
* row, record, tuple
* column, field, attribute
* retrieve, select
* replace, update
* append, insert
* OID, serial value
* portal, cursor
* range variable, table name, table alias
Liste terminw zwiazanych z bazami danych mozesz znalezc pod tym
adresem:http://www.comptechnews.com/~reaster/dbdesign.html
4.18) Skad bierze sie ten bl/ad "ERROR: Memory exhausted in
AllocSetAlloc()"?
Jesli uzywasz wersji starszej niz 7.1, upgrade moze rozwiazac ten
problem. Jest takze mozliwe, ze po prostu wyczerpal/a Ci sie pamiec
wirtualna (virtual memory) w systemie lub Twj kernel ma zbyt nisko
ustawione limity dla pewnych zasobw. Sprbuj wykonac nastepujace
polecenia zanim uruchomisz postmaster'a:
ulimit -d 262144
limit datasize 256m
W zaleznosci od shell'a jakiego uzywasz jedno z tych polecen moze nie
zadzial/ac, ale to ustawienie pozwoli ustawic segment danych dla
procesu znacznie wiekszy i byc moze pozwoli wykonac zapytanie. To
polecenie zadzial/a dla biezacego procesu oraz wszytkich podprocesw
utworzonych po wykonaniu polecenia. Jesli ten problem wystepuje z
klientem SQL, poniewaz backend zwraca zbyt duzo danych, sprbuj
wykonac to polecenie przed uruchomieniem klienta.
4.19) Jak sprawdzic jakiej wersji PostgreSQL uzywam?
W psql, wpisz select version();
4.20) Dlaczego operacje, ktre wykonuje na duzych obiektach "large-object"
zwracaja komunikat: "invalid large obj descriptor"?
Musisz uzyc BEGIN WORK i COMMIT przed i po uzyciu uchwytu do duzego
obiektu, tzn. musisz nimi otoczyc funkcje lo_open ... lo_close.
Obecnie PostgreSQL uzywjac "rule" zamyka uchwyt do duzego obiektu przy
kazdym wywol/aniu "commit". Wiec pierwsze prba zrobienia czegokolwiek
z uchwytem spowoduje wypisanie: invalid large obj descriptor. Kod,
ktry do tej pory dzial/al/ (przynajmniej wiekszosc razy) bedzie teraz
generowal/ informacje o bl/edzie jesli nie bedziesz korzystal/ z
transakcji.
Jesli uzywasz interfejsu klienta jak ODBC byc moze bedziesz musial/
ustawic auto-commit off.
4.21) Jak stworzyc kolumne ktrej domyslna wartoscia bedzie biezacy czas?
Uzyj CURRENT_TIMESTAMP:
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
4.22) Dlaczego zapytania uzywajace IN sa takie wolne?
Obecnie l/aczymy podzapytania w outer queries poprzez sekwencyjne
przeszukiwanie wynikw podzapytania dla kazdego rzedu z outer query.
Mozna to ominac zastepujac IN przez EXISTS:
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
na:
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
Mamy zamiar poprawic to ograniczenie w przyszl/ych wydaniach.
4.23) Jak wykonac "outer join"?
PostgreSQL 7.1 i pzniejsze wersje maja zaimplementowane outer join
wykorzystujac standardowa skl/adnie SQL. Ponizej dwa przykl/ady:
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
or
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
Te dwa identyczne zapytania l/acza kolumne t1.col z kolumna t2.col,
ale takze zwrca niepol/aczone rzedy w t1 (te ktre nie pasuja w t2).
RIGHT join dodal/by niepol/aczone rzedy z tabeli t2. FULL join
zwrcil/by rzedy plus dodatkowo wszystkie rzedy z tabel t1 i t2.
Sl/owo OUTER jest opcjonalne i jest dodawane domyslnie przy LEFT,
RIGHT, i FULL join'ach. Zwykl/e join'y sa nazywane INNER joins.
W poprzednich wersjach "outer joins" moga byc zasymulowane poprzez
uzycie slowa kluczowego UNION i NOT IN. Dla przykl/adu, l/aczac tabele
tab1 i tab2, nastepujace zapytanie wykonuje outer join:
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
4.24) Jak wykonywac zapytanie uzywajace kilku baz danych jednoczesnie?
Nie ma takiej mozliwosci aby w zapytaniu odpytawac inna baze danych
poza biezaca. Poniewaz PostgreSQL l/aduje specyficzne dla bazy danych
katalogi systemowe, nie jest do konca jasne jak zapytanie pomiedzy
rznymi bazami danych powinno sie zachowywac.
Oczywiscie klient moze l/aczyc sie z rznymi bazami danych i l/aczyc
informacje w ten sposb uzyskana.
4.25) Jak zwrcic w funkcji wiele rzedw lub kolumn?
Mozesz zwracac zbiory z funkcji PL/pgSQL uzywajac refcursors. Zobacz
http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
sekcje 23.7.3.3.
Rozwijanie PostgreSQL
5.1) Napisal/em wl/asna funkcje. Kiedy uzyje jej w psql, program zrzuca
pamiec (dump core)?
Problem moze byc spowodowany przez bardzo wiele rzeczy. Sprbuj
najpierw przetestowac Twoja funkcje w samodzielnie dzial/ajacym
programie.
5.2) Jak moge dodac/zgl/osic nowe typy czy funkcje do PostgreSQL?
Wyslij Twoje propozycje na liste mailowa pgsql-hackers, wtedy
prawdopodobnie Twj kod znajdzie sie w katalogu contrib/.
5.3) Jak napisac funkcje C zwracajaca krotke (tuple)?
To wymaga wysil/ku tak olbrzymiego, ze nawet autorzy nigdy tego nie
prubowali, chociaz z zalozen wynika, ze jest to mozliwe.
5.4) Zmienil/em plik zrdl/owy. Dlaczego po rekompilacji nie widac zmiany?
Pliki Makefiles nie maja dorzuconych odpowiednich zaleznosci dla
plikw nagl/wkowych (include files). Wykonaj najpierw make clean, a
nastepnie ponownie make. Jesli uzywasz GCC mozesz uzyc opcji
--enable-depend przy wykonywaniu configure aby
doc/src/FAQ/FAQ_polish.html
0 → 100644
View file @
c763cfa9
<!DOCTYPE html PUBLIC "-//W3C//DTD html 4.01 transitional//EN">
<HTML>
<!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
<!-- HTML -->
<HEAD>
<META
name=
"generator"
content=
"HTML Tidy, see www.w3.org"
>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=iso-8859-2"
>
<TITLE>
PostgreSQL FAQ
</TITLE>
</HEAD>
<BODY
bgcolor=
"#ffffff"
text=
"#000000"
link=
"#ff0000"
vlink=
"#a00000"
alink=
"#0000ff"
>
<H1>
Frequently Asked Questions (FAQ) o PostgreSQL
</H1>
<P>
Ostatnia aktualizacja: Thu Apr 18 00:44:51 EDT 2002
</P>
<P>
Obecny maintainer: Bruce Momjian (
<A
href=
"mailto:pgman@candle.pha.pa.us"
>
pgman@candle.pha.pa.us
</A>
)
<BR>
</P>
<P>
Tumaczenie: Marcin Mazurek (
<A
href=
"mailto:m.mazurek@netsync.pl"
>
m.mazurek@netsync.pl
</A>
)
<BR>
</P>
<P>
Najbardziej aktualn wersj tego dokumentu mona znale pod
adresem:
<A
href=
"http://www.Postgresql.org/docs/faq-english.html"
>
http://www.PostgreSQL.org/docs/faq-english.html
</A>
.
</P>
<P>
Odpowiedzi na pytania dotyczce konkretnych systemw operacyjnych
mona znale pod adresem:
<A
href=
"http://www.PostgreSQL.org/users-lounge/docs/faq.html"
>
http://www.PostgreSQL.org/users-lounge/docs/faq.html
</A>
.
</P>
<HR>
<H2
align=
"center"
>
Pytania oglne
</H2>
<A
href=
"#1.1"
>
1.1
</A>
) Co to jest PostgreSQL? Jak to wymawia?
<BR>
<A
href=
"#1.2"
>
1.2
</A>
) Jak licencj chroniony jest PostgreSQL?
<BR>
<A
href=
"#1.3"
>
1.3
</A>
) Na jakich systemach Unixowych dziaa
PostreSQL?
<BR>
<A
href=
"#1.4"
>
1.4
</A>
) Na jakich nie-Unixowych systemach dziaa
PostgreSQL?
<BR>
<A
href=
"#1.5"
>
1.5
</A>
) Skd mog cign PostgreSQL?
<BR>
<A
href=
"#1.6"
>
1.6
</A>
) Gdzie mona szuka wsparcia technicznego?
<BR>
<A
href=
"#1.7"
>
1.7
</A>
) Jaka jest ostatnia dostpna wersja?
<BR>
<A
href=
"#1.8"
>
1.8
</A>
) Jaka dokumentacja jest dostpna?
<BR>
<A
href=
"#1.9"
>
1.9
</A>
) Gdzie mog znale informacj o znanych
bdach czy brakujcych rozwizanich?
<BR>
<A
href=
"#1.10"
>
1.10
</A>
) Jak mog si nauczy
<SMALL>
SQL
</SMALL>
?
<BR>
<A
href=
"#1.11"
>
1.11
</A>
) Czy PostgreSQL ma rozwizany problem Y2K?
<BR>
<A
href=
"#1.12"
>
1.12
</A>
) Jak mog si przyczy do grupy osb
bezporednio pracujcych nad rozwojem PostgreSQL?
<BR>
<A
href=
"#1.13"
>
1.13
</A>
) Jak mog zgasza bdy?
<BR>
<A
href=
"#1.14"
>
1.14
</A>
) Jak mona porwna PostgreSQL w stosunku
do innych
<SMALL>
DBMS
</SMALL>
?
<BR>
<A
href=
"#1.15"
>
1.15
</A>
) W jaki sposb mog wesprze finansowo
PostgreSQL?
<BR>
<H2
align=
"center"
>
Pytania uytkownikw
</H2>
<A
href=
"#2.1"
>
2.1
</A>
) Czy s jakie driwery
<SMALL>
ODBC
</SMALL>
dla
PostgreSQL?
<BR>
<A
href=
"#2.2"
>
2.2
</A>
) Jakie istniej narzdzia pozwalajce na dostp do
PostgreSQL przez www?
<BR>
<A
href=
"#2.3"
>
2.3
</A>
) Czy istnieje jakie GUI dla PostgreSQL?
Narzdzie do raportowania? Interfejs dla "embedded query language"?
<BR>
<A
href=
"#2.4"
>
2.4
</A>
) Za pomoc jakich jzykw programowania mona
si komunikowa z PostgreSQL?
<BR>
<H2
align=
"center"
>
Pytania administratora
</H2>
<A
href=
"#3.1"
>
3.1
</A>
) Jak mog zainstalowa PostgreSQL w innej
lokalizacji ni
<I>
/usr/local/pgsql
</I>
?
<BR>
<A
href=
"#3.2"
>
3.2
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikat:
<I>
Bad System Call
</I>
lub "core dumped". Dlaczego?
<BR>
<A
href=
"#3.3"
>
3.3
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikato bdzie:
<I>
IpcMemoryCreate
</I>
. Dlaczego?
<BR>
<A
href=
"#3.4"
>
3.4
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikat o bdzie:
<I>
IpcSemaphoreCreate
</I>
. Dlaczego?
<BR>
<A
href=
"#3.5"
>
3.5
</A>
) W jaki sposb mog kontrolowa poczenia z
innych hostw?
<BR>
<A
href=
"#3.6"
>
3.6
</A>
) Jak powinienem skonfigurowa system baz
danych aby uzyska lepsz wydajno?
<BR>
<A
href=
"#3.7"
>
3.7
</A>
) Jakie s moliwoci wyszukiwania bdw?
<BR>
<A
href=
"#3.8"
>
3.8
</A>
) Skd si bierze komunikat:
<I>
"Sorry, too many
clients"
</I>
podczas prby poczenia si z baz danych?
<BR>
<A
href=
"#3.9"
>
3.9
</A>
) Co to za pliki typu
<I>
pg_sorttempNNN.NN
</I>
, ktre znajduj si w katalogu z plikami bazy danych?
<BR>
<H2
align=
"center"
>
Pytania dotyczce uytkowania
</H2>
<A
href=
"#4.1"
>
4.1
</A>
) Jaka jest rnica pomidzy kursorami
binarnymi (binary cursors) i zwykymi kursorami (normal cursors)?
<BR>
<A
href=
"#4.2"
>
4.2
</A>
) Jak mog pobra za pomoc
<SMALL>
SELECT
</SMALL>
jedynie kilka pierwszych wynikw zapytania?
<BR>
<A
href=
"#4.3"
>
4.3
</A>
) Jak mog uzyska list wszystkich tabel czy
innych rzeczy pod
<I>
psql
</I>
?
<BR>
<A
href=
"#4.4"
>
4.4
</A>
) Jak usun kolumn z tabeli?
<BR>
<A
href=
"#4.5"
>
4.5
</A>
) Jaki jest maksymalny rozmiar dla rzdu,
tabeli i bazy danych?
<BR>
<A
href=
"#4.6"
>
4.6
</A>
) Jak duo miejsca w bazie danych jest
potrzebne aby przechowa dane ze zwyczajnego pliku tekstowego?
<BR>
<A
href=
"#4.7"
>
4.7
</A>
) Jak mog sprawdzi jakie tabele, klucze,
bazy danych i uytkownicy s utworzeni?
<BR>
<A
href=
"#4.8"
>
4.8
</A>
) Moje zapytania s wolne lub nie uywaj
kluczy. Dlaczego?
<BR>
<A
href=
"#4.9"
>
4.9
</A>
) Jak mog sprawdzi w jakis sposb "query
optimizer" wykonuje moje zapytanie?
<BR>
<A
href=
"#4.10"
>
4.10
</A>
) Co to jest "R-tree index"?
<BR>
<A
href=
"#4.11"
>
4.11
</A>
) Co to jest "Genetic Query Optimizer"?
<BR>
<A
href=
"#4.12"
>
4.12
</A>
) Jak mog uywa wyrae regularnych w
zapytaniach i zapyta case-insensitive w wyraeniach regularnych?
Jak korzysta z indeksw dla zapyta case-insensitive?
<BR>
<A
href=
"#4.13"
>
4.13
</A>
) Jak sprawdzi w zapytaniu czy pole ma
warto
<SMALL>
NULL
</SMALL>
?
<BR>
<A
href=
"#4.14"
>
4.14
</A>
) Jaka jest rnica pomidzy rnymi typami
tekstowymi (character types)?
<BR>
<A
href=
"#4.15.1"
>
4.15.1
</A>
) Jak mog utworzy pole typu int, ktre samo
zwiksza swoj warto?
<BR>
<A
href=
"#4.15.2"
>
4.15.2
</A>
) Jak pobra warto pola typu
<SMALL>
SERIAL
</SMALL>
po wykonaniu insert'u?
<BR>
<A
href=
"#4.15.3"
>
4.15.3
</A>
) Czy uycie
<I>
currval()
</I>
i
<I>
nextval()
</I>
nie doprowadzi do "race condition" z innymi
uytkownikami?
<BR>
<A
href=
"#4.15.4"
>
4.15.4
</A>
) Dlaczego numery sekwencji nie s
ponownie uywane przy przerwaniu transakcji?
Skd si bior luki w numerowaniu kolumny tabeli sekwencjami/SERIALem?
<BR>
<A
href=
"#4.16"
>
4.16
</A>
) Co to jest
<SMALL>
OID
</SMALL>
? Co to jest
<SMALL>
TID
</SMALL>
?
<BR>
<A
href=
"#4.17"
>
4.17
</A>
) Jakie jest znaczenie niektrych terminw w
PostgreSQL?
<BR>
<A
href=
"#4.18"
>
4.18
</A>
) Skd bierze si ten bd:
<I>
"ERROR: Memory
exhausted in AllocSetAlloc()"
</I>
?
<BR>
<A
href=
"#4.19"
>
4.19
</A>
) Jak sprawdzi jakiej wersji PostgreSQL
uywam?
<BR>
<A
href=
"#4.20"
>
4.20
</A>
) Dlaczego operacje, ktre wykonuj na
duych obiektach "large-object" zwracaj komunikat:
<I>
"invalid large obj descriptor"
</I>
?
<BR>
<A
href=
"#4.21"
>
4.21
</A>
) Jak stworzy kolumn ktrej domyln
wartoci bdzie biecy czas?
<BR>
<A
href=
"#4.22"
>
4.22
</A>
) Dlaczego zapytania uywajce
<CODE><SMALL>
IN
</SMALL></CODE>
s takie wolne?
<BR>
<A
href=
"#4.23"
>
4.23
</A>
) Jak wykona "outer join"?
<BR>
<A
href=
"#4.24"
>
4.24
</A>
) Jak wykonywa zapytanie uywajce kilku
baz danych jednoczenie?
<BR>
<A
href=
"#4.25"
>
4.25
</A>
) Jak zwrci w funkcji wiele rzdw lub
kolumn?
<BR>
<H2
align=
"center"
>
Rozwijanie PostgreSQL
</H2>
<A
href=
"#5.1"
>
5.1
</A>
) Napisaem wasn funkcj. Kiedy uyj jej w
<I>
psql
</I>
, program zrzuca pami (dump core)?
<BR>
<A
href=
"#5.2"
>
5.2
</A>
) Jak mog doda/zgosi nowe typy czy funkcje
do PostgreSQL?
<BR>
<A
href=
"#5.3"
>
5.3
</A>
) Jak napisa funkcj C zwracajc krotk
(tuple)?
<BR>
<A
href=
"#5.4"
>
5.4
</A>
) Zmieniem plik rdowy. Dlaczego po
rekompilacji nie wida zmiany?
<BR>
<HR>
<H2
align=
"center"
>
Pytania oglne
</H2>
<H4><A
name=
"1.1"
>
1.1
</A>
) Co to jest PostgreSQL? Jak to wymawia?
</H4>
<P>
PostgreSQL wymawia si
<I>
Post-Gres-kju-el
</I>
.
</P>
<P>
PostgreSQL jest rozszerzeniem systemu zarzdzania bazami danych -
POSTGRES, kolejn generacj rozwojowego prototypu
<SMALL>
DBMS
</SMALL>
.
Mimo, e PostgreSQL zachowa bardzo dobrze zbudowany model danych
(data model) i bogaty zestaw typw danych POSTGRES'a, zastpi
PostQuel'owy jzyk zapyta z rozbudowanym podzbiorem jzyka
<SMALL>
SQL
</SMALL>
. PostgreSQL jest oprogramowaniem darmowym
z dostpnymi caymi rdami.
</P>
<P>
Rozwj PostgreSQL jest prowadzony przez grup ludzi z Internetu,
komunikujcych si poprzez mailowe listy dyskusyjne PostgreSQL.
Obecnym koordynatorem jest Marc G. Fournier (
<A
href=
"mailto:scrappy@PostgreSQL.org"
>
scrappy@PostgreSQL.org
</A>
). (Zobacz
poniej jak si przyczy). Ta grupa ludzi jest odpowiedzialna za
cay rozwj PostgreSQL.
</P>
<P>
Autorami PostgreSQL 1.01 byli Andrew Yu and Jolly Chen.
Wiele innych osb pomogo przy portowaniu, testowaniu, debugowaniu, i
rozwijaniu kodu. Oryginalny kod Postgresa, na ktrym zosta oparty
PostgreSQL, by wysikiem studentw oraz pracownikw pracujcych pod
kierownictwem profesora Michael'a Stonebraker'a z University of
California w Berkeley.
</P>
<P>
Oryginaln nazw oprogramowania w Berkeley by Postgres. Po
dodaniu obsugi
<SMALL>
SQL
</SMALL>
w 1995, nazwa zostaa zmieniona
na Postgres95. Pod koniec roku 1996 nazwa zostaa zmieniona na
PostgreSQL.
</P>
<H4><A
name=
"1.2"
>
1.2
</A>
) Jak licencj chroniony jest
PostgreSQL?
</H4>
<P>
PostgreSQL objty jest nastpujc licencj:
</P>
<P>
PostgreSQL Data Base Management System
</P>
<P>
Portions copyright (c) 1996-2002, PostgreSQL Global Development
Group Portions Copyright (c) 1994-6 Regents of the University of
California
</P>
<P>
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose, without fee, and without a
written agreement is hereby granted, provided that the above
copyright notice and this paragraph and the following two
paragraphs appear in all copies.
</P>
<P>
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</P>
<P>
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE
UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
</P>
<P>
Tekst powyej, jest klasyczn licencj BSD.
Nie posiada ona adnych restrykcji co do uywania kodu rdowego.
Podoba nam si i nie zamierzamy jej zmienia.
<H4><A
name=
"1.3"
>
1.3
</A>
) Na jakich systemach Unixowych dziaa
PostreSQL?
</H4>
<P>
PostgreSQL powinien dziaa na wszystkich nowych Unix-podobnych
systemach. Platformy, ktre zostay szczegowo przetestowane podczas
publikowania PostgreSQL s wymienione w dokumentacji opisujcej
instalacj.
</P>
<H4><A
name=
"1.4"
>
1.4
</A>
) Na jakich nie-Unixowych systemach dziaa
PostgreSQL?
</H4>
<P><STRONG>
Klient
</STRONG></P>
<P>
Moliwa jest kompilacja bibliteki C
<I>
libpq
</I>
C, psql oraz
innych interfejsw i uruchamianie ich na platformie MS Windows. W tym
wypadku klient jest uruchamiany na MS Windows a z serwerem komunikuje si
poprzez TCP/IP. Serwer moe dziaa na dowolnej wspieranej platformie
Unixowej. Plik
<I>
win31.mak
</I>
jest doczony
do rde, aby mona byo stworzy bibliotek
<I>
libpq
</I>
oraz
program
<I>
psql
</I>
dziaajce w rodowisku Win32. PostgreSQL moe si
take komunikowa z klientami
<SMALL>
ODBC
</SMALL>
.
</P>
<P><STRONG>
Serwer
</STRONG></P>
<P>
Serwer moe by uruchamiany na Windows NT i Win2k uywajc
bibliotek Cygwin, Cygnus Unix/NT. W pliku
<I>
pgsql/doc/FAQ_MSWIN
</I>
znajdujcym si w rdach lub pod adresem:
<A
href=
"http://www.postgresql.org/docs/faq-mswin.html"
>
MS Windows FAQ
</A>
na naszych stronach. Nie planujemy tworzy portu przeznaczonego
docelowo dla platformy Microsoft.
</P>
<H4><A
name=
"1.5"
>
1.5
</A>
) Skd mona cign PostgreSQL?
</H4>
<P>
Gwny serwer ftp z dostpem "anonymous" dla PostgreSQL znajduje
si
<A
href=
"ftp://ftp.PostgreSQL.org/pub"
>
ftp://ftp.PostgreSQL.org/pub
</A>
.
jeli szukasz mirrorw sprawd nasz gwn stron www.
<P>
<H4><A
name=
"1.6"
>
1.6
</A>
) Gdzie mona szuka wsparcia technicznego?
</H4>
<P>
Adres gwnej listy mailowej:
<A
href=
"mailto:pgsql-general@PostgreSQL.org"
>
pgsql-general@PostgreSQL.org
</A>
.
Jest ona przeznaczona dyskusjom dotyczcym spraw zwizanych z PostgreSQL.
eby zapisac si na list, wylij email z nastpujcymi liniami w
treci maila (nie w temacie):
</P>
<PRE>
subscribe
end
</PRE>
<P>
na adres:
<A
href=
"mailto:pgsql-general-request@PostgreSQL.org"
>
pgsql-general-request@PostgreSQL.org
</A>
.
</P>
<P>
Dostpna jest take lista wysyajca digesty. Aby zapisa si na
ni, wylij email na adres:
<A
href=
"mailto:pgsql-general-digest-request@PostgreSQL.org"
>
pgsql-general-digest-request@PostgreSQL.org
</A>
z treci maila zawierajc:
</P>
<PRE>
subscribe
end
</PRE>
Digesty s wysyane do czonkw listy, kiedy na gwn list dotrze ok
30k wiadomoci.
<P>
Dostpna jest take lista powicona bdom znalezionym w
PostgreSQL. Aby zapisa si na ni wylij email na adres:
<A
href=
"mailto:pgsql-bugs-request@PostgreSQL.org"
>
pgsql-bugs-request@PostgreSQL.org
</A>
z treci maila zawierajc:
</P>
<PRE>
subscribe
end
</PRE>
Lista powicona dyskusjom developerw jest dostpna pod adresem:
<A
href=
"mailto:pgsql-hackers-request@PostgreSQL.org"
>
pgsql-hackers-request@PostgreSQL.org
</A>
Aby si na ni zapisa wylij na jej adres mail z treci:
<PRE>
subscribe
end
</PRE>
<P>
Dodatkowe informacje o listach mailowych dotyczcych PostgreSQL
mona znale na stronach WWW PostgreSQL pod adresem:
</P>
<BLOCKQUOTE>
<A
href=
"http://www.PostgreSQL.org"
>
http://www.PostgreSQL.org
</A>
</BLOCKQUOTE>
<P>
W sieci EFNet istnieje kana IRC
<I>
#PostgreSQL
</I>
. Ja, do
poczenia si z kanaem uywam Unixowego polecenia
<CODE>
irc -c
'#PostgreSQL' "$USER" irc.phoenix.net.
</CODE></P>
<P>
Lista firm oferujcych wsparcie na zasadach komercyjnych znajduje
si pod adresem:
<A
href=
"http://www.postgresql.org/users-lounge/commercial-support.html"
>
http://www.postgresql.org/users-lounge/commercial-support.html
</A>
.
</P>
<H4><A
name=
"1.7"
>
1.7
</A>
) Jaka jest ostatnia dostpna wersja?
</H4>
<P>
Ostatnia dostpna wersja PostgreSQL to 7.2.1.
</P>
<P>
Planujemy publikowanie kolejnych wersji co cztery miesice.
</P>
<H4><A
name=
"1.8"
>
1.8
</A>
) Jaka dokumentacja jest dostpna?
</H4>
<P>
Kilka manuali, stron podcznika man, oraz kilka przykadw do
testowania s zaczone w samej dystrybucji. Znajduj si one w
katalogu
<I>
/doc
</I>
. Manual moe by take przegldany poprzez
strony www pod adresem
<A
href=
"http://www.PostgreSQL.org/users-lounge/docs/"
>
http://www.PostgreSQL.org/users-lounge/docs/
</A>
.
</P>
<P>
Istniej take dwie ksiki dostpne online pod adresami
<A
href=
"http://www.PostgreSQL.org/docs/awbook.html"
>
http://www.PostgreSQL.org/docs/awbook.html
</A>
i
<A
href=
"http://www.commandprompt.com/ppbook/"
>
http://www.commandprompt.com/ppbook/
</A>
.
Lista ksiek o PostgreSQL, ktre mona kupi znajduje si pod adresem
<A
href=
"http://www.postgresql.org/books/"
>
http://www.postgresql.org/books/
</A>
.
Zbir technicznych artykuw o PostgreSQL znajduje si pod adresem
<A
href=
"http://techdocs.postgresql.org/"
>
http://techdocs.postgresql.org/
</A>
.
</P>
<P><I>
psql
</I>
posiada kilka wbudowanych polece \d, za pomoca ktrych
mona sprawdzi informacje dotyczce typw, operatorw, funkcji,
aggregatw itd.
</P>
<P>
Na naszej stronie mona znale duo wicej dokumentacji.
</P>
<H4><A
name=
"1.9"
>
1.9
</A>
) Gdzie mona znale informacj o znanych
bdach czy brakujcych rozwizanich?
</H4>
<P>
PostgreSQL wspiera rozszerzony podzbir standardu
<SMALL>
SQL
</SMALL>
-92.
Sprawd nasz list
<A
href=
"http://developer.PostgreSQL.org/todo.php"
>
TODO
</A>
aby znale informacj o znanych problemach, brakujcych
rozwizaniach czy przyszych planach.
</P>
<H4><A
name=
"1.10"
>
1.10
</A>
) Jak mog si nauczy
<SMALL>
SQL
</SMALL>
?
</H4>
<P>
Ksika o PostgreSQL
<A
href=
"http://www.PostgreSQL.org/docs/awbook.html"
>
http://www.PostgreSQL.org/docs/awbook.html
</A>
uczy
<SMALL>
SQL
</SMALL>
. Jest jeszcze inna ksizka o PostgreSQL
dostpna pod adresem:
<A
href=
"http://www.commandprompt.com/ppbook/"
>
http://www.commandprompt.com/ppbook.
</A>
Dobry tutorial moesz znale pod adresem:
<A
href=
"http://www.intermedia.net/support/sql/sqltut.shtm"
>
http://www.intermedia.net/support/sql/sqltut.shtm,
</A>
oraz
<A
href=
"http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM"
>
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
</A>
i
<A
href=
"http://sqlcourse.com/"
>
http://sqlcourse.com.
</A></P>
<P>
Jeszcze inny to "Teach Yourself SQL in 21 Days, Second Edition"
pod adresem:
<A
href=
"http://members.tripod.com/er4ebus/sql/index.htm"
>
http://members.tripod.com/er4ebus/sql/index.htm
</A></P>
<P>
Wielu z naszych uytkownikw poleca
<I>
The Practical SQL Handbook
</I>
,
Bowman, Judith S., et al., Addison-Wesley. Inni polecaj
<I>
The
Complete Reference SQL
</I>
, Groff et al., McGraw-Hill.
</P>
<H4><A
name=
"1.11"
>
1.11
</A>
) Czy PostgreSQL ma rozwizany problem Y2K?
</H4>
<P>
Tak, bez problemu radzimy sobie z datami po roku 2000 AD, oraz
przed rokiem 2000 BC.
</P>
<H4><A
name=
"1.12"
>
1.12
</A>
) Jak mog si przyczy do grupy osb
bezporednio pracujcych nad rozwojem PostgreSQL?
</H4>
<P>
Przede wszystkim cignij ostatnie dostpne rda i przeczytaj
dokumentacj przeznaczon dla developerw na naszej stronie www lub
dostpn take w rdach PostgreSQL. Nastpnie zapisz si na listy
mailowe
<I>
pgsql-hackers
</I>
i
<I>
pgsql-patches
</I>
. I na koniec, wysyaj nam wysokiej jakoci
patch'e na list pgsql-patches.
</P>
<P>
Jest okoo 12 osb, ktre maj uprawnienia do commit'owania w
<SMALL>
CVS
</SMALL>
PostgreSQL'a. Kady z nich submitowa tak wiele
wysokiej jakoci patchy, e stao si niemoliwe dla obecnych
commiterw by z nimi na bieco, majc pewno e s to poprawki
wysokiej jakoci.
</P>
<H4><A
name=
"1.13"
>
1.13
</A>
) Jak mog zgasza bdy?
</H4>
<P>
Zajrzyj na stron
<A
href=
"http://www.postgresql.org/bugs/bugs.php"
>
PostgreSQL BugTool
</A>
, na
ktrej opisane s wskazwki jak zgasza informacje o bdach.
</P>
<P>
Zajrzyj take na nasz ftp
<A
href=
"ftp://ftp.PostgreSQL.org/pub"
>
ftp://ftp.PostgreSQL.org/pub
</A>
, aby
sprawdzi czy nie ma nowszych wersji PostgreSQL czy patchy.
</P>
<H4><A
name=
"1.14"
>
1.14
</A>
) Jak mona porwna PostgreSQL w stosunku
do innych
<SMALL>
DBMS
</SMALL>
?
</H4>
<P>
Jest kilka sposobw oceny softwaru: moliwoci,
wydajno, stabilno, wsparcie i cena.
</P>
<DL>
<DT><B>
Moliwoci
</B></DT>
<DD>
PostgreSQL posiada moliwoci dostpne w duych, komercyjnych
systemach
<SMALL>
DBMS
</SMALL>
, takie jak transakcje, podzapytania
(subselects), triggery, widoki, klucze obce, referential integrity,
oraz wyrafinowany system blokowania. Mamy take waciowci ktrych
inni nie posiadaj, jak typy definiowane przez uytkownika,
dziedziczenie, rules, multi-version concurrency control, ktra
redukuje problemy z blokowaiem (lock contention).
<BR>
<BR>
</DD>
<DT><B>
Wydajno
</B></DT>
<DD>
PostgreSQL dziaa w dwch trybach. Standardowy tryb
<I>
fsync
</I>
zrzuca kad zakoczon transakcj na dysk, gwarantujc w ten
sposb to, e jeli system operacyjny si zawiesi lub straci
zasilanie wcigu kilku nastepnych sekund, wszystkie Twoje dane
zostan bezpiecznie zapisane na dysku. W tym trybie, jestemy
wolniejsi ni wikszo komercyjnych baz danych, czciowo dlatego
e niewiele z nich wykonuje taki sposb zapisywania danych jako
domylne ustawienie.
W trybie
<I>
no-fsync
</I>
z reguy jestemy szybsi ni komercyjne
bazy danych, chocia w tym wypadku zawieszenie si systemu moe
spowodowa uszkodzenie danych. Pracujemy nad tym, aby stworzy
poredni tryb, ktry powoduje mniejsz redukcj wydajnoci ni tryb
fsync i pozwoli na integralno danych w przecigu 30 sekund do
zaamania si systemu operacyjnego.
<BR>
<BR>
Porwnujc do MySQL czy innych prostych baz danych, jestemy
wolniejsi przy wykonywaniu insertw/updatw przez narzut
spowodowany przez transakcje. Oczywicie MySQL nie posiada adnej z
wymienionych wyej
<I>
moliwoci
</I>
. PostgreSQL zosta zbudowany
aby by DBMS elastycznym i bogatym z rnorakie moliwoci,
aczkolwiek dbamy, aby poprawia jego wydajno poprzez analiz
kodu rdowego i profilowanie. Ciekawe porwnanie PostgreSQL i MySQL
mona znale pod adresem
<A
href=
"http://openacs.org/why-not-mysql.html"
>
http://openacs.org/why-not-mysql.html
</A><BR>
<BR>
Kade poczenie klienta jest obsugiwane przez nas poprzez
stworzenie nowego procesu Unixowego. Procesy backendu dziel
bufory danych oraz informacj o blokadach. Uywajc wielu
procesorw, rne backendy mog bez problemu dziaa na rnych
procesorach.
<BR>
<BR>
</DD>
<DT><B>
Stabilno
</B></DT>
<DD>
Zdajemy sobie spraw, e
<SMALL>
DBMS
</SMALL>
musi by stabilny,
w przeciwnym wypadku jest bez wartoci. Staramy si publikowa kod
stabilny, dobrze przetestowany, z minimum moliwych bdw. Kade
wydanie poprzedza conajmniej miesic testw wersji beta. Patrzc na
histori wyda PostgreSQL wida, e dostarczamy stabilne, dobrze
sprawdzone wersje, ktre s gotowe do uycia w rodowisku
produkcyjnym. Mylimy, e proces publikowania kolejnych wersji
opracowany przez nas jest jednym z lepszych wrd innych twrcw
oprogramowania bazodanowego.
<BR>
<BR>
</DD>
<DT><B>
Wsparcie
</B></DT>
<DD>
Dziki naszym listom mailowym masz dostp do duej liczby
programistw i uytkownikw, ktrzy pomagaj rozwiza kady
napotkany problem. Chocia nie moemy gwarantowa znalezienia
rozwizania danego problemu, nie rnimy si w tym od innych
komercyjnych systemw
<SMALL>
DBMS
</SMALL>
. Bezporedni kontakt z
programistami, uytkownikami, dokumentacj i kodem rdowym
sprawiaj, e wsparcie oferowane PostgreSQL niejednokrotnie jest
lepsze ni w innych systemach
<SMALL>
DBMS
</SMALL>
. Istnieje take
moliwo skorzystania z komercyjnego wsparcia dla tych, ktrych
takiego rozwizania potrzebuj.
(Sprawd
<A
href=
"#1.6"
>
ten punkt FAQ
</A>
.)
<BR>
<BR>
</DD>
<DT><B>
Cena
</B></DT>
<DD>
Korzystanie z PostgreSQL jest darmowe, zarwno w przypadku
komercyjnym jak i niekomercyjnym. Moesz korzysta z naszego kodu
rdowego w Twoim produkcie bez adnych ogranicze, poza tymi
wymienionymi w licencji BSD przytoczonej powyej.
<BR>
<BR>
</DD>
</DL>
<H4><A
name=
"1.15"
>
1.15
</A>
) W jaki sposb mog wesprze finansowo
PostgreSQL?
</H4>
<P>
PostgreSQL korzysta z najlepszej infrastruktury od samego pocztku
istnienia projektu, tzn. szeciu lat. Wszystko to zawdziczamy Marc'owi
Fournier'owi, ktry stworzy t infrastruktur i zarzdza ni od
lat.
</P>
<P>
Wysokiej jakoci infrastruktura jest bardzo wana dla kadego
projektu open-source. Zapobiega przerwom w rozwoju projektu i
jakimkolwiek przestojom.
</P>
<P>
Oczywicie korzystanie z wysokiej jakoci infrastruktury nie jest
tanie. Istnieje wiele rznych miesicznych, czy jednorazowych
wydatkw, ktre trzeba ponosi aby wszystko dziaao jak naley.
Jeli Ty, bd Twoja firma moe wspomc finansowo rozwj PostgreSQL
odwied adres:
<A
href=
"http://www.pgsql.com/pg_goodies"
>
http://www.pgsql.com/pg_goodies
</A>
gdzie opisane jest jak to zrobi.
</P>
<P>
Chocia na stronie wspomniana jest nazwa PostgreSQL Inc, "datki"
s przeznaczone jedynie na rozwj projektu PostgreSQL i nie s
przeznaczane na finansowanie jakiejkolwiek firmy. Jeli wolisz,
moesz wysa czek na adres kontaktowy.
</P>
<HR>
<H2
align=
"center"
>
User Client Questions
</H2>
<H4><A
name=
"2.1"
>
2.1
</A>
) Czy s jakie driwery
<SMALL>
ODBC
</SMALL>
dla
PostgreSQL?
</H4>
<P>
Dostpne s dwa driwery
<SMALL>
ODBC
</SMALL>
: PsqlODBC
i OpenLink
<SMALL>
ODBC
</SMALL>
.
</P>
<P>
PsqlODBC jest doczony do rde. Wicej informacji na jego temat
moesz znale pod adresem:
<A
href=
"ftp://ftp.PostgreSQL.org/pub/odbc/"
>
ftp://ftp.PostgreSQL.org/pub/odbc/
</A>
.
</P>
<P>
OpenLink
<SMALL>
ODBC
</SMALL>
moe by pobrany z adresu:
<A
href=
"http://www.openlinksw.com/"
>
http://www.openlinksw.com
</A>
.
Wsppracuje ze standardowym oprogramowaniem klienckim
<SMALL>
ODBC
</SMALL>
wic w ten sposb moesz korzysta z PostgreSQL
<SMALL>
ODBC
</SMALL>
dostpnego na kadej plaformie ktr wspiera (Win, Mac, Unix, VMS).
</P>
<P>
Autorzy bd prawdopodobnie sprzedawa ten produkt osobom ktre
wymagaj komercyjnego wsparcia, ale wersja darmowa bdzie zawsze
dostpna. Wszystkie pytania moesz wysya na adres:
<A
href=
"mailto:postgres95@openlink.co.uk"
>
postgres95@openlink.co.uk
</A>
.
</P>
<P>
Sprawd take rozdzia o
<A
href=
"http://www.postgresql.org/devel-corner/docs/programmer/odbc.html"
>
ODBC
w "Programmer's Guide"
</A>
.
</P>
<H4><A
name=
"2.2"
>
2.2
</A>
) Jakie istniej narzdzia pozwalajce na dostp do
PostgreSQL przez www?
</H4>
<P>
Dobry podrcznik dla pocztkujcych o dostpie do bazy danych
przez www moesz znale pod adresem:
<A
href=
"http://www.webreview.com"
>
http://www.webreview.com
</A></P>
<P>
Inny znajduje si pod adresem:
<A
href=
"http://www.phone.net/home/mwm/hotlist/"
>
http://www.phone.net/home/mwm/hotlist/.
</A></P>
<P>
Do integracji z www, wietnym rozwizaniem jest PHP. Moesz
znale wicej informacji na ten temat pod adresem
<A
href=
"http://www.php.net"
>
http://www.php.net
</A>
.
</P>
<P>
Wiele osb w przypadku skomplikowanych rozwiza uzywa Perl'a i
moduu CGI.pl.
</P>
<H4><A
name=
"2.3"
>
2.3
</A>
) Czy istnieje jakie GUI dla PostgreSQL?
Narzdzie do raportowania? Interfejs dla "embedded query
language"?
</H4>
<P>
Mamy cakiem miy interfejs graficzny, ktry zosta nazwany
<I>
pgaccess
</I>
i jest on dostarczany jako cz rde.
<I>
pgaccess
</I>
posiada take generator raportw. Mona go znale
pod adresem
<A
href=
"http://www.flex.ro/pgaccess"
>
http://www.flex.ro/pgaccess
</A></P>
<P>
Udostpnilimy take
<I>
ecpg
</I>
, ktry jest "embedded SQL query
language interface" dla jzyka C.
</P>
<H4><A
name=
"2.4"
>
2.4
</A>
) Za pomoc jakich jzykw programowania
mona si komunikowa z PostgreSQL?
</H4>
<P>
Mamy wsparcie dla:
</P>
<UL>
<LI>
C (libpq)
</LI>
<LI>
C++ (libpq++)
</LI>
<LI>
Embedded C (ecpg)
</LI>
<LI>
Java (jdbc)
</LI>
<LI>
Perl (perl5)
</LI>
<LI>
ODBC (odbc)
</LI>
<LI>
Python (PyGreSQL)
</LI>
<LI>
TCL (libpgtcl)
</LI>
<LI>
C Easy API (libpgeasy)
</LI>
<LI>
Embedded
<SMALL>
HTML
</SMALL>
(
<A
href=
"http://www.php.net"
>
PHP z http://www.php.net
</A>
)
</LI>
</UL>
<HR>
<H2
align=
"center"
>
Pytania administratora
</H2>
<H4><A
name=
"3.1"
>
3.1
</A>
) Jak mog zainstalowa PostgreSQL w innej
lokalizacji ni
<I>
/usr/local/pgsql
</I>
?
</H4>
<P>
Uyj opcji
<I>
--prefix
</I>
podczas uruchamiania skryptu
<I>
configure
</I>
.
</P>
<H4><A
name=
"3.2"
>
3.2
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikat o bdzie:
<I>
Bad System Call
</I>
lub "core dumped".
Dlaczego?
</H4>
<P>
Ten bd moe by wynikiem wielu problemw, ale na pocztek
sprawd czy masz zainstalowane rozszerzenia systemu V w jdrze
systemu. PostgreSQL wymaga do pracy zainstalowanej obsugi pamici
dzielonej i semaforw.
</P>
<H4><A
name=
"3.3"
>
3.3
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikat o bdzie:
<I>
IpcMemoryCreate
</I>
.
Dlaczego?
</H4>
<P>
Albo nie masz poprawnie skonfigurowanej obsugi pamici dzielonej
w jdrze systemu, albo musisz zwikszy jej dostpny rozmiar.
Dokadna ilo jak potrzebujesz jest zalena od architektury systemu
na jakim pracujesz, jak duo buforw oraz jak duo procesw backendu
skonfigurowae dla
<I>
postmaster'a
</I>
. Dla wikszoci systemw, z
domyln liczb buforw i procesw potrzebujesz minimum w
przyblieniu 1MB. Zobacz
<A
href=
"http://www.postgresql.org/idocs/index.php?kernel-resources.html"
>
PostgreSQL
Administrator's Guide
</A>
gdzie szczegowo zostao opisane
wykorzystanie pamici dzielonej i semaforw.
</P>
<H4><A
name=
"3.4"
>
3.4
</A>
) Podczas startu
<I>
postmaster'a
</I>
,
otrzymuj komunikat o bdzie:
<I>
IpcSemaphoreCreate
</I>
.
Dlaczego?
</H4>
<P>
Jeli tre bdu brzmi:
<I>
IpcSemaphoreCreate: semget failed
(No space left on device)
</I>
oznacza to, e jdro systemu nie jest
skonfigurowane do obsugi wystarczajcej liczby semaforw.
Postgres wymaga jednego semafor'a na potencjalny jeden proces backend.
Tymczasowym rozwizaniem jest uruchomienie programu
<I>
postmaster
</I>
z mniejsz maksymaln liczb procesw backend.
Uyj opcji
<I>
-N
</i>
z parameterem mniejszym od domylnego - 32.
Bardziej trwaym rozwizaniem jest zwikszenie parametrw
<SMALL>
SEMMNS
</SMALL>
i
<SMALL>
SEMMNI
</SMALL>
jdra twojego systemu.
</P>
<P>
Niedziaajce semafory mog spowodowa niepoprawne zamknicie
systemu w czasie intensywnego korzystania z bazy.
</P>
<P>
Jeli tre bdu jest inna, moe to oznacza, e obsuga semaforw
nie zostaa wczona do jdra wcale. Zobacz PostgreSQL
Administrator's Guide po bardziej szczegowe informacje o pamici
dzielonej i semaforach.
</P>
<H4><A
name=
"3.5"
>
3.5
</A>
) W jaki sposb mog kontrolowa poczenia
z innych hostw?
</H4>
<P>
Domylnie PostgreSQL pozwala jedynie na poczenia za pomoc
socketw Unixowych z lokalnego hosta. Inne hosty nie bd mogy si
poczy z serwerem dopki nie zostanie dodana opcja
<I>
-i
</I>
do
<I>
postmaster'a
</I>
,
<B>
oraz
</B>
nie umoliwi si autoryzacji na podstawie adresu hostw
modyfikujc odpowiednio plik
<I>
$PGDATA/pg_hba.conf
</I>
. To zmiany pozwol na
poczenia TCP/IP.
</P>
<H4><A
name=
"3.6"
>
3.6
</A>
) Jak powinienem skonfigurowa system baz
danych aby uzyska lepsz wydajno?
</H4>
<P>
Indeksy bez wtpienia mog przyspieszy wykonywanie zapyta.
Polecenie
<SMALL>
EXPLAIN
</SMALL>
pozwala zobaczy jak PostgreSQL
interpretuje Twoje zapytanie i ktre indeksy s uywane.
</P>
<P>
Jeli wykonujesz bardzo duo
<SMALL>
INSERTw
</SMALL>
, moe warto
je wykona za pomoc jednego duego pliku uywajc polecenia
<SMALL>
COPY
</SMALL>
. Jest to duo szybsze ni pojedyncze
<SMALL>
INSERTy.
</SMALL>
Po drugie polecenia SQL nie zawarte w bloku
okrelajcym transakcj -
<SMALL>
BEGIN WORK/COMMIT
</SMALL>
, s
traktowane jako pojedyncza transakcja. Rozwa wykonanie kilku
polece/zda SQL w jednym bloku transakcji. To redukuje narzut
powodowany przez transakcj. Przy duych zmianach w danych, warto
usun i stworzy na nowo indeksy.
</P>
<P>
Jest kilka opcji pozwalajcych na poprawienie wydajnoci.
Moesz wyczy
<I>
fsync()
</I>
poprzez uruchomienie
<I>
postmaster'a
</I>
z opcjami
<I>
-o -F
</I>
. To spowoduje, e
<I>
fsync()
</I>
nie bdzie zrzuca danych na dysk po kadej
transakcji.
</P>
<P>
Moesz take uruchomi
<I>
postmaster'a
</I>
z opcj
<I>
-B
</I>
aby zwikszy wielko pamici dzielonej uywanej przez procesy
backendw. Jeli ustawisz t warto zbyt wysoko i przekroczysz limity
ustawione przez kernel na pami dzielon,
<I>
postmaster
</I>
moe si
nie uruchomi. Kady bufor zajmuje 8K a domylna ilo buforw to 64.
</P>
<P>
Moesz take uy opcji
<I>
-S
</I>
dla backendu aby zwikszy
maksymaln warto pamici uywan przez proces backendu podczas
sortowania. Opcja
<I>
-S
</I>
jest ustawiana wartoci podawan w
kilobajtach, domylna warto to 512K.
</P>
<P>
Moesz take uy polecenia
<SMALL>
CLUSTER
</SMALL>
aby pogrupowa
dane w tabelach wg indeksu. Zobacz opis polecenia
<SMALL>
CLUSTER
</SMALL>
w manualu eby dowiedzie si wicej.
</P>
<H4><A
name=
"3.7"
>
3.7
</A>
) Jakie s moliwoci wyszukiwania
bdw?
</H4>
<P>
PostgreSQL ma kilka moliwoci na raportowanie informacji o
jego statusie, ktre mog by przydatne przy debugowaniu procesu.
</P>
<P>
Przede wszystkim uruchom skrypt
<I>
configure
</I>
z opcj
--enable-cassert, wiele funkcji
<I>
assert()
</I>
monitoruj postp
procesu backend i zatrzymuj program kiedy wydarzy si co
nieoczekiwanego.
</P>
<P>
Zarwno
<I>
postmaster
</I>
jak i
<I>
postgres
</I>
maj kilka opcji
do debugowania. Za kadym razem kiedy uruchamiasz
<I>
postmaster'a
</I>
,
upewnij si, e wysyasz standardowe wyjcie i error do pliku z
logami, np. w ten sposb:
</P>
<PRE>
cd /usr/local/pgsql
./bin/postmaster
>
server.log 2
>&
1
&
</PRE>
<P>
To utworzy plik server.log w gwnym katalogu PostgreSQL.
Ten plik zawiera poyteczne informacje o problemach i bdach, ktre
wydarzyy si podczas pracy serwera.
<I>
Postmaster
</I>
posiada opcj
<I>
-d
</I>
, ktra pozwala na raportowanie bardzo szczeglowych
informacji. Do opcji
<I>
-d
</I>
podajemy liczb, ktra okrela
szczegowo wysyanych informacji. Musisz mie wiadomo, e
wysoki poziom logowania bdzie powodowa tworzenie bardzo duzych
plikw z logami.
</P>
<P>
Jeli
<I>
postmaster
</I>
nie zosta uruchomiony, moesz uruchomi
<I>
postgres'owy
</I>
backend z linii polece, i uruchomi Twoje
polecenie
<SMALL>
SQL
</SMALL>
bezporednio na nim.
Taki sposb jest polecany
<B>
jedynie
</B>
w przypadku debugowania.
Zwr uwag, e w tym wypadku zapytanie koczy znak nowej linii a nie
rednik. Jeli skompilowae z opcjami debugowania mozesz uy
debuggera aby sprawdzi co si dzieje. Poniew backend nie zosta
uruchomiony przez
<I>
postmaster'a
</I>
, nie dziaa w identycznym
rodowisku, co oznacza e powtrzenie warunkw w jakich wystpiy
problemy moze by problemem.
</P>
<P>
Jeli
<I>
postmaster
</I>
dziaa, uruchom
<I>
psql
</I>
w jednym z
okien, nastpnie znajd
<SMALL>
PID
</SMALL>
procesu
<I>
postgres
</I>
uywanego przez
<I>
psql
</I>
. Uyj debuggera aby do
<SMALL>
PID'u
</SMALL>
<I>
postgres'a
</I>
. Moesz ustawia puapki
(breakpoints) w debuggerze i wykonywa zapytania z
<I>
psql
</I>
.
Jeli debugujesz uruchamianie
<I>
postgres'a
</I>
, moesz ustawi zmienn
PGOPTIONS="-W n", nastpnie uruchomi
<I>
psql
</I>
.
Opcja ta pozwoli spowolni uruchomienie na
<I>
n
</I>
sekund aby mg si poczy z procesem za pomoc
debugera, ustawi jakiekolwiek puapki i kontynuowa proces
uruchamiania.
</P>
<P><I>
postgres
</I>
moe by uruchamiany z opcjami
<I>
-s, -A
</I>
i
<I>
-t
</I>
, ktre mog by bardzo przydatne przy debuggowaniu i ocenie
wydajnoci.
</P>
<P>
Moesz take skompilowa z profilingiem aby zobaczy jakie funkcje
ile czasu wykonuj si. Pliki profilowane dla backendu zostan
umieszczone w katalogu
<I>
pgsql/data/base/dbname
</I>
. Pliki profilu klienta zostan
umieszczone w biecym katalogu klienta. Linux wymaga aby kompilowa
z opcj
<I>
-DLINUX_PROFILE
</I>
aby profilowanie odbywao si
poprawnie.
</P>
<H4><A
name=
"3.8"
>
3.8
</A>
) Skd si bierze komunikat:
<I>
"Sorry, too
many clients"
</I>
podczas prby poczenia si z baz danych?
</H4>
<P>
Musisz zwikszy limit iloci jednoczesnych procesw bacekendu
dla procesu
<I>
postmaster'a
</I>
.
</P>
<P>
Domylny limit to 32 procesy. Moesz go zwikszy przez restart
<I>
postmaster
</I>
z odpowiedni wartoci ustawian opcj
<I>
-N
</I>
w
pliku
<I>
postgresql.conf
</I>
.
</P>
<P>
We pod uwag, e jeli zwikszysz warto podan w opcji
<I>
-N
</I>
na wicej ni 32 musisz take zwikszy warto w opcji
<I>
-B
</I>
ponad jej domyln warto 64; warto
<I>
-B
</I>
musi by
co najmniej dwa razy wiksza od wartoci podanej w opcji
<I>
-N
</I>
, a prawdopodobnie powinna by w rzeczywistoci jeszcze
wiksza dla optymalnej wydajnoci.
Dla duej liczby procesw backendu na pewno zauwaysz, e trzeba
zwikszy rne parametry jdra Unixa. Rzeczy, ktre powniene
sprawdzi to maksymalna liczba blokw pamici dzielonej,
<SMALL>
SHMMAX;
</SMALL>
maksymalna liczba semaforw,
<SMALL>
SEMMNS
</SMALL>
oraz
<SMALL>
SEMMNI;
</SMALL>
maksymalna liczba procesw,
<SMALL>
NPROC;
</SMALL>
maksymalna liczba
procesw na jednego uytkownika,
<SMALL>
MAXUPRC;
</SMALL>
i maksymalna
liczba otwartych plikw,
<SMALL>
NFILE
</SMALL>
oraz
<SMALL>
NINODE.
</SMALL>
Powd dla ktrego PostgreSQL ma limit na
maksymaln liczb procesw backendu to obawa o wyczerpanie zasobw
systemu.
</P>
<P>
W wersjach PostgreSQL wczeniejszych ni 6.5, maksymalna liczba
backendw bya ustawiona na 64, a zmiana tej wartoci wymaga
rekompliacji po zmianie staej MaxBackendId w pliku
<I>
include/storage/sinvaladt.h
</I>
.
</P>
<H4><A
name=
"3.9"
>
3.9
</A>
) Co to s za pliki typu:
<I>
pg_sorttempNNN.NN
</I>
,
ktre znajduj si w katalogu z plikami bazy danych?
</H4>
<P>
S to tymczasowe pliki utworzone przez executor. Dla przykadu,
jeli jaka operacja sortowania jest wymagana do wykonania
<SMALL>
ORDER BY,
</SMALL>
a samo sortowanie wymaga wicej miejsca ni
paratmetr backendu
<I>
-S
</I>
ustawi do wykorzystania, wtedy tymczasowe pliki s uywane
do przechowywania tych danych.
</P>
<P>
Pliki tymczasowe powinny by usunite automatycznie, ale mogo si
to nie sta jeli proces backendu w midzyczasie nie zakoczy si
poprawnie podczas operacji sortowania. Jeli w danym momencie nie
dziaaj adne procesy backendw mozesz spokojnie usun pliki
pg_tempNNN.NN.
</P>
<HR>
<H2
align=
"center"
>
Pytania dotyczce uywania
</H2>
<H4><A
name=
"4.1"
>
4.1
</A>
) Jaka jest rnica pomidzy kursorami
binarnymi (binary cursors) i zwykymi kursorami (normal
cursors)?
</H4>
<P>
Zobacz w manualu opis polecenia
<SMALL>
DECLARE
</SMALL>
.
</P>
<H4><A
name=
"4.2"
>
4.2
</A>
) Jak mog pobra za pomoc
<SMALL>
SELECT
</SMALL>
jedynie kilka pierwszych wynikw
zapytania?
</H4>
<P>
Zobacz w manualu opis polecenia
<SMALL>
FETCH
</SMALL>
lub uyj
polecenia
<SMALL>
SELECT
</SMALL>
...
<SMALL>
LIMIT
</SMALL>
....
</P>
<P>
Nawet jeli chesz pobra kilka pierwszych rzdw z wyniku
zapytania, cae zapytanie musi zosta wykonane. Byc moe powiniene
skorzysta z polecenia
<SMALL>
ORDER BY.
</SMALL>
Jeli istnieje indeks ktry odpowiada polom okrelonym przez
<SMALL>
ORDER BY
</SMALL>
, PostgreSQL moe wykorzysta jedynie kilka
pierwszych rzdw, by moe bdzie konieczno wykonania zapytania do
momentu a zostan znalezione podane wyniki.
</P>
<H4><A
name=
"4.3"
>
4.3
</A>
) Jak mog uzyska list wszystkich tabel
czy innych rzeczy pod
<I>
psql
</I>
?
</H4>
<P>
Moesz sprawdzi zawarto rde
<I>
psql
</I>
, a konkretnie plik
<I>
pgsql/src/bin/psql/describe.c
</I>
. Zawiera on polecenia
<SMALL>
SQL
</SMALL>
ktre generuja wyniki komend z backslashem.
Moesz take uruchomi
<I>
psql
</I>
z opcj
<I>
-E
</I>
wtedy po wykonaniu polecenia z backslashem wywietlane
bdzie zapytanie, ktre w rzeczywistoci jest wykonywane.
</P>
<H4><A
name=
"4.4"
>
4.4
</A>
) Jak usun kolumn z tabeli?
</H4>
<P>
Nie mamy zaimplementowanego
<SMALL>
ALTER TABLE DROP
COLUMN,
</SMALL>
ale moesz zrobi tak:
</P>
<PRE>
SELECT ... -- wybierz zawarto wszystkich kolumn poza t jedn ktrej chcesz si pozby
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
</PRE>
<H4><A
name=
"4.5"
>
4.5
</A>
) Jaki jest maksymalny rozmiar dla rzdu,
tabeli i bazy danych?
</H4>
<P>
Oto wszystkie ograniczenia:
</P>
<PRE>
Maksymalny rozmiar dla bazdy danych? nieograniczony ( istniej bazy danych o wielkoci 500 GB databases )
Maksymalny rozmiar dla tabeli? 16 TB
Maksymalny rozmiar dla rzdu? nieograniczony w 7.1 i pniejszych
Maksymalny rozmiar pola? 1 GB w 7.1 and later
Maksymalna liczba rzdw w tabeli? nieograniczona
Maksymalna liczba kolumn w tabeli? 250-1600 w zaleonoci od typw kolumn
Makasymalna liczba indeksw na tabeli? nieograniczona
</PRE>
Oczywicie "nieograniczony" nie jest prawd tak do koca, istniej
ograniczenia wynikajce z dostpnego miejsca na dysku, pamici/swapa.
Kiedy wielkoci te bd bardzo due moe odbi si to na wydajnoci.
<P>
Maksymalny rozmiar tabeli, czyli 16 TB nie wymaga od systemu
operacyjnego wsparcia dla duych plikw. Due tabele s przechowywane
jako pliki o rozmiarze 1 GB, wic ograniczenia co do wielkoci plikw
narzucone przez system plikw nie s istotne.
</P>
<P>
Masymalny rozmiar tabeli i maksymalna liczba kolumn moe by
zwikszona jeli zwikszymy domylny rozmiar bloku (block size) do
32k.
</P>
<H4><A
name=
"4.6"
>
4.6
</A>
) Jak duo miejsca w bazie danych jest
konieczne aby przechowywa dane ze zwyczajnego pliku
tekstowego?
</H4>
<P>
Baza danych PostgreSQL moe potrzebowa do piciu razy wicej
miejsca na przechowywanie danych z plikw tekstowych ni ich
objto.
</P>
<P>
Jako przykad moemy rozway plik skadajcy si z 100,000 linii
zbudowanych z liczby cakowitej oraz opisu tekstowego w kadej.
Zamy, e rednio kady acuch tekstu w linii zajmuje 20
bajtw. Cay plik powinien zajmowa ok. 2.8 MB. Rozmiar pliku bazy danych w
PostgreSQL zawierajcego te dane mozna oszacowa na okoo 6.4MB:
</P>
<PRE>
36 bajtw: nagwek kadego rzdu w przyblieniu)
24 bajty: jedno pole int i jedno pole typu text
+ 4 bajty: wkanik na stronie do krotki
--------------------------------------------------
64 bajty w jednym rzdzie
Strona danych w PostgreSQL zajmuje 8192 bajtw (8 KB), wic:
8192 bajtw na stron
--------------------- = 128 rzdw na jedn strone w bazie (zaokrglone w d)
64 bajtw na rzd
100000 rzdw danych
----------------------- = 782 stron w bazie danych (zaokrglone w gr)
128 rzdw na stron
782 stron w bazie * 8192 bajtw na stron = 6,406,144 bajtw (6.4 MB)
</PRE>
<P>
Indeksy nie powoduj duego narzutu na zajmowane miejsce,
ale zawieraj pewne dane,
wic w pewnych przypadkach moga by cakiem due.
</P>
<H4><A
name=
"4.7"
>
4.7
</A>
) Jak mog sprawdzi jakie tabele, klucze,
bazy danych i uytkownicy s utworzeni?
</H4>
<P><I>
psql
</I>
ma cakiem du ilo polece z backslashem aby
wydoby takie informacje. Wprowad \? aby zobaczy ich spis. Istniej
take tablice systemowe rozpoczynajce si od
<i>
pg_
</i>
, zawierajce
interesujce Ciebie informacje. Wykonanie
<i>
psql -l
</i>
pokae spis
wszystkich baz danych.
</P>
<P>
Obejrzyj take plik
<I>
pgsql/src/tutorial/syscat.source
</I>
.
Zawiera on wiele z zapyta typu
<SMALL>
SELECT
</SMALL>
, ktre s
potrzebne aby wydoby informacje z tablic systemowych.
</P>
<H4><A
name=
"4.8"
>
4.8
</A>
) Moje zapytania s wolne lub nie uywaj
kluczy. Dlaczego?
</H4>
Indeksy nie s uywane automatycznie przez kde z zapyta. Ideksy s
uywane jedynie gdy tabela jest odpowiedniego rozmiaru, wikszego ni
wymagany minimalny, a zapytanie wybiera jedynie may procent
zawartoci tabeli. Wynika to z tego, e losowy dostep do dysku
powodowany przez ideksowane poszukiwanie jest czasami wolniejsze ni
poszukiwanie sekwencyjne bez uycia kluczy.
<P>
eby zdecydowa czy indeks powinien byc uywany, PostgreSQL musi
mie statystyki dotyczce danej tabeli. S one gromadzone przez
uycie polecenia
<SMALL>
VACUUM ANALYZE
</SMALL>
, lub poprostu
<SMALL>
ANALYZE
</SMALL>
. uywajc statystyk, optymalizator wie ile
rzdw jest w tabeli i moe lepiej okreli czy indeksy powinny by
uyte. Statystyki mog by take pomocne w okreleniu najlepszej
kolejnoci wykonania zczenia (join) i jego sposobu. Gromadzenie
statystyk powinno si odbywa w okrelonych interwaach czasu
poniewa dane w tabelach zmieniaj si.
</P>
<P>
Indeksy nie s zazwyczaj uywane przez
<SMALL>
ORDER BY
</SMALL>
lub
przy wykonywaniu zcze (join). Sekwencyjne przeszukiwanie po ktrym
nastpuje sortowanie jest zazwyczaj szybsze ni wyszukiwanie za
pomoc indeksu na duej tabeli.
</P>
Jakkolwiek
<SMALL>
LIMIT
</SMALL>
w poczeniu z
<SMALL>
ORDER BY
</SMALL>
czsto bdzie wykorzystywa indeksw poniewz jedynie maa czc z
tabeli jest zwracana.
<P>
Kiedy uywa si operatorw dopasujcych takich jak
<SMALL>
LIKE
</SMALL>
lub
<I>
~
</I>
, indeksy bd uywane jedynie jeli
pocztek wyszukiwania jest oparty na pocztku acucha tekstu.
Dlatego, aby uywac indeksw,
dopasowania operatorem
<SMALL>
LIKE
</SMALL>
nie mog si zaczyna
<I>
%
</I>
, a dopasowania operatorem
<I>
~
</I>
(dopasowania regularne)
musz si zaczyna znakiem specjalnym
<I>
^
</I>
.
</P>
<H4><A
name=
"4.9"
>
4.9
</A>
) Jak mog sprawdzi w jakis sposb "query
optimizer" wykonuje moje zapytanie?
</H4>
<P>
Zobacz manual dla polecenia
<SMALL>
EXPLAIN
</SMALL>
.
</P>
<H4><A
name=
"4.10"
>
4.10
</A>
) Co to jest "R-tree index"?
</H4>
<P>
Indeks R-tree jest uywany do indeksowania danych przestrzennych.
Indeks hasuujcy nie nadaje si do wyszukiwania odlegoci.
Natomiast indeks typu B-tree moe wyszukiwa odlegloci jedynie w
jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
przestrzeniami wielo-wymiarowymi. Dla przykadu, jeli zostanie
zaoony indeks typu R-tree na polu typu
<I>
point
</I>
, system moe
bardziej wydajnie odpowiada na zapytania typu
"select all points within a bounding rectangle."
</P>
<P>
rdowym dokumentem opisujcym oryginalnie projektowanie R-tree
indeksw jest:
</P>
<P>
Guttman, A. "R-trees: A Dynamic Index Structure for Spatial
Searching." Proceedings of the 1984 ACM SIGMOD Int'l Conf on Mgmt
of Data, 45-57.
</P>
<P>
Ten dokument moesz znale take w pracy Stonebraker'a "Readings in
Database Systems".
</P>
<P>
Wbudowane indeksy R-trees radz sobie w wielobokami i boxes.
Teoretycznie, indeksy R-tree mog by rozszerzone o moliwoci
indeksowania w wicej wymiarowych przestrzeniach. W praktyce,
rozbudowa indeksw R-tree wymaga troch pracy, a w tej chwili nie
dysponujemy jakkolwiek dokumentacj jak to zrobi.
</P>
<H4><A
name=
"4.11"
>
4.11
</A>
) Co to jest "Genetic Query
Optimizer"?
</H4>
<P>
Modu
<SMALL>
GEQO
</SMALL>
ma za zadanie przyspieszenie
optymalizacji zapyta czc wiele tabel za pomoc algorytmw
genetycznych (Genetic Algorithm (GA)). Pozwala na uywanie duych
zapyta czcych tabele (join queries) bez wykorzystywania
zasoboernego wyszukiwania.
</P>
<H4><A
name=
"4.12"
>
4.12
</A>
) Jak mog uywa wyrae regularnych w
zapytaniach i zapyta case-insensitive w wyraeniach
regularnych?
jak korzysta z indeksw dla zapyta case-insensitive?
</H4>
<P>
Operator
<I>
~
</I>
moze by wykorzystywany do wyszukiwania za
pomoc wyrae regularnych, a
<I>
~*
</I>
do wyszukiwania case-insensitive z wyraeniami
regularnymi.
Wariant case-insensitive dla
<SMALL>
LIKE
</SMALL>
zosta nazwany
<SMALL>
ILIKE
</SMALL>
i jest dostpny w PostgreSQL 7.1 i pniejszych
wersjach.
</P>
<P>
Porwnania case-insensitive s zazwyczaj wykonywane w nastpujcy
sposb:
</P>
<PRE>
SELECT *
FROM tab
WHERE lower(col) = 'abc'
</PRE>
W tym wypadku standardowe indeksy nie bd uywane. Moesz utworzy
indeks funkcyjny, poprzez:
<PRE>
CREATE INDEX tabindex on tab (lower(col));
</PRE>
<H4><A
name=
"4.13"
>
4.13
</A>
) Jak sprawdzi w zapytaniu czy pole ma
warto
<SMALL>
NULL
</SMALL>
?
</H4>
<P>
Moesz to sprawdzi, testujc warto kolumny warunkiem
<SMALL>
IS NULL
</SMALL>
albo
<SMALL>
IS NOT NULL
</SMALL>
.
</P>
<H4><A
name=
"4.14"
>
4.14
</A>
) Jaka jest rnica pomidzy rnymi
typami tekstowymi (character types)?
</H4>
<PRE>
Type Nazwa wewntrzna Uwagi
--------------------------------------------------
"char" char 1 znak
CHAR(#) bpchar wypeniane pustymi znakami do podanej dugoci
VARCHAR(#) varchar rozmiar okrela maksymaln dugo, nie ma tutaj wypeniania
TEXT text bez limitu na dugo acucha
BYTEA bytea zmiennej dugoci tablica bajtw (null-byte safe)
</PRE>
<P>
Jeli bdziesz przeglda katalogi systemowe lub komunikaty o
bdach czsto spotkasz si z podanymi powyej nazwami
wewntrznymi.
</P>
<P>
Ostatnie cztery typy powyej to tzw typy "varlena" (np. pierwsze
cztery bajty na dysku to dugo, po ktrych jest data). Dlatego
faktyczna dugoc takiego acucha jest troch wiksza ni
zadeklarowany rozmiar. Te typy take podlegaj kompresji lub mog by
przechowywane out-of-line jako
<SMALL>
TOAST
</SMALL>
, wic faktyczne
zuycie miejsca na dysku moe by mniejsze ni oczekiwane.
</P>
<P><SMALL>
CHAR()
</SMALL>
jast najlepszym typem do przechowywania
acuchw o tej samej dugoci.
<SMALL>
VARCHAR()
</SMALL>
jest
najodpowiedniejszy do przechowywania acuchw o rnej dugoci
ale okrela on maksymaln jego dugo.
<SMALL>
TEXT
</SMALL>
jest
najlepszy dla acuchw o dowolnej dugoci, nie przekraczajcej 1GB.
<SMALL>
BYTEA
</SMALL>
suy do przechowywania danych binarnych,
w szczeglnoci dla danych zawierajcych
<SMALL>
NULL
</SMALL>
bajty.
</P>
<H4><A
name=
"4.15.1"
>
4.15.1
</A>
) Jak mog utworzy pole ktre samo
zwiksza swoj warto?
</H4>
<P>
PostgreSQL ma zaimplementowany typ
<SMALL>
SERIAL
</SMALL>
.
Automatycznie tworzy sekwencj i indeks na tej kolumnie. Dla
przykladu:
</P>
<PRE>
CREATE TABLE person (
id SERIAL,
name TEXT
);
</PRE>
zostanie automatycznie prztumaczone na:
<PRE>
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
name TEXT
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
</PRE>
Wicej informacji o sekwencjach znajdziesz w manualu o
<I>
create_sequence
</I>
. Moesz take uy pola
<I>
OID
</I>
jako
unikalnej wartoci dla kadego rzdu danych. Jeli bdziesz
potrzebowa z backupowa dane robic dump bazy i odtworzy j, musisz
uyc
<I>
pg_dump
</I>
z opcj
<I>
-o
</I>
lub polecenia
<SMALL>
COPY
WITH OIDS
</SMALL>
aby zachowa
<SMALL>
OIDy
</SMALL>
.
<H4><A
name=
"4.15.2"
>
4.15.2
</A>
) Jak pobra warto pola typu
<SMALL>
SERIAL
</SMALL>
po wykonaniu insert'u?
</H4>
<P>
Jednym z podej jest pobranie kolejnej wartoci typu
<SMALL>
SERIAL
</SMALL>
z sekwencji za pomoc funkcji
<I>
nextval()
</I>
<I>
zanim
</I>
zostanie wstawiona, a pniej naley jej uy. Uywajc
przykadu z tabeli z punktu
<A
href=
"#4.15.1"
>
4.15.1
</A>
, moe to
wyglda w Perlu na przykad w ten sposb:
</P>
<PRE>
new_id = output of "SELECT nextval('person_id_seq')"
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
</PRE>
Bdziesz mia wtedy t warto przechowan w zmiennej
<CODE>
new_id
</CODE>
do uytku w innych zapytaniach (np. jako klucz
obcy do tabeli
<CODE>
person
</CODE>
). Warto zwrci uwag, e nazwa
automatycznie utworzonej sekwencji
<SMALL>
SEQUENCE
</SMALL>
bdzie nastpujca:
<
<I>
tabela
</I>
>
_
<
<I>
kolumnatypuserial
</I>
>
_
<I>
seq
</I>
,
gdzie
<I>
tabela
</I>
i
<I>
kolumnatypuserial
</I>
s nazwami Twojej tabeli i
Twojej kolumny typu
<SMALL>
SERIAL
</SMALL>
.
<P>
Inne rozwizanie to uycie funkcji
<I>
currval
</I>
() na pola typu
<SMALL>
SERIAL
</SMALL>
po dodaniu nowej wartoci do rzdu zawierajcego
kolumn typu
<SMALL>
SERIAL
</SMALL>
z wstawion domylnie wartoci,
np.
</P>
<PRE>
INSERT INTO person (name) VALUES ('Blaise Pascal');
new_id = output of "SELECT currval('person_id_seq')";
</PRE>
Ostatecznie moesz uy
<A
href=
"#4.16"
><SMALL>
OID
</SMALL></A>
zwracanej po wykonaniu
<SMALL>
INSERT
</SMALL>
, chocia to jest najmniej
przenone rozwizanie.
W Perlu, wykorzystujc bibliotek DBI z moduem Edmunda Mergla
DBD::Pg, oid jest dostpny poprzez
<I>
$sth-
>
{pg_oid_status}
</I>
po
wykonaniu
<I>
$sth-
>
execute()
</I>
.
<H4><A
name=
"4.15.3"
>
4.15.3
</A>
) Czy uycie
<I>
currval()
</I>
i
<I>
nextval()
</I>
nie doprowadzi do race condition z innymi
uytkownikami?
</H4>
<P>
Nie. currval() zwraca biec warto przypisan przez Twj
backend, a nie przez wszystkich uytkownikw.
</P>
<H4><A
name=
"4.15.4"
>
4.15.4
</A>
) Dlaczego numery sekwencji nie s
ponownie uywane przy przerwaniu transakcji?
Skd si bior luki w numerowaniu kolumny tabeli
sekwancjami/SERIALem?
</H4>
<P>
Aby poprawi zbieno (concurrency), wartoci sekwencji s
podawane dziaajcym transakcjom kiedy tego potrzebuj i nie s
blokowane dopki transakcja si nie zakoczy. To spowoduje przerwy w
numerowaniu z przerwanych transakcji.
</P>
<H4><A
name=
"4.16"
>
4.16
</A>
) Co to jest
<SMALL>
OID
</SMALL>
? Co to
jest
<SMALL>
TID
</SMALL>
?
</H4>
<P><SMALL>
OID
</SMALL>
s PostgreSQL'owym rozwizaniem problemu
unikalnych numerw rzdw. Kady rzd tworzony przez PostgreSQL
otrzymuje unikalny
<SMALL>
OID
</SMALL>
. Wszystkie
<SMALL>
OID
</SMALL>
y
generowane podczas procesu uruchamianego przez skrypt
<I>
initdb
</I>
maj mniejsz warto ni 16384 (na podstawie pliku
<I>
backend/access/transam.h
</I>
). Wszystkie
<SMALL>
OID
</SMALL>
y tworzone przez uytkownika sa rwne lub wiksze
podanej wczeniej wartoci. Domylnie
wszystkie
<SMALL>
OID
</SMALL>
y s unikalne nie tylko w pojedyczej
tabeli czy bazie danych ale w caej instalacji PostgreSQL.
</P>
<P>
PostgreSQL uywa
<SMALL>
OIDw
</SMALL>
w swoim wewntrznym systemie
tabel, aby mona byo je czy.
Te
<SMALL>
OIDy
</SMALL>
mog byc uywane aby identyfikowac rzdy w
tabelach i wykorzystywa je w zczeniach tych tabel. Zaleca si aby
uywa typu
<SMALL>
OID
</SMALL>
aby przechowywa wartoci
<SMALL>
OID
</SMALL>
. Moesz utworzy indeks na polu
<SMALL>
OID
</SMALL>
aby dostp do niego by szybszy.
</P>
<P><SMALL>
OID
</SMALL>
s przypisane do wszystkich rzdw z jednego
gwnego miejsca i uywane sa przez wszystkie bazy danych. Jeli
chciaby zmieni
<SMALL>
OID
</SMALL>
na co innego, lub jeli
chciaby zrobi kopi tabeli, z orginalnymi
<SMALL>
OIDami
</SMALL>
nie ma adnego przeciwwskazania aby to zrobi:
</P>
<PRE>
CREATE TABLE new_table(old_oid oid, mycol int);
SELECT old_oid, mycol INTO new FROM old;
COPY new TO '/tmp/pgtable';
DELETE FROM new;
COPY new WITH OIDS FROM '/tmp/pgtable';
<!--
CREATE TABLE new_table (mycol int);
INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table;
-->
</PRE>
<P><SMALL>
OIDy
</SMALL>
s przechowywane jako cztero-bajtowe liczby
cakowite i skocz si po osigniciu czterech miliardw. Nikt jak
dotd nie zgosi aby co takiego si stalo, ale mamy zamiar pozby
si tego ograniczenia zanim kto to zgosi.
</P>
<P><SMALL>
TID
</SMALL>
s uywane aby zidentyfikowa konkretne rzdy z
blokami i wartoci ofsetw.
<SMALL>
TIDy
</SMALL>
zmieniaj si wraz
ze zmianami rzdw. Sa uywane przez indeksy, aby wskazywa do
fizycznych rzdw.
</P>
<H4><A
name=
"4.17"
>
4.17
</A>
) Jakie jest znaczenie niektrych terminw
w PostgreSQL?
</H4>
<P>
W czci kodu rdowego i starszej dokumentacji uywamy terminw,
ktre maj bardziej oglne znaczenie. Oto niektre z nich:
</P>
<UL>
<LI>
table, relation, class
</LI>
<LI>
row, record, tuple
</LI>
<LI>
column, field, attribute
</LI>
<LI>
retrieve, select
</LI>
<LI>
replace, update
</LI>
<LI>
append, insert
</LI>
<LI><SMALL>
OID
</SMALL>
, serial value
</LI>
<LI>
portal, cursor
</LI>
<LI>
range variable, table name, table alias
</LI>
</UL>
<P>
List terminw zwizanych z bazami danych moesz znale pod tym
adresem:
<A
href=
"http://www.comptechnews.com/~reaster/dbdesign.html"
>
http://www.comptechnews.com/~reaster/dbdesign.html
</A></P>
<H4><A
name=
"4.18"
>
4.18
</A>
) Skd bierze si ten bd
<I>
"ERROR:
Memory exhausted in AllocSetAlloc()"
</I>
?
</H4>
<P>
Jeli uywasz wersji starszej ni 7.1, upgrade moe rozwiza ten
problem. Jest take mozliwe, e po prostu wyczerpaa Ci si pami
wirtualna (virtual memory) w systemie lub Twj kernel ma zbyt nisko
ustawione limity dla pewnych zasobw. Sprbuj wykona nastpujce
polecenia zanim uruchomisz
<I>
postmaster'a
</I>
:
</P>
<PRE>
ulimit -d 262144
limit datasize 256m
</PRE>
W zalenoci od shell'a jakiego uywasz jedno z tych polece moe nie
zadziaa, ale to ustawienie pozwoli ustawi segment danych dla
procesu znacznie wikszy i by moe pozwoli wykona zapytanie.
To polecenie zadziaa dla biecego procesu oraz wszytkich podprocesw
utworzonych po wykonaniu polecenia. Jeli ten problem wystpuje z
klientem
<SMALL>
SQL
</SMALL>
, poniewa backend zwraca zbyt duo danych,
sprbuj wykona to polecenie przed uruchomieniem klienta.
<H4><A
name=
"4.19"
>
4.19
</A>
) Jak sprawdzi jakiej wersji PostgreSQL
uywam?
</H4>
<P>
W
<I>
psql
</I>
, wpisz
<CODE>
select version();
</CODE></P>
<H4><A
name=
"4.20"
>
4.20
</A>
) Dlaczego operacje, ktre wykonuj na
duych obiektach "large-object" zwracaj komunikat:
<I>
"invalid large obj descriptor"
</I>
?
</H4>
<P>
Musisz uy
<CODE>
BEGIN WORK
</CODE>
i
<CODE>
COMMIT
</CODE>
przed i po uyciu uchwytu do duego obiektu, tzn. musisz nimi otoczy
funkcje
<CODE>
lo_open
</CODE>
...
<CODE>
lo_close.
</CODE></P>
<P>
Obecnie PostgreSQL uywjc "rule" zamyka uchwyt do duego obiektu
przy kadym wywoaniu "commit". Wic pierwsze prba zrobienia
czegokolwiek z uchwytem spowoduje wypisanie:
<I>
invalid large obj
descriptor
</I>
. Kod, ktry do tej pory dziaa (przynajmniej
wikszo razy) bdzie teraz generowa informacj o bdzie jeli nie
bdziesz korzysta z transakcji.
</P>
<P>
Jeli uywasz interfejsu klienta jak
<SMALL>
ODBC
</SMALL>
by moe
bdziesz musia ustawi
<CODE>
auto-commit off.
</CODE></P>
<H4><A
name=
"4.21"
>
4.21
</A>
) Jak stworzy kolumn ktrej domyln
wartoci bdzie biecy czas?
</H4>
<P>
Uyj
<I>
CURRENT_TIMESTAMP
</I>
:
</P>
<PRE>
<CODE>
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
</CODE>
</PRE>
<H4><A
name=
"4.22"
>
4.22
</A>
) Dlaczego zapytania uywajce
<CODE><SMALL>
IN
</SMALL></CODE>
sa takie wolne?
</H4>
<P>
Obecnie czymy podzapytania w outer queries poprzez sekwencyjne
przeszukiwanie wynikw podzapytania dla kadego rzdu z outer query.
Mona to omin zastpujc
<CODE>
IN
</CODE>
przez
<CODE>
EXISTS
</CODE>
:
</P>
<PRE>
<CODE>
SELECT *
FROM tab
WHERE col1 IN (SELECT col2 FROM TAB2)
</CODE>
</PRE>
na:
<PRE>
<CODE>
SELECT *
FROM tab
WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2)
</CODE>
</PRE>
Mamy zamiar poprawi to ograniczenie w przyszych wydaniach.
<H4><A
name=
"4.23"
>
4.23
</A>
) Jak wykona "outer join"?
</H4>
<P>
PostgreSQL 7.1 i pniejsze wersje maj zaimplementowane outer join
wykorzystujc standardow skadnie SQL. Poniej dwa przykady:
</P>
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
</PRE>
or
<PRE>
SELECT *
FROM t1 LEFT OUTER JOIN t2 USING (col);
</PRE>
<P>
Te dwa identyczne zapytania cz kolumn t1.col z kolumn t2.col,
ale take zwrc niepoczone rzdy w t1 (te ktre nie pasuj w t2).
<SMALL>
RIGHT
</SMALL>
join dodaby niepoczone rzdy z tabeli t2.
<SMALL>
FULL
</SMALL>
join zwrciby rzdy plus dodatkowo wszystkie
rzdy z tabel t1 i t2. Sowo
<SMALL>
OUTER
</SMALL>
jest opcjonalne i
jest dodawane domylnie przy
<SMALL>
LEFT
</SMALL>
,
<SMALL>
RIGHT
</SMALL>
, i
<SMALL>
FULL
</SMALL>
join'ach. Zwyke join'y s nazywane
<SMALL>
INNER
</SMALL>
joins.
</P>
<P>
W poprzednich wersjach "outer joins" mog by zasymulowane poprzez
uycie slowa kluczowego
<SMALL>
UNION
</SMALL>
i
<SMALL>
NOT IN
</SMALL>
. Dla przykadu, czc
tabele
<I>
tab1
</I>
i
<I>
tab2
</I>
, nastpujce zapytanie wykonuje
<I>
outer
</I>
join:
<BR>
<BR>
</P>
<PRE>
SELECT tab1.col1, tab2.col2
FROM tab1, tab2
WHERE tab1.col1 = tab2.col1
UNION ALL
SELECT tab1.col1, NULL
FROM tab1
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
ORDER BY col1
</PRE>
<H4><A
name=
"4.24"
>
4.24
</A>
) Jak wykonywa zapytanie uywajce kilku
baz danych jednoczenie?
</H4>
<P>
Nie ma takiej moliwoci aby w zapytaniu odpytawa inn baze danych
poza biec. Poniewa PostgreSQL aduje specyficzne dla bazy danych
katalogi systemowe, nie jest do koca jasne jak zapytanie pomidzy
rnymi bazami danych powinno si zachowywa.
</P>
<P>
Oczywicie klient moe czy si z rnymi bazami danych i czy
informacj w ten sposb uzyskan.
</P>
<H4><A
name=
"4.25"
>
4.25
</A>
) Jak zwrci w funkcji wiele rzdw lub
kolumn?
</H4>
<P>
Moesz zwraca zbiory z funkcji PL/pgSQL uywajc
<i>
refcursors
</i>
. Zobacz
<a
href=
"http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html"
>
http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
</a>
sekcj 23.7.3.3.
</P>
<H2
align=
"center"
>
Rozwijanie PostgreSQL
</H2>
<H4><A
name=
"5.1"
>
5.1
</A>
) Napisaem wasn funkcj. Kiedy uyj jej
w
<I>
psql
</I>
, program zrzuca pami (dump core)?
</H4>
<P>
Problem moe by spowodowany przez bardzo wiele rzeczy. Sprbuj
najpierw przetestowa Twoj funkcj w samodzielnie dziaajcym programie.
</P>
<H4><A
name=
"5.2"
>
5.2
</A>
) Jak mog doda/zgosi nowe typy czy
funkcje do PostgreSQL?
</H4>
<P>
Wylij Twoje propozycje na list mailow
<I>
pgsql-hackers
</I>
,
wtedy prawdopodobnie Twj kod znajdzie si w katalogu
<I>
contrib/
</I>
.
</P>
<H4><A
name=
"5.3"
>
5.3
</A>
) Jak napisa funkcj C zwracajc krotk
(tuple)?
</H4>
<P>
To wymaga wysiku tak olbrzymiego, e nawet autorzy nigdy tego nie
prubowali, chocia z zaloe wynika, e jest to moliwe.
</P>
<H4><A
name=
"5.4"
>
5.4
</A>
) Zmieniem plik rdowy. Dlaczego po
rekompilacji nie wida zmiany?
</H4>
<P>
Pliki
<I>
Makefiles
</I>
nie maj dorzuconych odpowiednich
zalenoci dla plikw nagwkowych (include files). Wykonaj najpierw
<I>
make clean
</I>
, a nastpnie ponownie
<I>
make
</I>
.
Jeli uywasz
<SMALL>
GCC
</SMALL>
moesz uy opcji
<I>
--enable-depend
</I>
przy wykonywaniu
<I>
configure
</I>
aby
</BODY>
</HTML>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment