๐Ÿš€ ์šฐ์„  ๋ฉ”์ธ ํ‚ค์™€ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜

59187 ๋‹จ์–ด sqldatabasepostgresyugabytedb
Nikolay Samokhvalov์€ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ ๋‹ฌ๋ผ๋Š” ํŠธ์œ—์„ ์˜ฌ๋ ธ๋‹ค.

๋‹ˆ์ฝœ๋ผ ์‚ฌ๋ชจํ๋ฐ”๋กœํ”„--๋ฐ•์‚ฌํ›„ ํ›Œ๋ฅญ

์ด ์„ ์€ ์‚ฌ๋žŒ์„ ๋†€๋ผ๊ฒŒ ํ•œ๋‹ค.1100๋งŒ ์ค„, 3์ดˆ ๋™์•ˆ ์‹คํ–‰๋˜๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์„ ์ตœ์ ํ™”ํ•˜๋Š” 1001๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค. ํด๋ฆญํ•˜์šฐ์Šค๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์ ˆ๋ถ„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์†Œ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค๋งŒ์ด btree๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.๐Ÿคท๐Ÿปโ€โ™‚๏ธ twitter.com/jlongster/statโ€ฆ
2021๋…„ 11์›” 6์ผ ์˜คํ›„ 22:57
์ œ์ž„์Šค ๋ž‘
์กด์Šคํ„ฐ
PostgreSQL์˜ ์‹ ์ถ•์„ฑ ๋ฌธ์ œ.๋งž์•„์š”!๊ฐ€์žฅ ์ข‹์€ ๋ฌธ์ œ!
์ง€๊ธˆ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ 3์ดˆ๋„ ์•ˆ ๋˜๋Š” ์‹œ๊ฐ„ ์•ˆ์— 11644420์ค„์„ ์กฐํšŒํ•˜๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค.
์•ค๋”” ํŒŒ๋ธ”๋กœ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ •ํ™•ํ•œ ์ƒ‰์ธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋งŽ์€ ๊ทผ๋ณธ์ ์ธ ๋ณ€ํ™”๋ฅผ ์ œ๊ธฐํ–ˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ๋‹ค.

์•ค๋”” ํŒŒ๋ธ”๋กœ
# ์•ค๋”” ํŒŒ๋ธ”๋กœ

์ด ๋‹จ์„œ๋Š” ์ €์ž๊ฐ€ ์˜คํ† ๋งคํ‹ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋Š” ๋™๊ธฐ๋‹ค.James๋Š” ์ฟผ๋ฆฌ ์˜ต์…˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ๋‹นํ•œ ์ธ๋ฑ์Šค๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ, ๋ถ„ํฌ์‹์ด๋‚˜ NosQL DBMS๋กœ ์ „ํ™˜ํ•˜๊ณ , MatView๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์œ ํ˜•์„ UUID๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. H/T twitter.com/jlongster/statโ€ฆ
2021๋…„ 11์›” 7์ผ ์˜คํ›„ 13:58
์ œ์ž„์Šค ๋ž‘
์กด์Šคํ„ฐ
PostgreSQL์˜ ์‹ ์ถ•์„ฑ ๋ฌธ์ œ.๋งž์•„์š”!๊ฐ€์žฅ ์ข‹์€ ๋ฌธ์ œ!
์ง€๊ธˆ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ 3์ดˆ๋„ ์•ˆ ๋˜๋Š” ์‹œ๊ฐ„ ์•ˆ์— 11644420์ค„์„ ์กฐํšŒํ•˜๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค.
์ด ๊ธ€์—์„œ ๋‚˜๋Š” ์ด ์˜ˆ๋กœ ์ƒ‰์ธ์„ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์„ค๋ช…ํ•  ๊ฒƒ์ด๋‹ค.์–ด์จŒ๋“ , ์ด ์ž‘์—…์€ ๋ถ„ํฌ์‹ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ํ™•์žฅ๋˜๊ธฐ ์ „์— ๋๋‚ด์•ผ ํ•œ๋‹ค.์ด ๋ฌธ์ œ๋Š” PostgreSQL์—์„œ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์˜ ๊ฐœ๋…์ด ๋˜‘๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด YugabyteDB์—์„œ ์ œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ์‹คํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.SQL๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.
James Long ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฌธ์˜ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด, ์‹คํ–‰ ๊ณ„ํš ๋ฐ ์ƒ‰์ธ ์ •์˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. https://gist.github.com/jlongster/4b31299dcb622aa7e29b59d889db2b2c#file-gistfile1-txt
์ด๋Ÿฌํ•œ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์žฌํ˜„๋˜๊ธฐ ์‰ฝ๋‹ค.
yugabyte=# \c yugabyte yugabyte

psql (15devel, server 11.2-YB-2.9.1.0-b0)
You are now connected to database "yugabyte" as user "yugabyte".

yugabyte=# create table messages_binary (
            "timestamp" text,
            "group_id" uuid,
            "other_column" int,
            primary key("timestamp","group_id")
           );
CREATE TABLE

yugabyte=# EXPLAIN SELECT * FROM messages_binary
           WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
           AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
                                                                    QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
------------------
 Seq Scan on messages_binary  (cost=0.00..105.00 rows=1000 width=52)
   Filter: (("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text) AND (group_id = '983d5259-97ff-49e3-8829-101a
b8dead92'::uuid))
(2 rows)
์ด๊ฒƒ์€ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์ด๋‹ค.์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ฝ๋Š” ๋ชจ๋“  ์ค„์— '๊ทธ๋ฃน id' ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ฒ”์œ„ ์Šค์บ๋‹์ด๋‹ค.
๋ช‡ ํ–‰(3 ๊ทธ๋ฃน 3 ํƒ€์ž„ ์Šคํƒฌํ”„)์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
yugabyte=# create extension pgcrypto;
CREATE EXTENSION

yugabyte=# insert into messages_binary
           with groups as (
            select gen_random_uuid() group_id from generate_series(1,3)
           )
           select
            to_char(now()+(generate_series(1,3)*interval'1 second')
             ,'yyyy-mm-ddThh24:mi:ss.000Z-')
             ||substr(gen_random_uuid()::text,25) "timestamp"
            ,group_id, 42 as "value"
           from groups;
INSERT 0 9

yugabyte=# select * from messages_binary;

               timestamp               |               group_id               | other_column
--------------------------------------------+--------------------------------------+--------------
 2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
(9 rows)
YugabyteDB์—์„œ ์ค„์€ ๋ถ„๋ฆฌ๋˜์–ด ์ฃผ ์ธ๋ฑ์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.PostgreSQL์—์„œ, ๊ทธ๊ฒƒ๋“ค์€ ํ•˜๋‚˜์˜ ๋ฌด๋”๊ธฐ์— ์ถ”๊ฐ€๋˜๊ณ , ๋ฉ”์ธ ํ‚ค์— ์ถ”๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๋‘ ๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ๋ฒ”์œ„ ์Šค์บ” ์ ‘๊ทผ์€ ๋ฉ”์ธ ํ‚ค์— ๋‹ฌ๋ ค ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ๋Š” ("timestamp","group_id")์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.์šฐ๋ฆฌ๋Š” ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e์ค„์ด ์ด Seq ์Šค์บ” ๊ฒฐ๊ณผ์—์„œ ๋ถ„์‚ฐ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋ฉ”์ธ ํ‚ค์˜ ์ˆœ์„œ, ์„ ํƒ์„ ์•Œ์•„๋ณด์ž...๊ฐ™์€ ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.
yugabyte=# select * from messages_binary
            order by "timestamp","group_id";

               timestamp               |               group_id               | other_column
--------------------------------------------+--------------------------------------+--------------
 2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
(9 rows)
ํ˜„์žฌ, ๋‹น์‹ ์€ WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e' AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e' ์ˆ ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ƒ‰ ํšจ์œจ์ด ์–ผ๋งˆ๋‚˜ ๋‚ฎ์€์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์šฐ๋ฆฌ๋Š” ์ฒซ ์ค„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'์„ ๊ฒ€์ฆํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ค„์„ ์Šค์บ”ํ•ด์„œ ํ•„ํ„ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.๋‹จ๋…์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์ค„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์—†๋‹ค.์ด๊ฒƒ์ด ๋ฐ”๋กœ Seq ์Šค์บ”์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
๋จผ์ € ๊ทธ๋ฃน id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
yugabyte=# select * from messages_binary
            order by "group_id","timestamp";

               timestamp               |               group_id               | other_column
--------------------------------------------+--------------------------------------+--------------
 2021-11-07T20:00:22.000Z-c440295c4500 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:23.000Z-1dcde16fc472 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:24.000Z-90342717a0c8 | 9c3d61e1-6d3f-4b95-9e08-46f485d10b75 |           42
 2021-11-07T20:00:22.000Z-ad01842bb691 | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:23.000Z-c533a5e5623e | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:24.000Z-631b45e66aba | e7e46753-2e99-4ee4-b77f-17136b01790e |           42
 2021-11-07T20:00:22.000Z-933f552d0159 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:23.000Z-ca98dd4de397 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
 2021-11-07T20:00:24.000Z-b879daca6cb7 | f27ac68f-2a10-46f0-a8fe-77b99c0c5a66 |           42
(9 rows)
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์€ ์ด ๊ตฌ์กฐ(ํ–‰ ์ˆœ์„œ๋ฅผ ๋ณผ ๋•Œ ์—ด ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ)์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ group_id='e7e46753-2e99-4ee4-b77f-17136b01790e'10 ์ฐพ๊ธฐ
  • ์ตœ์ดˆ timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e',
  • ์ถ”๊ฐ€
  • ๋‹ค์Œ ์ค„์„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ธฐ,
  • , ๋งˆ์ง€๋ง‰ group_id='e7e46753-2e99-4ee4-b77f-17136b01790e'์— ๋ฉˆ์ท„๋‹ค.
  • ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ์–ป์Šต๋‹ˆ๊นŒ?๋‹ค๋ฅธ ์ƒ‰์ธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    yugabyte=# create index messages_binary_key2 
                on messages_binary ("group_id","timestamp");
    CREATE INDEX
    
    ๋‹ค์Œ์€ ์‹คํ–‰ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
    yugabyte=# EXPLAIN SELECT * FROM messages_binary
               WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
               AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
                                                                          QUERY PLAN
    
    -------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------
     Index Scan using messages_binary_key2 on messages_binary  (cost=0.00..5.25 rows=10 width=52)
       Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
    b84edae7349e'::text))
    (2 rows)
    
    ์ด๊ฒƒ์€ ๋งค์šฐ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.INCLUDE ์ž๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ๋ชจ๋“  ์—ด์„ ์ƒ‰์ธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    yugabyte=# create index messages_binary_key2 
               on messages_binary ("group_id","timestamp")
               include ("other_column");
    CREATE INDEX
    
    yugabyte=# EXPLAIN SELECT * FROM messages_binary
               WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
               AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
                                                                          QUERY PLAN
    
    -------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------
     Index Only Scan using messages_binary_key2 on messages_binary  (cost=0.00..5.15 rows=10 width=52)
       Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
    b84edae7349e'::text))
    (2 rows)
    
    ๋‹ค์Œ ๋‹จ์›์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ƒ‰์ธ ์ „์šฉ ๊ฒ€์ƒ‰ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    https://blog.yugabyte.com/how-a-distributed-sql-database-boosts-secondary-index-queries-with-index-only-scan/
    ์ง„์ผ๋ณดํ•œ ๋ถ„์„์„ ํ†ตํ•ด'์‹œ๊ฐ„ ์Šคํƒฌํ”„','๊ทธ๋ฃน id'์˜ ์ธ๋ฑ์Šค๋Š” ์ „ํ˜€ ์“ธ๋ชจ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” timestamp๋งŒ ์กฐํšŒํ•˜๊ณ  group_id์€ ์กฐํšŒํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ๊ทธ๋Ÿฌ๋ฉด ์ด ํ…Œ์ด๋ธ”์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    yugabyte=# create table messages_binary (
                "timestamp" text,
                "group_id" uuid,
                "other_column" int,
                primary key("group_id","timestamp")
                );
    CREATE TABLE
    
    ์ถ”๊ฐ€ ํ–‰์„ ์‚ฝ์ž…ํ•˜๊ณ  ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.
    yugabyte=# insert into messages_binary
               with groups as (
                select gen_random_uuid() group_id from generate_series(1,1e3)
               )
               select
                to_char(now()+(generate_series(1,1e4)*interval'1 second')
                 ,'yyyy-mm-ddThh24:mi:ss.000Z-')
                 ||substr(gen_random_uuid()::text,25) "timestamp"
                ,group_id, 42 as "value"
               from groups;
    
    yugabyte=# analyze messages_binary;
    ANALYZE
    
    yugabyte=# EXPLAIN (analyze)
               SELECT * FROM messages_binary
               WHERE group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'
               AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
                                                                                                                                                                                                                      QUERY PLAN
    
    -------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------
     Index Scan using messages_binary_pkey on messages_binary  (cost=0.00..1214.95 rows=10530 width=52) (actual time=10.588..100.838
     rows=10000 loops=1)
       Index Cond: ((group_id = 'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26
    b84edae7349e'::text))
     Planning Time: 0.067 ms
     Execution Time: 101.711 ms
    (4 rows)
    
    ๋‚˜์˜ ์†Œํ˜• 8VCPU ์‹คํ—˜์‹ค์—์„œ 1000๋งŒ ์ค„์˜ ์‹œ๊ณ„์—์„œ 100๋ฐ€๋ฆฌ์ดˆ ์•ˆ์— 10000์ค„์„ ๊ฒ€์ƒ‰ํ•˜์˜€์œผ๋‚˜, ์ด๊ฒƒ์€ ์‹œ๊ณ„์˜ ํฌ๊ธฐ์— ๋‹ฌ๋ ค ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด๊ฒƒ์€ ์ ‘๊ทผ ํŒจํ„ด์„ ์ดํ•ดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์ด๋‹ค. ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.์ด ์ƒ‰์ธ ์Šค์บ”์€ ํ…Œ์ด๋ธ” ํฌ๊ธฐ์—์„œ O (1) ์— ๊ฐ€๊น๋‹ค.์ด๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š”'logn'์ด์ง€๋งŒ, ํฐ ๋ฒ”์œ„์˜ ์Šค์บ”์— ๋Œ€ํ•ด์„œ๋Š” B ํŠธ๋ฆฌ์—์„œ ์žŽ์œผ๋กœ ๊ฐˆ๋ผ์ง€๊ฑฐ๋‚˜ LSM ํŠธ๋ฆฌ์˜ SST ํŒŒ์ผ์˜seek์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊ฒฐ๊ณผ ํฌ๊ธฐ๋Š” O(n)์ž…๋‹ˆ๋‹ค.
    ๋‹ˆ์ฝœ๋ผ์ด ์‚ฌ๋ชจํ๋ฐ”๋กœํ”„(postgres.ai)์™€ ๋…ผ์˜ํ•œ ๋’ค ์‚ฌ์ฒด๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๋‹ค.YugabyteDB์™€ PostgreSQL์˜ ๊ฒฐ๊ณผ๋„ ๋น„๊ตํ–ˆ๋‹ค.๋‚ด ์กฐํšŒ๊ฐ€ ์ƒ์„ฑํ•œ ์ค„์€ '๊ทธ๋ฃน id' ์ˆœ์„œ๋กœ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ YugabyteDB์˜ ์–ด๋–ค ๋‚ด์šฉ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค„์€ ๋ฉ”์ธ ํ‚ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€๋งŒ, PostgreSQL ์ปฌ๋ ‰์…˜์˜ ์„ฑ๋Šฅ์€ ์ƒ‰์ธ/ํ…Œ์ด๋ธ”์˜ ๊ด€๋ จ์„ฑ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.๋‹ค์Œ์€ PostgreSQL์—์„œ ํƒ€์ž„ ์Šคํƒฌํ”„์— ๋” ์ง„์‹คํ•œ ์ƒํ™ฉ์ด ์žˆ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.
    postgres=# truncate table messages_binary;
    TRUNCATE TABLE
    postgres=# insert into messages_binary
               with groups as (
                           select gen_random_uuid() group_id from generate_series(1,1e3)
                          ), timestamps as (
                           select to_char(now()+(generate_series(1,1e4)*interval'1 second')
                            ,'yyyy-mm-ddThh24:mi:ss.000Z-')
                            ||substr(gen_random_uuid()::text,25) "timestamp"
                          )
                          select
                           "timestamp",group_id, 42 as "value"
                          from timestamps,groups;
    INSERT 0 10000000
    
    postgres=# select * from messages_binary limit 1;
                   timestamp               |               group_id               | other_column
    --------------------------------------------+--------------------------------------+--------------
     2021-11-08T08:34:14.000Z-6bb27dbe2723 | 91ee7381-eb92-48cd-bb82-9ed939dc3a13 |           42
    (1 row)
    
    postgres=# EXPLAIN (analyze,buffers)
               SELECT * FROM messages_binary
               WHERE group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'
               AND timestamp > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e';
                                                                             QUERY PLAN
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     Bitmap Heap Scan on messages_binary  (cost=778.61..30792.78 rows=9956 width=58) (actual time=3.021..43.141 rows=10000 loops=1)
       Recheck Cond: ((group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text))
       Heap Blocks: exact=10000
       Buffers: shared hit=2006 read=8167 written=2249
       ->  Bitmap Index Scan on messages_binary_pkey  (cost=0.00..776.12 rows=9956 width=0) (actual time=1.897..1.897 rows=10000 loops=1)
             Index Cond: ((group_id = '91ee7381-eb92-48cd-bb82-9ed939dc3a13'::uuid) AND ("timestamp" > '1970-01-01T00:00:00.000Z-0000-ae26b84edae7349e'::text))
             Buffers: shared hit=11 read=162
     Planning Time: 0.086 ms
     Execution Time: 43.832 ms
    
    ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ฐ๊ณผ ๋ฒ„ํผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ˆซ์ž๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.YugabyteDB์˜ LSM ํŠธ๋ฆฌ ์ž๋™ ์••์ถ•, PostgreSQL์˜ ์ˆ˜๋™ pg ์žฌํฌ์žฅ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๊ตฌ์žฅ์— ์žˆ๋‹ค.์‘๋‹ต ์‹œ๊ฐ„์ด ์˜ˆ์ƒ๋ณด๋‹ค ๋ช‡ ๋“ฑ๊ธ‰ ๋†’์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์˜ ์„ค๊ณ„๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.๊ทธ๋ฆฌ๊ณ  ์—”์ง„๋งˆ๋‹ค ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ตœ์ ํ™”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
    ์ด๊ฒƒ์€ ์ด ๊ฒ€์ƒ‰์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์ผ์ด๋‹ค. ์ถ”๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ , ํ‚ค์˜ ์ •ํ™•ํ•œ ์—ด ์ˆœ์„œ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.PostgreSQL์—์„œ, ์ด๊ฒƒ์€ ํ…Œ์ด๋ธ”์—์„œ ๋ฌด์ž‘์œ„๋กœ ์ฝ์–ด์•ผ ํ•˜์ง€๋งŒ, ์ ์–ด๋„ ๋ชจ๋“  ๋‚ด์šฉ์€ ๋ฉ”์ธ ํ‚ค ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„ ์Šค์บ”์—์„œ ํ•„ํ„ฐ๋ฉ๋‹ˆ๋‹ค.YugabyteDB์˜ ๋ชจ๋“  ํ–‰์€ ์ˆœ์ฐจ์  ์ฝ๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค.
  • ์€ ๊ธฐ๋ณธ ํ‚ค์—์„œ ๋ถ„๋ฆฌ๋˜๋ฉฐ ํ•˜๋‚˜์˜ ํƒœ๋ธ”๋ฆฟ์—์„œ๋งŒ
  • ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • SST ํŒŒ์ผ์—๋Š” bloom ํ•„ํ„ฐ๊ฐ€ ์žˆ์–ด ๋งŽ์€ ํŒŒ์ผ์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค ๋ธ”๋ก์€ ํ•„์š”ํ•œ
  • ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
    ์•Œ๋ฐ”๋กœ ์—˜๋‚œ๋ฐ์Šค(Alvaro Hernรกndez)์˜ ๋˜ ๋‹ค๋ฅธ ๋ง์€ ์ด ๊ฒ€์ƒ‰์ด ๊ฒ€์ƒ‰ํ•œ ์ค„์˜ ์ˆ˜๋ฅผ ์˜์‹ฌํ–ˆ๋‹ค.

    ์•Œ๋ฐ”๋กœ ์—˜๋‚œ๋ฐ์Šค

    ์ด๊ฑฐ ๋„ˆ๋ฌด ๋งŽ์„ ๊ฑฐ์•ผ.์™œ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ์ค„์„ ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ?์ƒ‰์ธ์ด ์žˆ๋“  ์—†๋“  ๊ฐ„์— ์ด๊ฒƒ์€ ํ™•์žฅํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค.
    2021๋…„ 11์›” 6์ผ ์˜คํ›„ 23:18
    ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜ ๋”, ์ œ์ž„์Šค ๋กฑ์˜ ์‹คํ–‰ ๊ณ„ํš์€ ์ƒ‰์ธ ์กฐ๊ฑด์—์„œ (group_id = '983d5259-97ff-49e3-8829-101ab8dead92'::text)์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.UUID๋ฅผ TXT๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ UUID ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
    yugabyte=# select pg_column_size(
               'e7e46753-2e99-4ee4-b77f-17136b01790e'::uuid);
    
     pg_column_size
    ---------------------
                 16
    (1 row)
    
    yugabyte=# select pg_column_size(
               'e7e46753-2e99-4ee4-b77f-17136b01790e'::text);
    
     pg_column_size
    ---------------------
                 40
    (1 row)
    
    ํ•œ ๋งˆ๋””๋กœ ํ•˜๋ฉด '๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹ ์ถ• ๋ถˆ๊ฐ€' ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ ํŒจํ„ด์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋ฆ„๊ธธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ ๊ฒฐ๊ณผ์˜ ํฌ๊ธฐ์™€ ์œ ํšจํ•œ ์ ‘๊ทผ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.์ œ์ž„์Šค ๋ž‘์ฒ˜๋Ÿผ: ์ง‘ํ–‰ ๊ณ„ํš์„ ์ฝ๊ณ  ์ง€์—ญ ์‚ฌํšŒ์— ๋ฌผ์–ด๋ณด๊ธฐ๐Ÿ‘

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ