Query Optimized Coalesce

์ฟผ๋ฆฌ ์ตœ์ ํ™” - COALESCE vs or

ํŒ๋งค ๋‚ด์—ญ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋™๋ฃŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์งฐ์ง€๋งŒ ํšจ์œจ์ ์ด์ง€ ์•Š๊ณ  ์†๋„๋„ ์ข‹์ง€์•Š์•„์„œ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

๊ธฐ์กด ๋กœ์ง ์ˆœ์„œ

  1. ์ด๋ฉ”์ผ ๊ฒ€์ƒ‰ ๋กœ์ง์„ ์œ„ํ•ด ์œ ์ €๋“ค์˜ ์ด๋ฉ”์ผ์„ ๊ฐ€์ €์˜จ๋‹ค.
  2. ๋งŒ์•ฝ ์ด๋ฉ”์ผ์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ชจ๋“  ์œ ์ €๋“ค์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํŒ๋งค ๋‚ด์—ญ์— ํŒ๋งค์ž์ธ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. - ์—ฌ๊ธฐ๊นŒ์ง€ 1s 114ms
  3. ์ถ”๊ฐ€์ ์ธ ๊ฒ€์ƒ‰ํ•  ์กฐ๊ฑด์ด ์žˆ๋‹ค๋ฉด COALESCE(IF(:code = '', null, :code), code) ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฒ€์ƒ‰ 16ms

์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ ์€ ์™œ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ์œ ์ €์˜ ์ด๋ฉ”์ผ๋งŒ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์•˜๋Š”์ง€, ์™œ ์ด๋ ‡๊ฒŒ IF๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด์•ผ ํ–ˆ๋Š”์ง€๊ฐ€ ๊ถ๊ธˆํ–ˆ์—ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์œผ๋ก  (:code is null or :code = '' or mg.code = :code) ์ด๋Ÿฐ ์‹์œผ๋กœ ์งœ๋ฉด ๊ตณ์ด ํ•จ์ˆ˜๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์–ด๋ ค์šด ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ ๊ฑฐ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๋กœ์ง์„ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ 1์ดˆ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๋กœ์ง์„ 30ms์ •๋„๋กœ ์ค„์˜€๋‹ค.

COALESCE(COL1, COL2, ..... COLn)

NVL๊ณผ ๊ฐ™์ด ์ธ์ž ์ค‘์—์„œ NULL์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. NVL๊ณผ ๋‹ค๋ฅธ์ ์€ 2๊ฐœ์˜ ์ธ์ž๊ฐ’๋งŒ ์ค„์ˆ˜ ์žˆ์—ˆ๋˜ NVL๊ณผ ๋‹ค๋ฅด๊ฒŒ COALESCE์€ NULL์„ ์ฒดํฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋กœ์ง์€ COL1์ด NULL์ผ ๊ฒฝ์šฐ COL2๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  COL2๊ฐ€ NULL์ผ ๊ฒฝ์šฐ ๋‹ค์Œ ์ธ์ž๋ฅผ ์ญˆ์šฐ์šฑ ํ•œ๋‹ค์Œ ๋งˆ์ง€๋ง‰ ์ธ์ž ๊ฐ’๊นŒ์ง€ ๊ฒ€์‚ฌํ›„ NULL์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋งŒ์•ฝ ๋ชจ๋“  ์ธ์ž๊ฐ€ NULL์ผ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜