DECLARE - Amazon Redshift

DECLARE

새로운 커서를 정의합니다. 더 큰 쿼리의 결과 집합에서 한 번에 몇 개의 행을 검색하려면 커서를 사용하십시오.

커서의 첫 행을 가져올 때, 필요한 경우 메모리나 디스크에서 리더 노드에 전체 결과 집합이 구체화됩니다. 큰 결과 집합을 가진 커서를 사용하면 성능에 나쁜 영향을 미칠 가능성이 있으므로, 가급적이면 다른 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 커서 사용 시 성능 고려사항 단원을 참조하십시오.

트랜잭션 블록 내에 커서를 선언해야 합니다. 세션당 한 번에 한 개의 커서만 열 수 있습니다.

자세한 내용은 FETCH, CLOSE 섹션을 참조하세요.

구문

DECLARE cursor_name CURSOR FOR query

파라미터

cursor_name

새 커서의 이름입니다.

query

커서를 채우는 SELECT 문입니다.

DECLARE CURSOR 사용 시 주의 사항

클라이언트 애플리케이션이 ODBC 연결을 사용하고 쿼리가 메모리에 비해 너무 큰 결과 집합을 생성하는 경우, 커서를 사용하여 결과 집합을 클라이언트 애플리케이션으로 스트리밍할 수 있습니다. 커서를 사용할 때, 리더 노드에서 전체 결과 집합이 구체화된 다음에 클라이언트가 결과를 증분 방식으로 가져올 수 있습니다.

참고

Microsoft Windows용 ODBC에서 커서를 사용하려면 Amazon Redshift에 사용하는 ODBC DSN에서 [선언/가져오기 사용(Use Declare/Fetch)] 옵션을 사용합니다. 라운드 트립을 최소화하려면 다중 노드 클러스터에 대해 ODBC DSN 옵션 대화 상자에서 캐시 크기 필드를 사용하여 ODBC 캐시 크기를 4,000 이상으로 설정하는 것이 좋습니다. 단일 노드 클러스터에서 Cache Size를 1,000으로 설정합니다.

커서를 사용하면 성능에 나쁜 영향을 미칠 가능성이 있으므로, 가급적이면 다른 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 커서 사용 시 성능 고려사항 단원을 참조하십시오.

Amazon Redshift 커서는 다음 제한 사항과 함께 지원됩니다.

  • 세션당 한 번에 한 개의 커서만 열 수 있습니다.

  • 트랜잭션 (BEGIN … END) 내에서 커서를 사용해야 합니다.

  • 모든 커서에 대한 최대 누적 결과 집합 크기는 클러스터 노드 유형을 기준으로 제한됩니다. 더 큰 결과 집합이 필요하면 XL 또는 8XL 노드 구성으로 크기를 조정할 수 있습니다.

    자세한 내용은 커서 제약 조건 단원을 참조하십시오.

커서 제약 조건

커서의 첫 행을 가져올 때, 리더 노드에 전체 결과 집합이 구체화됩니다. 결과 집합이 메모리에 적합하지 않을 경우 필요에 따라 디스크에 기록됩니다. Amazon Redshift는 리더 노드의 무결성을 보호하려고 클러스터의 노드 유형을 기준으로 모든 커서 결과 집합의 크기에 제약 조건을 적용합니다.

다음 표에는 각 클러스터 노드 유형에 대한 최대 전체 결과 집합 크기가 나와 있습니다. 최대 결과 집합 크기의 단위는 메가바이트입니다.

노드 유형 클러스터당 최대 결과 집합 크기(MB)

RA3 16XL 다중 노드

14400000

DC2 Large 단일 노드

8000

DC2 Large 다중 노드

192000

DC2 8XL 다중 노드

3200000

RA3 4XL 다중 노드

3200000

RA3 XLPLUS 다중 노드

1000000

RA3 XLPLUS 단일 노드

64000

Amazon Redshift Serverless

150000

클러스터에 대한 활성 커서 구성을 보려면 수퍼유저로서 STV_CURSOR_CONFIGURATION 시스템 테이블을 쿼리하십시오. 활성 커서의 상태를 보려면 STV_ACTIVE_CURSORS 시스템 테이블을 쿼리하십시오. 사용자에게는 자신의 커서에 대한 행만 보이지만, 수퍼유저는 모든 커서를 볼 수 있습니다.

커서 사용 시 성능 고려사항

커서는 리더 노드의 전체 결과 집합을 구체화한 후 결과를 클라이언트로 반환하기 시작하므로, 매우 큰 결과 집합을 가진 커서를 사용하면 성능에 나쁜 영향을 미칠 수 있습니다. 결과 집합이 매우 클 때는 커서를 사용하지 않는 것이 좋습니다. 애플리케이션에서 ODBC 연결을 사용할 때와 같이, 경우에 따라서는 커서가 유일하게 실행 가능한 해결책일 수도 있습니다. 가능하면 다음과 같은 대안을 사용하는 것이 좋습니다.

  • UNLOAD를 사용하여 큰 테이블을 내보냅니다. UNLOAD 사용 시, 컴퓨팅 노드가 병렬로 작동하여 Amazon Simple Storage Service에 있는 데이터 파일로 데이터를 직접 전송합니다. 자세한 내용은 데이터 언로드 단원을 참조하십시오.

  • 클라이언트 애플리케이션에서 JDBC 가져오기 크기 파라미터를 설정합니다. JDBC 연결을 사용하는데 클라이언트 측 메모리 부족 오류가 발생할 경우, JDBC 가져오기 크기 파라미터를 설정하여 클라이언트가 더 작은 배치에서 결과 집합을 검색하도록 할 수 있습니다. 자세한 내용은 JDBC Fetch Size 파라미터 설정 단원을 참조하십시오.

DECLARE CURSOR 예제

다음 예에서는 LOLLAPALOOZA로 명명된 커서를 선언하여 롤라팔루자(LOLLAPALOOZA) 행사를 위한 판매 정보를 선택한 후 커서를 사용하여 결과 집합에서 행을 가져옵니다.

-- Begin a transaction begin; -- Declare a cursor declare lollapalooza cursor for select eventname, starttime, pricepaid/qtysold as costperticket, qtysold from sales, event where sales.eventid = event.eventid and eventname='Lollapalooza'; -- Fetch the first 5 rows in the cursor lollapalooza: fetch forward 5 from lollapalooza; eventname | starttime | costperticket | qtysold --------------+---------------------+---------------+--------- Lollapalooza | 2008-05-01 19:00:00 | 92.00000000 | 3 Lollapalooza | 2008-11-15 15:00:00 | 222.00000000 | 2 Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 3 Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 4 Lollapalooza | 2008-04-17 15:00:00 | 239.00000000 | 1 (5 rows) -- Fetch the next row: fetch next from lollapalooza; eventname | starttime | costperticket | qtysold --------------+---------------------+---------------+--------- Lollapalooza | 2008-10-06 14:00:00 | 114.00000000 | 2 -- Close the cursor and end the transaction: close lollapalooza; commit;

다음 예제는 테이블의 모든 결과를 포함하는 refcursor를 반복합니다.

CREATE TABLE tbl_1 (a int, b int); INSERT INTO tbl_1 values (1, 2),(3, 4); CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$ DECLARE target record; curs1 cursor for select * from tbl_1; BEGIN OPEN curs1; LOOP fetch curs1 into target; exit when not found; RAISE INFO 'a %', target.a; END LOOP; CLOSE curs1; END; $$ LANGUAGE plpgsql; CALL sp_cursor_loop(); SELECT message from svl_stored_proc_messages where querytxt like 'CALL sp_cursor_loop()%'; message ---------- a 1 a 3