코드 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 컬럼을 기준으로 집계해 계산하는 서브쿼리로 해당 테이블을 조인하는 것이 훨씬 더 효율적이다.

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