ααα»ααααΆααααα»α
α’αααααΆαααααΎααΆα αααΎαααΆα 6000 ααα αΎα ααα»αααααα»αααΆαααΆααααα½ααα½αααααααα ααααΆαα·αααΆαααααΆααααααααΆαααααααΊ ααααα»ααα ααΆαααααααααααααΎααα ααΌα αααα
ααααΆαααα½ααα α αΎαααααΎααααα’αααααΉα "ααααΆαααΆαααΌα αα·ααααααααααΆαα"α π
ααα»ααααααααααααα ααααΆαααΆαααΆα αααΎααααααααΎα±ααααααΎααΊααααΆα αα·ααααααααααΆαααααΆα ααΆαααααααααααααΆ α αΎαα’αΆα ααααΌαααΆαααα½αααααΆααααααα ααΆαααααααα αα·ααα·αααααααααααααΆα.
αααα»αααααΈααα α’αααα’αα·ααααααααααΆααααα·αα αΆαααΆα αααααααααααααΎααααααΎαααααα·αααααΆαααααααα½αα―ααα αααααΉαααα’ααααααΎαααα·αααααααααααΆαα - ααΎαα’αΆα ααααΆααααΆααααΈα’αααΈααααααα»αααΎαα‘αΎααα ααΈααα α’αααΈαααα’αΆα ααΆα ααα»αα αα·α ααααβααβαααααααααΆα. αααα αΎαααΆα’αααΈαααααΎαααΆαααααΎα
ααΌααα·αα·αααααΎαα±ααααΆααααα
αααΆααα’αααΈααααΈααΆααααα - ααααααααα½αααΆααααΌαααΆαααααα αα·αα’αα»ααΆαααα’αααΈααααααααα½αααααΆααα
ααα
ααΎααααΈααααα»ααααα½αα’αααα±ααααΆαααααααααΎαα‘αΎααα
αααα»ααααααΆαααααααΌαα’αααα’αΆα
ααααΆαααααα»ααααααααΌαααααΆααΈ
# 1: αα·αα·αααα "ααΆααααααα"
αα ααααααααΎαα‘αΎα
αααα αΆααα·ααααααααα α»αααααααααα»ααααααΆααα’αα·αα·αα "LLC Kolokolchik" α
αααααααααα’ααααααααΆα
-> Limit
-> Sort
-> Index [Only] Scan [Backward] | Bitmap Heap Scan
α’αα»ααΆααα
ααααααααααααααΆαααααΎ αααααΈαααΆαα½αααΆααααααα.
α§ααΆα ααα:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, (random() * 1000)::integer fk_cli; -- 1K ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
CREATE INDEX ON tbl(fk_cli); -- ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ foreign key
SELECT
*
FROM
tbl
WHERE
fk_cli = 1 -- ΠΎΡΠ±ΠΎΡ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ
ORDER BY
pk DESC -- Ρ
ΠΎΡΠΈΠΌ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄Π½Ρ "ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ" Π·Π°ΠΏΠΈΡΡ
LIMIT 1;
α’αααα’αΆα ααααααααΆααααααΆααααΆαααααααααΆα αααΎαααΆα 100 ααααΌαααΆαααα ααααΈαα·αα·αααα ααααααααΆααααααααΌαααΆαααααααααΆααα’αα α αΎααααααΆαααααα ααααααα½αααα»αααααα
ααΆααααααααΌαα
DROP INDEX tbl_fk_cli_idx;
CREATE INDEX ON tbl(fk_cli, pk DESC); -- Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ»ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
ααΌααααΈαααα
ααΎααααΌααΎααααααα - ααΏαααΆα 8.5 αα αα·αα’αΆααα·α
ααΆα 33 αα. "ααΆααα·α" ααΆααααα
αααΎααααα’αααααΆααααααΆαααααααααΈαα½αα α₯αααα·ααααΆααααα
αααΆαα fk
.
αααα»αααααααααΆααααΆαααααααααααααααααΉαααααΎαααΆαααΆ "αα»ααααα" ααααααααααα·αα’αΆαααααααΆαααΈαα»ααααααΆαααααα½αααααααααααΆαα½α fk
αααααΆαααααααααααααααααΆα pk
ααΆαα·αααΆα αα·ααα·αααΆα (α’αααα’αΆα
α’αΆαααααααα’αααΈααΏαααα
# 2: α ααα»α αααααααααααααααα (BitmapAnd)
αα ααααααααΎαα‘αΎα
αααα αΆααα·α αα αααααααααααΆααα’αααααααΆααα’αα·αα·αα "LLC Kolokolchik" αααααΆααααα αααααα»αααΆα "NAO Buttercup" α
αααααααααα’ααααααααΆα
-> BitmapAnd
-> Bitmap Index Scan
-> Bitmap Index Scan
α’αα»ααΆααα
αααααΎα ααααααααααααΆαααΆαα» ααΆαβααΆαβααΆααβααΈβααΎαβα¬βαααααΈαβαα½αβαααα»αβα ααααβαααβααΆαβααααΆααβααΆαα½αβααΆαβααΈβααΈααΈαα
α§ααΆα ααα:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, (random() * 100)::integer fk_org -- 100 ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
, (random() * 1000)::integer fk_cli; -- 1K ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
CREATE INDEX ON tbl(fk_org); -- ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ foreign key
CREATE INDEX ON tbl(fk_cli); -- ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ foreign key
SELECT
*
FROM
tbl
WHERE
(fk_org, fk_cli) = (1, 999); -- ΠΎΡΠ±ΠΎΡ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠ°ΡΠ΅
ααΆααααααααΌαα
DROP INDEX tbl_fk_org_idx;
CREATE INDEX ON tbl(fk_org, fk_cli);
ααΆαααΌααΆαααα ααΈαααααΊααΌα ααΆα αααααΆα Bitmap Heap Scan ααΆαααααα·αααααΆαααΆααααααααα½αα―αα ααα»αααααααΆαααΆααααα ααΏαααΆα 7 αα αα·αα’αΆααα·α ααΆα 2.5 αα.
# 3: αααα αΌαααααααααα (BitmapOr)
αα ααααααααΎαα‘αΎα
αααα αΆα "αα½αααΎα" αααα αΆααααΆαααα ααα½α 20 ααΆααααααΌα α¬ααααΎααααα·αααΆααααΆαα αΆααααΆαααααααΆααααααΎαααΆα αααααΆαα’αΆαα·ααΆαααααα’αααα
αααααααααα’ααααααααΆα
-> BitmapOr
-> Bitmap Index Scan
-> Bitmap Index Scan
α’αα»ααΆααα
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ αα ααΆα [ααΆααα’αα] ααΎααααΈαααα αΌαααααΆααΌααααα½ααααααααΆαα OR-blocks ααααααααααααΈαα½ααα
α§ααΆα ααα:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, CASE
WHEN random() < 1::real/16 THEN NULL -- Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ 1:16 Π·Π°ΠΏΠΈΡΡ "Π½ΠΈΡΡΡ"
ELSE (random() * 100)::integer -- 100 ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
END fk_own;
CREATE INDEX ON tbl(fk_own, pk); -- ΠΈΠ½Π΄Π΅ΠΊΡ Ρ "Π²ΡΠΎΠ΄Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅ΠΉ" ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ
SELECT
*
FROM
tbl
WHERE
fk_own = 1 OR -- ΡΠ²ΠΎΠΈ
fk_own IS NULL -- ... ΠΈΠ»ΠΈ "Π½ΠΈΡΡΠΈ"
ORDER BY
pk
, (fk_own = 1) DESC -- ΡΠ½Π°ΡΠ°Π»Π° "ΡΠ²ΠΎΠΈ"
LIMIT 20;
ααΆααααααααΌαα
(
SELECT
*
FROM
tbl
WHERE
fk_own = 1 -- ΡΠ½Π°ΡΠ°Π»Π° "ΡΠ²ΠΎΠΈ" 20
ORDER BY
pk
LIMIT 20
)
UNION ALL
(
SELECT
*
FROM
tbl
WHERE
fk_own IS NULL -- ΠΏΠΎΡΠΎΠΌ "Π½ΠΈΡΡΠΈ" 20
ORDER BY
pk
LIMIT 20
)
LIMIT 20; -- Π½ΠΎ Π²ΡΠ΅Π³ΠΎ - 20, Π±ΠΎΠ»ΡΡΠ΅ ΠΈ Π½Π΅ Π½Π°Π΄ΠΎ
ααΎαααΆαααΆαααααααααααααΈααΆααα·ααααααΆαααααααααΆαααααΆαααΆαααΆαα 20 ααααΌαααΆαααα½αααααΆαααα αααα»ααααα»αααΈαα½α ααΌα ααααααΈααΈαααΆαα½αααΉα Bitmap Heap Scan αααααΆααααααααααααΆα αα·αααααΌαααΆαααααα·ααααα·ααΌααααΈαα - αα ααΈαααα αα ααΏαααΆα 22 αα α’αΆααα·α ααΆα 44 αα!
ααΏααααα’α·ααααααααααα’αααΈαα·ααΈααΆααααααααααΎαααααα·αααααΆααααα αααααααΎα§ααΆα αααααΆααααΆαα α’αΆα ααααΌαααΆαα’αΆααα αααα»αα’ααααα
PostgreSQL Antipatternsα ααΆαα αΌααα½α αα·α ORs ααααααααααααααααΆαα ΠΈPostgreSQL Antipatternsα ααΏααααΆαααααΆαα ααααΆααα‘αΎααα·αααααΆααααααααααΆαααααα α¬ βααΆααααααΎαααααα·αααααΆααα αα·ααα ααβ .ααααααΌαα ααΆαααααΎαααΎαααΆαααααΆαααααααα’ααααΎααααΆααα α»α ααΆα αααΎαα (αα·ααα·αααααΉαααααΌ const/NULL) ααααΌαααΆααα·ααΆααααΆαα αααα»αα’ααααα
SQL HowTo: ααααα while-loop αααααααΆαααα αααα»ααααα½α α¬ "Elementary three-way" .
#α€α ααΎαα’αΆαααΏαααααα·αα αΆαααΆα αα αααΎαα
αα ααααααααΎαα‘αΎα
ααΆααααα½αααΆααΎαα‘αΎααα αααα’αααα αα "ααααΆααααααααααααααα" αα ααΉαααααΎαααααΆαααααΆααα
"α αΎαα’ααααα·αααΆαααΌα ααααΆαα ααα»αααα ααΆαα½αααΉααααΌαα»ααα»ααααα? ααααααΆααααα "ααααααα"
α§ααΆα ααα ααΆααααααααα·α αα ααΆαααΆαααΎ αααα αΆαααααΎ "ααααΆαα" α αΆαααααα»αα ααα½α 20 ααααΌααααααΆααααααΎαααΆα ααααα·ααα·αααΈααααααααααααα½αααα
αααααααααα’ααααααααΆα
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& 5 Γ rows < RRbF -- ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½ΠΎ >80% ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ
&& loops Γ RRbF > 100 -- ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅ 100 Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎ
α’αα»ααΆααα
αααααΎα [αααααα] α―αααα αααααααααααΆαα½ααααααααα WHERE α¬αα½ααααα αΌαααΆααααααααα αααα»ααα·αα·ααααα
ααααα·αααΎαααααααααααααααΊ "αα·αα·αααα" αααααΆαααααααααααααα’ααα - αααααΊ αα·αααΆααααααΆααΆααααααΈαααα αααααΈαααααααΆαααα’ααΆαα - ααΆααΆααΆααααααΎααααα»αααΆαααααΎααααααααα WHERE α ααααΆαααΆα boolean/enum ααΆα αααΎαααααΉαααα’αα αααα»ααααααααααα
ααααα·αααΎααααααααααααα α’αΆα ααα½αααα’αααααααααααααααΆαααααΆαααα ααΆααΆααΆααααααΎααααα»αααΆααααααΈααα·αα·ααααααΆαα½αααΆαααΆααααα - ααΌα αα αααα»αααααΆαααΆαααΆαα½α BitmapAnd ααΆαααΎα
α§ααΆα ααα:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, CASE
WHEN random() < 1::real/16 THEN NULL
ELSE (random() * 100)::integer -- 100 ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
END fk_own
, (random() < 1::real/50) critical; -- 1:50, ΡΡΠΎ Π·Π°ΡΠ²ΠΊΠ° "ΠΊΡΠΈΡΠΈΡΠ½Π°Ρ"
CREATE INDEX ON tbl(pk);
CREATE INDEX ON tbl(fk_own, pk);
SELECT
*
FROM
tbl
WHERE
critical
ORDER BY
pk
LIMIT 20;
ααΆααααααααΌαα
CREATE INDEX ON tbl(pk)
WHERE critical; -- Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ "ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ΅" ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ
ααΌα αααα’αααααΆαααΎα ααΆαααααααΆαααΆααααΆαααααα»αααΈαααααΆα α αΎαααααΎααΆαααααΆααα ααΆ ααΏαααΆα 5 αα.
ααα α₯α ααΆααΆαααΌα
αα ααααααααΎαα‘αΎα
ααΆαααα»ααααααΆα αααΎαααΎααααΈαααααΎααα½αααααΎαααΆααα·α αα ααΆαααααΆαααααα½αααααα’ααα αα ααααααα ααα½αααααΆαααααΎαα αα α»ααααααααΆα/ααΆααα»ααααααααααΆααΆα αααΎααα ααΎααΆααΆαααΆαα±ααααΆαααααΆαααΆααααααααααααΆ "ααααΆαα" αα½αα ααα½αααα
αααααααααα’ααααααααΆα
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& loops Γ (rows + RRbF) < (shared hit + shared read) Γ 8
-- ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ 1KB Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡ
&& shared hit + shared read > 64
α’αα»ααΆααα
α’αα»αααααααααααΆαααααΆαα VACUUM [ααα] α¬ααα½αααΆαααΆαααααα»ααααααΆαα±ααααΆαααΉαααΆαααααααααααΆαα
αααα»αααααΈααΆαα αααΎα αααα αΆααααααααααΌαααΆαααααα‘αΎαααααααΆαααΆααααα½ααα·αααα’ αα αααα α α ααααΈαααααα·ααααΆα’αΆααΈαααααααΌα α’αααΈαααααΆααα·ααΆααααΆ
PostgreSQL Antipatterns: ααααα»ααααααααΆααααΉαα αααΌαααα»ααααα "ααααΆαα" .ααα»ααααα’αααααααΌααααααΆ ααΌααααΈαα VACUUM FULL ααα’αΆα αα·αααααααα½αααΆααααα αααααΆααααααΈααααααααΆααΆααααααααααΆαααααα½αα’αααααΆαα½αααΉααααα½ααααααααΆαααΈα’ααααα
DBA: αα αααααα VACUUM αααΆααα ααΎααααα’αΆαααΆααΆαααααα .
# 6: ααΆαα’αΆαααΈ "αααααΆα" ααααααααααα
αα ααααααααΎαα‘αΎα
ααΆα αΆααααΈααΌα ααΆααΎαααΆαα’αΆαααααα·α ααααα½α α αΎαα’αααΈαααΆααα’ααααααΌαααΆαααααΎαα·αα·αααα α αΎαααΎααα·αααΆαααααα’αααααΆααααΆααααΎαααααα ααα»ααααααΎααα ααα’αΆααααααα αααΎαααΆαα’αααΈαααααΎαα ααααΆαα
αααααααααα’ααααααααΆα
-> Index [Only] Scan [Backward]
&& loops Γ (rows + RRbF) < (shared hit + shared read) Γ 8
-- ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ 1KB Π½Π° ΠΊΠ°ΠΆΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡ
&& shared hit + shared read > 64
α’αα»ααΆααα
ααΌααααα‘ααααΎααααΆααα·ααααααΌααα
ααΆαααααααααααα·αα·αααααααααΆαααααΎ αα·αααΆαααααΆααααααααΆααααααΆαααα
αααα»ααααα½α - αααααααα»αα αααααααααααααααααα·αααααΌαααΆααααααααα. ααΆαα
αααΎαα’αααααΉαααααΌααααααΎααα·αα·ααααααααααααααΆ ααα»αααααααααααΆαααΆααα»ααααα α¬
α§ααΆα ααα:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "ΡΠ°ΠΊΡΠΎΠ²"
, (random() * 100)::integer fk_org -- 100 ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
, (random() * 1000)::integer fk_cli; -- 1K ΡΠ°Π·Π½ΡΡ
Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠ»ΡΡΠ΅ΠΉ
CREATE INDEX ON tbl(fk_org, fk_cli); -- Π²ΡΠ΅ ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΊ Π² #2
-- ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎ fk_cli ΠΌΡ ΡΠΆΠ΅ ΠΏΠΎΡΡΠΈΡΠ°Π»ΠΈ Π»ΠΈΡΠ½ΠΈΠΌ ΠΈ ΡΠ΄Π°Π»ΠΈΠ»ΠΈ
SELECT
*
FROM
tbl
WHERE
fk_cli = 999 -- Π° fk_org Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, Ρ
ΠΎΡΡ ΡΡΠΎΠΈΡ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ΅ ΡΠ°Π½ΡΡΠ΅
LIMIT 20;
α’αααΈααααααααΆαα αΆααααΌα
ααΆααα’ αααααΈααΆααααα
ααΆααααααααααααααα ααα»ααααααΆαα½αα±αααααααα - αααααΆαααααααααααΆααΈαα½αααα 20 αααααΆαα’αΆα ααΎαααααΌααααα·αααααα 4 ααααα 32KB αααα»ααα½ααααααααααΆ - ααΎααΆαα·ααα·ααα? αα·ααααααααααααααα tbl_fk_org_fk_cli_idx
αααα»ααααα·αα
ααΆααααααααΌαα
CREATE INDEX ON tbl(fk_cli);
ααααΆαα - ααΏαααΆααα»α 10 αα αα·αα’αΆααα·α ααΆα 4 αα!
α§ααΆα αααααααααααααααααΆαααΆαααααΆαααααΎααααΆαααα·αα·ααααααααα·αααΆαααααα·αααααΆαα’αΆα ααααΌαααΆαααααΎαααΎααα αααα»αα’ααααα
DBA: ααααααααα·αα·αααααααααααΆααααααααα .
ααα α§α CTE Γ CTE
αα ααααααααΎαα‘αΎα
ααΆαααΆαααααΎαα»α ααα½αααΆααα·αααα» "ααααΆαα" CTE ααΈαα»αααααααααΆ α αΎααααααΆαααααααααα
α
α·αααααααΎααΆαααΆααα½αααα JOIN
.
ααααΈαααααΊααΆααααααααααααΆααααααααΆαααααα v12 α¬ααααΎααΆαα½α WITH MATERIALIZED
.
αααααααααα’ααααααααΆα
-> CTE Scan
&& loops > 10
&& loops Γ (rows + RRbF) > 10000
-- ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π΄Π΅ΠΊΠ°ΡΡΠΎΠ²ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ CTE
α’αα»ααΆααα
αα·ααΆαααααααα»αααααααααααΌαααααΎ - αα·α
ααα α¨α ααααΌααα ααΈα (αα»αααααααα)
αα ααααααααΎαα‘αΎα
ααααΎαααΆααααα½ααα (ααΆααααααα α¬ααΆαααααΎαααααααΈαα) αααααααααααΆαα½αα ααα½ααααα·αααααΉαα’αααα αα αΆααααααΆαααααα»ααα»ααααααΆααααΆααααααα
αααααααααα’ααααααααΆα
-> *
&& temp written > 0
α’αα»ααΆααα
ααααα·αααΎααα·ααΆαα’αααα
αα
αΆααααααααΎαααααααα·ααααα·ααΆααα·αααΎαααΈααααααααααΆααααααΆαααααααΆαααΆαααααα SET [LOCAL]
αααααΆααααααΎ/ααααα·ααααα·ααΆαααΆααααΆααα
α§ααΆα ααα:
SHOW work_mem;
-- "16MB"
SELECT
random()
FROM
generate_series(1, 1000000)
ORDER BY
1;
ααΆααααααααΌαα
SET work_mem = '128MB'; -- ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ°
αααααΆααα ααα»ααααΆααααααα ααααα·αααΎααααΎααα’αααα αα αΆαααα»ααααα α αΎααα·ααααααΆααα ααααααα½αααΉαααααΌαααΆαααααα·ααααα·ααΏαααΆααα»αα αααα»ααααααΆαα½αααααΆαααααααααα½αααααααα»αααΈ HDD ααααααΌαααΆαααα αααααααα
ααα»ααααα’αααααααΌααααααΆ α’αααααΉααα·αα’αΆα αααα ααααΆαα αα αΆαααΆαα αααΎα αα·αα αααΎαααααα - ααΆααΉααα·ααααααααααΆαααααααΆααααα»ααααααααααααΆαααααα
ααα α©α αααα·αα·αα·αααΆααααααα
αα ααααααααΎαα‘αΎα
αα½αααααΆαα
αΆααα
αααΎαα
αΌααα
αααα»αααΌαααααΆααα·αααααααααα»αααααααα½α ααα»αααααα·αααΆααααααΎααααΈαααα»αααΆα
ααααα ANALYZE
.
αααααααααα’ααααααααΆα
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
α’αα»ααΆααα
α’αα»ααααααΆα
αα ANALYZE
.
ααααΆαααΆααααααααΌαααΆααα·αααααΆαααα’α·αααααααααααα αααα»α
PostgreSQL Antipatterns: αααα·αα·ααΊααΆα’αααΈααααααααΆα .
ααα α‘α α "ααΆαα’αααΈαα½ααα»αααααααααΈ"
αα ααααααααΎαα‘αΎα
ααΆαααΆααααα αΆααααααΆααααΆαα αΆααααααααααααΎα‘αΎααααααααΎααααα½ααααααα α¬ααΆαααααΆααααααααΉα CPU/hypervisor αα·ααααααααααΆααα
αααααααααα’ααααααααΆα
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ΡΠΈΡΠ°Π»ΠΈ ΠΌΠ°Π»ΠΎ, Π½ΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ
α’αα»ααΆααα
ααααΎααΆααααα
αααααααααααα½ααα·αα·ααα αααΆαααΈααααααααΆααααΆααααααααΆαα α¬ααΆαααααΎααααΆααααααΆααα·αααααααααΈα ααΎαααΆααα·ααΆααα½α
α αΎαα’αααΈααααααααααΎαααααΆααααα
αααααΎαααΆαααααααααΆαααααΆαααΈαααααΆαααα
ααααα: www.habr.com