ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ™‚๊ฐœ์š” 

- ๋‚˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ๋“ค์„ ์ˆ˜์ง‘ํ•ด๋ณด๊ณ , ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ๊ฐœ์„  ์ •๋„๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ œ์ถœ

  • ์ž์ฃผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ํŒŒ์•…
  • Index ์ถ”๊ฐ€ ์ „ํ›„ Explain, ์‹คํ–‰์‹œ๊ฐ„ ๋“ฑ ๋น„๊ต

 

๐Ÿšฉ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ

  1. ์‚ฌ์šฉ์ž ์ฒซ ์ ‘๊ทผ ์‹œ ํ† ํฐ์„ ๋ฐœ๊ธ‰, -> ๋Œ€๊ธฐ์—ด์—์„œ ๊ธฐ๋‹ค๋ฆผ ->์ฐจ๋ก€๊ฐ€ ์˜ค๋ฉด ํ™œ์„ฑํ™” ํ† ํฐ
  2. ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ๋‚ ์งœ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  3. ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์ขŒ์„์„ ์กฐํšŒํ•œ๋‹ค.
  4. ์ฝ˜์„œํŠธ ์ขŒ์„์„ ์˜ˆ์•ฝํ•œ๋‹ค.
  5. ์ขŒ์„์„ ๊ฒฐ์ œํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž๋Š” ํฌ๊ฒŒ 5๊ฐœ์˜ ํ”Œ๋กœ์šฐ๋ฅผ ํƒ€๊ฒŒ๋œ๋‹ค. ๊ทธ ์ค‘์— 1๋ฒˆ์— ํ•ด๋‹นํ•˜๋Š” ํ† ํฐ์€ Redis์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋” ์ง„ํ–‰ํ•˜๋ คํ•œ๋‹ค.

2,3,4,5๋ฒˆ์˜ ํ”Œ๋กœ์šฐ์—์„œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ๋œ๋‹ค.

 

โ–ถ๏ธ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ๋‚ ์งœ ์กฐํšŒ

    select
        cs1_0.concert_schedule_id,
        cs1_0.concert_id,
        cs1_0.concert_at,
        cs1_0.create_at,
        cs1_0.price,
        cs1_0.total_available,
        cs1_0.update_at 
    from
        concert_schedule cs1_0 
    where
        cs1_0.concert_id=?
  • ์œ„ Query๋Š” concert_Id๋ฅผ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  • ์ฝ˜์„œํŠธ ๋งˆ๋‹ค ์—ฌ๋Ÿฌ ์ผ์ž์— ๊ณต์—ฐ์„ ํ•œ๋‹ค๋ฉด, ์ฝ˜์„œํŠธ ๋งˆ๋‹ค ๊ฒ€์ƒ‰ํ•  ๋•Œ์— full scan์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ ๋  ๊ฐ€๋Šฅ ์„ฑ์ด ์žˆ๋‹ค.

โ–ถ๏ธ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์ขŒ์„ ์กฐํšŒ

	SELECT *
	FROM CONCERT_SEAT s
	WHERE s.CONCERT_SCHEDULE_ID = 1
	AND s.status = 'UNASSIGNED';
  • 2๊ฐœ์˜ where์ ˆ์ด ๊ฑธ๋ฆฐ๋‹ค. 
  • status๋Š” ๋ฐฐ์ • ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์˜ "UNASSIGNED" ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
  • concert_schedule_id๋กœ ๋จผ์ € ์ˆœ์„œ๋ฅผ ์žก๊ณ  status๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ๋ณตํ•ฉ index๋ฅผ ๊ฑธ์–ด์•ผ๊ฒ ๋‹ค.

> ์œ„ 2๊ฐœ์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๋งŒ ๋ณด๋”๋ผ๋„ concert_schedule์˜ concert_Id ์ปฌ๋Ÿผ๊ณผ concert_seat์˜ status ๊ฐ’์— index๋ฅผ ๊ฑธ๋ฉด ์„ฑ๋Šฅ์ด ๋” ๋‚˜์•„์งˆ์ง€ ํฅ๋ถ„๋˜์–ด ์—‰๋ฉ์ด๊ฐ€ ๋“ค์ฉ์ด๊ฒŒ ๋˜์—ˆ๋‹ค..!!..!

 

๐Ÿ‹๏ธ‍โ™€๏ธ ํ…Œ์ŠคํŠธ ๋ฐฐ๊ฒฝ

Concert 1๊ฐœ
ConcertShedule ์ฝ˜์„œํŠธ ๋งˆ๋‹ค 2๊ฐœ ์ผ์ •
ConcertSeat ์ฝ˜์„œํŠธ ์Šค์ผ€์ฅด๋งˆ๋‹ค 100๋งŒ๊ฐœ์˜ ์ขŒ์„
์ด seat๋Š” 2๋ฐฑ๋งŒ ๊ฐœ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. (์ด ์ด์ƒ์€ ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ค..)
> ๊ทธ ์ค‘ 30๋งŒ๊ฐœ๋Š” ์ž„์‹œ๋ฐฐ์ •, 10๋งŒ๊ฐœ๋Š” ๋ฐฐ์ •, 60๋งŒ๊ฐœ๋Š” ๊ณต์„ ์ƒํƒœ์ด๋‹ค.

 

๋Œ€์ƒ Query (์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์ขŒ์„ ์กฐํšŒ)

	SELECT *
	FROM CONCERT_SEAT s
	WHERE s.CONCERT_SCHEDULE_ID = 1
	AND s.status = 'UNASSIGNED';

 

-None Index

์‹คํ–‰ ๊ณ„ํš

SELECT
    "S"."ASSIGNMENT_TIME",
    "S"."CONCERT_SCHEDULE_ID",
    "S"."CONCERT_SEAT_ID",
    "S"."SEAT",
    "S"."TEMP_ASSIGNMENT_TIME",
    "S"."USER_ID",
    "S"."STATUS"
FROM "PUBLIC"."CONCERT_SEAT" "S"
    /* PUBLIC.CONCERT_SEAT.tableScan */
    /* scanCount: 2000001 */
WHERE ("S"."CONCERT_SCHEDULE_ID" = CAST(1 AS BIGINT))
    AND ("S"."STATUS" = CAST('UNASSIGNED' AS ENUM('ASSIGNED', 'TEMP', 'UNASSIGNED')))
/*
reads: 97421
*/

 

1ํšŒ์ฐจ
2ํšŒ์ฐจ

- On Index

์‹คํ–‰ ๊ณ„ํš

CREATE INDEX idx_concer_schedule_id_status ON CONCERT_SEAT(CONCERT_SCHEDULE_ID, STATUS);
SELECT
    "S"."ASSIGNMENT_TIME",
    "S"."CONCERT_SCHEDULE_ID",
    "S"."CONCERT_SEAT_ID",
    "S"."SEAT",
    "S"."TEMP_ASSIGNMENT_TIME",
    "S"."USER_ID",
    "S"."STATUS"
FROM "PUBLIC"."CONCERT_SEAT" "S"
    /* PUBLIC.IDX_CONCER_SCHEDULE_ID_STATUS: CONCERT_SCHEDULE_ID = CAST(1 AS BIGINT)
        AND STATUS = CAST('UNASSIGNED' AS ENUM('ASSIGNED', 'TEMP', 'UNASSIGNED'))
     */
    /* scanCount: 600001 */
WHERE ("S"."CONCERT_SCHEDULE_ID" = CAST(1 AS BIGINT))
    AND ("S"."STATUS" = CAST('UNASSIGNED' AS ENUM('ASSIGNED', 'TEMP', 'UNASSIGNED')))
/*
reads: 55811
*/

 

ํ™•์‹คํžˆ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„ ๋ชจ์Šต์ด๋‹ค..! (์—‰๋ฉ์ด ๋“ค์ช)๐Ÿคฆ‍โ™‚๏ธ๐Ÿคฆ๐Ÿคฆ‍โ™€๏ธ~~

 

? ๐Ÿคท ๊ถ๊ธˆํ–ˆ๋˜ ๋ถ€๋ถ„

- ์ฒ˜์Œ์— 60๋งŒ๊ฐœ๋งŒ ๊ณต์„์œผ๋กœ ๋‘” ์ด์œ ๋Š”, index๋ฅผ ์„ค์ •ํ•˜๋ฉด ์กฐ๊ฑด์— ์˜ํ•ด allScane์ด ์•„๋‹Œ where์ ˆ์— ๋งž๊ฒŒ ์กฐ๊ฑด์„ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ์ ์ด๋‹ค.

 

๋งŒ์•ฝ ๊ฐฏ์ˆ˜์—์„œ ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ status๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

- TEMP (30๋งŒ๊ฐœ)

 

- ASSIGNED(10๋งŒ๊ฐœ)

 

ํ™•์‹คํžˆ status์˜ ์–‘์ด ์ ์„ ์ˆ˜๋ก ์†๋„๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค..!

 

 

? ๐Ÿคท๋งˆ์ง€๋ง‰์œผ๋กœ ๋“œ๋Š” 2๊ฐ€์ง€ ์˜๋ฌธ์  

1) ์ฒ˜์Œ ์ฝ˜์„œํŠธ๊ฐ€ ์—ด๋ ค์„œ ๋ชจ๋‘ ๊ณต์„์ด๋ผ๋ฉด, allScan์— ๊ฐ€๊นŒ์šธ ๊ฒƒ์ด๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚˜์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ขŒ์„์„ ์˜ˆ์•ฝํ•  ์ˆ˜๋ก ๋นจ๋ผ์งˆ ๊ฒƒ์ธ๋ฐ ์–ด๋–ป๊ฒŒ ์ด ๋ถ€๋ถ„์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

> ๋ชจ๋ฅด๊ฒ ๋‹ค. ์งˆ๋ฌธํ•ด์•ผ์ง€..

 

2) status๋Š” ์‚ฌ์šฉ์ž์˜ ์˜ˆ์•ฝ์— ๋”ฐ๋ผ ๋ฐ”๋€” ๊ฒƒ์ด๋ฉฐ, ๊ทธ๋งŒํผ index ์žฌ์ •๋ ฌ๋กœ db์˜ ๋ถ€ํ•˜๋ฅผ ์ค„ ๊ฒƒ์ด๋‹ค.

> ์‚ฌ์šฉ์ž๊ฐ€ ์ขŒ์„์„ ์„ ํƒํ•  ๋•Œ ์ƒˆ๋กœ๊ณ ์นจ, ์„ ํƒ ์ขŒ์„ ์„ ์  ์‹คํŒจ ๋“ฑ์˜ ์ด์œ ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์กฐํšŒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ ๋น„์šฉ๋ณด๋‹ค๋„ ์ธ๋ฑ์‹ฑ์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋ถ€ํ•˜๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.