เปเบกเบทเปเบญเบซเบฅเบฒเบเปเบเบทเบญเบเบเปเบญเบ
เบเปเบฒเบเปเบเปเปเบเปเบกเบฑเบเบซเบผเบฒเบเบเบงเปเบฒ 6000 เปเบเบทเปเบญเบเบฑเบเบเบฑเปเบเปเบเปเบเบฑเปเบเบกเบฒ, เปเบเปเบซเบเบถเปเบเปเบเบฅเบฑเบเบชเบฐเบเบฐเบเบตเปเบกเบตเบเบฐเปเบซเบเบเบญเบฒเบเบเบฐเบเปเปเปเบเปเบชเบฑเบเปเบเบเปเบซเบฑเบเปเบกเปเบ เบเปเปเบเบถเบเปเบเบเบชเปเบฒเบ, เบเบถเปเบโเปเบเบดเปเบโเบเบทโเปเบเบงโเบเบตเปโ:
เบเบฑเบเบเบงเบเปเบเบปเบฒเปเบฅเบฐเบเปเบฒเบฎเปเบญเบเบเปเบเบญเบเบเปเบฒเบเบเบฐ "เบเบฒเบเปเบเบฑเบเบเปเบฝเบ". ๐
เปเบเปเบขเปเบฒเบเบเบดเบเบเบฑเบ, เบซเบผเบฒเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเปเบฎเบฑเบเปเบซเปเบเบฒเบเบฎเปเบญเบเบเปเบเปเบฒเปเบฅเบฐ "gluttonous" เปเบเปเบเปเบเบญเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ, เปเบกเปเบเบเบปเบเบเบฐเบเบดเปเบฅเบฐเบชเบฒเบกเบฒเบเบฎเบฑเบเบฎเบนเปเปเบเปเปเบเบเปเบเบเบชเปเบฒเบเปเบฅเบฐเบเปเปเบกเบนเบเบเบญเบเปเบเบเบเบฒเบ.
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบเปเบฅเบฐเบเบปเบเบเบฐเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบญเบเบซเบฒเบเบฒเบเปเบฅเบทเบญเบเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบญเบเบเบปเบเปเบญเบ, เบญเบตเบเปเบชเปเบเบฐเบชเบปเบเบเบฒเบเบเบญเบเบเบปเบเปเบญเบเปเบเบปเปเบฒเบเบฑเปเบ - เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบญเบเบฅเบฒเบงเบงเปเบฒเบชเบดเปเบเบเบตเปเปเบเบตเบเบเบทเปเบเบขเบนเปเบเบตเปเบเบตเป, เปเบซเบเบเบปเบเปเบกเปเบเบซเบเบฑเบ, เปเบฅเบฐ. เบเบฐเบกเบฒเปเบเบดเบเบกเบตเบเบฒเบเปเบเปเปเบเปเบเบงเปเบ. เปเบเบดเปเบเปเบเบฑเบเบชเบดเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเปเบฎเบฑเบ.
เบเปเปเบซเปเบเบดเบเบฒเบฅเบฐเบเบฒเบขเปเบฒเบเบฅเบฐเบญเบฝเบเบเปเบฝเบงเบเบฑเบเบเปเบฅเบฐเบเบตเปเบซเบผเบปเปเบฒเบเบตเป - เบงเบดเบเบตเบเบฒเบเบเบตเปเบเบงเบเปเบเบปเบฒเบเบทเบเบเปเบฒเบเบปเบเปเบฅเบฐเบเปเบฒเปเบเบฐเบเปเบฒเปเบเบเบตเปเปเบเบปเบฒเปเบเบปเปเบฒเบเปเบฒเปเบเบชเบนเป.
เบชเปเบฒเบฅเบฑเบเบเบฒเบ immersion เบเบตเปเบเบตเบเบงเปเบฒเปเบเบซเบปเบงเบเปเป, เบเปเบฒเบญเบดเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฑเบเบเบฑเบเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเบเบฒเบ
#1: เบเบฑเบเบชเบฐเบเบต "undersorting"
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบชเบฐเปเบเบเปเบเปเบเบฑเบเปเบเบดเบเบชเบธเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบฅเบนเบเบเปเบฒ "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.5x เปเบฅเบฐเบญเปเบฒเบเปเปเบญเบเบฅเบปเบ 33x. เบเบปเบเบเบฐเบเบปเบเบเบฐเบเบฑเบเปเบเบเบเบงเปเบฒ, เบซเบผเบฒเบ "เบเบงเบฒเบกเบเบดเบ" เบเปเบฒเบเบกเบตเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเบกเบนเบเบเปเบฒ. fk
.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบชเบฑเบเปเบเบเบงเปเบฒเบเบฑเบเบเบฐเบเบตเบเบฑเปเบเบเปเบฒเบงเบเบฐเปเบฎเบฑเบเบงเบฝเบเปเบเบฑเบ "เบเปเบฒเบเปเบฒเบซเบเปเบฒ" เบเบฑเบเบเบฐเบเบตเบเปเปเบฎเปเบฒเบเปเบฎเบเบเบงเปเบฒเปเบเบปเปเบฒเบเปเบงเบฒเบญเบฑเบเบเบตเปเบเปเบฒเบเบกเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบญเบเบเบฒเบกเบญเบทเปเบเปเบเบตเปเบกเบต. fk
, เบเปเบญเบเบเบตเปเบเบฑเบเบฎเบฝเบเบเบฒเบก pk
เบเปเปเปเบกเปเบ เปเบฅเบฐเบเปเปเปเบกเปเบ (เบเปเบฒเบเบชเบฒเบกเบฒเบเบญเปเบฒเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเป
#2: เบเบธเบเบเบฑเบเบเบฑเบเบเบญเบเบเบฑเบเบเบฐเบเบต (BitmapAnd)
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบชเบฐเปเบเบเบชเบฑเบเบเบฒเบเบฑเบเบซเบกเบปเบเบชเปเบฒเบฅเบฑเบเบฅเบนเบเบเปเบฒ "LLC Kolokolchik" เบชเบฐเบซเบผเบธเบเปเบเบเบฒเบกเบเบญเบ "NJSC Lyutik".
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> 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 เปเบกเปเบเบเปเบญเบเบเปเบฒเบเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบญเบเบกเบฑเบเปเบญเบ. เปเบเปเบขเปเบฒเบเปเบเบเปเปเบเบฒเบก เปเบงเบเบงเปเบฒ 7x เปเบฅเบฐเบญเปเบฒเบเปเปเบญเบเบฅเบปเบ 2.5x.
#3: เบเบฒเบเบฅเบงเบกเบเบฑเบเบเบฐเบเบต (BitmapOr)
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ 20 เบเปเบฒเบญเบดเบเบเบตเปเปเบเบปเปเบฒเปเบเปเบเบตเปเบชเบธเบ "เบเบญเบเบเบปเบเปเบญเบ" เบซเบผเบทเบเบฒเบเบฎเปเบญเบเบเปเบเบตเปเบเปเปเปเบเปเบกเบญเบเบซเบกเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบกเบงเบเบเบปเบ, เบเบญเบเบเบปเบเปเบญเบเปเบเบเบนเบฅเบดเบกเบฐเบชเบดเบ.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> BitmapOr
-> Bitmap Index Scan
-> Bitmap Index Scan
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เปเบเป เบชเบฐเบซเบฐเบเบฑเบ [เบเบฑเบเปเบปเบ] เปเบเบทเปเบญเบชเบปเบกเบเบปเบเบเบฒเบเบชเบญเบเบเบฒเบกเบเปเบญเบเบชเปเบฒเบฅเบฑเบเปเบเปเบฅเบฐเปเบเบทเปเบญเบเปเบ OR เบเบฑเบ.
เบเบปเบงเบขเปเบฒเบ:
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 "เบฅเบฒเบเบฒเปเบเบเบเบงเปเบฒ", เบเปเปเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบ - เบเบฑเปเบเบเบฑเปเบ. เปเบงเบเบงเปเบฒ 22x, เบญเปเบฒเบเปเปเบญเบเบฅเบปเบ 44x!
เปเบฅเบทเปเบญเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเบงเบดเบเบตเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบตเป เบเปเบฝเบงเบเบฑเบเบเบปเบงเบขเปเบฒเบเบเบตเปเบเบฑเบเปเบเบ เบชเบฒเบกเบฒเบเบญเปเบฒเบเปเบเปเปเบเบเบปเบเบเบงเบฒเบก
PostgreSQL Antipatterns: เบเบฒเบเปเบเบปเปเบฒเบฎเปเบงเบกเบเบตเปเปเบเบฑเบเบญเบฑเบเบเบฐเบฅเบฒเบ เปเบฅเบฐ ORs ะธPostgreSQL Antipatterns: เบเบดเบเบฒเบเปเบฅเบทเปเบญเบเบเบญเบเบเบฒเบเบเบฑเบเบเบธเบเปเบซเบกเปเบเบญเบเบเบฒเบเบเบปเปเบเบซเบฒเปเบเบเบเบทเป, เบซเบผเบท "เบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฑเบเบเบทเบเปเบเบเปเบญเบเปเบฅเบฐเบญเบญเบเปเบ" .เบชเบฐเบเบฑเบเบเบปเปเบงเปเบ เบชเบฑเปเบเปเบฅเบทเบญเบเบเปเบงเบเบซเบผเบฒเบเบเบธเปเบก (เปเบฅเบฐเบเปเปเบเบฝเบเปเบเปเบชเปเบฒเบฅเบฑเบเบเบนเปเบเบญเบ const / NULL) เปเบกเปเบเบชเบปเบเบเบฐเบเบฒเปเบเบเบปเบเบเบงเบฒเบก
SQL HowTo: เบเบฝเบ while-loop เปเบเบเบเบปเบเปเบเบเบฒเบเบชเบญเบเบเบฒเบก, เบซเบผเบท "เบเบฐเบเบปเบกเบชเบฒเบกเบเบฒเบ" .
#4: เบเบงเบเปเบฎเบปเบฒเบญเปเบฒเบเบซเบผเบฒเบเปเบเบตเบเปเบ
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบเบฒเบกเบเบปเบเบฅเบฐเบเบฝเบ, เบกเบฑเบเปเบเบตเบเบเบทเปเบเปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบเปเบญเบเบเบฒเบ "เปเบเบเบเบปเบงเบเบญเบเบญเบทเปเบ" เบเบฑเบเบเปเบฒเบฎเปเบญเบเบเปเบเบตเปเบกเบตเบขเบนเป.
"เปเบฅเบฐเปเบเบปเปเบฒเบเปเปเบกเบตเบเบทเบเบฑเบ, เปเบเป เบกเบตเบเบธเปเบกเปเบเปเบกเบธเบ? ยป เบฎเบนเบเปเบเบปเบฒ "เบกเบทเปเบเบฑเบ"
เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเปเบเปเปเบเบงเบฝเบเบเบฒเบเบเปเบฒเบเปเบเบดเบ, เบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ 20 เบเปเบฒเบฎเปเบญเบเบเป "เบชเปเบฒเบเบฑเบ" เบเบตเปเปเบเบปเปเบฒเปเบเปเบเบตเปเบชเบธเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบธเบเปเบเปเบ, เปเบเบเบเปเปเบเปเบฒเบเบถเบเปเบเบดเบเบเบธเบเบเบฐเบชเบปเบเบเบญเบเบเบงเบเปเบเบปเบฒ.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& 5 ร rows < RRbF -- ะพััะธะปัััะพะฒะฐะฝะพ >80% ะฟัะพัะธัะฐะฝะฝะพะณะพ
&& loops ร RRbF > 100 -- ะธ ะฟัะธ ััะพะผ ะฑะพะปััะต 100 ะทะฐะฟะธัะตะน ััะผะผะฐัะฝะพ
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เบชเปเบฒเบ [เปเบเบตเปเบกเปเบเบตเบก] เบเบดเปเบชเบ index เบเบฑเบ WHERE clause เบซเบผเบทเบฅเบงเบกเปเบญเบปเบฒเบเปเบญเบเบเปเปเบกเบนเบเปเบเบตเปเบกเปเบเบตเบกเปเบเบเบฑเบเบเบฐเบเบต.
เบเปเบฒเปเบเบทเปเบญเบเปเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบกเปเบ "static" เบชเปเบฒเบฅเบฑเบเบงเบฝเบเบเบฒเบเบเบญเบเบเปเบฒเบ - เบเบฑเปเบเปเบกเปเบ เบเปเปเบฅเบงเบกเบเบฒเบเบเบฐเบซเบเบฒเบ เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบกเบนเบเบเปเบฒเปเบเบญเบฐเบเบฒเบเบปเบ - เบกเบฑเบเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเปเบเปเบเบฑเบเบชเบฐเบเบต 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 เปเบเบปเปเบฒ.
#5: เบเบฒเบเบฐเบฅเบฒเบเบเบฐเปเบเบเบเบฐเบเบฒเบ
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบเปเบฒเบเปเปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบเบดเบงเบเบฒเบเบเบธเบเปเบเปเบเบงเบฝเบเบเบฒเบเบเบญเบเบเปเบฒเบเปเบญเบ, เปเบกเบทเปเบญเบเปเบฒเบเบงเบเบเบฒเบเบเบฑเบเบเบธเบ / เบเบฒเบเบฅเบถเบเบเบฑเบเบเบถเบเปเบเบเบฒเบเบฐเบฅเบฒเบเบเปเบฒเบเบงเบเบซเบฅเบฒเบเปเบฎเบฑเบเปเบซเปเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบญเบเบเบฑเบเบเบถเบ "เบเบฒเบ" เบเปเบฒเบเบงเบเบซเบฅเบฒเบ.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& loops ร (rows + RRbF) < (shared hit + shared read) ร 8
-- ะฟัะพัะธัะฐะฝะพ ะฑะพะปััะต 1KB ะฝะฐ ะบะฐะถะดัั ะทะฐะฟะธัั
&& shared hit + shared read > 64
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เบเบฐเบเบดเบเบฑเบเบเปเบงเบเบเบปเบเปเบญเบเปเบเบฑเบเบเบปเบเบเบฐเบเบด เบชเบนเบเบเบฒเบเบฒเบ [FULL] เบซเบผเบทเบเบฑเบเบฅเบธเบเบฒเบเบเบธเบเปเบเปเบเปเบฅเบทเปเบญเบเปเบขเปเบฒเบเบเบฝเบเบเป
เปเบเบเปเบฅเบฐเบเบตเบซเบผเบฒเบเบเบตเปเบชเบธเบ, เบเบฑเบเบซเบฒเบเบฑเปเบเบเปเบฒเบงเปเบกเปเบเปเบเบตเบเบกเบฒเบเบฒเบเบฎเบนเบเปเบเบเบเบฒเบเบชเบญเบเบเบฒเบกเบเบตเปเบเปเปเบเบตเปเบกเบทเปเบญเบเบทเบเปเบญเบตเปเบเบเบฒเบเปเบซเบเบเบปเบเบเบฒเบเบเบธเบฅเบฐเบเบดเบ, เปเบเบฑเปเบเบงเปเบฒเบเบฒเบเบชเบปเบเบเบฐเบเบฒเปเบ.
PostgreSQL Antipatterns: เบเปเปเบชเบนเปเบเบฑเบ hordes เบเบญเบ "เบเบฒเบ" .เปเบเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเปเบเบปเปเบฒเปเบเบงเปเบฒเปเบเบดเบเปเบกเปเบเบงเปเบฒ VACUUM FULL เบเปเปเบเปเปเบชเบฒเบกเบฒเบเบเปเบงเบเปเบเปเบชเบฐเปเปเบต. เบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบง, เบเปเบฒเบเบเบงเบเบเบธเปเบเปเบเบตเบเบเบฑเบ algorithm เบเบฒเบเบเบปเบเบเบงเบฒเบก.
DBA: เปเบกเบทเปเบญ VACUUM เบเปเบฒเบเปเบ, เบเบงเบเปเบฎเบปเบฒเปเบฎเบฑเบเบเบงเบฒเบกเบชเบฐเบญเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเปเบงเบเบเบปเบเปเบญเบ .
#6: เบญเปเบฒเบเบเบฒเบ "เบเบฒเบ" เบเบญเบเบเบฑเบเบเบฐเบเบต
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบกเบฑเบเปเบเบดเปเบเบเบทเบงเปเบฒเบเบงเบเปเบเบปเบฒเบญเปเบฒเบเปเบฅเบฑเบเบเปเบญเบ, เปเบฅเบฐเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบเปเบเบทเบเบเบฑเบเบชเบฐเบเบต, เปเบฅเบฐเบเบงเบเปเบเบปเบฒเบเปเปเปเบเปเบเบฑเปเบเบเบญเบเปเบเปเบเบตเปเบกเปเบเบตเบก - เปเบเปเบเบฑเบเบกเบตเบซเบเปเบฒเบซเบผเบฒเบเบซเบผเบฒเบเบเบตเปเบญเปเบฒเบเบซเบผเบฒเบเบเบงเปเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบ.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> Index [Only] Scan [Backward]
&& loops ร (rows + RRbF) < (shared hit + shared read) ร 8
-- ะฟัะพัะธัะฐะฝะพ ะฑะพะปััะต 1KB ะฝะฐ ะบะฐะถะดัั ะทะฐะฟะธัั
&& shared hit + shared read > 64
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เบเบงเบเปเบเบดเปเบเปเบเบเบชเปเบฒเบเบเบญเบเบเบฑเบเบเบฐเบเบตเบเบตเปเบเปเบฒเปเบเปเปเบฅเบฐเบเบฒเบเบชเบฐเบซเบเบฒเบกเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบเปเบเบเบชเบญเบเบเบฒเบก - เบชเปเบงเบเบซเบผเบฒเบเบญเบฒเบเบเบฐ, เบชเปเบงเบเบเบฑเบเบชเบฐเบเบตเบเปเปเปเบเปเบเบฑเปเบ. เบชเปเบงเบเบซเบผเบฒเบเปเบเบปเปเบฒเบเบฐเบเปเบญเบเบชเปเบฒเบเบเบฑเบเบชเบฐเบเบตเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ, เปเบเปเบเปเปเบกเบต prefix fields, เบซเบผเบท
เบเบปเบงเบขเปเบฒเบ:
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: เบเบญเบเบซเบฒเบเบฑเบเบชเบฐเบเบตเบเบตเปเบเปเปเบกเบตเบเบฐเปเบซเบเบ .
#7: CTE ร CTE
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เปเบเบเบฒเบเบฎเปเบญเบเบเป เปเบเปเบเบฐเปเบเบ "เปเบเบกเบฑเบ" CTE เบเบฒเบเบเบฒเบเบฐเบฅเบฒเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฑเบเบชเบดเบเปเบเปเบฎเบฑเบเบฅเบฐเบซเบงเปเบฒเบเปเบเบปเบฒเปเบเบปเปเบฒ JOIN
.
เบเปโเบฅเบฐโเบเบตโเบเบตเปโเบเปเบฝเบงโเบเปเบญเบโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเบชเบฐโเบเบฑเบโเบเปเบฒเบโเบฅเบธเปเบกโเบเบตเป v12 เบซเบผเบทโเบเบฒเบโเบฎเปเบญเบโเบเปโเบเบฑเบโ WITH MATERIALIZED
.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> CTE Scan
&& loops > 10
&& loops ร (rows + RRbF) > 10000
-- ัะปะธัะบะพะผ ะฑะพะปััะพะต ะดะตะบะฐััะพะฒะพ ะฟัะพะธะทะฒะตะดะตะฝะธะต CTE
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เบงเบดเปเบเบฒเบฐเบเปเบฒเบฎเปเบญเบเบเปเบขเปเบฒเบเบฅเบฐเบญเบฝเบ
#8: swap to disk ( temp เบเบฝเบโ)
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบเบฒเบเบเบฐเบกเบงเบเบเบปเบเบเบฑเปเบเบเบฝเบง (เบเบฒเบเบเบฑเบเบฎเบฝเบเบซเบผเบทเบเบฒเบเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบ) เบเบญเบเบเบฑเบเบเบถเบเบเปเบฒเบเบงเบเบซเบฅเบฒเบเบเปเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบตเปเบเบฑเบเบชเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> *
&& temp written > 0
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เบเปเบฒเบเปเบฒเบเบงเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบตเปเปเบเปเปเบเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเปเปเบเบตเบเบกเบนเบเบเปเบฒเบเบตเปเบเปเบฒเบเบปเบเปเบงเปเบเบญเบเบเบฒเบฅเบฒเบกเบดเปเบเบต SET [LOCAL]
เบชเปเบฒเบฅเบฑเบเบเบฒเบเบฎเปเบญเบเบเป / เบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒเบชเบฐเปเบเบฒเบฐ.
เบเบปเบงเบขเปเบฒเบ:
SHOW work_mem;
-- "16MB"
SELECT
random()
FROM
generate_series(1, 1000000)
ORDER BY
1;
เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบ:
SET work_mem = '128MB'; -- ะฟะตัะตะด ะฒัะฟะพะปะฝะตะฝะธะตะผ ะทะฐะฟัะพัะฐ
เบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบตเปเบเบฑเบเปเบเบ, เบเปเบฒเบเบฝเบเปเบเปเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบทเบเบเปเบฒเปเบเปเปเบฅเบฐเบเปเปเปเบกเปเบเปเบเปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฒเบเบชเบญเบเบเบฒเบกเบเบฐเปเบงเบเบถเปเบเบซเบผเบฒเบ. เปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เบเบฒเบเบชเปเบงเบเบเบญเบเบเบฒเบเปเบซเบผเบเบเบฑเบเบเบทเบเปเบเบเบเปเบฒเบเบญเบญเบเบเบฒเบ HDD.
เปเบเปเบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบปเปเบฒเปเบเบงเปเบฒเบเบฒเบเบเบฑเบเบชเบฑเบเบเบงเบฒเบกเบเบปเบเบเปเบฒเบซเบผเบฒเบเบเบฐเบเปเปเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเบชเบฐเปเบซเบกเบต - เบกเบฑเบเบเปเปเบเบฝเบเบเปเบชเปเบฒเบฅเบฑเบเบเบธเบเบเบปเบ.
#9: เบชเบฐเบเบดเบเบดเบเบตเปเบเปเปเบเปเบฝเบงเบเปเบญเบ
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบซเบผเบฒเบโเบขเปเบฒเบโเปเบเปโเบเบทเบโเบเบญเบโเบฅเบปเบโเปเบชเปโเบเบฒเบโเปเบโเปเบงโเบฅเบฒโเบเบฝเบง, เปเบเปโเบเบงเบโเปเบเบปเบฒโเปเบเบปเปเบฒโเบเปเปโเบกเบตโเปเบงโเบฅเบฒโเบเบตเปโเบเบฐโเบเบฑเบโเบฅเบปเบโเบกเบฑเบโเปเบ ANALYZE
.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เปเบเปเบเปเบฒเบเบเบทเบเบฑเบ ANALYZE
.
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเปเบเปเบเบทเบเบญเบฐเบเบดเบเบฒเบเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเปเบ
PostgreSQL Antipatterns: เบชเบฐเบเบดเบเบดเปเบเบฑเบเบซเบปเบงเบซเบเปเบฒเบเบญเบเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบ .
#10: "เบกเบตเบเบฒเบเบขเปเบฒเบเบเบดเบเบเบฒเบ"
เปเบกเบทเปเบญโเปเบเบตเบโเบเบถเปเบ
เบกเบตเบเบฒเบเบฅเบฑเบญเบเบฅเปเบเปเบฒเบเปเบฒเบฎเปเบญเบเบเปเบเบฒเบเปเบเปเบเบเบฑเบ, เบซเบผเบทเบเปเปเบกเบตเบเบฑเบเบเบฐเบเบฒเบเบญเบเบฎเบฒเบเปเบง CPU/hypervisor เบเปเปเบเบฝเบเบเป.
เบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบปเบ
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ัะธัะฐะปะธ ะผะฐะปะพ, ะฝะพ ัะปะธัะบะพะผ ะดะพะปะณะพ
เบเปเปเบชเบฐเปเบซเบเบตเปเบเบฐ
เปเบเปเบเบฒเบเบเบญเบ เบฅเบฐโเบเบปเบโเบเบดเบโเบเบฒเบกโเบเบงเบโเบเบฒโ เปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบฐเบเบฑเบเบซเบผเบทเบเบฒเบเบเปเบฅเบดเปเบเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบตเปเบเบดเบเบเบปเบเบเบฐเบเบด. เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบชเบฐเบเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเบเบฒเบเบเบฑเบเบเบฑเปเบเบเบฐเบเบงเบเบเบฒเบเบเบตเปเบชเปเบฒเบฅเบฑเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเบซเบผเบฒเบเบฎเปเบญเบเบเบปเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com