수색…


매개 변수

매개 변수 세부
평행도 (DOP) 쿼리를 열어 둘 수있는 병렬 연결 / 프로세스의 수입니다. 대개 2, 4, 8, 16 등입니다.
테이블 이름 병렬 힌트가 적용될 테이블의 이름입니다.

병렬 힌트

문 수준의 병렬 힌트가 가장 쉽습니다.

SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;

객체 레벨의 병렬 힌트는보다 많은 제어를 제공하지만 오류가 발생하기 쉽습니다. 개발자는 종종 개체 이름 대신 별칭을 사용하는 것을 잊어 버렸거나 일부 개체를 포함하는 것을 잊었습니다.

SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;

SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;

병렬 힌트를 사용하지 않고 쿼리를 실행하는 데 100 초가 걸린다고 가정 해 보겠습니다. 동일한 쿼리에 대해 DOP를 2로 변경하면 이상적인 병렬 힌트가있는 동일한 쿼리는 50 초가 걸릴 것입니다. 마찬가지로 DOP를 4로 사용하면 25 초가 걸릴 것입니다.

실제로 병렬 실행은 다른 많은 요인에 따라 달라지며 선형으로 확장되지 않습니다. 이는 병렬 실행 오버 헤드가 여러 병렬 서버에서 실행될 때의 이득보다 클 수있는 작은 실행 시간에 특히 그렇습니다.

USE_NL

중첩 루프를 사용하십시오.

사용법 : use_nl(AB)

이 힌트는 중첩 루프 메서드를 사용하여 테이블 A와 B를 조인하도록 엔진에 요청합니다. 이는 행별로 비교하는 것입니다. 힌트는 조인 순서를 강제하지 않으며 NL을 요청합니다.

SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

첨부 힌트

"새 행을 삽입하는 데 DIRECT PATH 방법 사용".

APPEND 힌트는 엔진에 직접 경로로드 를 사용하도록 지시합니다 . 즉, 엔진은 메모리 구조와 표준 잠금을 사용하는 기존 삽입을 사용하지 않지만 데이터를 테이블 공간에 직접 씁니다. 항상 테이블의 세그먼트에 추가되는 새로운 블록을 만듭니다. 이것은 더 빠르지 만 몇 가지 제한이 있습니다.

  • 거래를 승인하거나 롤백 할 때까지 동일한 세션에서 추가 한 테이블을 읽을 수 없습니다.
  • 테이블에 정의 된 트리거가 있으면 Oracle 은 직접 경로를 사용하지 않습니다 (sqlldr로드에 대해서는 다른 이야기입니다).
  • 다른 사람

예.

INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;

USE_HASH

해시 메서드를 사용하여 인수의 테이블을 조인하도록 엔진에 지시합니다.

사용법 : use_hash(TableA [TableB] ... [TableN])

많은 에서 설명했듯이 "HASH 조인에서 Oracle은 하나의 테이블 (일반적으로 조인 된 결과 중 작은 것)에 액세스하고 메모리의 조인 키에 해시 테이블을 작성한 다음 조인에서 다른 테이블을 스캔합니다 하나)와 일치하는 해시 테이블을 조사합니다. "

테이블이 크거나 인덱스가없는 경우에는 중첩 루프 메소드에 비해 선호됩니다.

참고 : 힌트는 조인 순서를 강제하지 않으며 해시 조인 (HASH JOIN) 방법을 요청합니다.

사용 예 :

SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

완전한

FULL 힌트는 인덱스가 사용될 수 있는지 여부와 상관없이 지정된 테이블에서 전체 테이블 스캔을 수행하도록 Oracle에 지시합니다.

create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);

힌트가 없으면 색인이 사용됩니다.

select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    13 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |      |     1 |    13 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX  |     2 |    26 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

전체 힌트는 전체 검사를 강제 실행합니다.

select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |     1 |    13 |    47   (3)| 00:00:01 |
|   1 |  SORT AGGREGATE    |           |     1 |    13 |            |          |
|*  2 |   TABLE ACCESS FULL| FULLTABLE |     2 |    26 |    47   (3)| 00:00:01 |
--------------------------------------------------------------------------------

결과 캐시

Oracle ( 11g 이상 )을 사용하면 SQL 쿼리를 SGA에 캐시하고 성능을 향상시키기 위해 재사용 할 수 있습니다. 데이터베이스가 아닌 캐시에서 데이터를 쿼리합니다. 데이터가 캐시에서 가져 오기 때문에 동일한 쿼리의 후속 실행이 빠릅니다.

SELECT /*+ result_cache */ number FROM main_table;

출력 -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:02.20

같은 쿼리를 다시 실행하면 첫 번째 실행 중에 설정 한 캐시에서 데이터를 가져 오므로 실행 시간이 단축됩니다.

출력 -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:00.10

경과 시간이 2.20 초 에서 0.10 초로 감소 된 것을 주목하십시오.

결과 캐시는 데이터베이스의 데이터가 업데이트 / 변경 / 삭제 될 때까지 캐시를 보유합니다. 변경하면 캐시가 해제됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow