> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/tibero-sql-reference-guide/sql-elements/undefined-5.md).

# 주석과 힌트

## 주석과 힌트

### 주석

SQL 문장과 스키마 객체에는 주석을 넣을 수 있습니다. 주석은 문장의 목적이나 사용 의도를 설명할 때 사용합니다.

주석은 데이터베이스 문자 집합으로 표현할 수 있는 내용이면 자유롭게 작성할 수 있습니다. 주석은 SQL 문장의 실행 결과에 영향을 주지 않습니다.

주석은 다음 두 방식으로 작성합니다.

* `/*`로 시작하고 `*/`로 끝내는 방식입니다. 여러 줄에 걸쳐 작성할 수 있습니다.
* `--`로 시작하는 방식입니다. 해당 줄 끝까지 주석으로 처리합니다.

아래는 SQL 문장에 주석을 넣는 예시입니다.

```sql
SELECT EMPNO, ENAME, E.DEPTNO
     /* 부서가 ACCOUNTING인 직원 목록을 조회합니다. */
FROM EMP E, DEPT D
     /* 직원과 부서 테이블을 조인합니다. */
WHERE E.DEPTNO = D.DEPTNO
  AND D.DNAME = 'ACCOUNTING';

SELECT EMPNO, ENAME, E.DEPTNO -- 부서가 RESEARCH인 직원 목록을 조회합니다.
FROM EMP E, DEPT D            -- 직원과 부서 테이블을 조인합니다.
WHERE E.DEPTNO = D.DEPTNO
  AND D.DNAME = 'RESEARCH';
```

SQL 문장뿐 아니라 스키마 객체에도 주석을 넣을 수 있습니다. `COMMENT` 명령으로 테이블, 뷰, 컬럼에 주석을 저장할 수 있습니다. 저장된 주석은 데이터 사전에 보관됩니다.

***

### 힌트

힌트는 질의 최적화기에 특정 실행 방향을 지시하는 주석입니다.

질의 최적화기가 항상 최적의 실행 계획을 고르는 것은 아닙니다. 이럴 때 힌트로 접근 방법, 조인 순서, 조인 방법 등을 직접 제어할 수 있습니다.

하나의 질의 블록에는 하나의 힌트 주석만 둘 수 있습니다. 하나의 힌트 주석 안에는 여러 힌트를 나열할 수 있습니다. 힌트는 `SELECT`, `INSERT`, `UPDATE`, `DELETE` 바로 뒤에 위치해야 합니다.

**힌트 사용 예시**

```sql
SELECT /*+ hint [hint] ... */ *
FROM T;

INSERT /*+ hint [hint] ... */ INTO T
SELECT * FROM S;

UPDATE /*+ hint [hint] ... */ T
SET C1 = 1
WHERE C2 = 2;

DELETE /*+ hint [hint] ... */ FROM T
WHERE C1 = 1;

SELECT --+ hint [hint] ...
       *
FROM T;

INSERT --+ hint [hint] ...
       INTO T
SELECT * FROM S;

UPDATE --+ hint [hint] ...
       T
SET C1 = 1
WHERE C2 = 2;

DELETE --+ hint [hint] ...
       FROM T
WHERE C1 = 1;
```

힌트를 사용할 때는 다음 사항을 주의합니다.

* 힌트는 `SELECT`, `INSERT`, `UPDATE`, `DELETE` 바로 뒤에만 올 수 있습니다.
* `+` 기호는 반드시 주석 구분자 바로 뒤에 공백 없이 붙여야 합니다.
* `+` 기호 다음에는 공백이 있어도 됩니다.
* 문법에 맞지 않는 힌트는 주석으로 처리됩니다. 오류는 발생하지 않습니다.

다음은 주요 힌트의 종류입니다.

#### 질의 변형

<table><thead><tr><th width="301">힌트</th><th>설명</th></tr></thead><tbody><tr><td>NO_QUERY_TRANSFORMATION</td><td>전체 질의에 대한 변형 비활성화</td></tr><tr><td>NO_MERGE</td><td>특정 뷰의 뷰 병합 비활성화</td></tr><tr><td>UNNEST</td><td>특정 부질의의 언네스팅 수행</td></tr><tr><td>NO_UNNEST</td><td>특정 부질의의 언네스팅 비활성화</td></tr><tr><td>NO_JOIN_ELIMINATION</td><td>조인 제거 비활성화</td></tr><tr><td>STAR_TRANSFORMATION</td><td>스타 변형 수행</td></tr><tr><td>USE_CONCAT</td><td>OR expansion 플랜 생성 강제</td></tr><tr><td>NO_EXPAND</td><td>OR expansion 비활성화</td></tr></tbody></table>

#### 최적화 방법

<table><thead><tr><th width="235">힌트</th><th>설명</th></tr></thead><tbody><tr><td>ALL_ROWS</td><td>전체 결과 처리량 중심의 최적화</td></tr><tr><td>FIRST_ROWS</td><td>초기 로우 반환 속도 중심의 최적화</td></tr></tbody></table>

#### 접근 방법

<table><thead><tr><th width="174">힌트</th><th>설명</th></tr></thead><tbody><tr><td>FULL</td><td>전체 테이블 스캔</td></tr><tr><td>INDEX</td><td>명시한 인덱스를 사용하는 인덱스 스캔</td></tr><tr><td>NO_INDEX</td><td>명시한 인덱스를 사용하는 인덱스 스캔 비활성화</td></tr><tr><td>INDEX_ASC</td><td>명시한 인덱스를 오름차순으로 스캔</td></tr><tr><td>INDEX_DESC</td><td>명시한 인덱스를 내림차순으로 스캔</td></tr><tr><td>INDEX_FFS</td><td>빠른 전체 인덱스 스캔 수행</td></tr><tr><td>NO_INDEX_FFS</td><td>빠른 전체 인덱스 스캔 비활성화</td></tr><tr><td>INDEX_RS</td><td>범위 인덱스 스캔 수행</td></tr><tr><td>NO_INDEX_RS</td><td>범위 인덱스 스캔 비활성화</td></tr><tr><td>INDEX_SS</td><td>인덱스 스킵 스캔 수행</td></tr><tr><td>NO_INDEX_SS</td><td>인덱스 스킵 스캔 비활성화</td></tr><tr><td>INDEX_JOIN</td><td>두 개 이상 인덱스를 이용한 자체 조인 수행</td></tr></tbody></table>

#### 조인 순서

<table><thead><tr><th width="164">힌트</th><th>설명</th></tr></thead><tbody><tr><td>LEADING</td><td>먼저 조인할 테이블 집합 지정</td></tr><tr><td>ORDERED</td><td>FROM 절에 적은 순서대로 조인</td></tr></tbody></table>

#### 조인 방법

<table><thead><tr><th width="242">힌트</th><th>설명</th></tr></thead><tbody><tr><td>USE_NL</td><td>중첩 루프 조인 사용</td></tr><tr><td>NO_USE_NL</td><td>중첩 루프 조인 비활성화</td></tr><tr><td>USE_NL_WITH_INDEX</td><td>명시한 인덱스를 이용한 중첩 루프 조인 사용</td></tr><tr><td>USE_MERGE</td><td>합병 조인 사용</td></tr><tr><td>NO_USE_MERGE</td><td>합병 조인 비활성화</td></tr><tr><td>USE_HASH</td><td>해시 조인 사용</td></tr><tr><td>NO_USE_HASH</td><td>해시 조인 비활성화</td></tr><tr><td>HASH_SJ</td><td>해시 방식 세미조인 사용</td></tr><tr><td>HASH_AJ</td><td>해시 방식 안티조인 사용</td></tr><tr><td>MERGE_SJ</td><td>머지 방식 세미조인 사용</td></tr><tr><td>MERGE_AJ</td><td>머지 방식 안티조인 사용</td></tr><tr><td>NL_SJ</td><td>네스티드 루프 방식 세미조인 사용</td></tr><tr><td>NL_AJ</td><td>네스티드 루프 방식 안티조인 사용</td></tr><tr><td>SWAP_JOIN_INPUTS</td><td>명시한 테이블을 해시 조인의 빌드 입력으로 사용</td></tr><tr><td>NO_SWAP_JOIN_INPUTS</td><td>조인 입력 순서 변경 비활성화</td></tr></tbody></table>

#### 병렬 처리

<table><thead><tr><th width="246">힌트</th><th>설명</th></tr></thead><tbody><tr><td>PARALLEL</td><td>지정한 개수의 스레드로 병렬 수행</td></tr><tr><td>NO_PARALLEL</td><td>병렬 수행 비활성화</td></tr><tr><td>PQ_DISTRIBUTE</td><td>병렬 조인 시 로우 분산 방법 지정</td></tr></tbody></table>

#### 실체화 뷰

<table data-header-hidden><thead><tr><th width="163"></th><th></th></tr></thead><tbody><tr><td>REWRITE</td><td>실체화 뷰를 사용한 질의 재작성 수행</td></tr><tr><td>NO_REWRITE</td><td>질의 재작성 비활성화</td></tr><tr><td>MATERIALIZE</td><td><code>WITH</code> 절 안의 부질의를 실체화</td></tr><tr><td>INLINE</td><td><code>WITH</code> 절 안의 부질의 실체화 비활성화</td></tr></tbody></table>

#### 기타

<table><thead><tr><th width="325">힌트</th><th>설명</th></tr></thead><tbody><tr><td>APPEND</td><td>Direct-Path 방식으로 삽입</td></tr><tr><td>APPEND_VALUES</td><td><code>VALUES</code> 절을 사용하는 INSERT 문에 Direct-Path 방식 적용</td></tr><tr><td>NOAPPEND</td><td>Direct-Path 방식 비활성화</td></tr><tr><td>IGNORE_ROW_ON_DUPKEY_INDEX</td><td>유일 키 중복 시 오류 없이 해당 로우 건너뜀</td></tr><tr><td>CARD</td><td>지정 테이블의 Cardinality 지정</td></tr><tr><td>MONITOR</td><td>질의 수행 정보 수집</td></tr><tr><td>NO_MONITOR</td><td>질의 수행 정보 수집 비활성화</td></tr><tr><td>RESULT_CACHE</td><td>Result Cache 사용</td></tr><tr><td>NO_SUBQUERY_CACHE</td><td>특정 부질의 결과 캐싱 비활성화</td></tr><tr><td>OPT_PARAM</td><td>질의 수행 중 초기화 환경 변수 변경</td></tr></tbody></table>

### 질의 변형

질의 변형 관련 힌트는 질의 변형기(Query Transformer)의 동작에 영향을 줍니다.

#### NO\_QUERY\_TRANSFORMATION

`NO_QUERY_TRANSFORMATION`은 전체 질의에 대해 변형을 수행하지 않도록 지시합니다. Tibero는 기본적으로 질의를 자동 변형해 실행 계획을 만듭니다. 이 힌트를 사용하면 그 기본 동작을 막을 수 있습니다.

#### NO\_MERGE

`NO_MERGE`는 특정 뷰에 대한 뷰 병합을 수행하지 않도록 지시합니다. 기본적으로 병합 가능한 뷰는 상위 질의 블록과 결합됩니다.

```sql
SELECT *
FROM T1, (SELECT /*+ NO_MERGE */ * FROM T2, T3 WHERE T2.A = T3.B) V
WHERE T1.C = V.D;
```

#### UNNEST

`UNNEST`는 특정 부질의를 언네스팅하도록 지시합니다. 이 힌트는 대상 부질의 블록에 명시합니다.

#### NO\_UNNEST

`NO_UNNEST`는 특정 부질의의 언네스팅을 막습니다. 언네스팅이 가능한 부질의라도 조인 변환을 하지 않도록 강제할 수 있습니다.

#### NO\_JOIN\_ELIMINATION

`NO_JOIN_ELIMINATION`은 불필요한 조인 제거를 수행하지 않도록 지시합니다.

```sql
SELECT /*+ NO_JOIN_ELIMINATION */ T2.FK, T2.A
FROM T1, T2
WHERE T2.FK = T1.PK;
```

#### STAR\_TRANSFORMATION

`STAR_TRANSFORMATION`은 가능한 경우 스타 변형을 시도하도록 지시합니다.

```sql
SELECT /*+ STAR_TRANSFORMATION */ S.*
FROM S, T1, T2
WHERE S.C1 = T1.C1
  AND S.C2 = T2.C2;
```

#### USE\_CONCAT

`USE_CONCAT`은 `OR` 조건을 `UNION ALL` 형태로 확장한 OR expansion 플랜을 강제합니다.

#### NO\_EXPAND

`NO_EXPAND`는 OR expansion을 막고 `OR` 조건을 필터로 유지한 플랜을 강제합니다.

### 최적화 방법

최적화 방법 힌트는 처리량과 초기 응답 속도 사이의 우선순위를 조정합니다. 이 힌트가 지정된 질의는 통계 정보나 `OPTIMIZER_MODE` 기본값과 별개로 해당 방향을 우선 적용합니다.

#### ALL\_ROWS

`ALL_ROWS`는 전체 결과 처리량이 가장 크도록 최적화합니다.

#### FIRST\_ROWS

`FIRST_ROWS`는 초기 로우를 빠르게 반환하도록 최적화합니다.

### 접근 방법

접근 방법 힌트는 특정 접근 경로를 사용할 수 있을 때 그 방법을 우선 선택하도록 지시합니다. 명시한 방법을 사용할 수 없으면 질의 최적화기는 해당 힌트를 무시합니다.

힌트에 쓰는 테이블 이름은 SQL 문장에서 사용하는 이름과 같아야 합니다. 별칭을 사용했다면 테이블 이름 대신 별칭을 사용해야 합니다. SQL 문장에 스키마 이름을 적었더라도 힌트에는 테이블 이름 또는 별칭만 적습니다.

#### FULL

`FULL`은 전체 테이블 스캔을 사용하도록 지시합니다.

#### INDEX

`INDEX`는 명시한 인덱스를 사용하는 인덱스 스캔을 지시합니다.

#### NO\_INDEX

`NO_INDEX`는 명시한 인덱스를 사용하는 인덱스 스캔을 막습니다. `INDEX`, `INDEX_ASC`, `INDEX_DESC`와 같은 인덱스를 함께 지정하면 두 힌트 모두 무시됩니다.

#### INDEX\_ASC

`INDEX_ASC`는 명시한 인덱스를 오름차순으로 스캔하도록 지시합니다. 범위 스캔이 아닌 경우에는 `INDEX`와 같은 의미로 동작합니다.

#### INDEX\_DESC

`INDEX_DESC`는 명시한 인덱스를 내림차순으로 스캔하도록 지시합니다.

#### INDEX\_FFS

`INDEX_FFS`는 빠른 전체 인덱스 스캔(Fast Full Index Scan)을 사용하도록 지시합니다.

#### NO\_INDEX\_FFS

`NO_INDEX_FFS`는 빠른 전체 인덱스 스캔을 사용하지 않도록 지시합니다.

#### INDEX\_RS

`INDEX_RS`는 범위 인덱스 스캔(Range Index Scan)을 사용하도록 지시합니다.

#### NO\_INDEX\_RS

`NO_INDEX_RS`는 범위 인덱스 스캔을 사용하지 않도록 지시합니다.

#### INDEX\_SS

`INDEX_SS`는 인덱스 스킵 스캔(Index Skip Scan)을 사용하도록 지시합니다.

#### NO\_INDEX\_SS

`NO_INDEX_SS`는 인덱스 스킵 스캔을 사용하지 않도록 지시합니다.

#### INDEX\_JOIN

`INDEX_JOIN`은 두 개 이상의 인덱스를 이용한 자체 조인을 사용하도록 지시합니다.

### 조인 순서

`LEADING`, `ORDERED`는 조인 순서를 제어합니다. 일반적으로는 선택 폭이 더 넓은 `LEADING`을 사용하는 편이 좋습니다.

#### LEADING

`LEADING`은 먼저 조인해야 할 테이블 집합을 지정합니다. 먼저 조인될 수 없는 테이블을 지정하면 무시됩니다.

서로 충돌하는 `LEADING` 힌트가 함께 있으면 `LEADING`, `ORDERED`가 모두 무시됩니다. `ORDERED`가 있으면 `LEADING`은 모두 무시됩니다.

#### ORDERED

`ORDERED`는 `FROM` 절에 적은 순서대로 조인하도록 지시합니다. 조인 순서를 명확히 제어해야 할 때 사용합니다.

### 조인 방법

조인 방법 힌트는 명시한 테이블이 조인의 내부 테이블로 사용될 때만 참조됩니다. 외부 테이블로 사용되면 힌트가 무시될 수 있습니다.

#### USE\_NL

`USE_NL`은 중첩 루프 조인을 사용하도록 지시합니다.

#### NO\_USE\_NL

`NO_USE_NL`은 중첩 루프 조인을 사용하지 않도록 지시합니다. 다만 특수한 경우에는 중첩 루프 조인이 선택될 수 있습니다.

#### USE\_NL\_WITH\_INDEX

`USE_NL_WITH_INDEX`는 명시한 인덱스와 조인 조건을 사용한 중첩 루프 조인을 지시합니다. 인덱스를 사용할 수 없으면 힌트는 무시됩니다.

#### USE\_MERGE

`USE_MERGE`는 합병 조인을 사용하도록 지시합니다.

#### NO\_USE\_MERGE

`NO_USE_MERGE`는 합병 조인을 사용하지 않도록 지시합니다.

#### USE\_HASH

`USE_HASH`는 해시 조인을 사용하도록 지시합니다.

#### NO\_USE\_HASH

`NO_USE_HASH`는 해시 조인을 사용하지 않도록 지시합니다.

#### HASH\_SJ

`HASH_SJ`는 언네스팅 시 해시 방식 세미조인을 사용하도록 지시합니다.

#### HASH\_AJ

`HASH_AJ`는 언네스팅 시 해시 방식 안티조인을 사용하도록 지시합니다.

#### MERGE\_SJ

`MERGE_SJ`는 언네스팅 시 머지 방식 세미조인을 사용하도록 지시합니다.

#### MERGE\_AJ

`MERGE_AJ`는 언네스팅 시 머지 방식 안티조인을 사용하도록 지시합니다.

#### NL\_SJ

`NL_SJ`는 언네스팅 시 네스티드 루프 방식 세미조인을 사용하도록 지시합니다.

#### NL\_AJ

`NL_AJ`는 언네스팅 시 네스티드 루프 방식 안티조인을 사용하도록 지시합니다.

#### SWAP\_JOIN\_INPUTS

`SWAP_JOIN_INPUTS`는 해시 조인에서 명시한 테이블을 빌드 입력으로 사용하도록 지시합니다.

#### NO\_SWAP\_JOIN\_INPUTS

`NO_SWAP_JOIN_INPUTS`는 해시 조인에서 조인 입력 순서 변경을 막습니다.

### 병렬 처리

#### PARALLEL

`PARALLEL`은 지정한 개수의 스레드로 질의를 병렬 수행하도록 지시합니다.

#### NO\_PARALLEL

`NO_PARALLEL`은 질의를 병렬 수행하지 않도록 지시합니다.

#### PQ\_DISTRIBUTE

`PQ_DISTRIBUTE`는 조인을 포함한 병렬 질의에서 로우 분산 방법을 지정합니다. 분산 방법을 조정하면 병렬 조인 성능을 개선할 수 있습니다.

아래는 분산 방법별 의미입니다.

<table><thead><tr><th width="208">속성</th><th>설명</th></tr></thead><tbody><tr><td>NONE NONE</td><td>힌트가 없을 때와 같은 플랜 생성</td></tr><tr><td>BROADCAST NONE</td><td>왼쪽 입력은 BROADCAST, 오른쪽 입력은 PE BLOCK ITERATOR 방식 사용</td></tr><tr><td>NONE BROADCAST</td><td>왼쪽 입력은 PE BLOCK ITERATOR, 오른쪽 입력은 BROADCAST 방식 사용</td></tr><tr><td>HASH HASH</td><td>양쪽 입력 모두 HASH 방식 사용</td></tr></tbody></table>

### 실체화 뷰

#### REWRITE

`REWRITE`는 비용 비교 없이 실체화 뷰를 사용한 질의 재작성을 시도하도록 지시합니다. 실체화 뷰 목록을 함께 적으면 지정한 실체화 뷰만 사용합니다.

#### NO\_REWRITE

`NO_REWRITE`는 해당 질의 블록의 재작성을 하지 않도록 지시합니다.

#### MATERIALIZE

`MATERIALIZE`는 `WITH` 절 안의 부질의를 실체화하도록 지시합니다.

#### INLINE

`INLINE`은 `WITH` 절 안의 부질의를 실체화하지 않도록 지시합니다.

### 기타

#### APPEND

`APPEND`는 DML 문장에서 Direct-Path 삽입을 사용하도록 지시합니다.

Direct-Path 방식은 새 데이터 블록을 할당해 삽입을 수행합니다. 버퍼 캐시를 거치지 않고 직접 데이터 파일에 기록하므로 대량 삽입에서 유리합니다.

#### APPEND\_VALUES

`APPEND_VALUES`는 `VALUES` 절을 사용하는 `INSERT` 문에서 Direct-Path 삽입을 사용하도록 지시합니다.

#### NOAPPEND

`NOAPPEND`는 Direct-Path 삽입을 사용하지 않도록 지시합니다.

#### IGNORE\_ROW\_ON\_DUPKEY\_INDEX

`IGNORE_ROW_ON_DUPKEY_INDEX`는 단일 테이블 `INSERT` 문에서만 사용할 수 있습니다. 유일 키 제약조건을 위배하는 로우가 있으면 오류를 발생시키지 않고 해당 로우만 롤백한 뒤 다음 로우 삽입을 계속합니다.

인덱스를 지정하지 않거나, 여러 인덱스를 지정하거나, 지정한 인덱스가 `UNIQUE`가 아니면 오류가 발생합니다. 이 힌트를 사용하면 `APPEND`, `PARALLEL` 힌트는 무시됩니다.

#### CARD

`CARD`는 지정한 테이블의 Cardinality를 주어진 값으로 계산하도록 지시합니다.

#### MONITOR

`MONITOR`는 질의 수행 정보를 수집하도록 지시합니다.

#### NO\_MONITOR

`NO_MONITOR`는 질의 수행 정보를 수집하지 않도록 지시합니다.

#### RESULT\_CACHE

`RESULT_CACHE`는 질의 결과를 저장하기 위해 Result Cache를 사용하도록 지시합니다.

`RESULT_CACHE_MODE` 초기 파라미터 값이 `MANUAL`일 때만 유효합니다. `FORCE`일 때는 힌트와 관계없이 모든 질의 결과를 Result Cache에 저장합니다.

#### NO\_SUBQUERY\_CACHE

`NO_SUBQUERY_CACHE`는 특정 질의 블록의 부질의 결과를 캐싱하지 않도록 강제합니다. 이 힌트는 대상 질의 블록에 명시합니다.

```sql
SELECT *
FROM T1
WHERE EXISTS (
    SELECT /*+ NO_SUBQUERY_CACHE */ *
    FROM T2
    WHERE T1.A = T2.A
);
```

#### OPT\_PARAM

`OPT_PARAM`은 질의가 수행되는 동안 초기화 환경 변수를 바꿔서 적용하는 힌트입니다.

예를 들어 아래 힌트는 해당 질의가 수행되는 동안 `OPTIMIZER_MODE`를 `FIRST_ROWS_1`로 설정합니다.

```sql
SELECT /*+ OPT_PARAM(OPTIMIZER_MODE FIRST_ROWS_1) */ *
FROM T;
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/tibero-manuals/7.2.6.manuals/tibero-sql-reference-guide/sql-elements/undefined-5.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
