더북(TheBook)

코드 1-6 SQL Server의 함수와 테이블 정의

CREATE FUNCTION dbo.getOrderTotal(@orderId int)

RETURNS money

AS

BEGIN

  DECLARE @r money

  SELECT @r = SUM(Quantity * Price)

  FROM Order_Details WHERE OrderNumber = @orderId

  RETURN @r;

END;

GO

 

CREATE TABLE Orders (

  OrderNumber int NOT NULL,

  OrderDate date NULL,

  ShipDate date NULL,

  CustomerID int NULL,

  EmployeeID int NULL,

  OrderTotal money AS dbo.getOrderTotal(OrderNumber)

);


 

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

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