рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВ

рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ PostgreSQL рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реЗрд╡рд╛ , рд╕рдордЭрд╛рдиреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреА ред

рдкрд┐рдЫрд▓реЗ рд╕рдордп рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ 6,000 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдВрдХреЗрдд рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:



рдЙрдиреНрд╣реЗрдВ рд╕реБрдиреЗрдВ рдФрд░ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз "рдЪрд┐рдХрдиреА рдФрд░ рд░реЗрд╢рдореА рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред" :)

рд▓реЗрдХрд┐рди рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдзреАрдорд╛ рдФрд░ "рд▓рд╕рджрд╛рд░" рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдХрдИ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рдиреА рд╣реЛрдЧреА, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП - рд╣рдо рдЙрд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛ред



рдЖрдЗрдП рдЗрди рдорд╛рдорд▓реЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ - рд╡реЗ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдХрд┐рди рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред

рд╡рд┐рд╖рдп рдореЗрдВ рдмреЗрд╣рддрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ 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;


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ ред.tensor.ru] рдЖрдк

рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ 100 рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рдЫрд╛рдВрдЯреЗ рдЧрдП рдереЗ, рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрдЪрд╛ рдерд╛ред

рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ:

DROP INDEX tbl_fk_cli_idx;
CREATE INDEX ON tbl(fk_cli, pk DESC); --   


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрджрд┐рдо рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде - 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); --    


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ редensor.ru]

рд╕рд╣реА:

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


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рдпрд╣рд╛рдБ рд▓рд╛рдн рдХрдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдЯрдореИрдк рд╣реАрдк рд╕реНрдХреИрди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА 7 рдЧреБрдирд╛ рддреЗрдЬ рдФрд░ 2.5 рдЧреБрдирд╛ рдХрдо рд░реАрдбрд┐рдВрдЧ рд╣реИ ред

# 3: рдЗрдВрдбреЗрдХреНрд╕ рдкреВрд▓рд┐рдВрдЧ (рдмрд┐рдЯрдореИрдкрдСрд░)


рдЬрдм рдЙрдарддрд╛ рд╣реИ


рдкрд╣рд▓реЗ 20 рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ "рд╕реНрд╡рдпрдВ" рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЙрдирдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджрд┐рдЦрд╛рдПрдВред

рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдиреЗрдВ?


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

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рд╢рд░реНрддреЛрдВ рдХреЗ OR рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UNION [ALL] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

рдЙрджрд╛рд╣рд░рдг:

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;


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ редensor.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,    


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдХрд┐ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА 20 рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдХреЙрд░реНрдб рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░рд╛ "рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛" рдмрд┐рдЯрдореИрдк рд╣реАрдк рд╕реНрдХреИрди рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк , 22% рддреЗрдЬреА рд╕реЗред 44 рдЧреБрдирд╛ рдХрдо рдкрдарди !

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдХрд╣рд╛рдиреА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реАрдХреНрдпреВрдПрд▓ рдПрдВрдЯрд┐рдкрд░реНрдЯреЗрдВрд╕ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ : рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдЬреЛрдЗрди рдФрд░ рдУрдЖрд░ рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдПрдВрдЯрд┐рдкреЗрдЯрд░реНрди: рдпрд╣ рдирд╛рдо рд╕реЗ рдЦреЛрдЬ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ, рдпрд╛ "рд╡рд╣рд╛рдВ рдФрд░ рд╡рд╛рдкрд╕ рдЕрдиреБрдХреВрд▓рди" ред рдПрд╕рдХреНрдпреВрдПрд▓ рд╣реЙрд╡реНрдЯреЛ рд▓реЗрдЦ рдореЗрдВ рдХрдИ рдХреБрдВрдЬрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢рд┐рдд рдЪрдпрди

рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг (рдФрд░ рди рдХреЗрд╡рд▓ рдХреЙрдиреНрд╕реНрдЯ / NULL рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ : рд╣рдо рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕реАрдзреЗ рд▓реВрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпрд╛ "рдПрд▓рд┐рдореЗрдВрдЯреНрд░реА рдереНрд░реА-рд╡реЗ" ред

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


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ редensor.ru]

рд╕рд╣реА:

CREATE INDEX ON tbl(pk)
  WHERE critical; --  ""  


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.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

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ VACUUM [FULL] рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЗ рдЬрд╛рдПрдВ рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдЯреНрдпреВрдирд┐рдВрдЧ рдХрд░рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрд╛рддрд╛рд░ рдСрдЯреЛрд╡реЗрдХреНрдпреВрдо рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЦрд░рд╛рдм рд╕рдВрд░рдЪрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ PostgreSQL Antipatterns рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ : "рдореГрдд" рдХреА рднреАрдбрд╝ рд╕реЗ рд▓рдбрд╝рдирд╛ ред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ VACUUM FULL рднреА рд╣рдореЗрд╢рд╛ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреАрдмреАрдП рд▓реЗрдЦ рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП : рдЬрдм 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;


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЗрдЦреЗрдВред Tensor.ru] рд╕рдм рдХреБрдЫ

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рднреА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрджреЗрд╣ рд╕реЗ - 20 рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЗ 4 рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдкрдбрд╝рд╛, рдкреНрд░рддрд┐ рд░рд┐рдХреЙрд░реНрдб 32KB - рдХреНрдпрд╛ рдпрд╣ рдмреЛрд▓реНрдб рдирд╣реАрдВ рд╣реИ? рд╣рд╛рдВ, рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд╛рдо рд╡рд┐рдЪрд╛рд░реЛрддреНрддреЗрдЬрдХ рд╣реИред рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ:tbl_fk_org_fk_cli_idx



CREATE INDEX ON tbl(fk_cli);


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рдЕрдЪрд╛рдирдХ - 10 рдмрд╛рд░ рддреЗрдЬ рдФрд░ 4 рдмрд╛рд░ рдХрдо рдкрдврд╝реЗрдВ !
рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдЕрдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдбреАрдмреАрдП рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ : рдпреВрдЬрд╝рд▓реЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдЦреЛрдЬреЗрдВ ред

# 7: CTE ├Ч CTE


рдЬрдм рдЙрдарддрд╛ рд╣реИ


рдХреНрд╡реЗрд░реА рдореЗрдВ рд╣рдордиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ "рд╡рд╕рд╛" рд╕реАрдЯреАрдИ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ , рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдмреАрдЪ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ JOINред

рдорд╛рдорд▓рд╛ v12 рд╕реЗ рдиреАрдЪреЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдпрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ WITH MATERIALIZEDред

рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдиреЗрдВ?


-> CTE Scan
   && loops > 10
   && loops ├Ч (rows + RRbF) > 10000
      --     CTE

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ - рдХреНрдпрд╛ рд╕реАрдЯреАрдИ рдХреА рдпрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ? рдпрджрд┐ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ, рддреЛ PostgreSQL Antipatterns рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ hstore / json рдореЗрдВ "рдлрд╛рдбрд╝" рд▓рд╛рдЧреВ рдХрд░реЗрдВ : рдПрдХ рднрд╛рд░реА JOIN рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╣рд┐рдЯ рдХрд░реЗрдВ ред

# 8: рд╕реНрд╡реИрдк рдЯреВ рдбрд┐рд╕реНрдХ (рдЯреЗрдореНрдк рд▓рд┐рдЦрд┐рдд)


рдЬрдм рдЙрдарддрд╛ рд╣реИ


рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдПрдХ-рдмрд╛рд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (рдЫрдВрдЯрдиреА рдпрд╛ рдЕрджреНрд╡рд┐рддреАрдпрдХрд░рдг) рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдиреЗрдВ?


-> *
   && temp written > 0

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рдпрджрд┐ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛рд░реНрдп_рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реЗрдЯ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ , рддреЛ рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЖрдк рддреБрд░рдВрдд рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк SET [LOCAL]рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз / рд▓реЗрди-рджреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг:

SHOW work_mem;
-- "16MB"

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


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ редensor.ru]

рд╕рд╣реА:

SET work_mem = '128MB'; --   


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рд╕реНрдХ рдХрд╛ рдирд╣реАрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдЪрдбреАрдбреА рд╕реЗ рд▓реЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рд╕рднреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

# 9: рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЖрдБрдХрдбрд╝реЗ


рдЬрдм рдЙрдарддрд╛ рд╣реИ


рдЙрдиреНрд╣реЛрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдмрд╣реБрдд рдХреБрдЫ рдбрд╛рд▓рд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛ ANALYZEред

рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдиреЗрдВ?


-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
   && ratio >> 10

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ ANALYZEред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрдпреВрдПрд▓ рдПрдВрдЯрд┐рдкреНрдЯрд░реНрди рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ : рдЖрдВрдХрдбрд╝реЗ рдкреВрд░реЗ рд╕рд┐рд░ рдкрд░ рд╣реИрдВ ред

# 10: "рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛"


рдЬрдм рдЙрдарддрд╛ рд╣реИ


рдПрдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рд▓реЙрдХ рдХреА рдЙрдореНрдореАрдж рдереА, рдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдкреАрдпреВ / рд╣рд╛рдЗрдкрд░рд╡рд┐рдЬрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рдереЗред

рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдиреЗрдВ?


-> *
   && (shared hit / 8K) + (shared read / 1K) < time / 1000
      -- RAM hit = 64MB/s, HDD read = 8MB/s
   && time > 100ms --  ,   

рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ


рддрд╛рд▓реЗ рдпрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рд╕реИрдХрдбрд╝реЛрдВ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рдмрд╛рдд рдХреА рдереА ред



All Articles