แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ—แƒ•แƒ˜แƒก แƒฌแƒ˜แƒœ แƒ’แƒแƒ›แƒแƒ•แƒแƒชแƒฎแƒแƒ“แƒ”แƒ— แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒ”แƒ—.tensor.ru - แƒกแƒแƒฏแƒแƒ แƒ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒ’แƒ”แƒ’แƒ›แƒ”แƒ‘แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ แƒ“แƒ แƒ•แƒ˜แƒ–แƒฃแƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก PostgreSQL-แƒ–แƒ”.

แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ˜แƒก 6000-แƒ–แƒ” แƒ›แƒ”แƒขแƒฏแƒ”แƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒจแƒ”แƒฃแƒ›แƒฉแƒœแƒ”แƒ•แƒ”แƒšแƒ˜ แƒ“แƒแƒ แƒฉแƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ›แƒแƒฃแƒกแƒ›แƒ˜แƒœแƒ”แƒ— แƒ›แƒแƒ— แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ "แƒแƒ‘แƒ แƒ”แƒจแƒฃแƒ›แƒ˜แƒกแƒ”แƒ‘แƒ แƒ˜ แƒ’แƒšแƒฃแƒ•แƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒ‘แƒ". ๐Ÿ™‚

แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒ”แƒ แƒ˜แƒแƒ–แƒฃแƒšแƒแƒ“, แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ˜แƒซแƒฃแƒšแƒ”แƒ‘แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒœแƒ”แƒšแƒ˜ แƒ“แƒ โ€žแƒ’แƒแƒ›แƒแƒซแƒฆแƒแƒ แƒ˜โ€œ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜แƒ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ’แƒ”แƒ’แƒ›แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒ—แƒ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ—.

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒชแƒแƒšแƒ™แƒ”แƒฃแƒš แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒก แƒแƒ  แƒ›แƒแƒฃแƒฌแƒ”แƒ•แƒก แƒ“แƒแƒ›แƒแƒฃแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒšแƒแƒ“ แƒ”แƒซแƒ”แƒ‘แƒแƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒแƒ–แƒ” แƒ“แƒแƒงแƒ แƒ“แƒœแƒแƒ‘แƒ˜แƒ— - แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ•แƒฃแƒ—แƒฎแƒ แƒแƒ— แƒ›แƒแƒก แƒ แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒแƒฅ, แƒ แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒ›แƒแƒ˜แƒซแƒ”แƒ‘แƒœแƒแƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜. แƒ แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ—.

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ›แƒแƒ“แƒ˜แƒ—, แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒ”แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜ - แƒ แƒแƒ’แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒ“แƒ แƒ แƒ แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒก แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก.

แƒ—แƒ”แƒ›แƒ˜แƒก แƒฃแƒ™แƒ”แƒ— แƒฉแƒแƒซแƒ˜แƒ แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฏแƒ”แƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒฃแƒกแƒ›แƒ˜แƒœแƒแƒ— แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒก แƒฉแƒ”แƒ›แƒ˜ แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ PGConf.Russia 2020-แƒ–แƒ”แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ  แƒแƒœแƒแƒšแƒ˜แƒ–แƒ–แƒ”:

#1: แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ "แƒ“แƒแƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ”แƒ‘แƒ"

แฒ แƒแƒ“แƒ˜แƒก

แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ— แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ‘แƒแƒšแƒ แƒ˜แƒœแƒ•แƒแƒ˜แƒกแƒ˜ "แƒจแƒžแƒก แƒ™แƒแƒšแƒแƒ™แƒแƒšแƒฉแƒ˜แƒ™แƒ˜".

แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒแƒ—

-> 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;

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ”แƒ•แƒ—, แƒ แƒแƒ› แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ— 100-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ™แƒšแƒ“แƒ, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒšแƒแƒ’แƒ“แƒ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ“แƒแƒ แƒฉแƒ.

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

DROP INDEX tbl_fk_cli_idx;
CREATE INDEX ON tbl(fk_cli, pk DESC); -- ะดะพะฑะฐะฒะธะปะธ ะบะปัŽั‡ ัะพั€ั‚ะธั€ะพะฒะบะธ

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒแƒกแƒ”แƒ— แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒฃแƒš แƒœแƒ˜แƒ›แƒฃแƒจแƒ–แƒ”แƒช แƒ™แƒ˜ - 8.5-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ“แƒ 33-แƒฏแƒ”แƒ  แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ. แƒ”แƒคแƒ”แƒฅแƒขแƒ˜ แƒฃแƒคแƒ แƒ แƒ›แƒ™แƒแƒคแƒ˜แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ›แƒ˜แƒ— แƒ›แƒ”แƒขแƒ˜ โ€žแƒคแƒแƒฅแƒขแƒ˜โ€œ แƒ’แƒ”แƒฅแƒœแƒ”แƒ‘แƒแƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. fk.

แƒ›แƒ” แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ•, แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒช "แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜" แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒแƒ แƒ˜แƒก แƒฃแƒแƒ แƒ”แƒกแƒ˜, แƒ•แƒ˜แƒ“แƒ แƒ” แƒฌแƒ˜แƒœแƒ แƒกแƒฎแƒ•แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. fk, แƒกแƒแƒ“แƒแƒช แƒ“แƒแƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ”แƒ‘แƒ pk แƒแƒ  แƒ˜แƒงแƒ แƒ“แƒ แƒแƒ  แƒแƒ แƒ˜แƒก (แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ”แƒขแƒ˜ แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฉแƒ”แƒ›แƒก แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘). แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒจแƒ™แƒแƒ แƒ แƒกแƒแƒ’แƒแƒ แƒ”แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒแƒ› แƒกแƒคแƒ”แƒ แƒแƒก แƒ›แƒ˜แƒ”แƒ .

#2: แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ™แƒ•แƒ”แƒ—แƒ (BitmapAnd)

แฒ แƒแƒ“แƒ˜แƒก

แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒœแƒขแƒ แƒแƒฅแƒขแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก "แƒจแƒžแƒก แƒ™แƒแƒšแƒแƒ™แƒแƒšแƒฉแƒ˜แƒ™แƒ˜" แƒ“แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ "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); -- ะพั‚ะฑะพั€ ะฟะพ ะบะพะฝะบั€ะตั‚ะฝะพะน ะฟะฐั€ะต

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

DROP INDEX tbl_fk_org_idx;
CREATE INDEX ON tbl(fk_org, fk_cli);

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒแƒฅ แƒ›แƒแƒ’แƒ”แƒ‘แƒ แƒฃแƒคแƒ แƒ แƒ›แƒชแƒ˜แƒ แƒ”แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ Bitmap Heap Scan แƒ—แƒแƒ•แƒ˜แƒกแƒ—แƒแƒ•แƒแƒ“ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒ. แฒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ˜แƒœแƒช 7-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ“แƒ 2.5-แƒฏแƒ”แƒ  แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ.

#3: แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ (BitmapOr)

แฒ แƒแƒ“แƒ˜แƒก

แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ 20 แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ "แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜" แƒแƒœ แƒ›แƒ˜แƒฃแƒฌแƒ”แƒ แƒ”แƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒฃแƒšแƒแƒ“ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜.

แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒแƒ—

-> BitmapOr
   -> Bitmap Index Scan
   -> Bitmap Index Scan

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ [แƒงแƒ•แƒ”แƒšแƒ] แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒแƒ— แƒฅแƒ•แƒ”แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒ˜แƒก แƒแƒœ แƒ‘แƒšแƒแƒ™แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

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;

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

(
  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, ะฑะพะปัŒัˆะต ะธ ะฝะต ะฝะฐะดะพ

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ”แƒ— แƒ˜แƒ›แƒ˜แƒ—, แƒ แƒแƒ› 20-แƒ•แƒ” แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ˜แƒฅแƒœแƒ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ‘แƒšแƒแƒ™แƒจแƒ˜, แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒ”แƒแƒ แƒ”, แƒฃแƒคแƒ แƒ "แƒซแƒ•แƒ˜แƒ แƒ˜" Bitmap Heap Scan-แƒ˜แƒ—, แƒแƒ แƒช แƒ™แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ - แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“. 22-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜, 44-แƒฏแƒ”แƒ  แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ!

แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒแƒ›แƒ‘แƒแƒ•แƒ˜ แƒแƒ› แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ–แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒจแƒ˜ PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: แƒ›แƒแƒ•แƒœแƒ” แƒจแƒ”แƒ”แƒ แƒ—แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ OR ะธ PostgreSQL Antipatterns: แƒ–แƒฆแƒแƒžแƒแƒ แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒแƒฎแƒ•แƒ”แƒฌแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒแƒœ โ€žแƒฌแƒ˜แƒœ แƒ“แƒ แƒฃแƒ™แƒแƒœ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒโ€œ.

แƒ’แƒแƒœแƒ–แƒแƒ’แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒจแƒ”แƒฃแƒ™แƒ•แƒ”แƒ—แƒ แƒจแƒ”แƒ แƒฉแƒ”แƒ•แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ— (แƒ“แƒ แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฌแƒงแƒ•แƒ˜แƒšแƒ˜ const / NULL) แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜แƒ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ.

#4: แƒฉแƒ•แƒ”แƒœ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ‘แƒ”แƒ•แƒ แƒก แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ—

แฒ แƒแƒ“แƒ˜แƒก

แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒจแƒ˜แƒœ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒกแƒฃแƒ แƒ— โ€žแƒกแƒฎแƒ•แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ’แƒ แƒ”แƒ‘แƒโ€œ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒ–แƒ”.

โ€แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒแƒฅแƒ•แƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ แƒ’แƒแƒšแƒ˜แƒขแƒ˜แƒก แƒฆแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ—? " แƒคแƒ˜แƒšแƒ›แƒ˜ "แƒ‘แƒ แƒ˜แƒšแƒ˜แƒแƒœแƒขแƒ˜แƒก แƒฎแƒ”แƒšแƒ˜"

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒงแƒ•แƒแƒœแƒ˜แƒšแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒ—, แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ— แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ 20 แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ โ€žแƒ™แƒ แƒ˜แƒขแƒ˜แƒ™แƒฃแƒšแƒ˜โ€œ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ, แƒ’แƒแƒœแƒฃแƒ แƒฉแƒ”แƒ•แƒšแƒแƒ“ แƒ›แƒแƒ—แƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ˜แƒกแƒ.

แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒแƒ—

-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
   && 5 ร— rows < RRbF -- ะพั‚ั„ะธะปัŒั‚ั€ะพะฒะฐะฝะพ >80% ะฟั€ะพั‡ะธั‚ะฐะฝะฝะพะณะพ
   && loops ร— RRbF > 100 -- ะธ ะฟั€ะธ ัั‚ะพะผ ะฑะพะปัŒัˆะต 100 ะทะฐะฟะธัะตะน ััƒะผะผะฐั€ะฝะพ

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— [แƒ›แƒ”แƒขแƒ˜] แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ WHERE แƒžแƒฃแƒœแƒฅแƒขแƒ˜แƒ— แƒแƒœ แƒจแƒ”แƒ˜แƒขแƒแƒœแƒ”แƒ— แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒจแƒ˜.

แƒ—แƒฃ แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ "แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜แƒ" แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒ”แƒก แƒแƒ แƒ˜แƒก แƒแƒ  แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒแƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ - แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— WHERE แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜. แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜/แƒ”แƒœแƒฃแƒ› แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒฏแƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒ™แƒแƒขแƒ”แƒ’แƒแƒ แƒ˜แƒแƒจแƒ˜.

แƒ—แƒฃ แƒคแƒ˜แƒšแƒขแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒ˜แƒฆแƒแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒฏแƒแƒ‘แƒก แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ แƒแƒ› แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒแƒ— - แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒ”แƒ›แƒแƒ— 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;

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

CREATE INDEX ON tbl(pk)
  WHERE critical; -- ะดะพะฑะฐะฒะธะปะธ "ัั‚ะฐั‚ะธั‡ะฝะพะต" ัƒัะปะพะฒะธะต ั„ะธะปัŒั‚ั€ะฐั†ะธะธ

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ’แƒ”แƒ’แƒ›แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒคแƒ˜แƒšแƒขแƒ•แƒ แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ’แƒแƒฅแƒ แƒ แƒ“แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ’แƒแƒฎแƒ“แƒ 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

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒ แƒ”แƒ’แƒฃแƒšแƒแƒ แƒฃแƒšแƒแƒ“ แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ— แƒฎแƒ”แƒšแƒ˜แƒ— แƒ•แƒแƒ™แƒฃแƒฃแƒ›แƒ˜ [แƒกแƒ แƒฃแƒšแƒ˜] แƒแƒœ แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒแƒ— แƒแƒ“แƒ”แƒ™แƒ•แƒแƒขแƒฃแƒ แƒแƒ“ แƒฎแƒจแƒ˜แƒ  แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒก แƒแƒ•แƒขแƒแƒ•แƒแƒ™แƒฃแƒฃแƒ›แƒ˜ แƒ›แƒ˜แƒกแƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ–แƒฃแƒกแƒขแƒ”แƒ‘แƒ˜แƒ—, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ›แƒแƒ’แƒ˜แƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฃแƒ›แƒ”แƒขแƒ”แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒแƒกแƒ”แƒ—แƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒฌแƒ•แƒ”แƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒชแƒฃแƒ“แƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ‘แƒ˜แƒ–แƒœแƒ”แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜ PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒ›แƒ™แƒ•แƒ“แƒ แƒ”แƒ‘แƒ˜แƒก" แƒšแƒแƒจแƒฅแƒแƒ แƒ—แƒ แƒ‘แƒ แƒซแƒแƒšแƒ.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒ•แƒ”แƒกแƒ›แƒแƒ“แƒ”แƒก, แƒ แƒแƒ› 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;

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“แƒแƒ, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒฆแƒแƒชแƒœแƒแƒ˜แƒ แƒแƒ“ แƒกแƒแƒ”แƒญแƒ•แƒแƒ - แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒ˜ 20 แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒก 4 แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ”แƒ™แƒšแƒ”แƒ‘แƒ˜แƒœแƒ, แƒ—แƒ˜แƒ—แƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ–แƒ” 32 แƒ™แƒ‘ - แƒ—แƒแƒ›แƒแƒ›แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก? แƒ“แƒ˜แƒแƒฎ แƒ“แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ tbl_fk_org_fk_cli_idx แƒแƒ–แƒ แƒแƒ•แƒœแƒ”แƒ‘แƒแƒ›แƒ“แƒ” แƒ›แƒ˜แƒ•แƒงแƒแƒ•แƒแƒ แƒ—.

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

CREATE INDEX ON tbl(fk_cli);

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒฃแƒชแƒ”แƒ‘ - 10-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒ 4-แƒฏแƒ”แƒ  แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒฌแƒแƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒแƒ“!

แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒแƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒขแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒกแƒขแƒแƒขแƒ˜แƒ DBA: แƒ˜แƒžแƒแƒ•แƒœแƒ”แƒ— แƒฃแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜.

#7: CTE ร— CTE

แฒ แƒแƒ“แƒ˜แƒก

แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ— แƒ’แƒแƒ˜แƒขแƒแƒœแƒ "แƒ›แƒกแƒฃแƒฅแƒแƒœแƒ˜" CTE แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ JOIN.

แƒกแƒแƒฅแƒ›แƒ” แƒ”แƒฎแƒ”แƒ‘แƒ v12 แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒงแƒ•แƒแƒœแƒ˜แƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒก แƒแƒœ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒก WITH MATERIALIZED.

แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒแƒ—

-> CTE Scan
   && loops > 10
   && loops ร— (rows + RRbF) > 10000
      -- ัะปะธัˆะบะพะผ ะฑะพะปัŒัˆะพะต ะดะตะบะฐั€ั‚ะพะฒะพ ะฟั€ะพะธะทะฒะตะดะตะฝะธะต CTE

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ CTE-แƒ”แƒ‘แƒ˜ แƒแƒฅ แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒแƒ? แƒ—แƒฃ แƒ™แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— "แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜" hstore/json-แƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— PostgreSQL Antipatterns: Dictionary Hit Heavy JOIN.

#8: แƒ“แƒ˜แƒกแƒ™แƒ–แƒ” แƒจแƒ”แƒชแƒ•แƒšแƒ (แƒขแƒ”แƒ›แƒžแƒ”แƒ แƒแƒขแƒฃแƒ แƒ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ)

แฒ แƒแƒ“แƒ˜แƒก

แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒฏแƒ”แƒ แƒแƒ“แƒ˜ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ (แƒ“แƒแƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ”แƒ‘แƒ แƒแƒœ แƒฃแƒœแƒ˜แƒ™แƒ˜แƒ–แƒแƒชแƒ˜แƒ) แƒแƒ  แƒฏแƒ“แƒ”แƒ‘แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒš แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒจแƒ˜.

แƒ แƒแƒ’แƒแƒ  แƒแƒ›แƒแƒ•แƒ˜แƒชแƒœแƒแƒ—

-> *
   && temp written > 0

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒ—แƒฃ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒแƒ  แƒแƒฆแƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒ“แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒš แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก work_mem, แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ“แƒ”แƒก. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒจแƒ”แƒ˜แƒงแƒ•แƒแƒœแƒแƒ— แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒแƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— SET [LOCAL] แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก/แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

SHOW work_mem;
-- "16MB"

SELECT
  random()
FROM
  generate_series(1, 1000000)
ORDER BY
  1;

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—:

SET work_mem = '128MB'; -- ะฟะตั€ะตะด ะฒั‹ะฟะพะปะฝะตะฝะธะตะผ ะทะฐะฟั€ะพัะฐ

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ—แƒฃ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ แƒ แƒ“แƒ˜แƒกแƒ™แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“. แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ 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 -- ั‡ะธั‚ะฐะปะธ ะผะฐะปะพ, ะฝะพ ัะปะธัˆะบะพะผ ะดะพะปะณะพ

แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ แƒ” แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒšแƒแƒ™แƒ•แƒ˜แƒก แƒแƒœ แƒแƒ แƒแƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ— แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ› แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒแƒ แƒ’แƒแƒœแƒ˜แƒ–แƒ”แƒ‘แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒ–แƒ”. แƒแƒฅ ะธ แƒแƒฅ.

แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
แƒ แƒ”แƒชแƒ”แƒžแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒแƒ“แƒ›แƒงแƒแƒคแƒ˜ SQL แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ