더북(TheBook)

코드 2-30은 CalculateAge() 함수를 사용해 50세 이상인 임직원을 찾는 쿼리다.

코드 2-30 CalculateAge( ) 함수를 사용한 SQL

SELECT EmployeeID, EmpFirstName, EmpLastName,

  CalculateAge(EmpDOB) AS EmpAge

FROM Employees

WHERE CalculateAge(EmpDOB) > 50;


 

WHERE 절에서 이 함수를 사용하면 테이블 스캔이 수행되므로, 이 쿼리를 최적화하려면 함수 기반 인덱스를 사용해야 한다는 사실은 분명해 보인다. 불행히도 CalculateAge()를 호출한 결과는 매개변수에 따라 값이 달라지는 비결정적 함수다. 또 이 함수의 호출 결과는 SYSDATE() 함수가 반환하는 값에 따라 달라진다. 오직 결정적 함수만 인덱스로 만들 수 있다.

PostgreSQL과 오라클에서는 결정적 함수를 정의할 때 반드시 DETERMINISTIC (오라클)이나 IMMUTABLE(PostgreSQL) 키워드를 명시해야 한다. 이들 키워드를 명시하면 개발자가 함수를 올바르게 선언했음을 신뢰하므로 CalculateAge() 함수를 결정적 함수로 선언해 인덱스 정의에 사용할 수 있다. 하지만 인덱스가 생성된 시점에 계산된 값이 저장되므로 날짜가 변경되더라도 값은 변하지 않기에 의도한 대로 작동하지는 않을 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.