āĻŽāĻžāĻ¸ āĻāĻ¤āĻ āĻĒā§āĻ°ā§āĻŦā§
āĻāĻĒāĻ¨āĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻŋ 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: āĻ¸ā§āĻāĻ āĻā§āĻĻ (āĻŦāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒāĻāĻ¨ā§āĻĄ)
āĻ¯āĻāĻ¨ āĻāĻĻāĻ¯āĻŧ āĻšāĻ¯āĻŧ
āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ "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);
āĻāĻāĻžāĻ¨ā§ āĻĒā§āĻ āĻĢ āĻāĻŽ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻŦāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻšāĻŋāĻĒ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻ¨āĻŋāĻā§āĻ āĻŦā§āĻļ āĻāĻžāĻ°ā§āĻ¯āĻāĻ°āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻžāĻ āĻšā§āĻ 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āĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ°ā§āĻāĻ°ā§āĻĄ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻ¤āĻžāĻ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻāĻŋ, āĻāĻ°āĻ "āĻŦā§āĻ¯āĻ¯āĻŧāĻŦāĻšā§āĻ˛" āĻŦāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻšāĻŋāĻĒ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻš, āĻāĻŽāĻ¨āĻāĻŋ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ - āĻļā§āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ 22 āĻā§āĻŖ āĻĻā§āĻ°ā§āĻ¤, 44 āĻā§āĻŖ āĻāĻŽ āĻĒāĻĄāĻŧāĻž!
āĻāĻ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāĻžāĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻ°ā§ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻāĻ˛ā§āĻĒ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻĒāĻĄāĻŧāĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§
āĻĒā§āĻ¸ā§āĻāĻā§āĻ°ā§āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻ ā§āĻ¯āĻžāĻ¨ā§āĻāĻŋāĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨āĻ¸: āĻā§āĻˇāĻ¤āĻŋāĻāĻžāĻ°āĻ āĻ¯ā§āĻāĻĻāĻžāĻ¨ āĻāĻŦāĻ āĻāĻāĻ° иāĻĒā§āĻ¸ā§āĻāĻā§āĻ°ā§āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻ ā§āĻ¯āĻžāĻ¨ā§āĻāĻŋāĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨āĻ¸: āĻ¨āĻžāĻŽā§āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋāĻŽā§āĻ˛āĻ āĻĒāĻ°āĻŋāĻŽāĻžāĻ°ā§āĻāĻ¨āĻžāĻ° āĻāĻ˛ā§āĻĒ, āĻŦāĻž "āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāĻ°āĻž āĻāĻŦāĻ āĻ¸āĻžāĻŽāĻ¨ā§āĻ° āĻĻāĻŋāĻā§" .āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻā§āĻā§āĻ˛āĻŋāĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ā§āĻ° āĻāĻĻā§āĻļ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§ (āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 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 āĻ¸ā§āĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻžāĻ˛āĨ¤ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻŦā§āĻ˛āĻŋāĻ¯āĻŧāĻžāĻ¨/āĻāĻ¨āĻžāĻŽ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻžāĻ¸ āĻāĻ āĻā§āĻ¯āĻžāĻāĻžāĻāĻ°āĻŋāĻ¤ā§ āĻāĻžāĻ˛ā§āĻāĻžāĻŦā§ āĻĢāĻŋāĻ āĻāĻ°ā§āĨ¤
āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻŋāĻ āĻ āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻĨāĻžāĻāĻ˛ā§ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻ āĻ°ā§āĻĨ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻ¸ā§āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻāĻ°āĻž āĻāĻžāĻ˛ - āĻ¯ā§āĻŽāĻ¨āĻāĻŋ āĻŦāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻāĻŦāĻ āĻāĻĒāĻ°ā§āĻ° āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻŽāĻ¤ā§āĨ¤
āĻāĻĻāĻžāĻšāĻ°āĻŖ:
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
āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ
āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻāĻāĻ āĻŦāĻšāĻ¨ āĻā§āĻ¯āĻžāĻā§āĻ¯āĻŧāĻžāĻŽ [āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ] āĻŦāĻž āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ āĻāĻ¨ āĻāĻ¨ āĻĒā§āĻ°āĻļāĻŋāĻā§āĻˇāĻŖ āĻ
āĻ°ā§āĻāĻ¨ āĻāĻ°ā§āĻ¨
āĻŦā§āĻļāĻŋāĻ°āĻāĻžāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻā§āĻ˛āĻŋ āĻāĻžāĻ°āĻžāĻĒ āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§ āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāĻ¨ā§āĻ° āĻāĻžāĻ°āĻŖā§ āĻ¸ā§āĻˇā§āĻ āĻšāĻ¯āĻŧ āĻ¯āĻāĻ¨ āĻŦāĻŋāĻāĻ¨ā§āĻ¸ āĻ˛āĻāĻŋāĻ āĻĨā§āĻā§ āĻāĻ˛ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¯ā§āĻŽāĻ¨ āĻāĻ˛ā§āĻāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
āĻĒā§āĻ¸ā§āĻāĻā§āĻ°ā§āĻāĻ¸āĻāĻŋāĻāĻāĻ˛ āĻ ā§āĻ¯āĻžāĻ¨ā§āĻāĻŋāĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨āĻ¸: "āĻŽā§āĻ¤āĻĻā§āĻ°" āĻ¸ā§āĻ¨ā§āĻ¯āĻĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ˛āĻĄāĻŧāĻžāĻ āĻāĻ°āĻž .āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻŦā§āĻāĻ¤ā§ āĻšāĻŦā§ āĻ¯ā§ āĻāĻŽāĻ¨āĻāĻŋ āĻā§āĻ¯āĻžāĻā§āĻ¯āĻŧāĻžāĻŽ āĻĢā§āĻ˛ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻžāĨ¤ āĻāĻ āĻāĻžāĻ¤ā§āĻ¯āĻŧ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻĨā§āĻā§ āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¨āĻŋāĻā§āĻā§ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻāĻ°āĻž āĻŽā§āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨
āĻĄāĻŋāĻŦāĻŋāĻ: āĻā§āĻ¯āĻžāĻā§āĻ¯āĻŧāĻžāĻŽ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ˛ā§, āĻāĻŽāĻ°āĻž āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻā§āĻŦāĻŋāĻ˛āĻāĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻāĻžāĻ° āĻāĻ°āĻŋ .
#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: āĻ āĻā§āĻā§ āĻ¸ā§āĻā§ āĻā§āĻāĻāĻž .
#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'; -- ĐŋĐĩŅĐĩĐ´ вŅĐŋĐžĐģĐŊĐĩĐŊиĐĩĐŧ СаĐŋŅĐžŅĐ°
āĻ¸ā§āĻ¸ā§āĻĒāĻˇā§āĻ āĻāĻžāĻ°āĻŖā§, āĻ¯āĻĻāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŽā§āĻŽāĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻĄāĻŋāĻ¸ā§āĻ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§ āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻŋ āĻ āĻ¨ā§āĻ āĻĻā§āĻ°ā§āĻ¤ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻšāĻŦā§āĨ¤ āĻāĻāĻ āĻ¸āĻŽāĻ¯āĻŧā§, HDD āĻĨā§āĻā§ āĻ˛ā§āĻĄā§āĻ° āĻ āĻāĻļāĻ āĻ¸āĻ°āĻžāĻ¨ā§ āĻšāĻ¯āĻŧāĨ¤
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻŦā§āĻāĻ¤ā§ āĻšāĻŦā§ āĻ¯ā§ āĻāĻĒāĻ¨āĻŋ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻĒā§āĻ°āĻā§āĻ° āĻāĻŦāĻ āĻĒā§āĻ°āĻā§āĻ° āĻŽā§āĻŽāĻ°āĻŋ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§āĻ¨ āĻ¨āĻž - āĻ¸ā§āĻāĻžāĻ¨ā§ āĻ¸āĻŦāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯āĻĨā§āĻˇā§āĻ āĻšāĻŦā§ āĻ¨āĻžāĨ¤
#9: āĻ āĻĒā§āĻ°āĻžāĻ¸āĻā§āĻāĻŋāĻ āĻĒāĻ°āĻŋāĻ¸āĻāĻā§āĻ¯āĻžāĻ¨
āĻ¯āĻāĻ¨ āĻāĻĻāĻ¯āĻŧ āĻšāĻ¯āĻŧ
āĻ¤āĻžāĻ°āĻž āĻāĻāĻŦāĻžāĻ°ā§ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ
āĻ¨ā§āĻ āĻāĻŋāĻā§ āĻĸā§āĻ˛ā§ āĻĻāĻŋāĻ¯āĻŧā§āĻā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŋ āĻĻā§āĻ°ā§ āĻ¸āĻ°āĻŋāĻ¯āĻŧā§ āĻĻā§āĻāĻ¯āĻŧāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŋāĻ˛ āĻ¨āĻž ANALYZE
.
āĻāĻŋāĻāĻžāĻŦā§ āĻ¸āĻ¨āĻžāĻā§āĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& ratio >> 10
āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ
āĻāĻāĻž āĻŦāĻšāĻ¨ āĻāĻ°ā§ āĻ¨āĻžāĻ ANALYZE
.
āĻāĻ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻāĻ°āĻ āĻŦāĻŋāĻļāĻĻā§ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
PostgreSQL Antipatterns: āĻĒāĻ°āĻŋāĻ¸āĻāĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻŦāĻāĻŋāĻā§ .
#10: "āĻāĻŋāĻā§ āĻā§āĻ˛ āĻšāĻ¯āĻŧā§āĻā§"
āĻ¯āĻāĻ¨ āĻāĻĻāĻ¯āĻŧ āĻšāĻ¯āĻŧ
āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§āĻā§ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ°ā§āĻĒāĻŋāĻ¤ āĻāĻāĻāĻŋ āĻ˛āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻŋāĻ˛, āĻ āĻĨāĻŦāĻž āĻ āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ CPU/āĻšāĻžāĻāĻĒāĻžāĻ°āĻāĻžāĻāĻāĻžāĻ° āĻšāĻžāĻ°ā§āĻĄāĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻŋāĻ˛āĨ¤
āĻāĻŋāĻāĻžāĻŦā§ āĻ¸āĻ¨āĻžāĻā§āĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- ŅиŅĐ°Đģи ĐŧĐ°ĐģĐž, ĐŊĐž ŅĐģиŅĐēĐžĐŧ Đ´ĐžĐģĐŗĐž
āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ
āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻ¨ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻŦā§āĻ˛āĻāĻŋāĻ āĻŦāĻž āĻ
āĻ¸ā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻ¸āĻŽā§āĻĒāĻĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°āĨ¤ āĻāĻŽāĻ°āĻž āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻļāĻ¤ āĻļāĻ¤ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋ āĻ¸āĻāĻāĻ āĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛ā§āĻāĻŋ
āĻāĻ¤ā§āĻ¸: www.habr.com