Professional Documents
Culture Documents
wprowadzenie do administracji
Maciej Zakrzewicz
PLAN SZKOLENIA
▪ Wprowadzenie do PostgreSQL, architektura, instalacja, konfiguracja,
narzędzia
▪ Uwierzytelnianie i autoryzacja użytkowników, role, uprawnienia
▪ Monitorowanie serwera, audytowanie użytkowników
▪ Logiczne i fizyczne kopie bezpieczeństwa, odtwarzanie po awarii
▪ Przegląd mechanizmów replikacji
▪ Przegląd zagadnień zarządzania wydajnością
4
PostgreSQL: wprowadzenie do administracji
HISTORIA POSTGRESQL
▪ Obiektowo-relacyjny system zarządzania bazą danych
▪ oparty na POSTGRES, budowanym na University of Berkeley, California w
latach 1986-1993 (język zapytań PostQUEL)
▪ Postgres95 (obsługa języka SQL) w latach 1994-1995
▪ PostgreSQL od roku 1996
▪ open-source
▪ licencja umożliwia bezpłatne wykorzystywanie, modyfikowanie
i dystrybuowanie w celach prywatnych, akademickich lub komercyjnych
[źródło: postgresql.org]
© 2021 Maciej Zakrzewicz
6
PostgreSQL: wprowadzenie do administracji
ARCHITEKTURA POSTGRESQL
logger checkpointer logical rep
select pg_relation_filepath('cars');
pg_relation_filepath
---------------------- nazwa tabeli
base/13318/1247
15
PostgreSQL: wprowadzenie do administracji
URUCHAMIANIE I ZATRZYMYWANIE SERWERA
za pomocą pg_ctl
# zatrzymanie serwera
/usr/pgsql-*/bin/pg_ctl –D /var/lib/pgsql/*/data stop
# uruchomienie serwera
systemctl start postgresql-*.service
# zatrzymanie serwera
systemctl stop postgresql-*.service
$ su – postgres
$ psql
postgres=# \c postgres
You are now connected to database "postgres" a user "postgres".
postgres=# create table pracownicy(id serial, nazwisko varchar(20));
CREATE TABLE
postgres=# insert into pracownicy(nazwisko) values ('Kowalski');
INSERT 0 1
postgres=# select * from pracownicy;
...
postgres=# \q
$ exit
$
24
PostgreSQL: wprowadzenie do administracji
PARAMETRY KONFIGURACYJNE - PRZEGLĄD
▪ Lokalizacja plików z parametrami konfiguracyjnymi: Data Directory Parametry - dokumentacja
▪ postgresql.conf
▪ postgresql.auto.conf
▪ Zawierają parametry konfiguracyjne serwera PostgreSQL, np.:
▪ port – port nasłuchu sieciowego
▪ listen_addresses – adres IP nasłuchu sieciowego ('*' dla wszystkich adresów)
▪ max_connections – maksymalna liczba równoczesnych połączeń
▪ statement_timeout – maksymalny czas pracy polecenia SQL
▪ Zmiana wartości parametrów konfiguracyjnych:
▪ w pliku postgresql.conf
▪ za pomocą opcji uruchomienia serwera PostgreSQL
▪ poleceniem ALTER SYSTEM (zapisywane w pliku postgresql.auto.conf)
▪ poleceniem ALTER DATABASE – na poziomie bazy danych
▪ poleceniem SET – na poziomie sesji użytkownika
▪ Obserwacja aktualnych wartości parametrów konfiguracyjnych:
▪ poleceniem SHOW
▪ poprzez widok pg_settings
show max_connections;
max_connections
-----------------
100
setting
---------
100
postgresql.auto.conf
# Do not edit this file manually!
Plik postgresql.auto.conf przesłania # It will be overwritten by the ALTER SYSTEM command.
wpisy w pliku postgresql.conf! max_connections = '100'
set work_mem=3172;
▪ Zmiana dotyczy wyłącznie
show work_mem;
bieżącej sesji
▪ Tracona po zakończeniu sesji
work_mem
----------
▪ Tylko nieliczne parametry
3172kB
set password_encryption='md5';
alter role postgres password 'postgres'; ▪ Wybór metody za pomocą
select rolpassword from pg_authid where rolname='postgres'; parametru
rolpassword password_encryption
-------------------------------------
md53175bce1d3201d16594cebf9d7eb3f9d hasło zapisane jako MD5 ▪ md5
set password_encryption='scram-sha-256'; ▪ scram-sha-256
alter role postgres password 'postgres';
▪ Hasła nieszyfrowane nie są
wspierane od PostgreSQL 10
select rolpassword from pg_authid where rolname='postgres';
rolpassword
----------------------------------------------------------
SCRAM-SHA-256$4096:4zo2e7TyrFl2oomLWXQjzQ==$BEK9mTYa98mWH8
JtM/fS8KlEgDE5H/qo7RZtAI2kQtU=:Dg+2t6pnKRW/7Goh5Ah8eodAmLn
PXB2D9Gf8OqGIQfA=
hasło zapisane jako SHA
table table table table table table table table table table table table table table
table table table table table table table table table table table table table table
disk disk
47
PostgreSQL: wprowadzenie do administracji
ROLE
▪ Rola w uniwersalny sposób reprezentuje użytkownika lub grupę
użytkowników
▪ przed PostgreSQL 8.1 rozróżniano użytkowników i grupy
▪ Rola może być właścicielem obiektów bazy danych (tabel, funkcji, itp.)
▪ Rola może otrzymywać uprawnienia
▪ systemowe - wskazywane za pomocą atrybutów roli
▪ obiektowe - przydzielane poleceniami GRANT
postgres=# \dn+
List of schemas
▪ W każdej nowoutworzonej
Name | Owner | Access privileges | Description bazie danych, wszyscy
--------+----------+----------------------+------------------------ użytkownicy (PUBLIC)
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
otrzymują uprawnienia do
schematu PUBLIC (usage,
create)
nadawane automatycznie
▪ Często rekomendowane jest
odebranie tych uprawnień
▪ revoke all privileges
on schema public from
public;
61
PostgreSQL: wprowadzenie do administracji
OPERACJA VACUUM
https://www.postgresql.org/docs/13/sql-vacuum.html
▪ Gdy wykonywane są operacje UPDATE i DELETE, serwer PostgreSQL nie usuwa natychmiast
starego obrazu rekordu
▪ w celu zapewnienia spójności innych transakcji w toku (multiversion concurrency control - MVCC)
▪ Gdy stare obrazy rekordów nie są już potrzebne, mogą być usunięte za pomocą operacji
Vacuum
▪ usuwa stare obrazy rekordów (tzw. martwe rekordy – "dead tuples") i oznacza zajmowane przez nie
miejsce na dysku jako wolne
▪ VACUUM nie zwraca automatycznie wolnego miejsca systemowi operacyjnemu
▪ VACUUM FULL zwraca automatycznie wolne miejsce systemowi operacyjnemu (blokuje całkowicie
tabelę, uniemożliwia operacje SELECT!)
▪ Zwykle wykonywana przez proces drugoplanowy Autovacuum
▪ lub ręcznie przez administratora – np. raz dziennie
▪ VACUUM nazwa_tabeli
▪ VACUUM FULL nazwa_tabeli
▪ program narzędziowy vacuumdb
▪ Należy wykonywać co najmniej raz na 2 miliardy transakcji, aby uniknąć problemu
Transaction ID Wraparound
69
PostgreSQL: wprowadzenie do administracji
TABELE SYSTEMOWE
▪ Tabele wykorzystywane wewnętrznie przez serwer PostgreSQL do
przechowywania metadanych o obiektach i strukturze systemu
▪ Dostępne dla administratora
▪ bezpośrednio, poprzez widoki systemowe, poprzez funkcje systemowe
▪ nie powinny być modyfikowane ręcznie
74
PostgreSQL: wprowadzenie do administracji
INSTALOWANIE POSTGRESQL
Za pomocą YUM (np. Oracle Linux)
wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-
latest.noarch.rpm
/usr/pgsql-13/bin/postgresql-13-setup initdb
/usr/pgsql-13/bin/postgresql-13-setup initdb
79
PostgreSQL: wprowadzenie do administracji
KONFIGURACJA LOGÓW SERWERA
Dokumentacja: https://www.postgresql.org/docs/13/static/runtime-config-logging.html
\x
-[ RECORD 1 ]-------+-------------------------------------------------------------------
userid | 10
dbid | 13318
queryid | 7614968655942141176 Sparametryzowane, zagregowane
query | select count(*) from cars where make=$1
calls | 2
total_time | 134.91809999999998
min_time | 15.722199999999999
max_time | 119.1959
mean_time | 67.45904999999999
stddev_time | 51.73685
rows | 2
shared_blks_hit | 4000
shared_blks_read | 4000
shared_blks_dirtied | 0
shared_blks_written | 0
local_blks_hit | 0
local_blks_read | 0
local_blks_dirtied | 0
local_blks_written | 0
temp_blks_read | 0
temp_blks_written | 0
blk_read_time | 93.3792
blk_write_time | 0
proces oczekuje na
założenie blokady na tabeli
▪ Prezentuje ogólne statystyki aktywności baz danych (od chwili startu serwera), m.in.:
▪ datname – nazwa bazy danych
▪ numbackends – liczba aktualnie przyłączonych procesów klientów
▪ blks_read – liczba bloków odczytanych z dysku
▪ blks_hit – liczba bloków odczytanych z Bufer Cache
▪ tup_returned – liczba odczytanych rekordów (np. pełne odczyty tabel)
▪ tup_fetched – liczba rekordów pobranych przez zapytania (spełniających
kryteria)
▪ tup_inserted – liczba wstawionych rekordów
▪ tup_updated – liczba zmodyfikowanych rekordów
▪ tup_deleted – liczba usuniętych rekordów
▪ blk_read_time – sumaryczny czas odczytu bloków dyskowych (ms)
▪ blk_write_time – sumaryczny czas zapisu bloków dyskowych (ms)
-[ RECORD 1 ]-------------------------+--------------------------------------
blocked_pid | 13660
blocked_user | postgres
blocking_pid | 2776
blocking_user | postgres
blocked_statement | update cars set price=0 where c_id=1;
current_statement_in_blocking_process | update cars set price=0 where c_id=1;
102
PostgreSQL: wprowadzenie do administracji
WERYFIKACJA POPRAWNOŚCI PLIKÓW DANYCH
▪ W domyślnej konfiguracji serwera, uszkodzenia plików danych są wykrywane podczas
dostępu do bloku dyskowego tylko w sytuacji, kiedy blok danych nie może być odczytany z
dysku lub jego zawartość jest nieczytelna
▪ Aby umożliwić automatyczną detekcję "subtelnych" uszkodzeń bloków, wprowadzono
mechanizm sum kontrolnych
▪ Wymagana aktywacja mechanizmu sum kontrolnych
▪ initdb --data-checksums (w chwili tworzenia Data Directory), lub:
▪ pg_checksums (w istniejącym środowisku)
▪ Weryfikacja podczas odczytu bloku przez PostgreSQL lub za pomocą
pg_checksums
+ plik katalogowy 4
5
Airbus
Airbus
A318-100
A319-100
6 Airbus A319-100N
7 Airbus A320-200
...
backup_manifest
Plik JSON, zawierający wykaz base.tar.gz
wszystkich skopiowanych pg_wal.tar.gz
plików, ich sumy kontrolne
oraz zakres wpisów WAL
wygenerowanych podczas
wykonywania kopii.
{ "PostgreSQL-Backup-Manifest-Version": 1,
"Files": [
{ "Path": "backup_label", "Size": 226, "Last-Modified": "2021-01-12 10:04:23
GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "c927d580" },
{ "Path": "global/1262", "Size": 8192, "Last-Modified": "2021-01-03 17:35:59
GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "ae6ede64" },
...
{ "Path": "global/pg_control", "Size": 8192, "Last-Modified": "2021-01-12
10:04:22 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "43872087" }
],
"WAL-Ranges": [
{ "Timeline": 1, "Start-LSN": "0/EB000028", "End-LSN": "0/EB000138" }
],
"Manifest-Checksum":
"04e59701bdafafec5f77117cadd2425e863397a4a1c8447cd34900062b24e1c1"}
WAL:
insert rekord 1
9:05 - rekord 2
rekord 2 rekord 2
rekord 1 WAL:
rekord 1
9:15 rekord 2 - rekord 2 + rekord 2
rekord 3 - rekord 3
czas rekord 3
awaria
© 2021 Maciej Zakrzewicz
119
PostgreSQL: wprowadzenie do administracji
ARCHIWIZACJA PLIKÓW WAL
▪ Archiwizacja plików WAL
▪ gdy archiwizacja WAL nie jest włączona, pliki dzienników WAL (WAL segment
files) są nadpisywane przez serwer (gdy działania w nich odnotowane zostały
pomyślnie zapisane w plikach danych - checkpoint)
▪ archiwizacja WAL powoduje zapisywanie zapełnionych plików dzienników WAL
w bezpiecznej lokalizacji
▫ wal_level=replica
▫ archive_mode=on
▫ archive_command = 'cp %p /mnt/server/archivedir/%f'
PostgreSQL pg_receivewal
WAL WALWALWALWALWALWALWALWAL
WAL
/usr/pgsql-13/bin/pg_controldata
▪ Podczas odtwarzania bazy
pg_control version number:
...
1300 danych po awarii, PostgreSQL
Latest checkpoint location: 0/EA2A9460 automatycznie odnajduje
Latest checkpoint's REDO location:
Latest checkpoint's REDO WAL file:
0/E7401968
0000000100000000000000E7 początkową pozycję w pliku
...
Latest checkpoint's oldestXID: 479
WAL posługując się plikiem
...
Time of latest checkpoint: Mon 11 Jan 2021 01:34:04 PM CET
global/pg_control
... ▪ binarny, 8kB
wal_level setting: replica
wal_log_hints setting: off ▪ przechowuje informacje
max_connections setting:
max_worker_processes setting:
100
8
systemowe, w tym związane z
max_wal_senders setting: 10 zapisami WAL i operacjami
...
Database block size: 8192
Checkpoint
...
WAL block size: 8192
▪ analiza zawartości za pomocą
Bytes per WAL segment: 16777216 pg_controldata
...
129
PostgreSQL: wprowadzenie do administracji
ROZWIĄZANIA HIGH AVAILABILITY
▪ Shared Disk Failover – wspólna macierz dyskowa przyłączona do dwóch
serwerów zdolnych wykonywać oprogramowanie PostgreSQL (nie
jednocześnie)
▪ Filesystem Replication – replikacja plików na poziomie systemu
operacyjnego, pomiędzy dwoma serwerami wykonującymi
oprogramowanie PostgreSQL (np. DRBD)
▪ WAL Shipping – transmisja plików WAL w celu konsumpcji przez drugi
serwer PostgreSQL (wbudowane)
▪ Logical Replication, Trigger-Based Replication, Statement-Based
Replication – transmisja operacji wykonywanych na bazie danych do
drugiego serwera PostgreSQL (np. pglogical, Londiste, Slony, pgpool-II)
postgresql.conf
hot_standby = on
master hotprimary_conninfo
standby =hot standby
'host=localhost hot standby
port=5432
database user=postgres
database password=postgres'
database database
port = 5433
port=5432 postgresql.conf walreceiver walreceiver walreceiver
wal_level=replica
strumień transakcji <pusty> standby.signal
WAL
walsender
touch standby/standby.signal
psql -p 5433
select pg_is_in_recovery(); # czy w trybie standby?
t
146
PostgreSQL: wprowadzenie do administracji
QUERY PLANNER
▪ Moduł Query Planner jest odpowiedzialny za:
▪ wygenerowanie wszystkich możliwych planów wykonania zapytania
▪ oszacowanie kosztów wykonania każdego z wygenerowanych planów
▪ wybór najtańszego planu
Transformuj
Wygeneruj „wszystkie”
możliwe
plany wykonania
statystyki
Oszacuj koszty Wybierz
parametry planów wykonania Plan
najtańszy
optymalny
QUERY PLAN
-------------------------------------------------------------------------------------------------
Nested Loop (cost=4.65..118.62 rows=10 width=488) (actual time=0.128..0.377 rows=10 loops=1)
-> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) (actual time=0.057..0.121 rows=10 loops=1)
Recheck Cond: (unique1 < 10)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) (actual time=0.024..0.024 rows=10 loops=1)
Index Cond: (unique1 < 10)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10)
Index Cond: (unique2 = t1.unique2)
Planning time: 0.181 ms
Execution time: 0.501 ms
QUERY PLAN
--------------------------------------------------------------------------------------
Aggregate (cost=179889.00..179889.01 rows=1 width=8)
(actual time=1287.306..1287.307 rows=1 loops=1)
Buffers: shared hit=10869 read=44020
-> Seq Scan on mytable (cost=0.00..154889.00 rows=10000000 width=0)
(actual time=0.022..751.461 rows=10000000 loops=1)
Buffers: shared hit=10869 read=44020
154
PostgreSQL: wprowadzenie do administracji
WYKORZYSTYWANIE INDEKSÓW
Przykładowa tabela
explain select * from mytable where num < 20000; ▪ Seq Scan – odczytuje
QUERY PLAN kolejno wszystkie bloki
-------------------------------------------------------------------- tabeli, wyszukuje rekordy o
Seq Scan on mytable (cost=0.00..179891.55 rows=10000124 width=15)
Filter: (num < '20000'::numeric) podanej wartości klucza
▪ odczytuje (i pomija) także
wszystkie "dead rows"
explain select * from mytable where num = 20000; ▪ Index Scan – znajduje
wartości klucza w indeksie,
QUERY PLAN odczytuje wskaźniki (TID) na
--------------------------------------------------------------------- rekordy tabeli, odczytuje
Index Scan using myidx on mytable (cost=0.43..8.45 rows=1 width=15)
rekordy tabeli
Index Cond: (num = '20000'::numeric)
▪ Rekordy odczytywane
pojedynczo
▪ Ten sam blok tabeli może być
gdy pobierany mały fragment tabeli odczytywany wielokrotnie
▪ Indeks i tabela odwiedzane
naprzemiennie
▪ Dostęp swobodny do dysku
(random read)
explain select * from mytable where num < 200; ▪ Bitmap Index Scan –
przeszukuje indeks w celu
QUERY PLAN
znalezienia wartości klucza,
gromadzi wskaźniki na
------------------------------------------------------------------------------
rekordy w formie bitmapy TID
Bitmap Heap Scan on mytable (cost=46566.87..126596.28 rows=2011153 width=15)
lub bloków (gdy bitmapa TID
Recheck Cond: (num < '200'::numeric) jest zbyt wielka)
-> Bitmap Index Scan on myidx (cost=0.00..46064.08 rows=2011153 width=0) ▪ gdy zastosowana jest
Index Cond: (num < '200'::numeric) bitmapa bloków, konieczna
jest wtórna weryfikacja
rekordów (Recheck Cond)
▪ Bitmap Heap Scan – sortuje
bitmapę TID lub bloków,
gdy pobierany średni fragment tabeli odczytuje rekordy z tabeli
▪ Może łączyć wiele indeksów
▪ Dostępy swobodne
i sekwencyjne do dysku
explain select * from mytable where num < 2 and id < 50000;
▪ Query Planner rozważa
QUERY PLAN
także użycie wielu
----------------------------------------------------------------- indeksów jednocześnie
Bitmap Heap Scan on mytable
(cost=1472.74..1876.72 rows=104 width=15)
▪ na podstawie każdego
Recheck Cond: ((num < '2'::numeric) AND (id < 50000)) indeksu generowana
-> BitmapAnd (cost=1472.74..1472.74 rows=104 width=0) bitmapa TID lub
-> Bitmap Index Scan on myidx bloków
(cost=0.00..421.40 rows=18262 width=0)
▪ operacja BitmapAnd
Index Cond: (num < '2'::numeric)
lub BitmapOr na
-> Bitmap Index Scan on myidx2
(cost=0.00..1051.04 rows=56881 width=0) bitmapach
Index Cond: (id < 50000)
explain select num from mytable where num = 20000; ▪ Index Only Scan – wynik
zapytania powstaje
QUERY PLAN
--------------------------------------------------------------------------
wyłącznie na podstawie
Index Only Scan using myidx on mytable (cost=0.43..8.45 rows=1 width=11) przeszukania indeksu, bez
Index Cond: (num = '20000'::numeric) fizycznego dostępu do
tabeli
▪ tzw. covering index
▪ Może zaistnieć potrzeba
gdy wszystkie potrzebne dane znajdują się w indeksie sięgnięcia do tabeli w
związku z MVCC
▪ gdy tabela była ostatnio
modyfikowana
QUERY PLAN
---------------------------------------------------------------
Limit (cost=0.15..0.23 rows=5 width=15)
(actual time=0.023..0.024 rows=5 loops=1)
-> Seq Scan on mytable
(cost=0.00..154889.00 rows=10000000 width=15)
(actual time=0.021..0.022 rows=15 loops=1)
170
PostgreSQL: wprowadzenie do administracji
ALGORYTMY ŁĄCZENIA TABEL: NESTED LOOPS
przykład
Tabela zewnętrzna Tabela wewnętrzna
A 3 2 a
B 2 1 b
C 1 2 c
D 3 3 d
1 e
Pojedyncze
Wielokrotne
przeglądanie
przeglądanie
A 3 3 d
B 2 2 a
B 2 2 c
C 1 1 b Wynik połączenia
Nested Loop (cost=0.00..2500914.00 rows=200000000 width=317)
C 1 1 e
... (actual time=0.016..572221.288 rows=200000000 loops=1) D 3 3 d
-> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=268)
... (actual time=0.004..64.851 rows=20000 loops=1)
-> Materialize (cost=0.00..251.00 rows=10000 width=49)
... (actual time=0.001..8.786 rows=10000 loops=20000)
-> Seq Scan on products ...
C 1 2 c
D 3 3 d
Haszowanie HF 1 e
174
PostgreSQL: wprowadzenie do administracji
POWTÓRKA – PLAN WYKONANIA
QUERY PLAN
---------------------------------------------------------
Bitmap Heap Scan on tenk1 (cost=5.07..229.20 rows=101 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0)
Index Cond: (unique1 < 100)
talerz
SZYBCIEJ WOLNIEJ
▪ pg_stats
▪ tablename – nazwa tabeli
▪ attname – nazwa kolumny
▪ null_frac – procent wartości null w kolumnie
▪ avg_width – średni rozmiar wartości kolumny
▪ n_distinct – liczba różnych wartości kolumny (gdy wartość dodatnia) lub liczba różnych
wartości kolumny podzielona przez liczbę rekordów (gdy wartość ujemna)
▪ most_common_vals – najpopularniejsze wartości kolumny
▪ most_common_freqs – procentowe częstotliwości występowania każdej z
najpopularniejszych wartości kolumny
▪ histogram_bounds – granice przedziałów, dzielących rekordy na równoliczne podzbiory
▪ correlation – statystyczna korelacja pomiędzy fizycznym porządkiem rekordów na dysku a
logicznym porządkiem wartości kolumny (<-1;1>)
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+-------------------
QUERY PLAN
------------------------------------------------------------
Seq Scan on cars (cost=0.00..5097.00 rows=5600 width=273)
Filter: ((make)::text = 'porsche'::text)
explain select * from cars where c_id < 2500; ▪ Tabela CARS:
QUERY PLAN
▪ 100.000 rekordów
------------------------------------------------------------ ▪ każdy przedział
Seq Scan on cars (cost=0.00..5097.00 rows=2426 width=273) reprezentuje
Filter: (c_id < 2500) 100,000/100 = 1000
rekordów
▪ wartości c_id < 2500
< 2500 obejmują:
▫ pierwsze dwa
przedziały całkowicie
(2000 rekordów)
#rek
▫ trzeci przedział w
(2500 – 2070)/(3078-
2 1097 2069 3078 4029 … 2070)=42,6%=426
rekordów
(fizyczny porządek
10 | 8902
analyze ordered_messedup; ...
QUERY PLAN
------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..483.00 rows=7033 width=244)
Filter: (unique1 < 7000)
Buffer Cache/
WAL Buffers
Shared Buffers
Work Memory Vacuum Buffers
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
sortowanie dyskowe
Sort (cost=26140.32..26390.32 rows=100000 width=273) (actual time=128.100..156.310 rows=96398 loops=1)
Sort Key: price
Sort Method: external merge Disk: 27272kB
-> Seq Scan on cars (cost=0.00..4847.00 rows=100000 width=273) (actual time=0.023..9.096 rows=96398 loops=1)
Planning Time: 0.075 ms
Execution Time: 163.576 ms
set work_mem=1000000;
Work Memory: 1 000 000KB
explain analyze select * from cars order by price;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Sort (cost=13151.82..13401.82 rows=100000 width=273) (actual time=53.056..63.948 rows=96398 loops=1)
Sort Key: price
Sort Method: quicksort Memory: 52778kB
-> Seq Scan on cars (cost=0.00..4847.00 rows=100000 width=273) (actual time=0.017..9.605 rows=96398 loops=1)
Planning Time: 0.059 ms
Execution Time: 71.462 ms
sortowanie w pamięci