เชฎเชนเชฟเชจเชพเช เชชเซเชนเซเชฒเชพ
เชคเชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช เชคเซเชจเซ 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: เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เชเชเชคเชฐเชเซเชฆ (เชฌเซเชเชฎเซเชชเช เชจเซ)
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
โNAO เชฌเชเชฐเชเชชโ เชตเชคเซ เชธเชฎเชพเชชเซเชค เชฅเชฏเซเชฒ เชเซเชฒเชพเชฏเชจเซเช โLLC Kolokolchikโ เชฎเชพเชเซเชจเชพ เชคเชฎเชพเชฎ เชเชฐเชพเชฐเซ เชฌเชคเชพเชตเซ.
เชเซเชตเซ เชฐเซเชคเซ เชเชณเชเชตเซเช
-> 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);
เช เชนเซเช เชเซเชเชตเชฃเซ เชเชเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชฌเซเชเชฎเซเชช เชนเซเชช เชธเซเชเซเชจ เชคเซเชจเชพ เชชเซเชคเชพเชจเชพ เชชเชฐ เชเซเชฌ เช เชธเชฐเชเชพเชฐเช เชเซ. เชชเชฐเชเชคเซ เชเซเชเชชเชฃ เชฐเซเชคเซ 7 เชเชฃเซ เชเชกเชชเซ เช เชจเซ 2.5 เชเชฃเซ เชเชเซ เชตเชพเชเชเชจ.
#3: เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพเชเชจเซ เชฎเชฐเซเช เชเชฐเซ (เชฌเซเชเชฎเซเชชเชเชฐ)
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
เชชเซเชฐเชฅเชฎ 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 เชเชฐเซเชฐเซ เชฐเซเชเซเชฐเซเชกเซเชธ เชคเชฐเชค เช เชชเซเชฐเชพเชชเซเชค เชฅเช เชเชฏเชพ เชนเชคเชพ, เชคเซเชฅเซ เชตเชงเซ "เชเชฐเซเชเชพเชณ" เชฌเซเชเชฎเซเชช เชนเซเชช เชธเซเชเซเชจ เชธเชพเชฅเซเชจเซ เชฌเซเชเซ เชเช เชชเชฃ เช เชฎเชฒเชฎเชพเช เชเชตเซเชฏเซ เชจ เชนเชคเซ - เช เชเชคเซ 22x เชเชกเชชเซ, 44x เชเชเชพ เชตเชพเชเชเชจ!
เช เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจ เชชเชฆเซเชงเชคเชฟ เชตเชฟเชถเซ เชตเชงเซ เชตเชฟเชเชคเชตเชพเชฐ เชตเชพเชฐเซเชคเชพ เชเซเชเซเชเชธ เชเชฆเชพเชนเชฐเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฒเซเชเซเชฎเชพเช เชตเชพเชเชเซ เชถเชเชพเชฏ เชเซ
PostgreSQL เชเชจเซเชเชฟเชชเซเชเชฐเซเชจ: เชนเชพเชจเชฟเชเชพเชฐเช เชเซเชกเชพเช เช เชจเซ ORs ะธเชชเซเชธเซเชเชเซเชฐเซเชเชธเชเซเชฏเซเชเชฒ เชเชจเซเชเชฟเชชเซเชเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซเชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเชเชฐเชฃเชจเซ เชตเชพเชฐเซเชคเชพ, เช เชฅเชตเชพ "เชเชเชณ เช เชจเซ เชเชเชณ เชเชชเซเชเชฟเชฎเชพเชเช เชเชฐเชตเซเช" .เชธเชพเชฎเชพเชจเซเชฏเชเซเชค เชธเชเชธเซเชเชฐเชฃ เช เชจเซเช เชเซเชจเชพ เชเชงเชพเชฐเซ เชชเชธเชเชฆเชเซเชจเซ เชเชฆเซเชถ เชเชชเซเชฏเซ (เช เชจเซ เชฎเชพเชคเซเชฐ const/NULL เชเซเชกเซ เช เชจเชนเซเช) เชฒเซเชเชฎเชพเช เชเชฐเซเชเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ
SQL HowTo: เชเซเชตเซเชฐเซ เช เชฅเชตเชพ "เชชเซเชฐเชพเชฅเชฎเชฟเช เชฅเซเชฐเซ-เชตเซ"เชฎเชพเช เชธเซเชงเชพ เช เชเซเชฏเชพเชฐเซ-เชฒเซเชช เชฒเชเซ .
#4: เชเชชเชฃเซ เชเชฃเซ เชฌเชงเซ เชฌเชฟเชจเชเชฐเซเชฐเซ เชตเชธเซเชคเซเช เชตเชพเชเชเซเช เชเซเช
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
เชเช เชจเชฟเชฏเชฎ เชคเชฐเซเชเซ, เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชฐเชนเซเชฒเซ เชตเชฟเชจเชเชคเซ เชธเชพเชฅเซ "เชฌเซเชเชพ เชซเชฟเชฒเซเชเชฐเชจเซ เชเซเชกเชตเชพ" เชฎเชพเชเชเชคเชพ เชนเซ เชคเซเชฏเชพเชฐเซ เชคเซ เชเชฆเซเชญเชตเซ เชเซ.
"เช เชจเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชคเซ เช เชจเชฅเซ, เชชเชฐเชเชคเซ เชฎเชงเชฐ-เชเชซ-เชชเชฐเซเชฒ เชฌเชเชจเซ เชธเชพเชฅเซ? เชซเชฟเชฒเซเชฎ "เชง เชกเชพเชฏเชฎเชเชก เชเชฐเซเชฎ"
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชชเชฐเซเชเซเชค เชเชพเชฐเซเชฏเชจเซ เชธเชเชถเซเชงเชฟเชค เชเชฐเซเชจเซ, เชคเซเชฎเชจเชพ เชนเซเชคเซเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชงเชพ เชตเชฟเชจเชพ, เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฎเชพเชเซ เชชเซเชฐเชฅเชฎ 20 เชธเซเชฅเซ เชเซเชจเซ "เชเชเชฟเชฒ" เชตเชฟเชจเชเชคเซเช เชฌเชคเชพเชตเซ.
เชเซเชตเซ เชฐเซเชคเซ เชเชณเชเชตเซเช
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& 5 ร rows < RRbF -- ะพััะธะปัััะพะฒะฐะฝะพ >80% ะฟัะพัะธัะฐะฝะฝะพะณะพ
&& loops ร RRbF > 100 -- ะธ ะฟัะธ ััะพะผ ะฑะพะปััะต 100 ะทะฐะฟะธัะตะน ััะผะผะฐัะฝะพ
เชญเชฒเชพเชฎเชฃเซ
[เชตเชงเซ] เชตเชฟเชถเชฟเชทเซเช เชฌเชจเชพเชตเซ WHERE เชถเชฐเชค เชธเชพเชฅเซ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เช เชฅเชตเชพ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพเชฎเชพเช เชตเชงเชพเชฐเชพเชจเชพ เชเซเชทเซเชคเซเชฐเซเชจเซ เชธเชฎเชพเชตเซเชถ เชเชฐเซ.
เชเซ เชคเชฎเชพเชฐเชพ เชนเซเชคเซเช เชฎเชพเชเซ เชซเชฟเชฒเซเชเชฐเชจเซ เชธเซเชฅเชฟเชคเชฟ "เชธเซเชฅเชฟเชฐ" เชเซ - เชคเซ เชเซ เชตเชฟเชธเซเชคเชฐเชฃ เชธเซเชเชฟเชค เชเชฐเชคเซเช เชจเชฅเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชฎเซเชฒเซเชฏเซเชจเซ เชธเซเชเชฟ - WHERE เชเชจเซเชกเซเชเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชตเชงเซ เชธเชพเชฐเซเช เชเซ. เชตเชฟเชตเชฟเชง เชฌเซเชฒเชฟเชฏเชจ/เชเชจเชฎ เชธเซเชเซเชเชธ เช เชเซเชเซเชเชฐเซเชฎเชพเช เชธเชพเชฐเซ เชฐเซเชคเซ เชฌเชเชงเชฌเซเชธเซ เชเซ.
เชเซ เชซเชฟเชฒเซเชเชฐเชฟเชเช เชธเซเชฅเชฟเชคเชฟ เชตเชฟเชตเชฟเชง เช เชฐเซเชฅเซ เชฒเช เชถเชเซ เชเซ, เชคเซ เชชเชเซ เช เชเซเชทเซเชคเซเชฐเซ เชธเชพเชฅเซ เชเชจเซเชกเซเชเซเชธเชจเซ เชตเชฟเชธเซเชคเซเชค เชเชฐเชตเซเช เชตเชงเซ เชธเชพเชฐเซเช เชเซ - เชเซเชฎ เชเซ Bitmap เช เชจเซ เชเชชเชฐเชจเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชฎเชพเช.
เชเชฆเชพเชนเชฐเชฃ:
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
เชญเชฒเชพเชฎเชฃเซ
เชจเชฟเชฏเชฎเชฟเชคเชชเชฃเซ เชเชพเชคเซ เชนเชพเชฅ เชงเชฐเซ เชเซ เชตเซเชเซเชฏเซเชฎ [เชชเซเชฐเซเชฃ] เช
เชฅเชตเชพ เชชเชฐเซเชฏเชพเชชเซเชค เชตเชพเชฐเชเชตเชพเชฐ เชคเชพเชฒเซเชฎ เชชเซเชฐเชพเชชเซเชค เชเชฐเซ
เชฎเซเชเชพ เชญเชพเชเชจเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช, เชเชตเซ เชธเชฎเชธเซเชฏเชพเช เชจเชฌเชณเซ เชเซเชตเซเชฐเซ เชเชฎเซเชชเซเชเชฟเชถเชจเชจเซ เชเชพเชฐเชฃเซ เชฅเชพเชฏ เชเซ เชเซเชฏเชพเชฐเซ เชฌเชฟเชเชจเซเชธ เชฒเซเชเชฟเชเชฎเชพเชเชฅเซ เชเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซเชฎ เชเซ
เชชเซเชธเซเชเชเซเชฐเซเชเชธเชเซเชฏเซเชเชฒ เชเชจเซเชเชฟเชชเซเชเชฐเซเชจ: "เชฎเซเชค" เชจเซ เชฒเชกเชพเช .เชชเชฐเชเชคเซ เชคเชฎเชพเชฐเซ เช เชธเชฎเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ 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 เชฐเซเชเซเชฐเซเชกเซเชธเชฎเชพเชเชฅเซ เชฆเชฐเซเช เชฎเชพเชเซ, เช
เชฎเชพเชฐเซ เชฐเซเชเซเชฐเซเชก เชฆเซเช 4KB เชกเซเชเชพเชจเชพ 32 เชชเซเชทเซเช เซเชจเซ เชฌเชพเชฆ เชเชฐเชตเซ เชชเชกเซเชฏเซ - เชถเซเช เชคเซ เชฌเซเชฒเซเชก เชจเชฅเซ? เช
เชจเซ เชเชจเซเชกเซเชเซเชธ เชจเชพเชฎ 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: เชกเชฟเชธเซเช เชชเชฐ เชธเซเชตเซเชช (เชเซเชฎเซเชชเชฒ เชฒเชเซเชฒเซเช)
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชฐเซเชเซเชฐเซเชกเซเชธเชจเซเช เชตเชจ-เชเชพเชเชฎ เชชเซเชฐเซเชธเซเชธเชฟเชเช (เชธเซเชฐเซเชเชฟเชเช เช เชฅเชตเชพ เชฏเซเชจเชฟเชเชพเชเชเซเชถเชจ) เช เชฎเชพเชเซ เชซเชพเชณเชตเชตเชพเชฎเชพเช เชเชตเซเชฒเซ เชฎเซเชฎเชฐเซเชฎเชพเช เชซเชฟเช เชฅเชคเซเช เชจเชฅเซ.
เชเซเชตเซ เชฐเซเชคเซ เชเชณเชเชตเซเช
-> *
&& temp written > 0
เชญเชฒเชพเชฎเชฃเซ
เชเซ เชเชชเชฐเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเซ เชฎเซเชฎเชฐเซเชจเซ เชฎเชพเชคเซเชฐเชพ เชชเซเชฐเชพเชฎเซเชเชฐเชจเชพ เชเชฒเซเชฒเซเชเชฟเชค เชฎเซเชฒเซเชฏ เชเชฐเชคเชพเช เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชตเชงเซ เชจเชฅเซ SET [LOCAL]
เชเซเชเซเชเชธ เชตเชฟเชจเชเชคเซ/เชตเซเชฏเชตเชนเชพเชฐ เชฎเชพเชเซ.
เชเชฆเชพเชนเชฐเชฃ:
SHOW work_mem;
-- "16MB"
SELECT
random()
FROM
generate_series(1, 1000000)
ORDER BY
1;
เชธเซเชงเชพเชฐเซ เชฐเชนเซเชฏเซเช เชเซ:
SET work_mem = '128MB'; -- ะฟะตัะตะด ะฒัะฟะพะปะฝะตะฝะธะตะผ ะทะฐะฟัะพัะฐ
เชธเซเชชเชทเซเช เชเชพเชฐเชฃเซเชธเชฐ, เชเซ เชซเชเซเชค เชฎเซเชฎเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชกเชฟเชธเซเชเชจเซ เชเชชเชฏเซเช เชฅเชคเซ เชจเชฅเซ, เชคเซ เชเซเชตเซเชฐเซ เชตเชงเซ เชเชกเชชเชฅเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ. เชคเซ เช เชธเชฎเชฏเซ, เชเชเชกเซเชกเซเชฎเชพเชเชฅเซ เชฒเซเชกเชจเซ เชญเชพเช เชชเชฃ เชฆเซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชชเชฐเชเชคเซ เชคเชฎเชพเชฐเซ เช เชธเชฎเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เชเซ เชคเชฎเซ เชนเชเชฎเซเชถเชพ เชเชฃเซ เชฌเชงเซ เช เชจเซ เชเชฃเซ เชฌเชงเซ เชฎเซเชฎเชฐเซ เชซเชพเชณเชตเซ เชถเชเชถเซ เชจเชนเซเช - เชคเซ เชฆเชฐเซเช เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชจเชฅเซ.
#9: เช เชชเซเชฐเชธเซเชคเซเชค เชเชเชเชกเชพ
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
เชคเซเชเช เชเช เช เชธเชฎเชฏเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเชฃเซเช เชฌเชงเซเช เชฐเซเชกเซเชฏเซเช, เชชเชฐเชเชคเซ เชคเซเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชจเชนเซเชคเซ ANALYZE
.
เชเซเชตเซ เชฐเซเชคเซ เชเชณเชเชตเซเช
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
เชญเชฒเชพเชฎเชฃเซ
เชคเซเชจเซ เชฌเชนเชพเชฐ เชฒเช เชเชพเช ANALYZE
.
เช เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชฎเชพเช เชตเชงเซ เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชตเซเชฒ เชเซ
PostgreSQL เชเชจเซเชเชฟเชชเซเชเชฐเซเชจ: เชเชเชเชกเชพ เชฌเชงเซเช เช เชเซ .
#10: "เชเชเชเช เชเซเชเซเช เชฅเชฏเซเช"
เชเซเชฏเชพเชฐเซ เชเชฆเชญเชตเซ เชเซ
เชธเซเชชเชฐเซเชงเชพเชคเซเชฎเช เชตเชฟเชจเชเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชฒเชพเชฆเชตเชพเชฎเชพเช เชเชตเซเชฒ เชฒเซเชเชจเซ เชฐเชพเชน เชเซเชตเชพเช เชฐเชนเซ เชนเชคเซ, เช เชฅเชตเชพ เชคเซเชฏเชพเช เช เชชเซเชฐเชคเชพ CPU/เชนเชพเชฏเชชเชฐเชตเชพเชเชเชฐ เชนเชพเชฐเซเชกเชตเซเชฐ เชธเชเชธเชพเชงเชจเซ เชนเชคเชพ.
เชเซเชตเซ เชฐเซเชคเซ เชเชณเชเชตเซเช
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ัะธัะฐะปะธ ะผะฐะปะพ, ะฝะพ ัะปะธัะบะพะผ ะดะพะปะณะพ
เชญเชฒเชพเชฎเชฃเซ
เชฌเชพเชนเซเชฏ เชเชชเชฏเซเช เชเชฐเซ เชฎเซเชจเซเชเชฐเซเชเช เชธเชฟเชธเซเชเชฎ เช
เชตเชฐเซเชงเชฟเชค เช
เชฅเชตเชพ เช
เชธเชพเชฎเชพเชจเซเชฏ เชธเชเชธเชพเชงเชจ เชตเชชเชฐเชพเชถ เชฎเชพเชเซ เชธเชฐเซเชตเชฐ. เช
เชฎเซ เชธเซเชเชเชกเซ เชธเชฐเซเชตเชฐเซเชธ เชฎเชพเชเซ เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชเซเช เชตเชตเชพเชจเชพ เช
เชฎเชพเชฐเชพ เชธเชเชธเซเชเชฐเชฃ เชตเชฟเชถเซ เชชเชนเซเชฒเซเชฅเซ เช เชตเชพเชค เชเชฐเซ เชเซ
เชธเซเชฐเซเชธ: www.habr.com