SQLScript는 기존 저장 프로시저와 무엇이 다른가
많은 DBA가 "SQLScript도 그냥 저장 프로시저 아닌가?"라고 생각합니다. 기본 개념은 비슷하지만, SAP HANA SQLScript는 HANA의 컬럼 스토어와 병렬 처리 엔진을 최대한 활용하도록 설계된 언어입니다. 전통적인 Oracle PL/SQL이나 SQL Server T-SQL과는 데이터 처리 방식에서 근본적인 차이가 있습니다.
차이 1: 테이블 변수와 함수형 데이터 흐름
-- 전통적 저장 프로시저 방식 (행 단위 루프)
-- SQL Server T-SQL 예시
CREATE PROCEDURE UpdateOrderStatus
AS
BEGIN
DECLARE @orderId VARCHAR(10);
DECLARE cur CURSOR FOR
SELECT order_id FROM orders WHERE status = 'PENDING';
OPEN cur;
FETCH NEXT FROM cur INTO @orderId;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 행마다 개별 UPDATE — 느림
UPDATE orders SET status = 'PROCESSED' WHERE order_id = @orderId;
FETCH NEXT FROM cur INTO @orderId;
END;
CLOSE cur;
END;
-- SQLScript 방식: 테이블 변수 + 집합 연산
CREATE OR REPLACE PROCEDURE proc_update_order_status()
LANGUAGE SQLSCRIPT AS
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; RESIGNAL; END;
-- 테이블 변수로 대상 집합 한 번에 로드
lt_pending_orders = SELECT order_id, customer_id, net_amount
FROM zbtp_sales_order
WHERE status = 'PENDING'
AND created_at < ADD_DAYS(CURRENT_DATE, -1);
-- 집합 연산으로 한 번에 UPDATE (루프 없음)
UPDATE zbtp_sales_order
SET status = 'PROCESSED',
processed_at = CURRENT_TIMESTAMP
WHERE order_id IN (SELECT order_id FROM :lt_pending_orders);
COMMIT;
END;
SQLScript의 테이블 변수(lt_pending_orders)는 메모리 내 결과 집합입니다. 루프 없이 집합 연산으로 처리하면 HANA의 병렬 실행 엔진이 최적화합니다.
차이 2: CE 함수(Column Engine Function)로 HANA 엔진 직접 호출
-- SQLScript CE 함수: HANA 컬럼 엔진 직접 활용
CREATE OR REPLACE FUNCTION func_monthly_revenue(
IN iv_year INTEGER
)
RETURNS TABLE (
region NVARCHAR(50),
month_num INTEGER,
revenue DECIMAL(15,2)
)
LANGUAGE SQLSCRIPT READ ONLY AS
BEGIN
-- CE_COLUMN_TABLE: 컬럼 스토어에서 직접 읽기
lt_sales = CE_COLUMN_TABLE("ZBTP_SALES_DOC",
["region", "posting_date", "net_amount"]);
-- CE_PROJECTION: 컬럼만 선택
lt_filtered = CE_PROJECTION(:lt_sales,
["region", "posting_date", "net_amount"],
'"YEAR"("posting_date") = ' || :iv_year);
-- CE_AGGREGATION: 집계 (컬럼 엔진에서 직접)
RETURN
SELECT region,
MONTH(posting_date) AS month_num,
SUM(net_amount) AS revenue
FROM :lt_filtered
GROUP BY region, MONTH(posting_date)
ORDER BY region, month_num;
END;
CE 함수는 HANA 컬럼 스토어에 직접 연산을 위임합니다. SQL보다 낮은 레벨에서 HANA 엔진과 통신하므로 대용량 집계에서 성능 이점이 있습니다. 단, 최신 HANA 버전에서는 SQL 옵티마이저가 충분히 발전해 CE 함수가 반드시 필요하지 않은 경우도 많습니다.
차이 3: READONLY 함수와 병렬 실행
-- READ ONLY 함수: 병렬 처리 가능
CREATE OR REPLACE FUNCTION func_calc_vat(
IN iv_amount DECIMAL(15,2),
IN iv_tax_code NVARCHAR(2)
)
RETURNS DECIMAL(15,2)
LANGUAGE SQLSCRIPT
READ ONLY AS -- 병렬 실행 가능 선언
BEGIN
DECLARE lv_rate DECIMAL(5,4);
SELECT tax_rate INTO lv_rate
FROM zbtp_tax_code
WHERE tax_code = :iv_tax_code;
RETURN :iv_amount * :lv_rate;
END;
-- 프로시저에서 병렬로 함수 호출
CREATE OR REPLACE PROCEDURE proc_calc_order_totals()
LANGUAGE SQLSCRIPT AS
BEGIN
-- 여러 함수를 병렬로 실행 (PARALLEL BY GROUPING 또는 암시적 최적화)
SELECT
order_id,
net_amount,
func_calc_vat(net_amount, 'A0') AS vat_amount,
net_amount + func_calc_vat(net_amount, 'A0') AS gross_amount
FROM zbtp_sales_order
WHERE status = 'OPEN'
INTO lt_result;
-- READ ONLY 함수는 HANA가 자동으로 병렬 실행 가능
END;
SQLScript 모범 패턴 요약
- 루프 대신 집합 연산 사용 (테이블 변수 + UPDATE/INSERT)
- 조회만 하는 로직은 READ ONLY 함수로 분리
- 항상 EXIT HANDLER + ROLLBACK + RESIGNAL 포함
- 중간 결과는 테이블 변수에 저장 후 재사용
- 임시 테이블(#TEMP) 보다 테이블 변수 선호
공식 문서
HANA SQLScript 전체 레퍼런스는 SAP HANA SQLScript Reference에서 확인하세요.
댓글 0
아직 댓글이 없습니다.