"http://www.postgresql.org/idocs/index.php?kernel-resources.html">PostgreSQL
- Administrator's Guide gdzie szczegó³owo zosta³o opisane
- wykorzystanie pamiêci dzielonej i semaforów.
+ Administrator's Guide gdzie szczegółowo zostało opisane
+ wykorzystanie pamięci dzielonej i semaforów.
3.4) Podczas startu postmaster'a,
- otrzymujê komunikat o b³êdzie: IpcSemaphoreCreate.
+ otrzymuję komunikat o błędzie: IpcSemaphoreCreate.
Dlaczego?
-
Je¶li tre¶æ b³êdu brzmi: IpcSemaphoreCreate: semget failed
- (No space left on device) oznacza to, ¿e j±dro systemu nie jest
- skonfigurowane do obs³ugi wystarczaj±cej liczby semaforów.
+
Jeśli treść błędu brzmi: IpcSemaphoreCreate: semget failed
+ (No space left on device) oznacza to, że jądro systemu nie jest
+ skonfigurowane do obsługi wystarczającej liczby semaforów.
Postgres wymaga jednego semafor'a na potencjalny jeden proces backend.
- Tymczasowym rozwi±zaniem jest uruchomienie programu postmaster
- z mniejsz± maksymaln± liczb± procesów backend.
- U¿yj opcji -N z parameterem mniejszym od domy¶lnego - 32.
- Bardziej trwa³ym rozwi±zaniem jest zwiêkszenie parametrów
- SEMMNS i SEMMNI j±dra twojego systemu.
+ Tymczasowym rozwiązaniem jest uruchomienie programu postmaster
+ z mniejszą maksymalną liczbą procesów backend.
+ Użyj opcji -N z parameterem mniejszym od domyślnego - 32.
+ Bardziej trwałym rozwiązaniem jest zwiększenie parametrów
+ SEMMNS i SEMMNI jądra twojego systemu.
-
Niedzia³aj±ce semafory mog± spowodowaæ niepoprawne zamkniêcie
+
Niedziałające semafory mogą spowodować niepoprawne zamknięcie
systemu w czasie intensywnego korzystania z bazy.
-
Je¶li tre¶æ b³êdu jest inna, mo¿e to oznaczaæ, ¿e obs³uga semaforów
- nie zosta³a w³±czona do j±dra wcale. Zobacz PostgreSQL
- Administrator's Guide po bardziej szczegó³owe informacje o pamiêci
+
Jeśli treść błędu jest inna, może to oznaczać, że obsługa semaforów
+ nie została włączona do jądra wcale. Zobacz PostgreSQL
+ Administrator's Guide po bardziej szczegółowe informacje o pamięci
dzielonej i semaforach.
-
3.5) W jaki sposób mogê kontrolowaæ po³±czenia
- z innych hostów?
+
3.5) W jaki sposób mogę kontrolować połączenia
+ z innych hostów?
-
Domy¶lnie PostgreSQL pozwala jedynie na po³±czenia za pomoc±
- socketów Unixowych z lokalnego hosta. Inne hosty nie bêd± mog³y siê
- po³±czyæ z serwerem dopóki nie zostanie dodana opcja -i do
+
Domyślnie PostgreSQL pozwala jedynie na połączenia za pomocą
+ socketów Unixowych z lokalnego hosta. Inne hosty nie będą mogły się
+ połączyć z serwerem dopóki nie zostanie dodana opcja -i do
postmaster'a,
- oraz nie umo¿liwi siê autoryzacji na podstawie adresu hostów
- modyfikuj±c odpowiednio plik
- $PGDATA/pg_hba.conf. To zmiany pozwol± na po³±czenia TCP/IP.
+ oraz nie umożliwi się autoryzacji na podstawie adresu hostów
+ modyfikując odpowiednio plik
+ $PGDATA/pg_hba.conf. To zmiany pozwolą na połączenia TCP/IP.
-
3.6) Jak powinienem skonfigurowaæ system baz
- danych aby uzyskaæ lepsz± wydajno¶æ?
+
3.6) Jak powinienem skonfigurować system baz
+ danych aby uzyskać lepszą wydajność?
-
Indeksy bez w±tpienia mog± przyspieszyæ wykonywanie zapytañ.
- Polecenie EXPLAIN pozwala zobaczyæ jak PostgreSQL
- interpretuje Twoje zapytanie i które indeksy s± u¿ywane.
+
Indeksy bez wątpienia mogą przyspieszyć wykonywanie zapytań.
+ Polecenie EXPLAIN pozwala zobaczyć jak PostgreSQL
+ interpretuje Twoje zapytanie i które indeksy są używane.
-
Je¶li wykonujesz bardzo du¿o INSERTów, mo¿e warto
- je wykonaæ za pomoc± jednego du¿ego pliku u¿ywaj±c polecenia
- COPY. Jest to du¿o szybsze ni¿ pojedyncze
+
Jeśli wykonujesz bardzo dużo INSERTów, może warto
+ je wykonać za pomocą jednego dużego pliku używając polecenia
+ COPY. Jest to dużo szybsze niż pojedyncze
INSERTy. Po drugie polecenia SQL nie zawarte w bloku
- okre¶laj±cym transakcjê - BEGIN WORK/COMMIT, s±
- traktowane jako pojedyncza transakcja. Rozwa¿ wykonanie kilku
- poleceñ/zdañ SQL w jednym bloku transakcji. To redukuje narzut
- nak³adany przez transakcjê. Przy du¿ych zmianach w danych, warto
- usun±æ i stworzyæ na nowo indeksy.
-
-
Jest kilka opcji pozwalaj±cych na poprawienie wydajno¶ci.
- Mo¿esz wy³±czyæ fsync() poprzez uruchomienie postmaster'a
- z opcjami -o -F. To spowoduje, ¿e
- fsync() nie bêdzie zrzuca³ danych na dysk po ka¿dej
+ określającym transakcję - BEGIN WORK/COMMIT, są
+ traktowane jako pojedyncza transakcja. Rozważ wykonanie kilku
+ poleceń/zdań SQL w jednym bloku transakcji. To redukuje narzut
+ nakładany przez transakcję. Przy dużych zmianach w danych, warto
+ usunąć i stworzyć na nowo indeksy.
+
+
Jest kilka opcji pozwalających na poprawienie wydajności.
+ Możesz wyłączyć fsync() poprzez uruchomienie postmaster'a
+ z opcjami -o -F. To spowoduje, że
+ fsync() nie będzie zrzucał danych na dysk po każdej
transakcji.
-
Mo¿esz tak¿e uruchomiæ postmaster'a z opcj± -B
- aby zwiêkszyæ wielko¶æ pamiêci dzielonej u¿ywanej przez procesy
- backendów. Je¶li ustawisz t± warto¶æ zbyt wysoko i przekroczysz limity
- ustawione przez kernel na pamiêæ dzielon±, postmaster mo¿e siê
- nie uruchomiæ. Ka¿dy bufor zajmuje 8K a domy¶lna ilo¶æ buforów to 64.
+
Możesz także uruchomić postmaster'a z opcją -B
+ aby zwiększyć wielkość pamięci dzielonej używanej przez procesy
+ backendów. Jeśli ustawisz tą wartość zbyt wysoko i przekroczysz limity
+ ustawione przez kernel na pamięć dzieloną, postmaster może się
+ nie uruchomić. Każdy bufor zajmuje 8K a domyślna ilość buforów to 64.
-
Mo¿esz tak¿e u¿yæ opcji -S dla backendu aby zwiêkszyæ
- maksymaln± warto¶æ pamiêci u¿ywan± przez proces backendu podczas
- sortowania. Opcja -S jest ustawiana warto¶ci± podawan± w
- kilobajtach, domy¶lna warto¶æ to 512K.
+
Możesz także użyć opcji -S dla backendu aby zwiększyć
+ maksymalną wartość pamięci używaną przez proces backendu podczas
+ sortowania. Opcja -S jest ustawiana wartością podawaną w
+ kilobajtach, domyślna wartość to 512K.
-
Mo¿esz tak¿e u¿yæ polecenia CLUSTER aby pogrupowaæ
+
Możesz także użyć polecenia CLUSTER aby pogrupować
dane w tabelach wg indeksu. Zobacz opis polecenia CLUSTER
- w manualu ¿eby dowiedzieæ siê wiêcej.
+ w manualu żeby dowiedzieć się więcej.
-
3.7) Jakie s± mo¿liwo¶ci wyszukiwania
- b³êdów?
+
3.7) Jakie są możliwości wyszukiwania
+ błędów?
-
PostgreSQL ma kilka mo¿liwo¶ci na raportowanie informacji o
- jego statusie, które mog± byæ przydatne przy debugowaniu procesu.
+
PostgreSQL ma kilka możliwości na raportowanie informacji o
+ jego statusie, które mogą być przydatne przy debugowaniu procesu.
-
Przede wszystkim uruchom skrypt configure z opcj±
- --enable-cassert, wiele funkcji assert() monitoruj± postêp
- procesu backend i zatrzymuj± program kiedy wydarzy siê co¶
+
Przede wszystkim uruchom skrypt configure z opcją
+ --enable-cassert, wiele funkcji assert() monitorują postęp
+ procesu backend i zatrzymują program kiedy wydarzy się coś
nieoczekiwanego.
-
Zarówno postmaster jak i postgres maj± kilka opcji
- do debugowania. Za ka¿dym razem kiedy uruchamiasz postmaster'a,
- upewnij siê, ¿e wysy³asz standardowe wyj¶cie i error do pliku z
- logami, np. w ten sposób:
+
Zarówno postmaster jak i postgres mają kilka opcji
+ do debugowania. Za każdym razem kiedy uruchamiasz postmaster'a,
+ upewnij się, że wysyłasz standardowe wyjście i error do pliku z
+ logami, np. w ten sposób:
cd /usr/local/pgsql
./bin/postmaster >server.log 2>&1 &
-
To utworzy plik server.log w g³ównym katalogu PostgreSQL.
- Ten plik zawiera po¿yteczne informacje o problemach i b³êdach, które
- wydarzy³y siê podczas pracy serwera. Postmaster posiada opcjê
- -d, która pozwala na raportowanie bardzo szczególowych
- informacji. Do opcji -d podajemy liczbê, która okre¶la
- szczegó³owo¶æ wysy³anych informacji. Musisz mieæ ¶wiadomo¶æ, ¿e
- wysoki poziom logowania bêdzie powodowa³ tworzenie bardzo duzych
- plików z logami.
-
-
Je¶li postmaster nie zosta³ uruchomiony, mo¿esz uruchomiæ
- postgres'owy backend z linii poleceñ, i uruchomiæ Twoje
- polecenie SQL bezpo¶rednio na nim.
- Taki sposób jest polecany jedynie w przypadku debugowania.
- Zwróæ uwagê, ¿e w tym wypadku zapytanie koñczy znak nowej linii a nie
- ¶rednik. Je¶li skompilowa³e¶ z opcjami debugowania mozesz u¿yæ
- debuggera aby sprawdziæ co siê dzieje. Poniew¿ backend nie zosta³
- uruchomiony przez postmaster'a, nie dzia³a w identycznym
- ¶rodowisku, co oznacza ¿e powtórzenie warunków w jakich wyst±pi³y
- problemy moze byæ problemem.
-
-
Je¶li postmaster dzia³a, uruchom psql w jednym z
- okien, nastêpnie znajd¼ PID procesu postgres
- u¿ywanego przez psql. U¿yj debuggera aby do
- PID'u postgres'a. Mo¿esz ustawiaæ pu³apki
- (breakpoints) w debuggerze i wykonywaæ zapytania z psql.
- Je¶li debugujesz uruchamianie postgres'a, mo¿esz ustawiæ zmienn±
- PGOPTIONS="-W n", nastêpnie uruchomiæ psql.
- Opcja ta pozwoli spowolniæ uruchomienie na
- n sekund aby¶ móg³ siê po³±czyæ z procesem za pomoc±
- debugera, ustawiæ jakiekolwiek pu³apki i kontynuowaæ proces
+
To utworzy plik server.log w głównym katalogu PostgreSQL.
+ Ten plik zawiera pożyteczne informacje o problemach i błędach, które
+ wydarzyły się podczas pracy serwera. Postmaster posiada opcję
+ -d, która pozwala na raportowanie bardzo szczególowych
+ informacji. Do opcji -d podajemy liczbę, która określa
+ szczegółowość wysyłanych informacji. Musisz mieć świadomość, że
+ wysoki poziom logowania będzie powodował tworzenie bardzo duzych
+ plików z logami.
+
+
Jeśli postmaster nie został uruchomiony, możesz uruchomić
+ postgres'owy backend z linii poleceń, i uruchomić Twoje
+ polecenie SQL bezpośrednio na nim.
+ Taki sposób jest polecany jedynie w przypadku debugowania.
+ Zwróć uwagę, że w tym wypadku zapytanie kończy znak nowej linii a nie
+ średnik. Jeśli skompilowałeś z opcjami debugowania mozesz użyć
+ debuggera aby sprawdzić co się dzieje. Poniewż backend nie został
+ uruchomiony przez postmaster'a, nie działa w identycznym
+ środowisku, co oznacza że powtórzenie warunków w jakich wystąpiły
+ problemy moze być problemem.
+
+
Jeśli postmaster działa, uruchom psql w jednym z
+ okien, następnie znajdź PID procesu postgres
+ używanego przez psql. Użyj debuggera aby do
+ PID'u postgres'a. Możesz ustawiać pułapki
+ (breakpoints) w debuggerze i wykonywać zapytania z psql.
+ Jeśli debugujesz uruchamianie postgres'a, możesz ustawić zmienną
+ PGOPTIONS="-W n", następnie uruchomić psql.
+ Opcja ta pozwoli spowolnić uruchomienie na
+ n sekund abyś mógł się połączyć z procesem za pomocą
+ debugera, ustawić jakiekolwiek pułapki i kontynuować proces
uruchamiania.
-
postgres mo¿e byæ uruchamiany z opcjami -s, -A i
- -t, które mog± byæ bardzo przydatne przy debuggowaniu i ocenie
- wydajno¶ci.
+
postgres może być uruchamiany z opcjami -s, -A i
+ -t, które mogą być bardzo przydatne przy debuggowaniu i ocenie
+ wydajności.
-
Mo¿esz tak¿e skompilowaæ z profilingiem aby zobaczyæ jakie funkcje
- ile czasu wykonuj± siê. Pliki profilowane dla backendu zostan±
+
Możesz także skompilować z profilingiem aby zobaczyć jakie funkcje
+ ile czasu wykonują się. Pliki profilowane dla backendu zostaną
umieszczone w katalogu
- pgsql/data/base/dbname. Pliki profilu klienta zostan±
- umieszczone w bie¿±cym katalogu klienta. Linux wymaga aby kompilowaæ
- z opcj± -DLINUX_PROFILE aby profilowanie odbywa³o siê
+ pgsql/data/base/dbname. Pliki profilu klienta zostaną
+ umieszczone w bieżącym katalogu klienta. Linux wymaga aby kompilować
+ z opcją -DLINUX_PROFILE aby profilowanie odbywało się
poprawnie.
-
3.8) Sk±d siê bierze komunikat: "Sorry, too
- many clients" podczas próby po³±czenia siê z baz± danych?
+
3.8) Skąd się bierze komunikat: "Sorry, too
+ many clients" podczas próby połączenia się z bazą danych?
-
Musisz zwiêkszyæ limit ilo¶ci jednoczesnych procesów bacekendu
+
Musisz zwiększyć limit ilości jednoczesnych procesów bacekendu
dla procesu postmaster'a.
-
Domy¶lny limit to 32 procesy. Mo¿esz go zwiêkszyæ przez restart
- postmaster z odpowiedni± warto¶ci± ustawian± opcjê -N w
+
Domyślny limit to 32 procesy. Możesz go zwiększyć przez restart
+ postmaster z odpowiednią wartością ustawianą opcję -N w
pliku postgresql.conf.
-
We¼ pod uwagê, ¿e je¶li zwiêkszysz warto¶æ podan± w opcji
- -N na wiêcej ni¿ 32 musisz tak¿e zwiêkszyæ warto¶æ w opcji
- -B ponad jej domy¶ln± warto¶æ 64; warto¶æ -B musi byæ
- co najmniej dwa razy wiêksza od warto¶ci podanej w opcji
- -N, a prawdopodobnie powinna byæ w rzeczywisto¶ci jeszcze
- wiêksza dla optymalnej wydajno¶ci.
- Dla du¿ej liczby procesów backendu na pewno zauwa¿ysz, ¿e trzeba
- zwiêkszyæ ró¿ne parametry j±dra Unixa. Rzeczy, które powniene¶
- sprawdziæ to maksymalna liczba bloków pamiêci dzielonej,
- SHMMAX; maksymalna liczba semaforów, SEMMNS
+
Weź pod uwagę, że jeśli zwiększysz wartość podaną w opcji
+ -N na więcej niż 32 musisz także zwiększyć wartość w opcji
+ -B ponad jej domyślną wartość 64; wartość -B musi być
+ co najmniej dwa razy większa od wartości podanej w opcji
+ -N, a prawdopodobnie powinna być w rzeczywistości jeszcze
+ większa dla optymalnej wydajności.
+ Dla dużej liczby procesów backendu na pewno zauważysz, że trzeba
+ zwiększyć różne parametry jądra Unixa. Rzeczy, które pownieneś
+ sprawdzić to maksymalna liczba bloków pamięci dzielonej,
+ SHMMAX; maksymalna liczba semaforów, SEMMNS
oraz SEMMNI;
- maksymalna liczba procesów, NPROC; maksymalna liczba
- procesów na jednego u¿ytkownika, MAXUPRC; i maksymalna
- liczba otwartych plików, NFILE oraz
- NINODE. Powód dla którego PostgreSQL ma limit na
- maksymaln± liczbê procesów backendu to obawa o wyczerpanie zasobów
+ maksymalna liczba procesów, NPROC; maksymalna liczba
+ procesów na jednego użytkownika, MAXUPRC; i maksymalna
+ liczba otwartych plików, NFILE oraz
+ NINODE. Powód dla którego PostgreSQL ma limit na
+ maksymalną liczbę procesów backendu to obawa o wyczerpanie zasobów
systemu.
-
3.9) Jakie pliki znajduj± siê w pg_temp?
+
3.9) Jakie pliki znajdują się w pg_temp?
Katalog ten zawiera tymczasowe pliki utworzone przez executor. Dla
- przyk³adu, je¶li jaka¶ operacja sortowania jest wymagana do wykonania
- ORDER BY, a samo sortowanie wymaga wiêcej miejsca ni¿
+ przykładu, jeśli jakaś operacja sortowania jest wymagana do wykonania
+ ORDER BY, a samo sortowanie wymaga więcej miejsca niż
parametr backendu
- -S ustawi³ do wykorzystania, wtedy tymczasowe pliki s± u¿ywane
+ -S ustawił do wykorzystania, wtedy tymczasowe pliki są używane
do przechowywania tych danych.
-
Pliki tymczasowe powinny byæ usuniête automatycznie, ale mog³o siê
- to nie staæ je¶li proces backendu w miêdzyczasie nie zakoñczy³ siê
- poprawnie podczas operacji sortowania. Je¶li w danym momencie nie
- dzia³aj± ¿adne procesy backendów mozesz spokojnie usun±æ pliki
+
Pliki tymczasowe powinny być usunięte automatycznie, ale mogło się
+ to nie stać jeśli proces backendu w międzyczasie nie zakończył się
+ poprawnie podczas operacji sortowania. Jeśli w danym momencie nie
+ działają żadne procesy backendów mozesz spokojnie usunąć pliki
pg_tempNNN.NN.
3.9) Dlaczego konieczne jest przy upgradzie
- PostgreSQL korzystanie ze skryptów dump i restore?
+ PostgreSQL korzystanie ze skryptów dump i restore?
- Twórcy PostgreSQL dokonuj± jedynie ma³ych zmian pomiêdzy ma³ymi
+ Twórcy PostgreSQL dokonują jedynie małych zmian pomiędzy małymi
upgradami wersji, np z 7.2 do 7.2.1, wtedy upgrade nie wymaga
- korzystania z dump i restore. Przy wiêkszych zmianach, np. z wersji
- 7.2 do 7.3, czêsto zmianymaj± wp³yw na format przechowywanych danych.
- Zmiany te s± na tyle skomplikowane, ¿e nie utrzymujemy zgodo¶ci z
+ korzystania z dump i restore. Przy większych zmianach, np. z wersji
+ 7.2 do 7.3, często zmianymają wpływ na format przechowywanych danych.
+ Zmiany te są na tyle skomplikowane, że nie utrzymujemy zgodości z
poprzednimi wersjami PostgreSQL. dump pozwala na wydostanie danych w
- takiej postaci, w której ³atwe jest ich zaimportowanie do nowszych
- wersji bez k³opotu.
+ takiej postaci, w której łatwe jest ich zaimportowanie do nowszych
+ wersji bez kłopotu.
- W wydaniach gdzie zmiany nie dotycz± formatu danych na dysku, mo¿na
- wykorzystaæ skryptu pg_upgrade, do upgradu bez u¿ycia dump/restore.
- Dokumentacja do danego wydania zawiera informacjê czy mo¿liwe jest
- u¿ycie pg_upgrade.
+ W wydaniach gdzie zmiany nie dotyczą formatu danych na dysku, można
+ wykorzystać skryptu pg_upgrade, do upgradu bez użycia dump/restore.
+ Dokumentacja do danego wydania zawiera informację czy możliwe jest
+ użycie pg_upgrade.
-
Pytania dotycz±ce u¿ywania
+
Pytania dotyczące używania
-
4.1) Jaka jest ró¿nica pomiêdzy kursorami
- binarnymi (binary cursors) i zwyk³ymi kursorami (normal
+
4.1) Jaka jest różnica pomiędzy kursorami
+ binarnymi (binary cursors) i zwykłymi kursorami (normal
cursors)?
Zobacz w manualu opis polecenia DECLARE.
-
4.2) Jak mogê pobraæ za pomoc±
- SELECT jedynie kilka pierwszych wyników
+
4.2) Jak mogę pobrać za pomocą
+ SELECT jedynie kilka pierwszych wyników
zapytania?
-
Zobacz w manualu opis polecenia FETCH lub u¿yj
+
Zobacz w manualu opis polecenia FETCH lub użyj
polecenia SELECT ... LIMIT....
-
Nawet je¶li chesz pobraæ kilka pierwszych rzêdów z wyniku
- zapytania, ca³e zapytanie musi zostaæ wykonane. Byc mo¿e powiniene¶
- skorzystaæ z polecenia ORDER BY.
- Je¶li istnieje indeks który odpowiada polom okre¶lonym przez
- ORDER BY, PostgreSQL mo¿e wykorzystaæ jedynie kilka
- pierwszych rzêdów, byæ mo¿e bêdzie konieczno¶æ wykonania zapytania do
- momentu a¿ zostan± znalezione po¿±dane wyniki.
+
Nawet jeśli chesz pobrać kilka pierwszych rzędów z wyniku
+ zapytania, całe zapytanie musi zostać wykonane. Byc może powinieneś
+ skorzystać z polecenia ORDER BY.
+ Jeśli istnieje indeks który odpowiada polom określonym przez
+ ORDER BY, PostgreSQL może wykorzystać jedynie kilka
+ pierwszych rzędów, być może będzie konieczność wykonania zapytania do
+ momentu aż zostaną znalezione pożądane wyniki.
- Aby otrzymaæ losowy rz±d, u¿yj:
+ Aby otrzymać losowy rząd, użyj:
SELECT col
FROM tab
LIMIT 1;
-
4.3) Jak mogê uzyskaæ listê wszystkich tabel
+
4.3) Jak mogę uzyskać listę wszystkich tabel
czy innych rzeczy pod psql?
-
Mo¿esz sprawdziæ zawarto¶æ ¼róde³ psql, a konkretnie plik
+
Możesz sprawdzić zawartość źródeł psql, a konkretnie plik
pgsql/src/bin/psql/describe.c. Zawiera on polecenia
- SQL które generuja wyniki komend z backslashem.
- Mo¿esz tak¿e uruchomiæ psql z opcj±
- -E wtedy po wykonaniu polecenia z backslashem wy¶wietlane
- bêdzie zapytanie, które w rzeczywisto¶ci jest wykonywane.
+ SQL które generuja wyniki komend z backslashem.
+ Możesz także uruchomić psql z opcją
+ -E wtedy po wykonaniu polecenia z backslashem wyświetlane
+ będzie zapytanie, które w rzeczywistości jest wykonywane.
-
4.4) Jak usun±æ kolumnê z tabeli lub zmieniæ
+
4.4) Jak usunąć kolumnę z tabeli lub zmienić
jej typ?
-
DROP COLUMNT zosta³o dodane w wersji 7.3 przy poleceniu ALTER
- TABLE DROP COLUMN. We wcze¶ñiejszych wersjach mo¿esz zrobiæ tak:
+
DROP COLUMNT zostało dodane w wersji 7.3 przy poleceniu ALTER
+ TABLE DROP COLUMN. We wcześńiejszych wersjach możesz zrobić tak:
BEGIN;
LOCAL TABLE old_table;
- SELECT ... -- wybierz wszystkie kolumny poza t± jedn± której chcesz siê pozbyæ
+ SELECT ... -- wybierz wszystkie kolumny poza tą jedną której chcesz się pozbyć
INTO TABLE new_table
FROM old_table;
DROP TABLE old_table;
ALTER TABLE new_table RENAME TO old_table;
- Aby zmieniæ typ danych kolumny mo¿esz zrobiæ tak:
+ Aby zmienić typ danych kolumny możesz zrobić tak:
BEGIN;
COMMIT;
-
4.5) Jaki jest maksymalny rozmiar dla rzêdu,
+
4.5) Jaki jest maksymalny rozmiar dla rzędu,
tabeli i bazy danych?
Oto wszystkie ograniczenia:
- Maksymalny rozmiar dla bazdy danych? nieograniczony ( istniej±
- bazy danych o wielko¶ci 32 TB databases )
+ Maksymalny rozmiar dla bazdy danych? nieograniczony ( istnieją
+ bazy danych o wielkości 32 TB databases )
Maksymalny rozmiar dla tabeli? 32 TB
- Maksymalny rozmiar dla rzêdu? 1.6 TB
+ Maksymalny rozmiar dla rzędu? 1.6 TB
Maksymalny rozmiar pola? 1 GB
- Maksymalna liczba rzêdów w tabeli? nieograniczona
- Maksymalna liczba kolumn w tabeli? 250-1600 w zale¿ono¶ci od typów kolumn
- Makasymalna liczba indeksów na tabeli? nieograniczona
+ Maksymalna liczba rzędów w tabeli? nieograniczona
+ Maksymalna liczba kolumn w tabeli? 250-1600 w zależoności od typów kolumn
+ Makasymalna liczba indeksów na tabeli? nieograniczona
- Oczywi¶cie "nieograniczony" nie jest prawd± tak do koñca, istniej±
- ograniczenia wynikaj±ce z dostêpnego miejsca na dysku, pamiêci/swapa.
- Kiedy wielko¶ci te bêd± bardzo du¿e mo¿e odbiæ siê to na wydajno¶ci.
+ Oczywiście "nieograniczony" nie jest prawdą tak do końca, istnieją
+ ograniczenia wynikające z dostępnego miejsca na dysku, pamięci/swapa.
+ Kiedy wielkości te będą bardzo duże może odbić się to na wydajności.
Maksymalny rozmiar tabeli, czyli 32 TB nie wymaga od systemu
- operacyjnego wsparcia dla du¿ych plików. Du¿e tabele s± przechowywane
- jako pliki o rozmiarze 1 GB, wiêc ograniczenia co do wielko¶ci plików
- narzucone przez system plików nie s± istotne.
+ operacyjnego wsparcia dla dużych plików. Duże tabele są przechowywane
+ jako pliki o rozmiarze 1 GB, więc ograniczenia co do wielkości plików
+ narzucone przez system plików nie są istotne.
-
Masymalny rozmiar tabeli i maksymalna liczba kolumn mo¿e byæ
- zwiêkszona je¶li zwiêkszymy domy¶lny rozmiar bloku (block size) do
+
Masymalny rozmiar tabeli i maksymalna liczba kolumn może być
+ zwiększona jeśli zwiększymy domyślny rozmiar bloku (block size) do
32k.
-
4.6) Jak du¿o miejsca w bazie danych jest
- konieczne aby przechowywaæ dane ze zwyczajnego pliku
+
4.6) Jak dużo miejsca w bazie danych jest
+ konieczne aby przechowywać dane ze zwyczajnego pliku
tekstowego?
-
Baza danych PostgreSQL mo¿e potrzebowaæ do piêciu razy wiêcej
- miejsca na przechowywanie danych z plików tekstowych ni¿ ich
- objêto¶æ.
+
Baza danych PostgreSQL może potrzebować do pięciu razy więcej
+ miejsca na przechowywanie danych z plików tekstowych niż ich
+ objętość.
-
Jako przyk³ad mo¿emy rozwa¿yæ plik sk³adaj±cy siê z 100,000 linii
- zbudowanych z liczby ca³kowitej oraz opisu tekstowego w ka¿dej.
- Za³ó¿my, ¿e ¶rednio ka¿dy ³añcuch tekstu w linii zajmuje 20
- bajtów. Ca³y plik powinien zajmowaæ ok. 2.8 MB. Rozmiar pliku bazy danych w
- PostgreSQL zawieraj±cego te dane mozna oszacowaæ na oko³o 6.4MB:
+
Jako przykład możemy rozważyć plik składający się z 100,000 linii
+ zbudowanych z liczby całkowitej oraz opisu tekstowego w każdej.
+ Załóżmy, że średnio każdy łańcuch tekstu w linii zajmuje 20
+ bajtów. Cały plik powinien zajmować ok. 2.8 MB. Rozmiar pliku bazy danych w
+ PostgreSQL zawierającego te dane mozna oszacować na około 6.4MB:
- 36 bajtów: nag³ówek ka¿dego rzêdu w przybli¿eniu)
+ 36 bajtów: nagłówek każdego rzędu w przybliżeniu)
24 bajty: jedno pole int i jedno pole typu text
- + 4 bajty: wka¼nik na stronie do krotki
+ + 4 bajty: wkaźnik na stronie do krotki
--------------------------------------------------
- 64 bajty w jednym rzêdzie
+ 64 bajty w jednym rzędzie
- Strona danych w PostgreSQL zajmuje 8192 bajtów (8 KB), wiêc:
+ Strona danych w PostgreSQL zajmuje 8192 bajtów (8 KB), więc:
- 8192 bajtów na stronê
- --------------------- = 128 rzêdów na jedn± strone w bazie (zaokr±glone w dó³)
- 64 bajtów na rz±d
+ 8192 bajtów na stronę
+ --------------------- = 128 rzędów na jedną strone w bazie (zaokrąglone w dół)
+ 64 bajtów na rząd
- 100000 rzêdów danych
- ----------------------- = 782 stron w bazie danych (zaokr±glone w górê)
- 128 rzêdów na stronê
+ 100000 rzędów danych
+ ----------------------- = 782 stron w bazie danych (zaokrąglone w górę)
+ 128 rzędów na stronę
-782 stron w bazie * 8192 bajtów na stronê = 6,406,144 bajtów (6.4 MB)
+782 stron w bazie * 8192 bajtów na stronę = 6,406,144 bajtów (6.4 MB)
-
Indeksy nie powoduj± du¿ego narzutu na zajmowane miejsce,
- ale zawieraj± pewne dane,
- wiêc w pewnych przypadkach moga byæ ca³kiem du¿e.
-
NULLe s± przechowywane jako mapy bitowe, wiêc u¿ywaj± bardzo ma³o
+
Indeksy nie powodują dużego narzutu na zajmowane miejsce,
+ ale zawierają pewne dane,
+ więc w pewnych przypadkach moga być całkiem duże.
+
NULLe są przechowywane jako mapy bitowe, więc używają bardzo mało
miejsca.
-
4.7) Jak mogê sprawdziæ jakie tabele, klucze,
- bazy danych i u¿ytkownicy s± utworzeni?
+
4.7) Jak mogę sprawdzić jakie tabele, klucze,
+ bazy danych i użytkownicy są utworzeni?
-
psql ma ca³kiem du¿± ilo¶æ poleceñ z backslashem aby
- wydobyæ takie informacje. Wprowad¼ \? aby zobaczyæ ich spis. Istniej±
- tak¿e tablice systemowe rozpoczynaj±ce siê od pg_, zawieraj±ce
- interesuj±ce Ciebie informacje. Wykonanie psql -l poka¿e spis
+
psql ma całkiem dużą ilość poleceń z backslashem aby
+ wydobyć takie informacje. Wprowadź \? aby zobaczyć ich spis. Istnieją
+ także tablice systemowe rozpoczynające się od pg_, zawierające
+ interesujące Ciebie informacje. Wykonanie psql -l pokaże spis
wszystkich baz danych.
-
Obejrzyj tak¿e plik pgsql/src/tutorial/syscat.source.
- Zawiera on wiele z zapytañ typu SELECT, które s±
- potrzebne aby wydobyæ informacje z tablic systemowych.
+
Obejrzyj także plik pgsql/src/tutorial/syscat.source.
+ Zawiera on wiele z zapytań typu SELECT, które są
+ potrzebne aby wydobyć informacje z tablic systemowych.
-
4.8) Moje zapytania s± wolne lub nie u¿ywaj±
+
4.8) Moje zapytania są wolne lub nie używają
kluczy. Dlaczego?
- Indeksy nie s± u¿ywane automatycznie przez k±¿de z zapytañ. Ideksy s±
- u¿ywane jedynie gdy tabela jest odpowiedniego rozmiaru, wiêkszego ni¿
- wymagany minimalny, a zapytanie wybiera jedynie ma³y procent
- zawarto¶ci tabeli. Wynika to z tego, ¿e losowy dostep do dysku
- powodowany przez ideksowane poszukiwanie jest czasami wolniejsze ni¿
- poszukiwanie sekwencyjne bez u¿ycia kluczy.
+ Indeksy nie są używane automatycznie przez kążde z zapytań. Ideksy są
+ używane jedynie gdy tabela jest odpowiedniego rozmiaru, większego niż
+ wymagany minimalny, a zapytanie wybiera jedynie mały procent
+ zawartości tabeli. Wynika to z tego, że losowy dostep do dysku
+ powodowany przez ideksowane poszukiwanie jest czasami wolniejsze niż
+ poszukiwanie sekwencyjne bez użycia kluczy.
-
¯eby zdecydowaæ czy indeks powinien byc u¿ywany, PostgreSQL musi
- mieæ statystyki dotycz±ce danej tabeli. S± one gromadzone przez
- u¿ycie polecenia VACUUM ANALYZE, lub poprostu
- ANALYZE. u¿ywaj±c statystyk, optymalizator wie ile
- rzêdów jest w tabeli i mo¿e lepiej okre¶liæ czy indeksy powinny byæ
- u¿yte. Statystyki mog± byæ tak¿e pomocne w okre¶leniu najlepszej
- kolejno¶ci wykonania z³±czenia (join) i jego sposobu. Gromadzenie
- statystyk powinno siê odbywaæ w okre¶lonych interwa³ach czasu
- poniewa¿ dane w tabelach zmieniaj± siê.
-
-
Indeksy nie s± zazwyczaj u¿ywane przez ORDER BY lub
- przy wykonywaniu z³±czeñ (join). Sekwencyjne przeszukiwanie po którym
- nastêpuje sortowanie jest zazwyczaj szybsze niê wyszukiwanie za
- pomoc± indeksu na du¿ej tabeli.
-
Jakkolwiek LIMIT w po³±czeniu z ORDER BY
- czêsto bêdzie wykorzystywa³ indeksy poniewa¿ jedynie ma³a czê¶æ z
- tabeli jest zwracana. W rzeczywisto¶ci, chocia¿ MAX() i MIN() nie
- u¿ywaj± indeksów, mo¿liwe jest aby zwróciæ te warto¶ci u¿ywaj±c
- indeksów poprzez u¿ycie ORDER BY i LIMIT.
+
Żeby zdecydować czy indeks powinien byc używany, PostgreSQL musi
+ mieć statystyki dotyczące danej tabeli. Są one gromadzone przez
+ użycie polecenia VACUUM ANALYZE, lub poprostu
+ ANALYZE. używając statystyk, optymalizator wie ile
+ rzędów jest w tabeli i może lepiej określić czy indeksy powinny być
+ użyte. Statystyki mogą być także pomocne w określeniu najlepszej
+ kolejności wykonania złączenia (join) i jego sposobu. Gromadzenie
+ statystyk powinno się odbywać w określonych interwałach czasu
+ ponieważ dane w tabelach zmieniają się.
+
+
Indeksy nie są zazwyczaj używane przez ORDER BY lub
+ przy wykonywaniu złączeń (join). Sekwencyjne przeszukiwanie po którym
+ następuje sortowanie jest zazwyczaj szybsze nię wyszukiwanie za
+ pomocą indeksu na dużej tabeli.
+
Jakkolwiek LIMIT w połączeniu z ORDER BY
+ często będzie wykorzystywał indeksy ponieważ jedynie mała część z
+ tabeli jest zwracana. W rzeczywistości, chociaż MAX() i MIN() nie
+ używają indeksów, możliwe jest aby zwrócić te wartości używając
+ indeksów poprzez użycie ORDER BY i LIMIT.
SELECT col
LIMIT 1;
- Je¶li uwa¿asz, ¿e optimizer myli siê wybieraj±c sequential scan, u¿yj
- SET enable_seqscan TO 'off' i uruchom testy aby sprawdziæ czy wtym
- wypadku zapytanie bêdzie szybciej wykonywane.
+ Jeśli uważasz, że optimizer myli się wybierając sequential scan, użyj
+ SET enable_seqscan TO 'off' i uruchom testy aby sprawdzić czy wtym
+ wypadku zapytanie będzie szybciej wykonywane.
-
Kiedy u¿ywa siê operatorów dopasuj±cych takich jak
- LIKE lub ~, indeksy bêd± u¿ywane jedynie w
+
Kiedy używa się operatorów dopasujących takich jak
+ LIKE lub ~, indeksy będą używane jedynie w
pewnych wypadkach:
-
Pocz±tek wyszukiwania jest oparty na pocz±tku ³añcucha tekstu.
+
Początek wyszukiwania jest oparty na początku łańcucha tekstu.
-
wzorce LIKE nie mog± siê zaczynaæ %
+
wzorce LIKE nie mogą się zaczynać %
dopasowania operatorem ~ (dopasowania regularne)
- musz± siê zaczynaæ znakiem specjalnym ^.
+ muszą się zaczynać znakiem specjalnym ^.
-
Pocz±tek wyszukiwania nie mo¿e siê zaczynaæ od klas znaków, np.
+
Początek wyszukiwania nie może się zaczynać od klas znaków, np.
[a-e].
Case-insensitive searches such as ILIKE and ~* do not utilise
indexes. Instead, use functional indexes, which are described in
section 4.12.
-
Standardowe locale C musi byæ uzyte przy wykonywaniu initdb
+
Standardowe locale C musi być uzyte przy wykonywaniu initdb
-
4.9) Jak mogê sprawdziæ w jakis sposób "query
+
4.9) Jak mogę sprawdzić w jakis sposób "query
optimizer" wykonuje moje zapytanie?
Zobacz manual dla polecenia EXPLAIN.
4.10) Co to jest "R-tree index"?
-
Indeks R-tree jest u¿ywany do indeksowania danych przestrzennych.
- Indeks hasuuj±cy nie nadaje siê do wyszukiwania odleg³o¶ci.
- Natomiast indeks typu B-tree mo¿e wyszukiwaæ odleglo¶ci jedynie w
+
Indeks R-tree jest używany do indeksowania danych przestrzennych.
+ Indeks hasuujący nie nadaje się do wyszukiwania odległości.
+ Natomiast indeks typu B-tree może wyszukiwać odleglości jedynie w
jednowymiarowych przestrzeniach. R-tree indeks radzi sobie z
- przestrzeniami wielo-wymiarowymi. Dla przyk³adu, je¶li zostanie
- za³o¿ony indeks typu R-tree na polu typu point, system mo¿e
- bardziej wydajnie odpowiadaæ na zapytania typu
+ przestrzeniami wielo-wymiarowymi. Dla przykładu, jeśli zostanie
+ założony indeks typu R-tree na polu typu point, system może
+ bardziej wydajnie odpowiadać na zapytania typu
"select all points within a bounding rectangle."
-
¬ród³owym dokumentem opisuj±cym oryginalnie projektowanie R-tree
- indeksów jest:
+
Źródłowym dokumentem opisującym oryginalnie projektowanie R-tree
+ indeksów 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 mo¿esz znale¼æ tak¿e w pracy Stonebraker'a "Readings in
+
Ten dokument możesz znaleźć także w pracy Stonebraker'a "Readings in
Database Systems".
-
Wbudowane indeksy R-trees radz± sobie w wielobokami i boxes.
- Teoretycznie, indeksy R-tree mog± byæ rozszerzone o mo¿liwo¶ci
- indeksowania w wiêcej wymiarowych przestrzeniach. W praktyce,
- rozbudowa indeksów R-tree wymaga trochê pracy, a w tej chwili nie
- dysponujemy jak±kolwiek dokumentacj± jak to zrobiæ.
+
Wbudowane indeksy R-trees radzą sobie w wielobokami i boxes.
+ Teoretycznie, indeksy R-tree mogą być rozszerzone o możliwości
+ indeksowania w więcej wymiarowych przestrzeniach. W praktyce,
+ rozbudowa indeksów R-tree wymaga trochę pracy, a w tej chwili nie
+ dysponujemy jakąkolwiek dokumentacją jak to zrobić.
4.11) Co to jest "Genetic Query
Optimizer"?
-
Modu³ GEQO ma za zadanie przyspieszenie
- optymalizacji zapytañ ³±cz±c wiele tabel za pomoc± algorytmów
- genetycznych (Genetic Algorithm (GA)). Pozwala na u¿ywanie du¿ych
- zapytañ ³±cz±cych tabele (join queries) bez wykorzystywania
- zasobo¿ernego wyszukiwania.
+
Moduł GEQO ma za zadanie przyspieszenie
+ optymalizacji zapytań łącząc wiele tabel za pomocą algorytmów
+ genetycznych (Genetic Algorithm (GA)). Pozwala na używanie dużych
+ zapytań łączących tabele (join queries) bez wykorzystywania
+ zasobożernego wyszukiwania.
-
4.12) Jak mogê u¿ywaæ wyra¿eñ regularnych w
- zapytaniach i zapytañ case-insensitive w wyra¿eniach
+
4.12) Jak mogę używać wyrażeń regularnych w
+ zapytaniach i zapytań case-insensitive w wyrażeniach
regularnych?
- Jak korzystaæ z indeksów dla zapytañ case-insensitive?
+ Jak korzystać z indeksów dla zapytań case-insensitive?
-
Operator ~ moze byæ wykorzystywany do wyszukiwania za
- pomoc± wyra¿eñ regularnych, a
- ~* do wyszukiwania case-insensitive z wyra¿eniami
+
Operator ~ moze być wykorzystywany do wyszukiwania za
+ pomocą wyrażeń regularnych, a
+ ~* do wyszukiwania case-insensitive z wyrażeniami
regularnymi.
- Wariant case-insensitive dla LIKE zosta³ nazwany
+ Wariant case-insensitive dla LIKE został nazwany
ILIKE.
-
Porównania case-insensitive s± zazwyczaj wykonywane w nastêpuj±cy
- sposób:
+
Porównania case-insensitive są zazwyczaj wykonywane w następujący
+ sposób:
SELECT *
FROM tab
WHERE lower(col) = 'abc'
- W tym wypadku standardowe indeksy nie bêd± u¿ywane. Mo¿esz utworzyæ
+ W tym wypadku standardowe indeksy nie będą używane. Możesz utworzyć
indeks funkcyjny, poprzez:
CREATE INDEX tabindex on tab (lower(col));
-
4.13) Jak sprawdziæ w zapytaniu czy pole ma
- warto¶æ NULL?
+
4.13) Jak sprawdzić w zapytaniu czy pole ma
+ wartość NULL?
-
Mo¿esz to sprawdziæ, testuj±c warto¶æ kolumny warunkiem
+
Możesz to sprawdzić, testując wartość kolumny warunkiem
IS NULL albo IS NOT NULL.
-
4.14) Jaka jest ró¿nica pomiêdzy ró¿nymi
+
4.14) Jaka jest różnica pomiędzy różnymi
typami tekstowymi (character types)?
-Type Nazwa wewnêtrzna Uwagi
+Type Nazwa wewnętrzna Uwagi
--------------------------------------------------
-VARCHAR(n) varchar rozmiar okre¶la maksymaln± d³ugo¶æ, nie ma tutaj wype³niania
-CHAR(n) bpchar wype³niane pustymi znakami do podanej d³ugo¶ci
-TEXT text bez limitu na d³ugo¶æ ³añcucha
-BYTEA bytea zmiennej d³ugo¶ci tablica bajtów (null-byte safe)
+VARCHAR(n) varchar rozmiar określa maksymalną długość, nie ma tutaj wypełniania
+CHAR(n) bpchar wypełniane pustymi znakami do podanej długości
+TEXT text bez limitu na długość łańcucha
+BYTEA bytea zmiennej długości tablica bajtów (null-byte safe)
"char" char 1 znak
-
Je¶li bêdziesz przegl±daæ katalogi systemowe lub komunikaty o
- b³êdach czêsto spotkasz siê z podanymi powy¿ej nazwami
- wewnêtrznymi.
+
Jeśli będziesz przeglądać katalogi systemowe lub komunikaty o
+ błędach często spotkasz się z podanymi powyżej nazwami
+ wewnętrznymi.
-
Pierwsze cztery typy powy¿ej to tzw typy "varlena" (np. pierwsze
- cztery bajty na dysku to d³ugo¶æ, po których jest data). Dlatego
- faktyczna d³ugo¶c takiego ³añcucha jest trochê wiêksza ni¿
- zadeklarowany rozmiar. Te typy tak¿e podlegaj± kompresji lub mog± byæ
- przechowywane out-of-line jako TOAST, wiêc faktyczne
- zu¿ycie miejsca na dysku mo¿e byæ mniejsze ni¿ oczekiwane.
+
Pierwsze cztery typy powyżej to tzw typy "varlena" (np. pierwsze
+ cztery bajty na dysku to długość, po których jest data). Dlatego
+ faktyczna długośc takiego łańcucha jest trochę większa niż
+ zadeklarowany rozmiar. Te typy także podlegają kompresji lub mogą być
+ przechowywane out-of-line jako TOAST, więc faktyczne
+ zużycie miejsca na dysku może być mniejsze niż oczekiwane.
- najodpowiedniejszy do przechowywania ³añcuchów o ró¿nej d³ugo¶ci
- ale okre¶la on maksymaln± jego d³ugo¶æ.
+ najodpowiedniejszy do przechowywania łańcuchów o różnej długości
+ ale określa on maksymalną jego długość.
- TEXT jest najlepszy dla ³añcuchów o dowolnej d³ugo¶ci,
- nie przekraczaj±cej 1GB.
+ TEXT jest najlepszy dla łańcuchów o dowolnej długości,
+ nie przekraczającej 1GB.
CHAR(n) jast najlepszym typem do przechowywania
- ³añcuchów o tej samej d³ugo¶ci. CHAR(n) wype³nia dane do ¿adanej
- d³ugo¶ci, podczas gdy VARCHAR(n) przechowuje jedynie dane
+ łańcuchów o tej samej długości. CHAR(n) wypełnia dane do żadanej
+ długości, podczas gdy VARCHAR(n) przechowuje jedynie dane
dostarczone.
- BYTEA s³u¿y do przechowywania danych binarnych,
- w szczególno¶ci dla danych zawieraj±cych NULL bajty.
- Wszystkie typy opisane tutaj maja podobne charakterystyki je¶li
- chodzi o wydajno¶æ.
+ BYTEA służy do przechowywania danych binarnych,
+ w szczególności dla danych zawierających NULL bajty.
+ Wszystkie typy opisane tutaj maja podobne charakterystyki jeśli
+ chodzi o wydajność.
-
4.15.1) Jak mogê utworzyæ pole które samo
- zwiêksza swoj± warto¶æ?
+
4.15.1) Jak mogę utworzyć pole które samo
+ zwiększa swoją wartość?
PostgreSQL ma zaimplementowany typ SERIAL.
- Automatycznie tworzy sekwencjê i indeks na tej kolumnie. Dla
+ Automatycznie tworzy sekwencję i indeks na tej kolumnie. Dla
przykladu:
CREATE TABLE person (
name TEXT
);
- zostanie automatycznie przt³umaczone na:
+ zostanie automatycznie prztłumaczone na:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
);
CREATE UNIQUE INDEX person_id_key ON person ( id );
- Wiêcej informacji o sekwencjach znajdziesz w manualu o
- create_sequence. Mo¿esz tak¿e u¿yæ pola OID jako
- unikalnej warto¶ci dla ka¿dego rzêdu danych. Je¶li bêdziesz
- potrzebowa³ z backupowaæ dane robi±c dump bazy i odtworzyæ j±, musisz
- u¿yc pg_dump z opcj± -o lub polecenia COPY
- WITH OIDS aby zachowaæ OIDy.
+ Więcej informacji o sekwencjach znajdziesz w manualu o
+ create_sequence. Możesz także użyć pola OID jako
+ unikalnej wartości dla każdego rzędu danych. Jeśli będziesz
+ potrzebował z backupować dane robiąc dump bazy i odtworzyć ją, musisz
+ użyc pg_dump z opcją -o lub polecenia COPY
+ WITH OIDS aby zachować OIDy.
-
4.15.2) Jak pobraæ warto¶æ pola typu
+
4.15.2) Jak pobrać wartość pola typu
SERIAL po wykonaniu insert'u?
-
Jednym z podej¶æ jest pobranie kolejnej warto¶ci typu
- SERIAL z sekwencji za pomoc± funkcji nextval()
- zanim zostanie wstawiona, a pó¼niej nale¿y jej u¿yæ. U¿ywaj±c
- przyk
³adu z tabeli z punktu 4.15.1, mo¿e to
- wygl±daæ w Perlu na przyk³ad w ten sposób:
+
Jednym z podejść jest pobranie kolejnej wartości typu
+ SERIAL z sekwencji za pomocą funkcji nextval()
+ zanim zostanie wstawiona, a później należy jej użyć. Używając
+ przyk
ładu z tabeli z punktu 4.15.1, może to
+ wyglądać w Perlu na przykład w ten sposób:
new_id = output of "SELECT nextval('person_id_seq')"
INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal');
- Bêdziesz mia³ wtedy t± warto¶æ przechowan± w zmiennej
- new_id
do u¿ytku w innych zapytaniach (np. jako klucz
- obcy do tabeli person
). Warto zwróciæ uwagê, ¿e nazwa
+ Będziesz miał wtedy tą wartość przechowaną w zmiennej
+ new_id
do użytku w innych zapytaniach (np. jako klucz
+ obcy do tabeli person
). Warto zwrócić uwagę, że nazwa
automatycznie utworzonej sekwencji
- SEQUENCE bêdzie nastêpuj±ca:
+ SEQUENCE będzie następująca:
<tabela>_<kolumnatypuserial>_seq,
gdzie
- tabela i kolumnatypuserial s± nazwami Twojej tabeli i
+ tabela i kolumnatypuserial są nazwami Twojej tabeli i
Twojej kolumny typu SERIAL.
-
Inne rozwi±zanie to u¿ycie funkcji currval() na pola typu
- SERIAL po dodaniu nowej warto¶ci do rzêdu zawieraj±cego
- kolumnê typu SERIAL z wstawion± domy¶lnie warto¶ci±,
+
Inne rozwiązanie to użycie funkcji currval() na pola typu
+ SERIAL po dodaniu nowej wartości do rzędu zawierającego
+ kolumnę typu SERIAL z wstawioną domyślnie wartością,
np.
INSERT INTO person (name) VALUES ('Blaise Pascal');
new_id = output of "SELECT currval('person_id_seq')";
- Ostatecznie mo
¿esz u¿yæ OID
- zwracanej po wykonaniu INSERT, chocia¿ to jest najmniej
- przeno¶ne rozwi±zanie.
- W Perlu, wykorzystuj±c bibliotekê DBI z modu³em Edmunda Mergla
- DBD::Pg, oid jest dostêpny poprzez $sth->{pg_oid_status} po
+ Ostatecznie mo
żesz użyć OID
+ zwracanej po wykonaniu INSERT, chociaż to jest najmniej
+ przenośne rozwiązanie.
+ W Perlu, wykorzystując bibliotekę DBI z modułem Edmunda Mergla
+ DBD::Pg, oid jest dostępny poprzez $sth->{pg_oid_status} po
wykonaniu $sth->execute().
-
4.15.3) Czy u¿ycie currval() i
+
4.15.3) Czy użycie currval() i
nextval() nie doprowadzi do race condition z innymi
- u¿ytkownikami?
+ użytkownikami?
-
Nie. currval() zwraca bie¿±c± warto¶æ przypisan± przez Twój
- backend, a nie przez wszystkich u¿ytkowników.
+
Nie. currval() zwraca bieżącą wartość przypisaną przez Twój
+ backend, a nie przez wszystkich użytkowników.
-
4.15.4) Dlaczego numery sekwencji nie s±
- ponownie u¿ywane przy przerwaniu transakcji?
- Sk±d siê bior± luki w numerowaniu kolumny tabeli
+
4.15.4) Dlaczego numery sekwencji nie są
+ ponownie używane przy przerwaniu transakcji?
+ Skąd się biorą luki w numerowaniu kolumny tabeli
sekwancjami/SERIALem?
-
Aby poprawiæ zbie¿no¶æ (concurrency), warto¶ci sekwencji s±
- podawane dzia³aj±cym transakcjom kiedy tego potrzebuj± i nie s±
- blokowane dopóki transakcja siê nie zakoñczy. To spowoduje przerwy w
+
Aby poprawić zbieżność (concurrency), wartości sekwencji są
+ podawane działającym transakcjom kiedy tego potrzebują i nie są
+ blokowane dopóki transakcja się nie zakończy. To spowoduje przerwy w
numerowaniu z przerwanych transakcji.
4.16) Co to jest OID? Co to
jest TID?
-
OID s± PostgreSQL'owym rozwi±zaniem problemu
- unikalnych numerów rzêdów. Ka¿dy rz±d tworzony przez PostgreSQL
+
OID są PostgreSQL'owym rozwiązaniem problemu
+ unikalnych numerów rzędów. Każdy rząd tworzony przez PostgreSQL
otrzymuje unikalny OID. Wszystkie OIDy
generowane podczas procesu uruchamianego przez skrypt
- initdb maj± mniejsz± warto¶æ ni¿ 16384 (na podstawie pliku
+ initdb mają mniejszą wartość niż 16384 (na podstawie pliku
backend/access/transam.h). Wszystkie
- OIDy tworzone przez u¿ytkownika sa równe lub wiêksze
- podanej wcze¶niej warto¶ci. Domy¶lnie
- wszystkie OIDy s± unikalne nie tylko w pojedyñczej
- tabeli czy bazie danych ale w ca³ej instalacji PostgreSQL.
-
-
PostgreSQL u¿ywa OIDów w swoim wewnêtrznym systemie
- tabel, aby mo¿na by³o je ³±czyæ.
- Te OIDy mog± byc u¿ywane aby identyfikowac rzêdy w
- tabelach i wykorzystywaæ je w z³±czeniach tych tabel. Zaleca siê aby¶
- u¿ywa³ typu OID aby przechowywaæ warto¶ci
- OID. Mo¿esz utworzyæ indeks na polu
- OID aby dostêp do niego by³ szybszy.
-
-
OID s± przypisane do wszystkich rzêdów z jednego
- g³ównego miejsca i u¿ywane sa przez wszystkie bazy danych. Je¶li
- chcia³by¶ zmieniæ OID na co¶ innego, lub je¶li
- chcia³by¶ zrobiæ kopiê tabeli, z orginalnymi OIDami
- nie ma ¿adnego przeciwwskazania aby¶ to zrobi³:
+ OIDy tworzone przez użytkownika sa równe lub większe
+ podanej wcześniej wartości. Domyślnie
+ wszystkie OIDy są unikalne nie tylko w pojedyńczej
+ tabeli czy bazie danych ale w całej instalacji PostgreSQL.
+
+
PostgreSQL używa OIDów w swoim wewnętrznym systemie
+ tabel, aby można było je łączyć.
+ Te OIDy mogą byc używane aby identyfikowac rzędy w
+ tabelach i wykorzystywać je w złączeniach tych tabel. Zaleca się abyś
+ używał typu OID aby przechowywać wartości
+ OID. Możesz utworzyć indeks na polu
+ OID aby dostęp do niego był szybszy.
+
+
OID są przypisane do wszystkich rzędów z jednego
+ głównego miejsca i używane sa przez wszystkie bazy danych. Jeśli
+ chciałbyś zmienić OID na coś innego, lub jeśli
+ chciałbyś zrobić kopię tabeli, z orginalnymi OIDami
+ nie ma żadnego przeciwwskazania abyś to zrobił:
CREATE TABLE new_table(old_oid oid, mycol int);
-->
-
OIDy s± przechowywane jako cztero-bajtowe liczby
- ca³kowite i skoñcz± siê po osi±gniêciu czterech miliardów. Nikt jak
- dot±d nie zg³osi³ aby co¶ takiego siê stalo, ale mamy zamiar pozbyæ
- siê tego ograniczenia zanim kto¶ to zg³osi.
+
OIDy są przechowywane jako cztero-bajtowe liczby
+ całkowite i skończą się po osiągnięciu czterech miliardów. Nikt jak
+ dotąd nie zgłosił aby coś takiego się stalo, ale mamy zamiar pozbyć
+ się tego ograniczenia zanim ktoś to zgłosi.
-
TID s± u¿ywane aby zidentyfikowaæ konkretne rzêdy z
- blokami i warto¶ci± ofsetów. TIDy zmieniaj± siê wraz
- ze zmianami rzêdów. Sa u¿ywane przez indeksy, aby wskazywaæ do
- fizycznych rzêdów.
+
TID są używane aby zidentyfikować konkretne rzędy z
+ blokami i wartością ofsetów. TIDy zmieniają się wraz
+ ze zmianami rzędów. Sa używane przez indeksy, aby wskazywać do
+ fizycznych rzędów.
-
4.17) Jakie jest znaczenie niektórych terminów
+
4.17) Jakie jest znaczenie niektórych terminów
w PostgreSQL?
-
W czê¶ci kodu ¼ród³owego i starszej dokumentacji u¿ywamy terminów,
- które maj± bardziej ogólne znaczenie. Oto niektóre z nich:
+
W części kodu źródłowego i starszej dokumentacji używamy terminów,
+ które mają bardziej ogólne znaczenie. Oto niektóre z nich:
table, relation, class
range variable, table name, table alias
-
Listê terminów zwi±zanych z bazami danych mo¿esz znale¼æ pod tym
+
Listę terminów związanych z bazami danych możesz znaleźć pod tym