рдХреНрд╡реЗрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рдиред PostgreSQL рдореЗрдВ рднрд╛рдЧ рдореВрд▓ рдмрд╛рддреЗрдВ (рднрд╛рдЧ 2)


рдореИрдВ рдЧрд┐рд▓рд┐рдпреВрдо рд▓реЗрд▓рд╛рд░реНрдЬ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рд╕рдордЭ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдВрд╢реЛрдзрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реА рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдореВрд▓ рдкрдврд╝реЗрдВред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ:

рднрд╛рдЧ 1

рдХреИрд╢


рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреМрддрд┐рдХ рд╕реНрддрд░ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ рдЙрдмрдВрдЯреВ 13.10 рдкрд░ рд╣реИред рдУрдПрд╕ рд╕реНрддрд░ рдбрд┐рд╕реНрдХ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ PostgreSQL рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реВрдВ, рдЬрдмрд░рди рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реВрдВ, PostgreSQL рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ:
> sudo service postgresql-9.3 stop > sudo sync > sudo su - # echo 3 > /proc/sys/vm/drop_caches # exit > sudo service postgresql-9.3 start 

рдЕрдм рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдХреНрд╡реЗрд░реА рдХреЛ BUFFERS рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
 EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.525..734.754 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рдкрдврд╝рд╛ = 8334
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 1253.177 рдПрдордПрд╕
(3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рднрд╛рдЧреЛрдВ - рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреИрд╢ рдЦрд╛рд▓реА рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдбрд┐рд╕реНрдХ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 8334 рдмреНрд▓реЙрдХ рдЧрд┐рдирдиреЗ рдкрдбрд╝реЗред
Buffers: shared read - рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз рджреЛрд╣рд░рд╛рдПрдВ
 EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.173..693.000 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 32 рдкрдврд╝рд╛ = 8302
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 1208.433 рдПрдордПрд╕
(3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Buffers: shared hit - рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдХреИрд╢ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рдмреНрд▓реЙрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ред
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ PostgreSQL рдХреЛ рд╣рд░ рдмрд╛рд░ рдХреИрд╢ рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИред рд╣рд░ рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде, PostgreSQL рдЕрдкрдиреЗ рдХреИрд╢ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдХреИрд╢ рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдкрдврд╝реЗрдВ рдбрд┐рд╕реНрдХ рд╕реЗ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИрдВред рдЖрдк Total runtime рдХреЗ рдорд╛рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рд╡реГрддреНрддрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреИрд╢реЗ рдХрд╛ рдЖрдХрд╛рд░, postgresql.conf рдлрд╛рдЗрд▓ рдореЗрдВ shared_buffers рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╣рд╛рдВ


рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рд╢рд░реНрдд рдЬреЛрдбрд╝реЗрдВ
 EXPLAIN SELECT * FROM foo WHERE c1 > 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999522 рдЪреМрдбрд╝рд╛рдИ = 37)
рдлрд╝рд┐рд▓реНрдЯрд░: (c1> 500)
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдореЗрдЬ рдкрд░ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдирд╣реАрдВ рд╣реИрдВред рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рддрд╛рд▓рд┐рдХрд╛ рд░рд┐рдХреЙрд░реНрдб рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ ( Seq Scan ) рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреА рддреБрд▓рдирд╛ c1 > 500 ред рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рд╕рдВрддреБрд╖реНрдЯ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Filter рдорддрд▓рдм рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╣реИред
cost рдХрд╛ cost , рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдмрдврд╝ рдЧрдпрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ - rows - рдореЗрдВ рдХрдореА рдЖрдИ рд╣реИред
рдореВрд▓ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ cost рдРрд╕рд╛ рдореВрд▓реНрдп рдХреНрдпреЛрдВ рд▓реЗрддреА рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред

рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
 CREATE INDEX ON foo(c1); EXPLAIN SELECT * FROM foo WHERE c1 > 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999519 рдЪреМрдбрд╝рд╛рдИ = 37)
рдлрд╝рд┐рд▓реНрдЯрд░: (c1> 500)
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рдЧрдИ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВред рдмрд╛рдХреА рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
 EXPLAIN (ANALYZE) SELECT * FROM foo WHERE c1 > 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999519 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.572..848.895 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999500 рдЫреЛрд░реЛрдВ = 1)
рдлрд╝рд┐рд▓реНрдЯрд░: (c1> 500)
рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 510
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 1330.788 рдПрдордПрд╕
(4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдПрдХ рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдХреЗрд╡рд▓ 510 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ 99.9% рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдереАред

Seq рд╕реНрдХреИрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдВ:
 SET enable_seqscan TO off; EXPLAIN (ANALYZE) SELECT * FROM foo WHERE c1 > 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo_c1_idx рдХрд╛ foo (рд▓рд╛рдЧрдд = 0.42..34623.01 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999519 рдЪреМрдбрд╝рд╛рдИ = 37) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.178..1018.045 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 999500 рдЫреЛрд░реЛрдВ = 1)
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: (c1> 500)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 1434.429 рдПрдордПрд╕
(3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Filter рдмрдЬрд╛рдп Index Scan , Index Cond foo_c1_idx - рдЗрдВрдбреЗрдХреНрд╕ foo_c1_idx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрдм рд▓рдЧрднрдЧ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ cost рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдмрдврд╝рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдХрд╛рд░ рдореВрд░реНрдЦ рдирд╣реАрдВ рд╣реИ!

Seq Scan рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд░рджреНрдж рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
 SET enable_seqscan TO on; 


рдЕрдиреБрд░реЛрдз рдмрджрд▓реЗрдВ:
 EXPLAIN SELECT * FROM foo WHERE c1 < 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди foo_c1_idx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ foo (рд▓рд╛рдЧрдд = 0.42..25.78 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 491% =)
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: (c1 <500)
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдлрд┐рд░ рдпреЛрдЬрдирд╛рдХрд╛рд░ рдиреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рд╣рдо рд╢рд░реНрдд рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 EXPLAIN SELECT * FROM foo WHERE c1 < 500 AND c2 LIKE 'abcd%'; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo_c1_idx рдХрд╛ foo (рд▓рд╛рдЧрдд = 0.42..27.00 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1 рдЪреМрдбрд╝рд╛рдИ = 37) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: (c1 <500)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'abcd%' :: рдкрд╛рда)
(3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реВрдЪрдХрд╛рдВрдХ foo_c1_idx c1 < 500 рд▓рд┐рдП foo_c1_idx ред c2 ~~ 'abcd%'::text , рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ LIKE рдСрдкрд░реЗрдЯрд░ рдХреЗ POSIX рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╢рд░реНрдд рдХреЗрд╡рд▓ рдкрд╛рда рдлрд╝реАрд▓реНрдб рд╣реИ:
 EXPLAIN (ANALYZE) SELECT * FROM foo WHERE c2 LIKE 'abcd%'; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 100 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 14.497..412.030 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 10 рдЫреЛрд░реЛрдВ = 1)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'abcd%' :: рдкрд╛рда)
рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 1,000,000
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 412.120 рдПрдордПрд╕
(4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдЙрдореНрдореАрдж, Seq Scan ред

рд╣рдо c2 рдкрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
 CREATE INDEX ON foo(c2); EXPLAIN (ANALYZE) SELECT * FROM foo WHERE c2 LIKE 'abcd%'; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 100 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 20.992..424.946 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 10 рдЫреЛрд░ = 1)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'abcd%' :: рдкрд╛рда)
рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 1,000,000
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 425.039 рдПрдордПрд╕
(4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдлрд┐рд░ рд╕реЗ Seq Scan ? рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП UTF-8 рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдкрд░реЗрдЯрд░ рд╡рд░реНрдЧ text_pattern_ops рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
 CREATE INDEX ON foo(c2 text_pattern_ops); EXPLAIN SELECT * FROM foo WHERE c2 LIKE 'abcd%'; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдмрд┐рдЯрдореИрдк рдвреЗрд░ рд╕реНрдХреИрди рдлреВ рдкрд░ (рд▓рд╛рдЧрдд = 4.58..55.20 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 100 рдЪреМрдбрд╝рд╛рдИ = 37)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'abcd%' :: рдкрд╛рда)
-> рдмрд┐рдЯрдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди foo_c2_idx1 (рд▓рд╛рдЧрдд = 0.00..4.55 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 13 рдЪреМрдбрд╝рд╛рдИ = 0) рдкрд░
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: ((c2 ~> = ~ 'abcd' :: рдЯреЗрдХреНрд╕реНрдЯ) рдФрд░ (c2 ~ <~ 'abce') рдЯреЗрдХреНрд╕реНрдЯ)
(4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рд╣реБрд░реНрд░реЗ! рдпрд╣ рдирд┐рдХрд▓рд╛!
Bitmap Index Scan - foo_c2_idx1 рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж PostgreSQL рдХреНрд░реЙрд▓ рдЯреЗрдмрд▓ рдореЗрдВ рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: ( Bitmap Heap Scan ) - рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпреЗ рд░рд┐рдХреЙрд░реНрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ PostgreSQL рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдпрджрд┐ рдЖрдк рд╕рдВрдкреВрд░реНрдг рдкрдВрдХреНрддрд┐ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
 EXPLAIN SELECT c1 FROM foo WHERE c1 < 500; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗрд╡рд▓ foo_c1_idx рдХрд╛ foo (рд▓рд╛рдЧрдд = 0.42..25.78 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 491 рдЪреМрдбрд╝рд╛рдИ 4) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреИрди рдХрд░реЗрдВ
рд╕реВрдЪрдХрд╛рдВрдХ рдХрдВрдбреЛрдо: (c1 <500)
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Index Only Scan Index Scan рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЖрдкрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: width=4 ред

рд╕рд╛рд░рд╛рдВрд╢




рднрд╛рдЧ рей

Source: https://habr.com/ru/post/In203386/


All Articles