DB/MySQL

[MySQL] DETERMINISTIC vs NOT DETEMINISTIC

27200 2025. 10. 11. 15:09

๐Ÿ”น ์˜๋ฏธ

DETERMINISTIC = “๊ฐ™์€ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด์„œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค”

CREATE FUNCTION double_value(x INT)
RETURNS INT
DETERMINISTIC
BEGIN
    RETURN x * 2;
END;

NOT DETERMINISTIC = “๊ฐ™์€ ์ž…๋ ฅ๊ฐ’์ด๋ผ๋„ ์ƒํ™ฉ(์‹œ๊ฐ„, ํ™˜๊ฒฝ ๋“ฑ)์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค”

CREATE FUNCTION random_value()
RETURNS DOUBLE
NOT DETERMINISTIC
BEGIN
    RETURN RAND();
END;

๋‘ ํ•จ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๋™์ž‘์„ ํ•ด๋„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์— ํ˜ธ์ถœ ํšŸ์ˆ˜ ๋“ฑ์— ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

→ ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ตณ์ด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ธ๋ฑ์Šค ์‚ฌ์šฉ ์‹œ DETERMINISTIC๋ฅผ ์‚ฌ์šฉ

์ „์ œ ๊ฐœ๋… — “์ธ๋ฑ์Šค๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฐ’์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค”

MySQL์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ,

ํ•ด๋‹น ์กฐ๊ฑด์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ(fixed, deterministic) ๊ฐ’์ธ์ง€ ํŒ๋‹จํ•œ๋‹ค.

์ฆ‰,

  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์ „์— ๊ฐ’์ด ํ™•์ •๋˜๋Š” ๊ฒฝ์šฐ → ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์ค‘์— ๊ฐ’์ด ๋งค๋ฒˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ → ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ถˆ๊ฐ€
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    created_at DATETIME,
    INDEX idx_name (name),
    INDEX idx_created_at (created_at)
);

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ

EXPLAIN SELECT * 
FROM users 
WHERE LEFT(name, 3) = 'Kim';

์ด๋ฆ„ ์•ž์˜ ์„ธ ๊ธ€์ž๋ฅผ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ์ถœ๋ ฅ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

EXPLAIN SELECT * 
FROM users 
WHERE created_at < SYSDATE();

ํ•˜์ง€๋งŒ, ํ˜ธ์ถœ ์‹œ์ ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

NOT DETERMINISTIC ์ตœ์ ํ™” ์ด์Šˆ

  • ๋งค๋ฒˆ ํ˜ธ์ถœ ์‹œ์ ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋น„๊ต ๊ธฐ์ค€ ๊ฐ’์ด ์ƒ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ๋ณ€์ˆ˜์ด๋‹ค.
    • ๋งค๋ฒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์€ ํ›„, WHERE์ ˆ์„ ํ‰๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์ธ๋ฑ์Šค์—์„œ ํŠน์ • ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋‹ค.
    • ์ธ๋ฑ์Šค ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

NOT DETERMINISTIC ์˜ˆ์™ธ

  • NOW() vs SYSDATE()
    • ๋™์ผํ•˜๊ฒŒ ํ˜„์žฌ ์ผ์ž์™€ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
    • ๋‘˜ ๋ชจ๋‘ NOT DETERMINISTIC ํ•จ์ˆ˜์ด๋‹ค.
    • ํ•˜์ง€๋งŒ NOW() ํ•จ์ˆ˜๋Š” DETERMINISTIC ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.
SELECT NOW(), SYSDATE(), SLEEP(1)

ใ„ด +---------------------+---------------------+
| NOW()               | SYSDATE()           |
+---------------------+---------------------+
| 2025-10-11 14:59:12 | 2025-10-11 14:59:12 |   
| 2025-10-11 14:59:12 | 2025-10-11 14:59:13 |  
| 2025-10-11 14:59:12 | 2025-10-11 14:59:14 |   
| 2025-10-11 14:59:12 | 2025-10-11 14:59:15 |     
| 2025-10-11 14:59:12 | 2025-10-11 14:59:16 |     
| 2025-10-11 14:59:12 | 2025-10-11 14:59:17 |  
| 2025-10-11 14:59:12 | 2025-10-11 14:59:18 | 
| 2025-10-11 14:59:12 | 2025-10-11 14:59:19 |     
| 2025-10-11 14:59:12 | 2025-10-11 14:59:20 |     
| 2025-10-11 14:59:12 | 2025-10-11 14:59:21 | 
+---------------------+---------------------+

๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž.

 

NOW() ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ Statement ๋‚ด์—์„œ๋Š” Statement์˜ ์‹œ์ž‘ ์‹œ์ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

SYSDATE() ํ•จ์ˆ˜๋Š” NOT DETERMINISTIC์œผ๋กœ ๋งค๋ฒˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— NOW()๋ฅผ ์“ด๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ค์ •์—์„œ sysdate-is-now๋ฅผ ์„ค์ •ํ•œ๋‹ค๋ฉด ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ SYSDATE()์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.