더북(TheBook)

이런 식으로 처리하는 것은 매우 좋지 않은 생각이다. 이 함수는 비결정적 함수이고, 이 계산 컬럼은 테이블의 다른 실제 컬럼처럼 값이 지속되지 않기 때문이다. 또 이 컬럼으로는 인덱스를 만들 수 없고, 컬럼을 참조할 때마다 각 로우에 대해 서버가 함수를 호출해야 하므로 서버에 매우 많은 부하가 걸린다. 차라리 결과가 필요할 때마다 OrderID 컬럼을 기준으로 집계해 계산하는 서브쿼리로 해당 테이블을 조인하는 것이 훨씬 더 효율적이다.

결정적 함수와 비결정적 함수

결정적(Deterministic) 함수는 특정 값 집합이 입력되면 언제나 동일한 결과를 반환한다. 비결정적(Nondeterministic) 함수는 특정 값 집합이 입력되더라도 매번 다른 값을 반환할 수도 있다. 예를 들어 SQL Server의 내장 함수인 DATEADD()는 매개변수 세 개를 받는데, 주어진 값에서 동일한 결과를 반환하므로 결정적 함수다. 반면에 GETDATE() 함수는 실행할 때마다 매번 다른 값을 반환하므로 비결정적 함수다. (여기서는 DATEADD() 함수의 매개변수 값이 세 개 결정되었다고 가정한다. 예를 들어 GETDATE() 함수를 DATEADD() 함수의 매개변수로 사용할 수 없다고 가정한다.) ‘부록. 날짜와 시간 타입, 연산, 함수’에서 데이터베이스 시스템별로 제공되는 날짜와 시간 함수를 소개한다.

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