1 <!DOCTYPE html PUBLIC
"-//W3C//DTD html 4.01 transitional//EN">
4 <!-- DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN" -->
8 <META name=
"generator" content=
"HTML Tidy, see www.w3.org">
9 <meta http-equiv=
"Content-Type" content=
"text/html; charset=utf8">
10 <TITLE>PostgreSQL FAQ
</TITLE>
13 <BODY bgcolor=
"#ffffff" text=
"#000000" link=
"#ff0000" vlink=
"#a00000"
16 <H1>Frequently Asked Questions (FAQ) o PostgreSQL
</H1>
18 <P>Ostatnia aktualizacja: Sobota Luty
7 22:
16:
21 EST
2004</P>
20 <P>Ostatnia aktualizacja tłumaczenia: Piątek Marzec
5 19:
31:
12 EST
2004</P>
22 <P>Obecny maintainer: Bruce Momjian (
<A href=
23 "mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us
</A>)
<BR>
25 <P>Tłumaczenie: Marcin Mazurek (
<A href=
26 "mailto:m.mazurek@netsync.pl">m.mazurek@netsync.pl
</A>)
<BR>
29 <P>Najbardziej aktualną wersję tego dokumentu można znaleźć pod
32 "http://www.Postgresql.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html
</A>.
</P>
34 <P>Odpowiedzi na pytania dotyczące konkretnych systemów operacyjnych
35 można znaleźć pod adresem:
37 "http://www.PostgreSQL.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html
</A>.
</P>
40 <H2 align=
"center">Pytania ogólne
</H2>
41 <A href=
"#1.1">1.1</A>) Co to jest PostgreSQL? Jak to wymawiać?
<BR>
42 <A href=
"#1.2">1.2</A>) Jaką licencją chroniony jest PostgreSQL?
<BR>
43 <A href=
"#1.3">1.3</A>) Na jakich systemach Unixowych działa
45 <A href=
"#1.4">1.4</A>) Na jakich nie-Unixowych systemach działa
47 <A href=
"#1.5">1.5</A>) Skąd mogę ściągnąć PostgreSQL?
<BR>
48 <A href=
"#1.6">1.6</A>) Gdzie można szukać wsparcia technicznego?
<BR>
49 <A href=
"#1.7">1.7</A>) Jaka jest ostatnia dostępna wersja?
<BR>
50 <A href=
"#1.8">1.8</A>) Jaka dokumentacja jest dostępna?
<BR>
51 <A href=
"#1.9">1.9</A>) Gdzie mogę znaleźć informację o znanych
52 błędach czy brakujących rozwiązanich?
<BR>
53 <A href=
"#1.10">1.10</A>) Jak mogę się nauczyć
<SMALL>SQL
</SMALL>?
<BR>
54 <A href=
"#1.11">1.11</A>) Czy PostgreSQL ma rozwiązany problem Y2K?
<BR>
55 <A href=
"#1.12">1.12</A>) Jak mogę się przyłączyć do grupy osób
56 bezpośrednio pracujących nad rozwojem PostgreSQL?
<BR>
57 <A href=
"#1.13">1.13</A>) Jak mogę zgłaszać błędy?
<BR>
58 <A href=
"#1.14">1.14</A>) Jak można porównać PostgreSQL w stosunku
59 do innych
<SMALL>DBMS
</SMALL>?
<BR>
60 <A href=
"#1.15">1.15</A>) W jaki sposób mogę wesprzeć finansowo
63 <H2 align=
"center">Pytania użytkowników
</H2>
64 <A href=
"#2.1">2.1</A>) Czy są jakieś driwery
<SMALL>ODBC
</SMALL> dla
66 <A href=
"#2.2">2.2</A>) Jakie istnieją narzędzia pozwalające na dostęp do
67 PostgreSQL przez www?
<BR>
68 <A href=
"#2.3">2.3</A>) Czy istnieje jakieś GUI dla PostgreSQL?
<BR>
69 <A href=
"#2.4">2.4</A>) Za pomocą jakich języków programowania można
70 się komunikować z PostgreSQL?
<BR>
73 <H2 align=
"center">Pytania dotyczące administracji
</H2>
74 <A href=
"#3.1">3.1</A>) Jak mogę zainstalować PostgreSQL w innej
75 lokalizacji niż
<I>/usr/local/pgsql
</I>?
<BR>
76 <A href=
"#3.2">3.2</A>) Podczas startu
<I>postmaster'a
</I>,
78 <I>Bad System Call
</I> lub
"core dumped". Dlaczego?
<BR>
79 <A href=
"#3.3">3.3</A>) Podczas startu
<I>postmaster'a
</I>,
80 otrzymuję komunikat o błędzie:
<I>IpcMemoryCreate
</I>. Dlaczego?
<BR>
81 <A href=
"#3.4">3.4</A>) Podczas startu
<I>postmaster'a
</I>,
82 otrzymuję komunikat o błędzie:
<I>IpcSemaphoreCreate
</I>. Dlaczego?
<BR>
83 <A href=
"#3.5">3.5</A>) W jaki sposób mogę kontrolować połączenia z
85 <A href=
"#3.6">3.6</A>) Jak powinienem skonfigurować system baz
86 danych aby uzyskać lepszą wydajność?
<BR>
87 <A href=
"#3.7">3.7</A>) Jakie są możliwości wyszukiwania błędów?
<BR>
88 <A href=
"#3.8">3.8</A>) Skąd się bierze komunikat:
<I>"Sorry, too many
89 clients"</I> podczas próby połączenia się z bazą danych?
<BR>
90 <A href=
"#3.9">3.9</A>) Jakie pliki znajdują się w
<I>pg_temp
</I>?
<BR>
91 <A href=
"#3.10">3.10</A>) Dlaczego konieczne jest przy upgradzie
92 PostgreSQL korzystanie ze skryptów dump i restore?
<BR>
94 <H2 align=
"center">Pytania dotyczące użytkowania
</H2>
95 <A href=
"#4.1">4.1</A>) Jaka jest różnica pomiędzy kursorami
96 binarnymi (binary cursors) i zwykłymi kursorami (normal cursors)?
<BR>
97 <A href=
"#4.2">4.2</A>) Jak mogę pobrać za pomocą
<SMALL>SELECT
</SMALL>
98 jedynie kilka pierwszych wyników zapytania?
<BR>
99 <A href=
"#4.3">4.3</A>) Jak mogę uzyskać listę wszystkich tabel czy
100 innych rzeczy pod
<I>psql
</I>?
<BR>
101 <A href=
"#4.4">4.4</A>) Jak usunąć kolumnę z tabeli lub zmienić jej
103 <A href=
"#4.5">4.5</A>) Jaki jest maksymalny rozmiar dla rzędu,
104 tabeli i bazy danych?
<BR>
105 <A href=
"#4.6">4.6</A>) Jak dużo miejsca w bazie danych jest
106 potrzebne aby przechować dane ze zwyczajnego pliku tekstowego?
<BR>
107 <A href=
"#4.7">4.7</A>) Jak mogę sprawdzić jakie tabele, klucze,
108 bazy danych i użytkownicy są utworzeni?
<BR>
109 <A href=
"#4.8">4.8</A>) Moje zapytania są wolne lub nie używają
110 kluczy. Dlaczego?
<BR>
111 <A href=
"#4.9">4.9</A>) Jak mogę sprawdzić w jakis sposób
"query
112 optimizer" wykonuje moje zapytanie?
<BR>
113 <A href=
"#4.10">4.10</A>) Co to jest
"R-tree index"?
<BR>
114 <A href=
"#4.11">4.11</A>) Co to jest
"Genetic Query Optimizer"?
<BR>
115 <A href=
"#4.12">4.12</A>) Jak mogę używać wyrażeń regularnych w
116 zapytaniach i zapytań case-insensitive w wyrażeniach regularnych?
117 Jak korzystać z indeksów dla zapytań case-insensitive?
<BR>
118 <A href=
"#4.13">4.13</A>) Jak sprawdzić w zapytaniu czy pole ma
119 wartość
<SMALL>NULL
</SMALL>?
<BR>
120 <A href=
"#4.14">4.14</A>) Jaka jest różnica pomiędzy różnymi typami
121 tekstowymi (character types)?
<BR>
122 <A href=
"#4.15.1">4.15.1</A>) Jak mogę utworzyć pole typu int, które samo
123 zwiększa swoją wartość?
<BR>
124 <A href=
"#4.15.2">4.15.2</A>) Jak pobrać wartość pola typu
125 <SMALL>SERIAL
</SMALL> po wykonaniu insert'u?
<BR>
126 <A href=
"#4.15.3">4.15.3</A>) Czy użycie
<I>currval()
</I> i
127 <I>nextval()
</I> nie doprowadzi do
"race condition" z innymi
129 <A href=
"#4.15.4">4.15.4</A>) Dlaczego numery sekwencji nie są
130 ponownie używane przy przerwaniu transakcji?
131 Skąd się biorą luki w numerowaniu kolumny tabeli sekwencjami/SERIALem?
<BR>
132 <A href=
"#4.16">4.16</A>) Co to jest
<SMALL>OID
</SMALL>? Co to jest
133 <SMALL>TID
</SMALL>?
<BR>
134 <A href=
"#4.17">4.17</A>) Jakie jest znaczenie niektórych terminów w
136 <A href=
"#4.18">4.18</A>) Skąd bierze się ten błąd:
<I>"ERROR: Memory
137 exhausted in AllocSetAlloc()"</I>?
<BR>
138 <A href=
"#4.19">4.19</A>) Jak sprawdzić jakiej wersji PostgreSQL
140 <A href=
"#4.20">4.20</A>) Dlaczego operacje, które wykonuję na
141 dużych obiektach
"large-object" zwracają komunikat:
142 <I>"invalid large obj descriptor"</I>?
<BR>
143 <A href=
"#4.21">4.21</A>) Jak stworzyć kolumnę której domyślną
144 wartością będzie bieżący czas?
<BR>
145 <A href=
"#4.22">4.22</A>) Dlaczego zapytania używające
146 <CODE><SMALL>IN
</SMALL></CODE> są takie wolne?
<BR>
147 <A href=
"#4.23">4.23</A>) Jak wykonać
"outer join"?
<BR>
148 <A href=
"#4.24">4.24</A>) Jak wykonywać zapytanie używające kilku
149 baz danych jednocześnie?
<BR>
150 <A href=
"#4.25">4.25</A>) Jak zwrócić w funkcji wiele rzędów lub
152 <A href=
"#4.26">4.26</A>) Dlaczego nie mogę w sposób pewny
153 tworzyć/usuwać tabel tymczasowych w funkcjach PL/PgSQL?
<BR>
154 <A href=
"#4.27">4.27</A>) Jakie są możliwości replikacji w
156 <A href=
"#4.28">4.28</A>) Jakie możliwości szyfrowania oferuje
159 <H2 align=
"center">Rozwijanie PostgreSQL
</H2>
160 <A href=
"#5.1">5.1</A>) Napisałem własną funkcję. Kiedy użyję jej w
161 <I>psql
</I>, program zrzuca pamięć (dump core)?
<BR>
162 <A href=
"#5.2">5.2</A>) Jak mogę dodać/zgłosić nowe typy czy funkcje
164 <A href=
"#5.3">5.3</A>) Jak napisać funkcję C zwracającą krotkę
166 <A href=
"#5.4">5.4</A>) Zmieniłem plik źródłowy. Dlaczego po
167 rekompilacji nie widać zmiany?
<BR>
171 <H2 align=
"center">Pytania ogólne
</H2>
173 <H4><A name=
"1.1">1.1</A>) Co to jest PostgreSQL? Jak to wymawiać?
</H4>
175 <P>PostgreSQL wymawia się
<I>Post-Gres-kju-el
</I>. Często podczas
176 rozmów używany jest termin
"Postgres"</P>
178 <P>PostgreSQL jest rozszerzeniem systemu zarządzania bazami danych -
179 POSTGRES, kolejną generacją rozwojowego prototypu
<SMALL>DBMS
</SMALL>.
180 Mimo, że PostgreSQL zachował bardzo dobrze zbudowany model danych
181 (data model) i bogaty zestaw typów danych POSTGRES'a, zastąpił
182 PostQuel'owy język zapytań z rozbudowanym podzbiorem języka
183 <SMALL>SQL
</SMALL>. PostgreSQL jest oprogramowaniem darmowym
184 z dostępnymi całymi źródłami.
187 <P>Rozwój PostgreSQL jest prowadzony przez grupę ludzi z Internetu,
188 komunikujących się poprzez mailowe listy dyskusyjne PostgreSQL.
189 Obecnym koordynatorem jest Marc G. Fournier (
<A href=
190 "mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org
</A>). (Zobacz
191 pytanie
<A href=
"#1.6">1.6</A> jak się przyłączyć). Ta grupa ludzi jest
192 odpowiedzialna za cały rozwój PostgreSQL. PostgreSQL jest projektem
193 nie kontrolowanym przez żadną firmę, aby wziąć udział w jego rozwoju
194 sprawdź,
<A href=
"http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html">
195 http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html
</a></P>
197 <P>Autorami PostgreSQL
1.01 byli Andrew Yu and Jolly Chen.
198 Wiele innych osób pomogło przy portowaniu, testowaniu, debugowaniu i
199 rozwijaniu kodu. Oryginalny kod Postgresa, na którym został oparty
200 PostgreSQL, był wysiłkiem studentów oraz pracowników pracujących pod
201 kierownictwem profesora Michael'a Stonebraker'a z University of
202 California w Berkeley.
</P>
204 <P>Oryginalną nazwą oprogramowania w Berkeley był Postgres. Po
205 dodaniu obsługi
<SMALL>SQL
</SMALL> w
1995, nazwa została zmieniona
206 na Postgres95. Pod koniec roku
1996 nazwa została zmieniona na
209 <H4><A name=
"1.2">1.2</A>) Jaką licencją chroniony jest
212 <P>PostgreSQL objęty jest następującą licencją:
</P>
214 <P>PostgreSQL Data Base Management System
</P>
216 <P>Portions Copyright (c)
1996-
2009, PostgreSQL Global Development Group
217 Portions Copyright (c)
1994-
6 Regents of the University of California
</P>
219 <P>Permission to use, copy, modify, and distribute this software
220 and its documentation for any purpose, without fee, and without a
221 written agreement is hereby granted, provided that the above
222 copyright notice and this paragraph and the following two
223 paragraphs appear in all copies.
</P>
225 <P>IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
226 PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
227 DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
228 SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
229 CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</P>
231 <P>THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
232 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
233 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
234 SOFTWARE PROVIDED HEREUNDER IS ON AN
"AS IS" BASIS, AND THE
235 UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
236 SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
</P>
238 <P>Tekst powyżej, jest klasyczną licencją BSD.
239 Nie posiada ona żadnych restrykcji co do używania kodu źródłowego.
240 Podoba nam się i nie zamierzamy jej zmieniać.
</P>
242 <H4><A name=
"1.3">1.3</A>) Na jakich systemach Unixowych działa
245 <P>PostgreSQL powinien działać na wszystkich nowych Unix-podobnych
246 systemach. Platformy, które zostały szczegółowo przetestowane podczas
247 publikowania PostgreSQL są wymienione w dokumentacji opisującej
250 <H4><A name=
"1.4">1.4</A>) Na jakich nie-Unixowych systemach działa
253 <P><STRONG>Klient
</STRONG></P>
255 <P>Możliwa jest kompilacja bibliteki C
<I>libpq
</I>, psql oraz
256 innych interfejsów i uruchamianie ich na platformie MS Windows. W tym
257 wypadku klient jest uruchamiany na MS Windows a z serwerem komunikuje się
258 poprzez TCP/IP. Serwer może działać na dowolnej wspieranej platformie
259 Unixowej. Plik
<I>win32.mak
</I> jest dołączony
260 do źródeł, aby można było stworzyć bibliotekę
<I>libpq
</I> oraz
261 program
<I>psql
</I> działające w środowisku Win32. PostgreSQL może się
262 także komunikować z klientami
<SMALL>ODBC
</SMALL>.
</P>
264 <P><STRONG>Serwer
</STRONG></P>
266 <P>Serwer może być uruchamiany na Windows NT i Win2k używając
267 bibliotek Cygwin, Cygnus Unix/NT. W pliku
<I>pgsql/doc/FAQ_MSWIN
</I>
268 znajdującym się w źródłach lub pod adresem:
<A href=
269 "http://www.postgresql.org/docs/faqs/text/FAQ_MSWIN">http://www.PostgreSQL.org/docs/faqs/text/FAQ_MSWIN
</A> na naszych stronach.
</P><P>
270 Obecnie prowadzone są prace nad stworzeniem wersji dla MS Win
271 NT/
200/XP. Jeśli chcesz się dowiedzieć o obecnym statusie tych prac
273 href=
"http://techdocs.postgresql.org/guides/Windows">http://techdocs.postgresql.org/guides/Windows
</A> and
275 href=
"http://momjian.postgresql.org/main/writings/pgsql/win32.html">http://momjian.postgresql.org/main/writings/pgsql/win32.html
</A>.
278 Istnieje także port pod Novell Netware
6 dostępny pod adresem
<A
279 href=
"http://forge.novell.com">http://forge.novell.com
</A>.
282 <H4><A name=
"1.5">1.5</A>) Skąd można ściągnąć PostgreSQL?
</H4>
284 <P>Główny serwer ftp z dostępem
"anonymous" dla PostgreSQL znajduje
285 się
<A href=
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub
</A>.
286 jeśli szukasz mirrorów sprawdź naszą główną stronę www.
</P>
288 <H4><A name=
"1.6">1.6</A>) Gdzie można szukać wsparcia technicznego?
</H4>
290 <P>Adres głównej listy mailowej:
<A href=
291 "mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org
</A>.
292 Jest ona przeznaczona dyskusjom dotyczącym spraw związanych z PostgreSQL.
293 Żeby zapisac się na listę, wyślij email z następującymi liniami w
294 treści maila (nie w temacie):
</P>
300 <P>na adres:
<A href=
301 "mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org
</A>.
</P>
303 <P>Dostępna jest także lista wysyłająca digesty. Aby zapisać się na
304 nią, wyślij email na adres:
306 "mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org
</A>
307 z treścią maila zawierającą:
</P>
312 Digesty są wysyłane do członków listy, kiedy na główną listę dotrze ok
315 <P>Dostępna jest także lista poświęcona błędom znalezionym w
316 PostgreSQL. Aby zapisać się na nią wyślij email na adres:
318 "mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org
</A>
319 z treścią maila zawierającą:
</P>
324 Lista poświęcona dyskusjom developerów jest dostępna pod adresem:
326 "mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org
</A>
327 Aby się na nią zapisać wyślij na jej adres mail z treścią:
333 <P>Dodatkowe informacje o listach mailowych dotyczących PostgreSQL
334 można znaleźć na stronach WWW PostgreSQL pod adresem:
</P>
337 <P><A href=
"http://www.PostgreSQL.org">http://www.PostgreSQL.org
</A></P>
340 <P>W sieci EFNet istnieje kanał IRC
<I>#PostgreSQL
</I>. Ja, do
341 połączenia się z kanałem używam Unixowego polecenia
<CODE>irc -c
342 '#PostgreSQL'
"$USER" irc.phoenix.net.
</CODE></P>
344 <P>Lista firm oferujących wsparcie na zasadach komercyjnych znajduje
345 się pod adresem:
<A href=
"http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php
</A>.
</P>
347 <H4><A name=
"1.7">1.7</A>) Jaka jest ostatnia dostępna wersja?
</H4>
349 <P>Ostatnia dostępna wersja PostgreSQL to
7.4.1.
</P>
351 <P>Planujemy publikowanie kolejnych wersji co sześć do ośmiu miesięcy.
</P>
353 <H4><A name=
"1.8">1.8</A>) Jaka dokumentacja jest dostępna?
</H4>
355 <P>Kilka manuali, stron podęcznika man, oraz kilka przykładów do
356 testowania są załączone w samej dystrybucji. Znajdują się one w
357 katalogu
<I>/doc
</I>. Manual może być także przeglądany poprzez
358 strony www pod adresem
<A href=
359 "http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs
</A>.
</P>
361 <P>Istnieją także dwie książki dostępne online pod adresami
363 "http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html
</A>
365 "http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/
</A>.
366 Lista książek o PostgreSQL, które można kupić znajduje się pod adresem
368 "http://techdocs.PostgreSQL.org/techdocs/bookreviews.php">
369 http://techdocs.PostgreSQL.org/techdocs/bookreviews.php
</A>.
370 Zbiór technicznych artykułów o PostgreSQL znajduje się pod adresem
<A
372 "http://techdocs.PostgreSQL.org">http://techdocs.postgresql.org/
</A>.
</P>
374 <P><I>psql
</I> posiada kilka wbudowanych poleceń \d, za pomoca których
375 można sprawdzić informacje dotyczące typów, operatorów, funkcji,
378 <P>Na naszej stronie można znaleźć dużo więcej dokumentacji.
</P>
380 <H4><A name=
"1.9">1.9</A>) Gdzie można znaleźć informację o znanych
381 błędach czy brakujących rozwiązanich?
</H4>
383 <P>PostgreSQL wspiera rozszerzony podzbiór standardu
<SMALL>SQL
</SMALL>-
92.
384 Sprawdź naszą listę
<A href=
"http://www.postgresql.org/docs/faqs.TODO.html">TODO
</A>
385 aby znaleźć informację o znanych problemach, brakujących
386 rozwiązaniach czy przyszłych planach.
</P>
388 <H4><A name=
"1.10">1.10</A>) Jak mogę się nauczyć
389 <SMALL>SQL
</SMALL>?
</H4>
391 <P>Książka o PostgreSQL
<A href=
392 "http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html
</A>
393 uczy
<SMALL>SQL
</SMALL>. Jest jeszcze inna ksiązka o PostgreSQL
394 dostępna pod adresem:
<A href=
395 "http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook.
</A>
396 Dobry tutorial możesz znaleźć pod adresem:
<A href=
397 "http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,
</A>
399 "http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
400 http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,
</A>
402 "http://sqlcourse.com/">http://sqlcourse.com.
</A></P>
404 <P>Jeszcze inny to
"Teach Yourself SQL in 21 Days, Second Edition"
405 pod adresem:
<A href=
406 "http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm
</A></P>
408 <P>Wielu z naszych użytkowników poleca
<I>The Practical SQL Handbook
</I>,
409 Bowman, Judith S., et al., Addison-Wesley. Inni polecają
<I>The
410 Complete Reference SQL
</I>, Groff et al., McGraw-Hill.
</P>
412 <H4><A name=
"1.11">1.11</A>) Czy PostgreSQL ma rozwiązany problem Y2K?
</H4>
414 <P>Tak, bez problemu radzimy sobie z datami po roku
2000 AD, oraz
415 przed rokiem
2000 BC.
</P>
417 <H4><A name=
"1.12">1.12</A>) Jak mogę się przyłączyć do grupy osób
418 bezpośrednio pracujących nad rozwojem PostgreSQL?
</H4>
420 <P>Przede wszystkim ściągnij ostatnie dostępne źródła i przeczytaj
421 dokumentację przeznaczoną dla developerów na naszej stronie www lub
422 dostępną także w źródłach PostgreSQL. Następnie zapisz się na listy
423 mailowe
<I>pgsql-hackers
</I> i
424 <I>pgsql-patches
</I>. I na koniec, wysyłaj nam wysokiej jakości
425 patch'e na listę pgsql-patches.
</P>
427 <P>Jest około
12 osób, które mają uprawnienia do commit'owania w
428 <SMALL>CVS
</SMALL> PostgreSQL'a. Każdy z nich submitował tak wiele
429 wysokiej jakości patchy, że stało się niemożliwe dla obecnych
430 commiterów być z nimi na bieżąco, więc musieliśmy im ufać i mieć
431 pewność, że ich poprawki są wysokiej jakości.
</P>
433 <H4><A name=
"1.13">1.13</A>) Jak mogę zgłaszać błędy?
</H4>
435 <P>Zajrzyj na stronę
<A href=
436 "http://www.postgresql.org/bugs/bugs.php">PostgreSQL BugTool
</A>, na
437 której opisane są wskazówki jak zgłaszać informacje o błędach.
</P>
439 <P>Zajrzyj także na nasz ftp
<A href=
440 "ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub
</A>, aby
441 sprawdzić czy nie ma nowszych wersji PostgreSQL czy patchy.
</P>
443 <H4><A name=
"1.14">1.14</A>) Jak można porównać PostgreSQL w stosunku
444 do innych
<SMALL>DBMS
</SMALL>?
</H4>
446 <P>Jest kilka sposobów oceny softwaru: możliwości,
447 wydajność, stabilność, wsparcie i cena.
</P>
450 <DT><B>Możliwości
</B></DT>
452 <DD>PostgreSQL posiada możliwości dostępne w dużych, komercyjnych
453 systemach
<SMALL>DBMS
</SMALL>, takie jak transakcje, podzapytania
454 (subselects), triggery, widoki, klucze obce, referential integrity,
455 oraz wyrafinowany system blokowania. Mamy także właściowści których
456 inni nie posiadają, jak typy definiowane przez użytkownika,
457 dziedziczenie, rules, multi-version concurrency control, która
458 redukuje problemy z blokowaniem (lock contention).
<BR>
462 <DT><B>Wydajność
</B></DT>
464 <DD>Wydajność PostgreSQL jest podobna do innych komercyjnych i open
465 source baz danych. W niektórych sytuacjach jest szybszy w
466 niektórych wolniejszy. W porównianiu do MySQL lub mniejszych baz
467 danych jesteśmy szybsi przy wielu użytkownikach, skomplikowaych
468 zapytaniach i dużym obciążeniu podczas. MySQL jest szybszy dla
469 prostych SELECTów wykonywanych przez niewielu użytkowników.
470 Spowodowane jest to narzutem, który się pojawia przy transakcjach.
471 Oczywiście MySQL nie ma większości z rozwiązań opisanych powyżej
472 w sekcji
<I> Możliwości
</I>. PostgreSQL został stworzony z myślą o
473 stabilności, oraz szerokiej gamie możliwości, ale mimo to staramy
474 się w każdej wersji poprawiać jego wydajność.
475 Ciekawe porównanie PostgreSQL i MySQL można znaleźć pod adresem
<A href=
476 "http://openacs.org/philosophy/why-not-mysql.html">http://openacs.org/philosophy/why-not-mysql.html
</A>
477 Dodatkowo, MySQL jest firmą, która dystrybuuje jej produkty poprzez
478 zasadę Open Source i wymaga wykupienia licencji w przypadku
479 tworzenia close-source software, co ie ma miejsca w przypadku
483 <DT><B>Stabilność
</B></DT>
485 <DD>Zdajemy sobie sprawę, że
<SMALL>DBMS
</SMALL> musi być stabilny,
486 w przeciwnym wypadku jest bez wartości. Staramy się publikować kod
487 stabilny, dobrze przetestowany, z minimum możliwych błędów. Każde
488 wydanie poprzedza co najmniej miesiąc testów wersji beta. Patrząc na
489 historię wydań PostgreSQL widać, że dostarczamy stabilne, dobrze
490 sprawdzone wersje, które są gotowe do użycia w środowisku
491 produkcyjnym. Myślimy, że proces publikowania kolejnych wersji
492 opracowany przez nas jest jednym z lepszych wśród innych twórców
493 oprogramowania bazodanowego.
<BR>
497 <DT><B>Wsparcie
</B></DT>
499 <DD>Dzięki naszym listom mailowym masz dostęp do dużej liczby
500 programistów i użytkowników, którzy pomagają rozwiązać każdy
501 napotkany problem. Chociaż nie możemy gwarantować znalezienia
502 rozwiązania danego problemu, nie różnimy się w tym od innych
503 komercyjnych systemów
<SMALL>DBMS
</SMALL>. Bezpośredni kontakt z
504 programistami, użytkownikami, dokumentacją i kodem źródłowym
505 sprawiają, że wsparcie oferowane PostgreSQL niejednokrotnie jest
506 lepsze niż w innych systemach
<SMALL>DBMS
</SMALL>. Istnieje także
507 możliwość skorzystania z komercyjnego wsparcia dla tych, których
508 takiego rozwiązania potrzebują.
509 (Sprawdź
<A href=
"#1.6">ten punkt FAQ
</A>.)
<BR>
515 <DD>Korzystanie z PostgreSQL jest darmowe, zarówno w przypadku
516 komercyjnym jak i niekomercyjnym. Możesz korzystać z naszego kodu
517 źródłowego w Twoim produkcie bez żadnych ograniczeń, poza tymi
518 wymienionymi w licencji BSD przytoczonej powyżej.
<BR>
523 <H4><A name=
"1.15">1.15</A>) W jaki sposób mogę wesprzeć finansowo
526 <P>PostgreSQL korzysta z najlepszej infrastruktury od samego początku
527 istnienia projektu, czyli roku
1996 kiedy rozpoczeliśmy pracę. Wszystko
528 to zawdzięczamy Marc'owi Fournier'owi, który stworzył tą infrastrukturę
529 i zarządza nią od lat.
</P>
531 <P>Wysokiej jakości infrastruktura jest bardzo ważna dla każdego
532 projektu open-source. Zapobiega przerwom w rozwoju projektu i
533 jakimkolwiek przestojom.
</P>
535 <P>Oczywiście korzystanie z wysokiej jakości infrastruktury nie jest
536 tanie. Istnieje wiele różnych miesięcznych, czy jednorazowych
537 wydatków, które trzeba ponosić aby wszystko działało jak należy.
538 Jeśli Ty, bądź Twoja firma może wspomóc finansowo rozwój PostgreSQL
539 odwiedź adres:
<A href=
540 "http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/
</A>
541 gdzie opisane jest jak to zrobić.
</P>
543 <P>Chociaż na stronie wspomniana jest nazwa PostgreSQL Inc,
"datki"
544 są przeznaczone jedynie na rozwój projektu PostgreSQL i nie są
545 przeznaczane na finansowanie jakiejkolwiek firmy. Jeśli wolisz,
546 możesz wysłać czek na adres kontaktowy.
</P>
548 Jeśli możesz się pochwalić udanymi wdrożeniami PostgreSQL, prosimy
549 abyś zgłosił nam to na stronie:
<A
550 href=
"http://advocacy.postgresql.org/">http://advocacy.postgresql.org
</a>.
552 <H2 align=
"center">User Client Questions
</H2>
554 <H4><A name=
"2.1">2.1</A>) Czy są jakieś driwery
<SMALL>ODBC
</SMALL> dla
557 <P>Dostępne są dwa driwery
<SMALL>ODBC
</SMALL>: PsqlODBC
558 i OpenLink
<SMALL>ODBC
</SMALL>.
</P>
560 <P>Możesz pobrać PsqlODBC z adresu
<A
561 href=
"http://gborg.postgresql.org/project/psqlodbc/projdisplay.php">http://gborg.postgresql.org/project/psqlodbc/projdisplay.php
</A>
564 <P>OpenLink
<SMALL>ODBC
</SMALL> może być pobrany z adresu:
<A href=
565 "http://www.openlinksw.com/">http://www.openlinksw.com
</A>.
566 Współpracuje ze standardowym oprogramowaniem klienckim
<SMALL>ODBC
</SMALL>
567 więc w ten sposób możesz korzystać z PostgreSQL
<SMALL>ODBC
</SMALL>
568 dostępnego na każdej pltaformie którą wspiera (Win, Mac, Unix, VMS).
</P>
570 <P>Autorzy będą prawdopodobnie sprzedawać ten produkt osobom które
571 wymagają komercyjnego wsparcia, ale wersja darmowa będzie zawsze
572 dostępna. Wszystkie pytania możesz wysyłać na adres:
<A href=
573 "mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk
</A>.
</P>
575 <H4><A name=
"2.2">2.2</A>) Jakie istnieją narzędzia pozwalające na dostęp do
576 PostgreSQL przez www?
</H4>
578 <P>Dobry podręcznik dla początkujących o dostępie do bazy danych
579 przez www możesz znaleźć pod adresem:
580 <A href=
"http://www.webreview.com">http://www.webreview.com
</A></P>
582 <P>Do integracji z www, świetnym rozwiązaniem jest PHP. Możesz
583 znaleźć więcej informacji na ten temat pod adresem
584 <A href=
"http://www.php.net">http://www.php.net
</A>.
</P>
586 <P>Wiele osób w przypadku skomplikowanych rozwiązań uzywa Perl'a i
587 modułu CGI.pl lub mod_perl.
</P>
589 <H4><A name=
"2.3">2.3</A>) Czy istnieje jakieś GUI dla PostgreSQL?
</H4>
591 <P>Tak, istnieje kilka interfejsów graficznych dla PostgreSQL.
592 Wśród nich PgAccess (
<A href=
"http://www.pgaccess.org">
593 http://www.pgaccess.org
</A>), PgAdmin III (
<A
594 href=
"http://www.pgadmin.org">http://www.pgadmin.org
</A>),
595 RHDB Admin (http://sources.redhat.com/rhdb/ ) oraz Rekall (
596 http://www.thekompany.com/products/rekall/, komercyjny). Istnieje
597 także PHPPgAdmin ( http://phppgadmin.sourceforge.net/ ), webowy
598 interfejs dla PostgreSQL.
601 Więcej informacji na ten temat znajduje się pod adresem See
602 <A href=
"http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools
</A>.
</P>
604 <H4><A name=
"2.4">2.4</A>) Za pomocą jakich języków programowania
605 można się komunikować z PostgreSQL?
</H4>
607 <P>Najbardziej popularne języki posiiadają własny interfejs dla
608 PostgreSQL. Sprawdź listę rozszerzeń dla intersującego Ciebie języka
611 <P>Ze źródłami PostreSQL dystrubuowane są interfejsy dla
612 następujących języków programowania:
</P>
618 <LI>Embedded C (ecpg)
</LI>
622 <LI>Python (PyGreSQL)
</LI>
624 <LI>TCL (libpgtcl)
</LI>
626 Inne interfejsy są dostępne pod adresem:
627 <A href=
"http://gborg.postgresql.org"> http://gborg.postgresql.org
</A> w
628 sekcji Drivers/Interfaces.
631 <H2 align=
"center">Pytania dotyczące administracji
</H2>
633 <H4><A name=
"3.1">3.1</A>) Jak mogę zainstalować PostgreSQL w innej
634 lokalizacji niż
<I>/usr/local/pgsql
</I>?
</H4>
636 <P>Użyj opcji
<I>--prefix
</I> podczas uruchamiania skryptu
637 <I>configure
</I>.
</P>
639 <H4><A name=
"3.2">3.2</A>) Podczas startu
<I>postmaster'a
</I>,
640 otrzymuję komunikat o błędzie:
<I>Bad System Call
</I> lub
"core dumped".
644 <P>Ten błąd może być wynikiem wielu problemów, ale na początek
645 sprawdź czy masz zainstalowane rozszerzenia systemu V w jądrze
646 systemu. PostgreSQL wymaga do pracy zainstalowanej obsługi pamięci
647 dzielonej i semaforów.
</P>
649 <H4><A name=
"3.3">3.3</A>) Podczas startu
<I>postmaster'a
</I>,
650 otrzymuję komunikat o błędzie:
<I>IpcMemoryCreate
</I>.
653 <P>Albo nie masz poprawnie skonfigurowanej obsługi pamięci dzielonej
654 w jądrze systemu, albo musisz zwiększyć jej dostępny rozmiar.
655 Dokładna ilość jaką potrzebujesz jest zależna od architektury systemu
656 na jakim pracujesz, jak dużo buforów oraz jak dużo procesów backendu
657 skonfigurowałeś dla
<I>postmaster'a
</I>. Dla większości systemów, z
658 domyślną liczbą buforów i procesów potrzebujesz minimum w
659 przybliżeniu
1MB. Zobacz
<A href=
660 "http://www.postgresql.org/idocs/index.php?kernel-resources.html">PostgreSQL
661 Administrator's Guide
</A> gdzie szczegółowo zostało opisane
662 wykorzystanie pamięci dzielonej i semaforów.
</P>
664 <H4><A name=
"3.4">3.4</A>) Podczas startu
<I>postmaster'a
</I>,
665 otrzymuję komunikat o błędzie:
<I>IpcSemaphoreCreate
</I>.
668 <P>Jeśli treść błędu brzmi:
<I>IpcSemaphoreCreate: semget failed
669 (No space left on device)
</I> oznacza to, że jądro systemu nie jest
670 skonfigurowane do obsługi wystarczającej liczby semaforów.
671 Postgres wymaga jednego semafor'a na potencjalny jeden proces backend.
672 Tymczasowym rozwiązaniem jest uruchomienie programu
<I>postmaster
</I>
673 z mniejszą maksymalną liczbą procesów backend.
674 Użyj opcji
<I>-N
</i> z parameterem mniejszym od domyślnego -
32.
675 Bardziej trwałym rozwiązaniem jest zwiększenie parametrów
676 <SMALL>SEMMNS
</SMALL> i
<SMALL>SEMMNI
</SMALL> jądra twojego systemu.
</P>
678 <P>Niedziałające semafory mogą spowodować niepoprawne zamknięcie
679 systemu w czasie intensywnego korzystania z bazy.
</P>
681 <P>Jeśli treść błędu jest inna, może to oznaczać, że obsługa semaforów
682 nie została włączona do jądra wcale. Zobacz PostgreSQL
683 Administrator's Guide po bardziej szczegółowe informacje o pamięci
684 dzielonej i semaforach.
</P>
686 <H4><A name=
"3.5">3.5</A>) W jaki sposób mogę kontrolować połączenia
687 z innych hostów?
</H4>
689 <P>Domyślnie PostgreSQL pozwala jedynie na połączenia za pomocą
690 socketów Unixowych z lokalnego hosta. Inne hosty nie będą mogły się
691 połączyć z serwerem dopóki nie zostanie dodana opcja
<I>-i
</I> do
693 <B>oraz
</B> nie umożliwi się autoryzacji na podstawie adresu hostów
694 modyfikując odpowiednio plik
695 <I>$PGDATA/pg_hba.conf
</I>. To zmiany pozwolą na połączenia TCP/IP.
</P>
697 <H4><A name=
"3.6">3.6</A>) Jak powinienem skonfigurować system baz
698 danych aby uzyskać lepszą wydajność?
</H4>
700 <P>Indeksy bez wątpienia mogą przyspieszyć wykonywanie zapytań.
701 Polecenie
<SMALL>EXPLAIN
</SMALL> pozwala zobaczyć jak PostgreSQL
702 interpretuje Twoje zapytanie i które indeksy są używane.
</P>
704 <P>Jeśli wykonujesz bardzo dużo
<SMALL>INSERTów
</SMALL>, może warto
705 je wykonać za pomocą jednego dużego pliku używając polecenia
706 <SMALL>COPY
</SMALL>. Jest to dużo szybsze niż pojedyncze
707 <SMALL>INSERTy.
</SMALL> Po drugie polecenia SQL nie zawarte w bloku
708 określającym transakcję -
<SMALL>BEGIN WORK/COMMIT
</SMALL>, są
709 traktowane jako pojedyncza transakcja. Rozważ wykonanie kilku
710 poleceń/zdań SQL w jednym bloku transakcji. To redukuje narzut
711 nakładany przez transakcję. Przy dużych zmianach w danych, warto
712 usunąć i stworzyć na nowo indeksy.
</P>
714 <P>Jest kilka opcji pozwalających na poprawienie wydajności.
715 Możesz wyłączyć
<I>fsync()
</I> poprzez uruchomienie
<I>postmaster'a
</I>
716 z opcjami
<I>-o -F
</I>. To spowoduje, że
717 <I>fsync()
</I> nie będzie zrzucał danych na dysk po każdej
720 <P>Możesz także uruchomić
<I>postmaster'a
</I> z opcją
<I>-B
</I>
721 aby zwiększyć wielkość pamięci dzielonej używanej przez procesy
722 backendów. Jeśli ustawisz tą wartość zbyt wysoko i przekroczysz limity
723 ustawione przez kernel na pamięć dzieloną,
<I>postmaster
</I> może się
724 nie uruchomić. Każdy bufor zajmuje
8K a domyślna ilość buforów to
64.
</P>
726 <P>Możesz także użyć opcji
<I>-S
</I> dla backendu aby zwiększyć
727 maksymalną wartość pamięci używaną przez proces backendu podczas
728 sortowania. Opcja
<I>-S
</I> jest ustawiana wartością podawaną w
729 kilobajtach, domyślna wartość to
512K.
</P>
731 <P>Możesz także użyć polecenia
<SMALL>CLUSTER
</SMALL> aby pogrupować
732 dane w tabelach wg indeksu. Zobacz opis polecenia
<SMALL>CLUSTER
</SMALL>
733 w manualu żeby dowiedzieć się więcej.
</P>
735 <H4><A name=
"3.7">3.7</A>) Jakie są możliwości wyszukiwania
738 <P>PostgreSQL ma kilka możliwości na raportowanie informacji o
739 jego statusie, które mogą być przydatne przy debugowaniu procesu.
</P>
741 <P>Przede wszystkim uruchom skrypt
<I>configure
</I> z opcją
742 --enable-cassert, wiele funkcji
<I>assert()
</I> monitorują postęp
743 procesu backend i zatrzymują program kiedy wydarzy się coś
746 <P>Zarówno
<I>postmaster
</I> jak i
<I>postgres
</I> mają kilka opcji
747 do debugowania. Za każdym razem kiedy uruchamiasz
<I>postmaster'a
</I>,
748 upewnij się, że wysyłasz standardowe wyjście i error do pliku z
749 logami, np. w ten sposób:
</P>
752 ./bin/postmaster
>server.log
2>&1 &
755 <P>To utworzy plik server.log w głównym katalogu PostgreSQL.
756 Ten plik zawiera pożyteczne informacje o problemach i błędach, które
757 wydarzyły się podczas pracy serwera.
<I>Postmaster
</I> posiada opcję
758 <I>-d
</I>, która pozwala na raportowanie bardzo szczególowych
759 informacji. Do opcji
<I>-d
</I> podajemy liczbę, która określa
760 szczegółowość wysyłanych informacji. Musisz mieć świadomość, że
761 wysoki poziom logowania będzie powodował tworzenie bardzo duzych
764 <P>Jeśli
<I>postmaster
</I> nie został uruchomiony, możesz uruchomić
765 <I>postgres'owy
</I> backend z linii poleceń, i uruchomić Twoje
766 polecenie
<SMALL>SQL
</SMALL> bezpośrednio na nim.
767 Taki sposób jest polecany
<B>jedynie
</B> w przypadku debugowania.
768 Zwróć uwagę, że w tym wypadku zapytanie kończy znak nowej linii a nie
769 średnik. Jeśli skompilowałeś z opcjami debugowania mozesz użyć
770 debuggera aby sprawdzić co się dzieje. Poniewż backend nie został
771 uruchomiony przez
<I>postmaster'a
</I>, nie działa w identycznym
772 środowisku, co oznacza że powtórzenie warunków w jakich wystąpiły
773 problemy moze być problemem.
</P>
775 <P>Jeśli
<I>postmaster
</I> działa, uruchom
<I>psql
</I> w jednym z
776 okien, następnie znajdź
<SMALL>PID
</SMALL> procesu
<I>postgres
</I>
777 używanego przez
<I>psql
</I>. Użyj debuggera aby do
778 <SMALL>PID'u
</SMALL> <I>postgres'a
</I>. Możesz ustawiać pułapki
779 (breakpoints) w debuggerze i wykonywać zapytania z
<I>psql
</I>.
780 Jeśli debugujesz uruchamianie
<I>postgres'a
</I>, możesz ustawić zmienną
781 PGOPTIONS=
"-W n", następnie uruchomić
<I>psql
</I>.
782 Opcja ta pozwoli spowolnić uruchomienie na
783 <I>n
</I> sekund abyś mógł się połączyć z procesem za pomocą
784 debugera, ustawić jakiekolwiek pułapki i kontynuować proces
787 <P><I>postgres
</I> może być uruchamiany z opcjami
<I>-s, -A
</I> i
788 <I>-t
</I>, które mogą być bardzo przydatne przy debuggowaniu i ocenie
791 <P>Możesz także skompilować z profilingiem aby zobaczyć jakie funkcje
792 ile czasu wykonują się. Pliki profilowane dla backendu zostaną
793 umieszczone w katalogu
794 <I>pgsql/data/base/dbname
</I>. Pliki profilu klienta zostaną
795 umieszczone w bieżącym katalogu klienta. Linux wymaga aby kompilować
796 z opcją
<I>-DLINUX_PROFILE
</I> aby profilowanie odbywało się
799 <H4><A name=
"3.8">3.8</A>) Skąd się bierze komunikat:
<I>"Sorry, too
800 many clients"</I> podczas próby połączenia się z bazą danych?
</H4>
802 <P>Musisz zwiększyć limit ilości jednoczesnych procesów bacekendu
803 dla procesu
<I>postmaster'a
</I>.
</P>
805 <P>Domyślny limit to
32 procesy. Możesz go zwiększyć przez restart
806 <I>postmaster
</I> z odpowiednią wartością ustawianą opcję
<I>-N
</I> w
807 pliku
<I>postgresql.conf
</I>.
</P>
809 <P>Weź pod uwagę, że jeśli zwiększysz wartość podaną w opcji
810 <I>-N
</I> na więcej niż
32 musisz także zwiększyć wartość w opcji
811 <I>-B
</I> ponad jej domyślną wartość
64; wartość
<I>-B
</I> musi być
812 co najmniej dwa razy większa od wartości podanej w opcji
813 <I>-N
</I>, a prawdopodobnie powinna być w rzeczywistości jeszcze
814 większa dla optymalnej wydajności.
815 Dla dużej liczby procesów backendu na pewno zauważysz, że trzeba
816 zwiększyć różne parametry jądra Unixa. Rzeczy, które pownieneś
817 sprawdzić to maksymalna liczba bloków pamięci dzielonej,
818 <SMALL>SHMMAX;
</SMALL> maksymalna liczba semaforów,
<SMALL>SEMMNS
</SMALL>
819 oraz
<SMALL>SEMMNI;
</SMALL>
820 maksymalna liczba procesów,
<SMALL>NPROC;
</SMALL> maksymalna liczba
821 procesów na jednego użytkownika,
<SMALL>MAXUPRC;
</SMALL> i maksymalna
822 liczba otwartych plików,
<SMALL>NFILE
</SMALL> oraz
823 <SMALL>NINODE.
</SMALL> Powód dla którego PostgreSQL ma limit na
824 maksymalną liczbę procesów backendu to obawa o wyczerpanie zasobów
827 <H4><A name=
"3.9">3.9</A>) Jakie pliki znajdują się w
<I>pg_temp
</I>?
</H4>
829 <P>Katalog ten zawiera tymczasowe pliki utworzone przez executor. Dla
830 przykładu, jeśli jakaś operacja sortowania jest wymagana do wykonania
831 <SMALL>ORDER BY,
</SMALL> a samo sortowanie wymaga więcej miejsca niż
833 <I>-S
</I> ustawił do wykorzystania, wtedy tymczasowe pliki są używane
834 do przechowywania tych danych.
</P>
836 <P>Pliki tymczasowe powinny być usunięte automatycznie, ale mogło się
837 to nie stać jeśli proces backendu w międzyczasie nie zakończył się
838 poprawnie podczas operacji sortowania. Jeśli w danym momencie nie
839 działają żadne procesy backendów mozesz spokojnie usunąć pliki
842 <H4><A name=
"3.9">3.9</A>) Dlaczego konieczne jest przy upgradzie
843 PostgreSQL korzystanie ze skryptów dump i restore?
</H4>
845 Twórcy PostgreSQL dokonują jedynie małych zmian pomiędzy małymi
846 upgradami wersji, np z
7.2 do
7.2.1, wtedy upgrade nie wymaga
847 korzystania z dump i restore. Przy większych zmianach, np. z wersji
848 7.2 do
7.3, często zmianymają wpływ na format przechowywanych danych.
849 Zmiany te są na tyle skomplikowane, że nie utrzymujemy zgodości z
850 poprzednimi wersjami PostgreSQL. dump pozwala na wydostanie danych w
851 takiej postaci, w której łatwe jest ich zaimportowanie do nowszych
855 W wydaniach gdzie zmiany nie dotyczą formatu danych na dysku, można
856 wykorzystać skryptu pg_upgrade, do upgradu bez użycia dump/restore.
857 Dokumentacja do danego wydania zawiera informację czy możliwe jest
862 <H2 align=
"center">Pytania dotyczące używania
</H2>
864 <H4><A name=
"4.1">4.1</A>) Jaka jest różnica pomiędzy kursorami
865 binarnymi (binary cursors) i zwykłymi kursorami (normal
868 <P>Zobacz w manualu opis polecenia
<SMALL>DECLARE
</SMALL>.
</P>
870 <H4><A name=
"4.2">4.2</A>) Jak mogę pobrać za pomocą
871 <SMALL>SELECT
</SMALL> jedynie kilka pierwszych wyników
874 <P>Zobacz w manualu opis polecenia
<SMALL>FETCH
</SMALL> lub użyj
875 polecenia
<SMALL>SELECT
</SMALL> ...
<SMALL>LIMIT
</SMALL>....
</P>
877 <P>Nawet jeśli chesz pobrać kilka pierwszych rzędów z wyniku
878 zapytania, całe zapytanie musi zostać wykonane. Byc może powinieneś
879 skorzystać z polecenia
<SMALL>ORDER BY.
</SMALL>
880 Jeśli istnieje indeks który odpowiada polom określonym przez
881 <SMALL>ORDER BY
</SMALL>, PostgreSQL może wykorzystać jedynie kilka
882 pierwszych rzędów, być może będzie konieczność wykonania zapytania do
883 momentu aż zostaną znalezione pożądane wyniki.
</P>
885 Aby otrzymać losowy rząd, użyj:
</P>
893 <H4><A name=
"4.3">4.3</A>) Jak mogę uzyskać listę wszystkich tabel
894 czy innych rzeczy pod
<I>psql
</I>?
</H4>
896 <P>Możesz sprawdzić zawartość źródeł
<I>psql
</I>, a konkretnie plik
897 <I>pgsql/src/bin/psql/describe.c
</I>. Zawiera on polecenia
898 <SMALL>SQL
</SMALL> które generuja wyniki komend z backslashem.
899 Możesz także uruchomić
<I>psql
</I> z opcją
900 <I>-E
</I> wtedy po wykonaniu polecenia z backslashem wyświetlane
901 będzie zapytanie, które w rzeczywistości jest wykonywane.
</P>
903 <H4><A name=
"4.4">4.4</A>) Jak usunąć kolumnę z tabeli lub zmienić
906 <P>DROP COLUMNT zostało dodane w wersji
7.3 przy poleceniu ALTER
907 TABLE DROP COLUMN. We wcześńiejszych wersjach możesz zrobić tak:
911 LOCAL TABLE old_table;
912 SELECT ... -- wybierz wszystkie kolumny poza tą jedną której chcesz się pozbyć
915 DROP TABLE old_table;
916 ALTER TABLE new_table RENAME TO old_table;
919 Aby zmienić typ danych kolumny możesz zrobić tak:
923 ALTER TABLE tab ADD COLUMN new_col new_data_type;
924 UPDATE tab SET new_col = CAST(old_col AS new_data_type);
925 ALTER TABLE tab DROP COLUMN old_col;
929 <H4><A name=
"4.5">4.5</A>) Jaki jest maksymalny rozmiar dla rzędu,
930 tabeli i bazy danych?
</H4>
932 <P>Oto wszystkie ograniczenia:
</P>
934 Maksymalny rozmiar dla bazdy danych? nieograniczony ( istnieją
935 bazy danych o wielkości
32 TB databases )
936 Maksymalny rozmiar dla tabeli?
32 TB
937 Maksymalny rozmiar dla rzędu?
1.6 TB
938 Maksymalny rozmiar pola?
1 GB
939 Maksymalna liczba rzędów w tabeli? nieograniczona
940 Maksymalna liczba kolumn w tabeli?
250-
1600 w zależoności od typów kolumn
941 Makasymalna liczba indeksów na tabeli? nieograniczona
944 Oczywiście
"nieograniczony" nie jest prawdą tak do końca, istnieją
945 ograniczenia wynikające z dostępnego miejsca na dysku, pamięci/swapa.
946 Kiedy wielkości te będą bardzo duże może odbić się to na wydajności.
948 <P>Maksymalny rozmiar tabeli, czyli
32 TB nie wymaga od systemu
949 operacyjnego wsparcia dla dużych plików. Duże tabele są przechowywane
950 jako pliki o rozmiarze
1 GB, więc ograniczenia co do wielkości plików
951 narzucone przez system plików nie są istotne.
</P>
953 <P>Masymalny rozmiar tabeli i maksymalna liczba kolumn może być
954 zwiększona jeśli zwiększymy domyślny rozmiar bloku (block size) do
957 <H4><A name=
"4.6">4.6</A>) Jak dużo miejsca w bazie danych jest
958 konieczne aby przechowywać dane ze zwyczajnego pliku
961 <P>Baza danych PostgreSQL może potrzebować do pięciu razy więcej
962 miejsca na przechowywanie danych z plików tekstowych niż ich
965 <P>Jako przykład możemy rozważyć plik składający się z
100,
000 linii
966 zbudowanych z liczby całkowitej oraz opisu tekstowego w każdej.
967 Załóżmy, że średnio każdy łańcuch tekstu w linii zajmuje
20
968 bajtów. Cały plik powinien zajmować ok.
2.8 MB. Rozmiar pliku bazy danych w
969 PostgreSQL zawierającego te dane mozna oszacować na około
6.4MB:
</P>
972 36 bajtów: nagłówek każdego rzędu w przybliżeniu)
973 24 bajty: jedno pole int i jedno pole typu text
974 +
4 bajty: wkaźnik na stronie do krotki
975 --------------------------------------------------
976 64 bajty w jednym rzędzie
978 Strona danych w PostgreSQL zajmuje
8192 bajtów (
8 KB), więc:
980 8192 bajtów na stronę
981 --------------------- =
128 rzędów na jedną strone w bazie (zaokrąglone w dół)
985 ----------------------- =
782 stron w bazie danych (zaokrąglone w górę)
988 782 stron w bazie *
8192 bajtów na stronę =
6,
406,
144 bajtów (
6.4 MB)
991 <P>Indeksy nie powodują dużego narzutu na zajmowane miejsce,
992 ale zawierają pewne dane,
993 więc w pewnych przypadkach moga być całkiem duże.
</P>
994 <P> NULLe są przechowywane jako mapy bitowe, więc używają bardzo mało
998 <H4><A name=
"4.7">4.7</A>) Jak mogę sprawdzić jakie tabele, klucze,
999 bazy danych i użytkownicy są utworzeni?
</H4>
1001 <P><I>psql
</I> ma całkiem dużą ilość poleceń z backslashem aby
1002 wydobyć takie informacje. Wprowadź \? aby zobaczyć ich spis. Istnieją
1003 także tablice systemowe rozpoczynające się od
<i>pg_
</i>, zawierające
1004 interesujące Ciebie informacje. Wykonanie
<i>psql -l
</i> pokaże spis
1005 wszystkich baz danych.
</P>
1007 <P>Obejrzyj także plik
<I>pgsql/src/tutorial/syscat.source
</I>.
1008 Zawiera on wiele z zapytań typu
<SMALL>SELECT
</SMALL>, które są
1009 potrzebne aby wydobyć informacje z tablic systemowych.
</P>
1011 <H4><A name=
"4.8">4.8</A>) Moje zapytania są wolne lub nie używają
1012 kluczy. Dlaczego?
</H4>
1014 Indeksy nie są używane automatycznie przez kążde z zapytań. Ideksy są
1015 używane jedynie gdy tabela jest odpowiedniego rozmiaru, większego niż
1016 wymagany minimalny, a zapytanie wybiera jedynie mały procent
1017 zawartości tabeli. Wynika to z tego, że losowy dostep do dysku
1018 powodowany przez ideksowane poszukiwanie jest czasami wolniejsze niż
1019 poszukiwanie sekwencyjne bez użycia kluczy.
1021 <P>Żeby zdecydować czy indeks powinien byc używany, PostgreSQL musi
1022 mieć statystyki dotyczące danej tabeli. Są one gromadzone przez
1023 użycie polecenia
<SMALL>VACUUM ANALYZE
</SMALL>, lub poprostu
1024 <SMALL>ANALYZE
</SMALL>. używając statystyk, optymalizator wie ile
1025 rzędów jest w tabeli i może lepiej określić czy indeksy powinny być
1026 użyte. Statystyki mogą być także pomocne w określeniu najlepszej
1027 kolejności wykonania złączenia (join) i jego sposobu. Gromadzenie
1028 statystyk powinno się odbywać w określonych interwałach czasu
1029 ponieważ dane w tabelach zmieniają się.
</P>
1031 <P>Indeksy nie są zazwyczaj używane przez
<SMALL>ORDER BY
</SMALL> lub
1032 przy wykonywaniu złączeń (join). Sekwencyjne przeszukiwanie po którym
1033 następuje sortowanie jest zazwyczaj szybsze nię wyszukiwanie za
1034 pomocą indeksu na dużej tabeli.
</P>
1035 <P>Jakkolwiek
<SMALL>LIMIT
</SMALL> w połączeniu z
<SMALL>ORDER BY
</SMALL>
1036 często będzie wykorzystywał indeksy ponieważ jedynie mała część z
1037 tabeli jest zwracana. W rzeczywistości, chociaż MAX() i MIN() nie
1038 używają indeksów, możliwe jest aby zwrócić te wartości używając
1039 indeksów poprzez użycie ORDER BY i LIMIT.
1044 ORDER BY col [ DESC ]
1048 Jeśli uważasz, że optimizer myli się wybierając sequential scan, użyj
1049 SET enable_seqscan TO 'off' i uruchom testy aby sprawdzić czy wtym
1050 wypadku zapytanie będzie szybciej wykonywane.
</P>
1052 <P>Kiedy używa się operatorów dopasujących takich jak
1053 <SMALL>LIKE
</SMALL> lub
<I>~
</I>, indeksy będą używane jedynie w
1054 pewnych wypadkach:
</P>
1056 <LI>Początek wyszukiwania jest oparty na początku łańcucha tekstu.
1058 <LI>wzorce
<SMALL>LIKE
</SMALL> nie mogą się zaczynać
<I>%
</I></LI>
1059 <LI>dopasowania operatorem
<I>~
</I> (dopasowania regularne)
1060 muszą się zaczynać znakiem specjalnym
<I>^
</I>.
</LI>
1062 <LI>Początek wyszukiwania nie może się zaczynać od klas znaków, np.
1064 <LI>Case-insensitive searches such as ILIKE and ~* do not utilise
1065 indexes. Instead, use functional indexes, which are described in
1067 <LI>Standardowe locale C musi być uzyte przy wykonywaniu initdb
</LI>
1069 <H4><A name=
"4.9">4.9</A>) Jak mogę sprawdzić w jakis sposób
"query
1070 optimizer" wykonuje moje zapytanie?
</H4>
1072 <P>Zobacz manual dla polecenia
<SMALL>EXPLAIN
</SMALL>.
</P>
1074 <H4><A name=
"4.10">4.10</A>) Co to jest
"R-tree index"?
</H4>
1076 <P>Indeks R-tree jest używany do indeksowania danych przestrzennych.
1077 Indeks hasuujący nie nadaje się do wyszukiwania odległości.
1078 Natomiast indeks typu B-tree może wyszukiwać odleglości jedynie w
1079 jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
1080 przestrzeniami wielo-wymiarowymi. Dla przykładu, jeśli zostanie
1081 założony indeks typu R-tree na polu typu
<I>point
</I>, system może
1082 bardziej wydajnie odpowiadać na zapytania typu
1083 "select all points within a bounding rectangle."</P>
1085 <P>Źródłowym dokumentem opisującym oryginalnie projektowanie R-tree
1088 <P>Guttman, A.
"R-trees: A Dynamic Index Structure for Spatial
1089 Searching." Proceedings of the
1984 ACM SIGMOD Int'l Conf on Mgmt
1092 <P>Ten dokument możesz znaleźć także w pracy Stonebraker'a
"Readings in
1093 Database Systems".
</P>
1095 <P>Wbudowane indeksy R-trees radzą sobie w wielobokami i boxes.
1096 Teoretycznie, indeksy R-tree mogą być rozszerzone o możliwości
1097 indeksowania w więcej wymiarowych przestrzeniach. W praktyce,
1098 rozbudowa indeksów R-tree wymaga trochę pracy, a w tej chwili nie
1099 dysponujemy jakąkolwiek dokumentacją jak to zrobić.
</P>
1101 <H4><A name=
"4.11">4.11</A>) Co to jest
"Genetic Query
1104 <P>Moduł
<SMALL>GEQO
</SMALL> ma za zadanie przyspieszenie
1105 optymalizacji zapytań łącząc wiele tabel za pomocą algorytmów
1106 genetycznych (Genetic Algorithm (GA)). Pozwala na używanie dużych
1107 zapytań łączących tabele (join queries) bez wykorzystywania
1108 zasobożernego wyszukiwania.
</P>
1110 <H4><A name=
"4.12">4.12</A>) Jak mogę używać wyrażeń regularnych w
1111 zapytaniach i zapytań case-insensitive w wyrażeniach
1113 Jak korzystać z indeksów dla zapytań case-insensitive?
</H4>
1115 <P>Operator
<I>~
</I> moze być wykorzystywany do wyszukiwania za
1116 pomocą wyrażeń regularnych, a
1117 <I>~*
</I> do wyszukiwania case-insensitive z wyrażeniami
1119 Wariant case-insensitive dla
<SMALL>LIKE
</SMALL> został nazwany
1120 <SMALL>ILIKE
</SMALL>.
</P>
1122 <P>Porównania case-insensitive są zazwyczaj wykonywane w następujący
1127 WHERE lower(col) = 'abc'
1130 W tym wypadku standardowe indeksy nie będą używane. Możesz utworzyć
1131 indeks funkcyjny, poprzez:
1133 CREATE INDEX tabindex on tab (lower(col));
1137 <H4><A name=
"4.13">4.13</A>) Jak sprawdzić w zapytaniu czy pole ma
1138 wartość
<SMALL>NULL
</SMALL>?
</H4>
1140 <P>Możesz to sprawdzić, testując wartość kolumny warunkiem
1141 <SMALL>IS NULL
</SMALL> albo
<SMALL>IS NOT NULL
</SMALL>.
</P>
1143 <H4><A name=
"4.14">4.14</A>) Jaka jest różnica pomiędzy różnymi
1144 typami tekstowymi (character types)?
</H4>
1146 Type Nazwa wewnętrzna Uwagi
1147 --------------------------------------------------
1148 VARCHAR(n) varchar rozmiar określa maksymalną długość, nie ma tutaj wypełniania
1149 CHAR(n) bpchar wypełniane pustymi znakami do podanej długości
1150 TEXT text bez limitu na długość łańcucha
1151 BYTEA bytea zmiennej długości tablica bajtów (null-byte safe)
1155 <P>Jeśli będziesz przeglądać katalogi systemowe lub komunikaty o
1156 błędach często spotkasz się z podanymi powyżej nazwami
1159 <P>Pierwsze cztery typy powyżej to tzw typy
"varlena" (np. pierwsze
1160 cztery bajty na dysku to długość, po których jest data). Dlatego
1161 faktyczna długośc takiego łańcucha jest trochę większa niż
1162 zadeklarowany rozmiar. Te typy także podlegają kompresji lub mogą być
1163 przechowywane out-of-line jako
<SMALL>TOAST
</SMALL>, więc faktyczne
1164 zużycie miejsca na dysku może być mniejsze niż oczekiwane.
</P>
1166 <P> <SMALL>VARCHAR(n)
</SMALL> jest
1167 najodpowiedniejszy do przechowywania łańcuchów o różnej długości
1168 ale określa on maksymalną jego długość.
1170 <SMALL>TEXT
</SMALL> jest najlepszy dla łańcuchów o dowolnej długości,
1171 nie przekraczającej
1GB.
</P>
1174 <SMALL>CHAR(n)
</SMALL> jast najlepszym typem do przechowywania
1175 łańcuchów o tej samej długości. CHAR(n) wypełnia dane do żadanej
1176 długości, podczas gdy VARCHAR(n) przechowuje jedynie dane
1179 <SMALL>BYTEA
</SMALL> służy do przechowywania danych binarnych,
1180 w szczególności dla danych zawierających
<SMALL>NULL
</SMALL> bajty.
1181 Wszystkie typy opisane tutaj maja podobne charakterystyki jeśli
1182 chodzi o wydajność.
</P>
1184 <H4><A name=
"4.15.1">4.15.1</A>) Jak mogę utworzyć pole które samo
1185 zwiększa swoją wartość?
</H4>
1187 <P>PostgreSQL ma zaimplementowany typ
<SMALL>SERIAL
</SMALL>.
1188 Automatycznie tworzy sekwencję i indeks na tej kolumnie. Dla
1191 CREATE TABLE person (
1196 zostanie automatycznie prztłumaczone na:
1198 CREATE SEQUENCE person_id_seq;
1199 CREATE TABLE person (
1200 id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
1203 CREATE UNIQUE INDEX person_id_key ON person ( id );
1205 Więcej informacji o sekwencjach znajdziesz w manualu o
1206 <I>create_sequence
</I>. Możesz także użyć pola
<I>OID
</I> jako
1207 unikalnej wartości dla każdego rzędu danych. Jeśli będziesz
1208 potrzebował z backupować dane robiąc dump bazy i odtworzyć ją, musisz
1209 użyc
<I>pg_dump
</I> z opcją
<I>-o
</I> lub polecenia
<SMALL>COPY
1210 WITH OIDS
</SMALL> aby zachować
<SMALL>OIDy
</SMALL>.
1212 <H4><A name=
"4.15.2">4.15.2</A>) Jak pobrać wartość pola typu
1213 <SMALL>SERIAL
</SMALL> po wykonaniu insert'u?
</H4>
1215 <P>Jednym z podejść jest pobranie kolejnej wartości typu
1216 <SMALL>SERIAL
</SMALL> z sekwencji za pomocą funkcji
<I>nextval()
</I>
1217 <I>zanim
</I> zostanie wstawiona, a później należy jej użyć. Używając
1218 przykładu z tabeli z punktu
<A href=
"#4.15.1">4.15.1</A>, może to
1219 wyglądać w Perlu na przykład w ten sposób:
</P>
1222 new_id = output of
"SELECT nextval('person_id_seq')"
1223 INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
1225 Będziesz miał wtedy tą wartość przechowaną w zmiennej
1226 <CODE>new_id
</CODE> do użytku w innych zapytaniach (np. jako klucz
1227 obcy do tabeli
<CODE>person
</CODE>). Warto zwrócić uwagę, że nazwa
1228 automatycznie utworzonej sekwencji
1229 <SMALL>SEQUENCE
</SMALL> będzie następująca:
1230 <<I>tabela
</I>>_
<<I>kolumnatypuserial
</I>>_
<I>seq
</I>,
1232 <I>tabela
</I> i
<I>kolumnatypuserial
</I> są nazwami Twojej tabeli i
1233 Twojej kolumny typu
<SMALL>SERIAL
</SMALL>.
1235 <P>Inne rozwiązanie to użycie funkcji
<I>currval
</I>() na pola typu
1236 <SMALL>SERIAL
</SMALL> po dodaniu nowej wartości do rzędu zawierającego
1237 kolumnę typu
<SMALL>SERIAL
</SMALL> z wstawioną domyślnie wartością,
1240 INSERT INTO person (name) VALUES ('Blaise Pascal');
1241 new_id = output of
"SELECT currval('person_id_seq')";
1243 Ostatecznie możesz użyć
<A href=
"#4.16"><SMALL>OID
</SMALL></A>
1244 zwracanej po wykonaniu
<SMALL>INSERT
</SMALL>, chociaż to jest najmniej
1245 przenośne rozwiązanie.
1246 W Perlu, wykorzystując bibliotekę DBI z modułem Edmunda Mergla
1247 DBD::Pg, oid jest dostępny poprzez
<I>$sth-
>{pg_oid_status}
</I> po
1248 wykonaniu
<I>$sth-
>execute()
</I>.
1250 <H4><A name=
"4.15.3">4.15.3</A>) Czy użycie
<I>currval()
</I> i
1251 <I>nextval()
</I> nie doprowadzi do race condition z innymi
1254 <P>Nie. currval() zwraca bieżącą wartość przypisaną przez Twój
1255 backend, a nie przez wszystkich użytkowników.
</P>
1257 <H4><A name=
"4.15.4">4.15.4</A>) Dlaczego numery sekwencji nie są
1258 ponownie używane przy przerwaniu transakcji?
1259 Skąd się biorą luki w numerowaniu kolumny tabeli
1260 sekwancjami/SERIALem?
</H4>
1262 <P>Aby poprawić zbieżność (concurrency), wartości sekwencji są
1263 podawane działającym transakcjom kiedy tego potrzebują i nie są
1264 blokowane dopóki transakcja się nie zakończy. To spowoduje przerwy w
1265 numerowaniu z przerwanych transakcji.
</P>
1267 <H4><A name=
"4.16">4.16</A>) Co to jest
<SMALL>OID
</SMALL>? Co to
1268 jest
<SMALL>TID
</SMALL>?
</H4>
1270 <P><SMALL>OID
</SMALL> są PostgreSQL'owym rozwiązaniem problemu
1271 unikalnych numerów rzędów. Każdy rząd tworzony przez PostgreSQL
1272 otrzymuje unikalny
<SMALL>OID
</SMALL>. Wszystkie
<SMALL>OID
</SMALL>y
1273 generowane podczas procesu uruchamianego przez skrypt
1274 <I>initdb
</I> mają mniejszą wartość niż
16384 (na podstawie pliku
1275 <I>backend/access/transam.h
</I>). Wszystkie
1276 <SMALL>OID
</SMALL>y tworzone przez użytkownika sa równe lub większe
1277 podanej wcześniej wartości. Domyślnie
1278 wszystkie
<SMALL>OID
</SMALL>y są unikalne nie tylko w pojedyńczej
1279 tabeli czy bazie danych ale w całej instalacji PostgreSQL.
</P>
1281 <P>PostgreSQL używa
<SMALL>OIDów
</SMALL> w swoim wewnętrznym systemie
1282 tabel, aby można było je łączyć.
1283 Te
<SMALL>OIDy
</SMALL> mogą byc używane aby identyfikowac rzędy w
1284 tabelach i wykorzystywać je w złączeniach tych tabel. Zaleca się abyś
1285 używał typu
<SMALL>OID
</SMALL> aby przechowywać wartości
1286 <SMALL>OID
</SMALL>. Możesz utworzyć indeks na polu
1287 <SMALL>OID
</SMALL> aby dostęp do niego był szybszy.
</P>
1289 <P><SMALL>OID
</SMALL> są przypisane do wszystkich rzędów z jednego
1290 głównego miejsca i używane sa przez wszystkie bazy danych. Jeśli
1291 chciałbyś zmienić
<SMALL>OID
</SMALL> na coś innego, lub jeśli
1292 chciałbyś zrobić kopię tabeli, z orginalnymi
<SMALL>OIDami
</SMALL>
1293 nie ma żadnego przeciwwskazania abyś to zrobił:
</P>
1296 CREATE TABLE new_table(old_oid oid, mycol int);
1297 SELECT old_oid, mycol INTO new FROM old;
1298 COPY new TO '/tmp/pgtable';
1300 COPY new WITH OIDS FROM '/tmp/pgtable';
1302 CREATE TABLE new_table (mycol int);
1303 INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table;
1307 <P><SMALL>OIDy
</SMALL> są przechowywane jako cztero-bajtowe liczby
1308 całkowite i skończą się po osiągnięciu czterech miliardów. Nikt jak
1309 dotąd nie zgłosił aby coś takiego się stalo, ale mamy zamiar pozbyć
1310 się tego ograniczenia zanim ktoś to zgłosi.
</P>
1312 <P><SMALL>TID
</SMALL> są używane aby zidentyfikować konkretne rzędy z
1313 blokami i wartością ofsetów.
<SMALL>TIDy
</SMALL> zmieniają się wraz
1314 ze zmianami rzędów. Sa używane przez indeksy, aby wskazywać do
1315 fizycznych rzędów.
</P>
1317 <H4><A name=
"4.17">4.17</A>) Jakie jest znaczenie niektórych terminów
1320 <P>W części kodu źródłowego i starszej dokumentacji używamy terminów,
1321 które mają bardziej ogólne znaczenie. Oto niektóre z nich:
</P>
1324 <LI>table, relation, class
</LI>
1326 <LI>row, record, tuple
</LI>
1328 <LI>column, field, attribute
</LI>
1330 <LI>retrieve, select
</LI>
1332 <LI>replace, update
</LI>
1334 <LI>append, insert
</LI>
1336 <LI><SMALL>OID
</SMALL>, serial value
</LI>
1338 <LI>portal, cursor
</LI>
1340 <LI>range variable, table name, table alias
</LI>
1343 <P>Listę terminów związanych z bazami danych możesz znaleźć pod tym
1345 href=
"http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html
</A>.
</P>
1347 <H4><A name=
"4.18">4.18</A>) Skąd bierze się ten błąd
<I>"ERROR:
1348 Memory exhausted in AllocSetAlloc()"</I>?
</H4>
1351 Prawdopodobnie wyczerpała Ci się pamięć wirtualna (virtual memory)
1352 w systemie lub Twój kernel ma zbyt nisko
1353 ustawione limity dla pewnych zasobów. Spróbuj wykonać następujące
1354 polecenia zanim uruchomisz
<I>postmaster'a
</I>:
</P>
1359 W zależności od shell'a jakiego używasz jedno z tych poleceń może nie
1360 zadziałać, ale to ustawienie pozwoli ustawić segment danych dla
1361 procesu znacznie większy i być może pozwoli wykonać zapytanie.
1362 To polecenie zadziała dla bieżącego procesu oraz wszytkich podprocesów
1363 utworzonych po wykonaniu polecenia. Jeśli ten problem występuje z
1364 klientem
<SMALL>SQL
</SMALL>, ponieważ backend zwraca zbyt dużo danych,
1365 spróbuj wykonać to polecenie przed uruchomieniem klienta.
1367 <H4><A name=
"4.19">4.19</A>) Jak sprawdzić jakiej wersji PostgreSQL
1370 <P>W
<I>psql
</I>, wpisz
<CODE>select version();
</CODE></P>
1372 <H4><A name=
"4.20">4.20</A>) Dlaczego operacje, które wykonuję na
1373 dużych obiektach
"large-object" zwracają komunikat:
1374 <I>"invalid large obj descriptor"</I>?
</H4>
1376 <P>Musisz użyć
<CODE>BEGIN WORK
</CODE> i
<CODE>COMMIT
</CODE>
1377 przed i po użyciu uchwytu do dużego obiektu, tzn. musisz nimi otoczyć
1378 funkcje
<CODE>lo_open
</CODE> ...
<CODE>lo_close.
</CODE></P>
1380 <P>Obecnie PostgreSQL używjąc
"rule" zamyka uchwyt do dużego obiektu
1381 przy każdym wywołaniu
"commit". Więc pierwsze próba zrobienia
1382 czegokolwiek z uchwytem spowoduje wypisanie:
<I>invalid large obj
1383 descriptor
</I>. Kod, który do tej pory działał (przynajmniej
1384 większość razy) będzie teraz generował informację o błędzie jeśli nie
1385 będziesz korzystał z transakcji.
</P>
1387 <P>Jeśli używasz interfejsu klienta jak
<SMALL>ODBC
</SMALL> być może
1388 będziesz musiał ustawić
<CODE>auto-commit off.
</CODE></P>
1390 <H4><A name=
"4.21">4.21</A>) Jak stworzyć kolumnę której domyślną
1391 wartością będzie bieżący czas?
</H4>
1393 <P>Użyj
<I>CURRENT_TIMESTAMP
</I>:
</P>
1395 <CODE>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
1399 <H4><A name=
"4.22">4.22</A>) Dlaczego zapytania używające
1400 <CODE><SMALL>IN
</SMALL></CODE> sa takie wolne?
</H4>
1402 <P>W wersjach wcześniejszych niż
7.4 łączymy podzapytania w outer queries
1403 poprzez sekwencyjne przeszukiwanie wyników podzapytania dla każdego rzędu
1404 z outer query. Jeśli podzapytanie zwraca jedynie kilka rzędów a
1405 zewnętrzne zapytanie zwraca ich wiele, IN jest najszybsze.
1406 Aby przyspieszyć inne zapytania można zastąpić
<CODE>IN
</CODE> przez
1407 <CODE>EXISTS
</CODE>:
</P>
1411 WHERE col IN (SELECT subcol FROM subtab)
1418 WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col)
1422 Aby to rozwiązanie było szybkie, subcol powinna być kolumną
1426 W wersji
7.4 i późniejszych, IN w rzeczywistości używa tej samej
1427 wyrafinowanej techniki łączenia jak normalne zapytania i jest
1428 preferowane nad używaniem EXISTS.
1430 <H4><A name=
"4.23">4.23</A>) Jak wykonać
"outer join"?
</H4>
1432 <P>PostgreSQL ma zaimplementowane outer join
1433 wykorzystując standardową składnię SQL. Poniżej dwa przykłady:
</P>
1437 FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
1442 FROM t1 LEFT OUTER JOIN t2 USING (col);
1445 <P>Te dwa identyczne zapytania łączą kolumnę t1.col z kolumną t2.col,
1446 ale także zwrócą niepołączone rzędy w t1 (te, które nie pasują w t2).
1447 <SMALL>RIGHT
</SMALL> join dodałby niepołączone rzędy z tabeli t2.
1448 <SMALL>FULL
</SMALL> join zwróciłby rzędy plus dodatkowo wszystkie
1449 rzędy z tabel t1 i t2. Słowo
<SMALL>OUTER
</SMALL> jest opcjonalne i
1450 jest dodawane domyślnie przy
1451 <SMALL>LEFT
</SMALL>,
<SMALL>RIGHT
</SMALL>, i
<SMALL>FULL
</SMALL>
1452 join'ach. Zwykłe join'y są nazywane
<SMALL>INNER
</SMALL> joins.
</P>
1454 <P>W poprzednich wersjach
"outer joins" mogą być zasymulowane poprzez
1455 użycie slowa kluczowego
1456 <SMALL>UNION
</SMALL> i
<SMALL>NOT IN
</SMALL>. Dla przykładu, łącząc
1457 tabele
<I>tab1
</I> i
<I>tab2
</I>, następujące zapytanie wykonuje
1458 <I>outer
</I> join:
<BR>
1462 SELECT tab1.col1, tab2.col2
1464 WHERE tab1.col1 = tab2.col1
1466 SELECT tab1.col1, NULL
1468 WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
1472 <H4><A name=
"4.24">4.24</A>) Jak wykonywać zapytanie używające kilku
1473 baz danych jednocześnie?
</H4>
1475 <P>Nie ma takiej możliwości aby w zapytaniu odpytawać inną baze danych
1476 poza bieżącą. Ponieważ PostgreSQL ładuje specyficzne dla bazy danych
1477 katalogi systemowe, nie jest do końca jasne jak zapytanie pomiędzy
1478 różnymi bazami danych powinno się zachowywać.
</P>
1480 <P><I>contrib/dblink
</I> pozwala na wykonywanie zapytań poprzez różne
1481 bazy danych wywołując odpowiednie funkcje. Oczywiście klient może łączyć
1482 się z różnymi bazami danych i łączyć informację w ten sposób uzyskaną
1483 po stronie klienta.
</P>
1485 <H4><A name=
"4.25">4.25</A>) Jak zwrócić w funkcji wiele rzędów lub
1488 <P>Możesz w łatwy sposób zwracać wiele rzędów lub kolumn używając
1489 funkcji z:
<A href=
"http://techdocs.postgresql.org/guides/SetReturningFunctions">http://techdocs.postgresql.org/guides/SetReturningFunctions
</A>.
</P>
1491 <H4><A name=
"4.26">4.26</A>) Dlaczego nie mogę w sposób pewny
1492 tworzyć/usuwać tabel tymczasowych w funkcjach PL/PgSQL?
</H4>
1494 PL/PgSQL przechowuje w cache zawartość funkcji, niepożądanym efektem tego
1495 jest to, że gdy taka funkcja korzysta z tabel tymczasowych, które są
1496 później kasowane i odtwarzane, a funkcja wywoływana jest ponownie,jej
1497 wywołanie nie powiedzie się ponieważ cachowana funkcja wciąż będzie
1498 wskazywać na stara tablicę tymczasową. Rozwiązaniem tego problemu jest
1499 używanie EXECUTE aby korzystać z tabel tymczasowych w PL/PgSQL. To
1500 spowoduje, że zapytanie będzie parsowane przy każdym wywołaniu
1504 <H4><A name=
"4.27">4.27</A>) Jakie są możliwości replikacji w PostgreSQL?
</H4>
1506 Jest kilka opcji aby stosować replikację typu master/slave. Ten typ
1507 pozwala jedynie masterowi na dokonywanie zmian w bazie danych, a
1508 slave może jedynie te zmiany odczytywać. Na stronie
1510 href=
"http://gborg.PostgreSQL.org/genpage?replication_research">http://gborg.PostgreSQL.org/genpage?replication_research
</A>
1511 znajduje się ich lista. Replikacja typu multi-master jest w trakcie
1512 prac, opis projektu znajduje się pod adresem:
<A
1513 href=
"http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">
1514 http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php
</A>.
1517 <H4><A name=
"4.28">4.28</A>) Jakie możliwości szyfrowania oferuje
1520 <LI>contrib/pgcrypto zawiera wiele funkcji za pomocą, których możemy używać
1521 kryptografii w zapytaniach SQL.
</LI>
1522 <LI>Aby szyfrować transmisję od klienta do serwera, ten musi mieć
1523 ustawioną opcję ssl na true w pliku postgresql.conf, odpowiedni
1524 wpis host lub hostssl musi występować w pliku pg_hba.conf, oraz
1525 sslmode nie może być wyłączone w kliencie. (Warto zwrócić uwagę, że
1526 możliwe jest także używanie transportów szyfrująców przez strony
1527 trzecie, takie jak stunnel lub ssh, poza natywnym wsparciem dla SSL
1528 przez PostgreSQL).
</LI>
1529 <LI>Hasła użytkowników bazy danych są automatycznie szyfrowane od
1530 wersji
7.3. W poprzednich wersjach, należy tą funkcjonalność poprzez
1531 włączenie opcji PASSWORD_ENCRYPTION w postgresql.conf.
</LI>
1532 <LI>Serwer może działać używając szyfrowanego systemu plików.
</LI>
1535 <H2 align=
"center">Rozwijanie PostgreSQL
</H2>
1537 <H4><A name=
"5.1">5.1</A>) Napisałem własną funkcję. Kiedy użyję jej
1538 w
<I>psql
</I>, program zrzuca pamięć (dump core)?
</H4>
1540 <P>Problem może być spowodowany przez bardzo wiele rzeczy. Spróbuj
1541 najpierw przetestować Twoją funkcję w samodzielnie działającym programie.
1544 <H4><A name=
"5.2">5.2</A>) Jak mogę dodać/zgłosić nowe typy czy
1545 funkcje do PostgreSQL?
</H4>
1547 <P>Wyślij Twoje propozycje na listę mailową
<I>pgsql-hackers
</I>,
1548 wtedy prawdopodobnie Twój kod znajdzie się w katalogu
<I>contrib/
</I>.
</P>
1550 <H4><A name=
"5.3">5.3</A>) Jak napisać funkcję C zwracającą krotkę
1554 W wersjach PostgreSQL od numeru
7.3, funckje zwracające tabele są w
1555 pęlni wspierane w C, PL/PgSQL i SQL. Sprawdź w Programmer's Guide aby
1556 uzyskać więcej informacji. Przykład funkcji napisanej w C zwracającej
1557 tabelę został umieszczony w
<I>contrib/tablefunc
</I>.
1560 <H4><A name=
"5.4">5.4</A>) Zmieniłem plik źródłowy. Dlaczego po
1561 rekompilacji nie widać zmiany?
</H4>
1563 <P>Pliki
<I>Makefiles
</I> nie mają dorzuconych odpowiednich
1564 zależności dla plików nagłówkowych (include files). Wykonaj najpierw
1565 <I>make clean
</I>, a następnie ponownie
<I>make
</I>.
1566 Jeśli używasz
<SMALL>GCC
</SMALL> możesz użyć opcji
1567 <I>--enable-depend
</I> przy wykonywaniu
<I>configure
</I> aby
1568 kompilator mógł określić zależności samodzielnie.