Slide 1

Slide 1 text

SQLνϡʔχϯά ཧ࿦ͱ࣮ફ 2019-10-05 OSC 2019 ৽ׁ

Slide 2

Slide 2 text

஫ҙࣄ߲ 4 εϥΠυ͸ެ։͍ͯ͠·͢ɻ 4 ࣭໰ͱ͔͕͋Ε͹ ೔ຊPostgreSQLϢʔβձ ϒʔεͰʂ 4 ௚઀ͩͱஏ͔͍ͣ͠ɻɻͬͯํ͸ #osc19ni ʹʂ 4 ֶੜͷํͱ͔DBʹ͍ͭͯ͋·Γৄ͘͠ແ͍ํΛର৅ʹͨ͠ جૅతͳॴͷ͓࿩Ͱ͢ɻ

Slide 3

Slide 3 text

ಥવͰ͕͢ԿͷάϥϑͰ͠ΐ͏ʁ

Slide 4

Slide 4 text

Կͷάϥϑʁ 4 Ҏલ ฐࣾͷӡӦαΠτʹͯ TV๒ʹΑΓDB΁ͷΞΫηε͕ ٸ૿ͨ࣌͠ͷάϥϑ 4 ͜ͷؒαΠτ͸΄΅ΞΫηεग़དྷͳ͔ͬ ͨɻ ཧ༝͸DBɻ 4 ͦͷଞʹ΋ αΠτͷදࣔ଎౓͕3ඵΛ௒͑Δͱ 3ਓʹ1ਓ͕ݟΔͷΛࣙΊͯ͠·͏ɻ ͔ͤͬ͘ྑ͍΋ͷΛ࡞ͬͯ΋ DB͕ࢮ͵=ച্্͕͛ΒΕͳ͍ɻ

Slide 5

Slide 5 text

ࠓ೔ͷ࿩ͷ໨ඪ 4 σʔλϕʔεͷSQLͷԠ౴଎౓͕஗͍৔߹ʹ Ͳ͕͜஗͍ͷ͔ௐࠪ͢Δํ๏ͱ վળํ๏ͷجຊతͳॴΛ஌ͬͯ΋Β͏ɻ

Slide 6

Slide 6 text

͓͠ͳ͕͖ 4 ࣗݾ঺հ 4 SQL࣮ߦͷ࢓૊Έ 4 SQLνϡʔχϯάͷجૅ 4 ·ͱΊ

Slide 7

Slide 7 text

1.ࣗݾ঺հ 4 ߴڮɹҰٍ 4 Ԭࢁࡏॅ ʢ৽ׁདྷΔͷॳʂʣ 4 גࣜձࣾΦϛΧϨ WebΤϯδχΞ 4 ೔ຊPostgreSQLϢʔβʔձ தࠃ஍ํ ࢧ෦௕

Slide 8

Slide 8 text

̎ɽSQL࣮ߦͷ࢓૊Έ

Slide 9

Slide 9 text

SQLͱ͸ DBʹ͓͍ͯɺσʔλͷૢ࡞΍ఆٛΛߦ͏ͨΊͷ σʔλϕʔεݴޠʢ໰͍߹ΘͤݴޠʣͷҰͭɻ By. ʰ https://ja.wikipedia.org/wiki/SQL ʱ

Slide 10

Slide 10 text

SQLͱ͸ ྫ SELECT ϝʔϧΞυϨε, ஀ੜ೔, ੑผ FROM ސ٬৘ใ WHERE ໊લ = 'ߴڮ'; 4 ߏจͷҙຯ ʰސ٬৘ใʱ ͱ͍͏ςʔϒϧ͔Β ʰ໊લ͕ 'ߴڮ'ʱʹ߹க͍ͯ͠ΔσʔλΛର৅ʹ ʰϝʔϧΞυϨεɺ஀ੜ೔ɺੑผʱͷσʔλΛ͍ͩ͘͞ɻ

Slide 11

Slide 11 text

SQLจ͕ॲཧ͞Ε͍ͯ͘ྲྀΕ

Slide 12

Slide 12 text

SQLจ͕ॲཧ͞Ε͍ͯ͘ྲྀΕ ౉͞ΕͨSQL͕ Ұ൪ߴ଎ʹ࣮ߦ͞ΕΔͰ͋Ζ͏࣮ߦܭըΛ ϓϥϯφ͕ܾΊͯɺ ͦͷ࣮ߦܭըʹԊͬͯSQLΛ࣮ߦͯ݁͠ՌΛฦ͢

Slide 13

Slide 13 text

࣮ߦܭը͸Ͳ͏΍ܾͬͯ·Δͷ͔ʁ 4 DBͰ͸ ʮ͜ͷςʔϒϧʹ͸͜Μͳσʔλ͕ೖͬͯΔʯͱ͍ ͏౷ܭ৘ใΛ࣋ͬͯΔɻ 4 ϓϥϯφ͸ ౷ܭ৘ใΛಡΜͰ ʰ͜ͷςʔϒϧ͸͜ͷΑ͏ͳσʔλ͕ೖͬͯΔ͔Β ɹ͜ͷΑ͏ʹΞΫηε͢Δͷ͕࠷଎ͩΖ͏ʱ ͱ࣮ߦܭըΛܾΊΔɻ

Slide 14

Slide 14 text

SQLνϡʔχϯάͷجૅ 4 ΑΓʮείΞ͕ग़Δʯ࣮ߦܭըΛ ϓϥϯφ͕૊ΈཱͯΔࣄ͕ग़དྷΔΑ͏ʹௐ੔͢Δɻ => ͦͷҝʹ͸ ࣮ࡍʹϓϥϯφ͕ ͲΜͳ࣮ߦܭըΛཱ͔ͯͨݟͯνϡʔχϯά͢Δඞཁ͕͋Δ

Slide 15

Slide 15 text

̏ɽSQLνϡʔχϯάͷجૅ

Slide 16

Slide 16 text

SQLνϡʔχϯάͷجૅ લষʹͯɺϓϥϯφཱ͕࣮ͯͨߦܭըΛ஌Γ ͦͷ࣮ߦܭըΛΑΓ଎౓ͷग़Δ࣮ߦܭըʹ͢ΔΑ͏ʹ վળ͢Δͷ͕SQL଎౓νϡʔχϯάͷجૅɺͱ͍͏࿩Λͨ͠

Slide 17

Slide 17 text

࣮ߦܭըͷݟํ 4 EXPLAIN ͱ͍͏ΩʔϫʔυΛSQLจͷઌ಄ʹ෇͚Δɻ 4 ࣮ߦܭը͕ʮਓʹ෼͔ΔΑ͏ͳܗͰʯฦͬͯ͘Δɻ ྫɿ EXPLAIN SELECT ϝʔϧΞυϨε FROM ސ٬৘ใ WHERE ໊લ = 'ߴڮ';

Slide 18

Slide 18 text

ͱ͸͍͑ɺݴͬͯ΋ܭը

Slide 19

Slide 19 text

࣮ߦܭըͷݟํ 4 EXPLAIN ANALYZE ͱ͍͏ΩʔϫʔυΛ SQLจͷઌ಄ʹ෇͚Δɻ 4 ࣮ߦܭըͱ࣮ߦʹ͔͔͕ͬͨ࣌ؒฦͬͯ͘Δɻ ྫɿ EXPLAIN ANALYZE SELECT ϝʔϧΞυϨε FROM ސ٬৘ใ WHERE ໊લ = 'ߴڮ';

Slide 20

Slide 20 text

σϞ Part1

Slide 21

Slide 21 text

࣮ߦܭըͷྫ osc_demo=# EXPLAIN ANALYZE SELECT * FROM customers WHERE name = 'percy.wolff'; QUERY PLAN ---------------------------------------------------------------------- Gather (cost=1000.00..10172.63 rows=3 width=110) (actual time=170.646..174.786 rows=1 loops=1) Workers Planned: 2 Workers Launched: 2 -> Parallel Seq Scan on customers (cost=0.00..9172.33 rows=1 width=110) (actual time=134.860..136.997 rows=0 loops=3) Filter: ((name)::text = 'percy.wolff'::text) Rows Removed by Filter: 133333 Planning Time: 2.530 ms Execution Time: 174.869 ms (8 rows)

Slide 22

Slide 22 text

࣮ߦܭըͷݟํ ಛʹॏཁͳՕॴ͸ೋ఺ Gather (cost=1000.00..10172.63 rows=3 width=110) (actual time=170.646..174.786 rows=1 loops=1) Workers Planned: 2 Workers Launched: 2 -> Parallel Seq Scan on customers (cost=0.00..9172.33 rows=1 width=110) (actual time=134.860..136.997 rows=0 loops=3) Filter: ((name)::text = 'percy.wolff'::text) Rows Removed by Filter: 133333 Planning Time: 2.530 ms Execution Time: 174.869 ms (8 rows)

Slide 23

Slide 23 text

࣮ߦܭըͷݟํ ಛʹॏཁͳՕॴ͸ೋ఺ Gather (cost=1000.00..10172.63 rows=3 width=110) (actual time=170.646..174.786 rows=1 loops=1) Workers Planned: 2 Workers Launched: 2 -> ʲParallel Seq Scan on customersʳ (cost=0.00..9172.33 rows=1 width=110) (actual time=134.860..136.997 rows=0 loops=3) Filter: ((name)::text = 'percy.wolff'::text) Rows Removed by Filter: 133333 Planning Time: 2.530 ms Execution Time: ʲ174.869 msʳ (8 rows)

Slide 24

Slide 24 text

࣮ߦܭըͷݟํ 4 Parallel Seq Scan on customers 4 Execution Time: 174.869 ms

Slide 25

Slide 25 text

࣮ߦܭըͷݟํ Parallel Seq Scan on customers 4 ʮParallelʯ + ʮSeq Scanʯ + ʮon customersʯ

Slide 26

Slide 26 text

Seq Scan ͱ͸ 4 ೔ຊޠͩͱʮॱ࣍ݕࡧʯ 4 ߟ͑ํ͸ඇৗʹγϯϓϧͰDBʹ֨ೲ͞Εͨ ʮ͢΂ͯͷσʔλΛॱʹݕࡧ͢Δʯݕࡧํ๏ ʮSeq Scanʯ + ʮon customersʯ ͱॻ͔Ε͍ͯΔࣄ͔Β customers ςʔϒϧͷத਎Λ ॱ൪ʹશͯݟ͍ͯͬͨ ͱ͍͏ࣄ͕෼͔Δɻ

Slide 27

Slide 27 text

Parallel ͱ͸ 4 PostgreSQLʹ͋ΔػೳͷҰͭɻ 4 σʔλϕʔεͷ໰͍߹ΘͤΛෳ਺ͷϫʔΧʔʹΑͬͯ ฒྻʹݕࡧ͢Δػೳɻ ʮParallelʯ ͱॻ͔Ε͍ͯΔࣄ͔Β ͜ͷSQL͸ ςʔϒϧͷσʔλΛฒྻʹݕࡧͨ͠ࣄ͕෼͔Δɻ

Slide 28

Slide 28 text

࣮ߦܭըͷݟํ Execution Time: 174.869 ms 4 ࣮ߦܭըʹԊͬͯSQLΛ࣮ߦ͔͔ͯͬͨ࣌ؒ͠ɻ

Slide 29

Slide 29 text

Ҏ্Λ౿·͑ͯɺ࠶౓ ࣮ߦܭըΛݟͯΈΑ͏ɻ ---------------------------------------------------- Gather (cost=1000.00..10172.63 rows=3 width=110) (actual time=170.646..174.786 rows=1 loops=1) Workers Planned: 2 Workers Launched: 2 -> Parallel Seq Scan on customers (cost=0.00..9172.33 rows=1 width=110) (actual time=134.860..136.997 rows=0 loops=3) Filter: ((name)::text = 'percy.wolff'::text) Rows Removed by Filter: 133333 Planning Time: 2.530 ms Execution Time: 174.869 ms (8 rows)

Slide 30

Slide 30 text

࣮ߦܭը͔ΒνϡʔχϯάϙΠϯτΛ୳͢ 4 ஗ͦ͏ͳॴແ͍͔ɻ 4 Seq Scan ʹண໨ => ސ٬σʔλ͸αʔϏε͕੒௕͢Ε͹͢Δ΄Ͳ૿͑Δɻ => Seq Scan͸σʔλΛશͯݕࡧ͢Δݕࡧํ๏ɻ => αʔϏεͷ੒௕ʹ൐͍ɺ͜ͷSQL͸ͲΜͲΜ஗͘ͳΔɻ => ͜͜ʹߴ଎Խͷ؊͕͋Γͦ͏ɻ

Slide 31

Slide 31 text

σϞ Part2

Slide 32

Slide 32 text

IndexͰߴ଎Խ͍ͯ͘͠ CREATE INDEX customers_name_idx ON customers (name); 4 customers ͷ name ʹ customemrs_name_idxͱ͍͏໊લͷ ΠϯσοΫεΛ࡞Δ

Slide 33

Slide 33 text

4 ࣮ߦ݁Ռ ------------------------------------------------------- Bitmap Heap Scan on customers (cost=4.45..16.30 rows=3 width=110) (actual time=2.301..2.319 rows=1 loops=1) Recheck Cond: ((name)::text = 'percy.wolff'::text) Heap Blocks: exact=1 -> Bitmap Index Scan on customers_name_idx (cost=0.00..4.45 rows=3 width=0) (actual time=2.275..2.284 rows=1 loops=1) Index Cond: ((name)::text = 'percy.wolff'::text) Planning Time: 6.774 ms Execution Time: 2.918 ms (7 rows)

Slide 34

Slide 34 text

Indexߏஙલͱߏஙޙ ߲໨ Indexߏஙલ Indexߏஙޙ εΩϟϯํ๏ Parallel Seq Scan Bitmap Heap Scan ࣮ߦ࣌ؒ 174.869 ms 2.918 ms

Slide 35

Slide 35 text

------------------------------------------------------- Bitmap Heap Scan on customers (cost=4.45..16.30 rows=3 width=110) (actual time=2.301..2.319 rows=1 loops=1) Recheck Cond: ((name)::text = 'percy.wolff'::text) Heap Blocks: exact=1 -> Bitmap Index Scan on customers_name_idx (cost=0.00..4.45 rows=3 width=0) (actual time=2.275..2.284 rows=1 loops=1) Index Cond: ((name)::text = 'percy.wolff'::text) Planning Time: 6.774 ms Execution Time: 2.918 ms (7 rows)

Slide 36

Slide 36 text

̐ɽ·ͱΊ

Slide 37

Slide 37 text

̐ɽ·ͱΊ 4 ࠓճ͸SQLͷ࣮ߦͷ࢓૊Έͱ࣮ߦܭըͷݟํɺ ߴ଎Խʹ͋ͨͬͯߟ͑Δॴͱ࣮ࡍͷߴ଎Խख๏ʹ͍ͭͯ ͓࿩ͤͯ͞௖͖·ͨ͠ɻ 4 ࠓճͷ࿩͸ඇৗʹ؆୯ͳσϞͰIndex͕͙͢ʹޮՌ͕͋Δ Α͏ͳܗͰͨ͠ɻ ࣮຿Ͱ͍͏ͱ׳Ε͍ͯͳ͍ͱ୯७ʹߴ଎Խग़དྷΔΑ͏ͳ IndexΛషΔͷ͸೉͔ͬͨ͠Γ͠·͢ɻ

Slide 38

Slide 38 text

̐ɽ·ͱΊ 4 ͱ͸͍͑ɺࢼߦࡨޡ͸ඇৗʹେࣄͰ͢ɻ 4 ಛघͳ৔߹Λআ͍ͯɺIndex͸࡞ͬͯμϝͩͬͨΒݩʹ໭ͤ ͹ྑ͍ͷͰ͢ɻ 4 جૅΛԡ͑ͯ͞ΑΓ༗ޮͳIndexΛ࡞ΔΑ͏ʹͳΓͭͭɺ ࣌ʹ͸ΞάϨογϒʹSQLͱ޲͖߹͍͖ͬͯ·͠ΐ͏ʂ

Slide 39

Slide 39 text

͝ਗ਼੅͋Γ͕ͱ͏͍͟͝ ·ͨ͠ɻ