본문 바로가기
DB/MySQL

(MySQL/DB) Hint

by windy7271 2023. 3. 2.
728x90
반응형

Hint 옵티마이저의 실행 계획을 원하는 대로 바꿀수 있게 해준다.

계발자가 조인이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이다.

 

Select 문에 

/*+HINT */

이렇게 들어간다.

 

왜 사용해??

  1. 성능 향상: 적절한 힌트를 사용하면 쿼리 성능을 향상시킬 수 있다. 예를 들어, 인덱스를 사용하지 않거나 잘못된 인덱스를 사용하는 쿼리가 있다면 인덱스 힌트를 사용하여 적절한 인덱스를 사용하도록 할 수 있다. 또는 JOIN 순서가 잘못되어 성능이 저하되는 경우 STRAIGHT_JOIN 힌트를 사용하여 JOIN 순서를 강제로 조정할 수 있다.
  2. 예측 가능성: 옵티마이저는 실행 계획을 최적화하기 위해 여러 가지 규칙을 적용한다다. 하지만 모든 상황에서 최적의 실행 계획을 만들어내는 것은 어렵다. 힌트를 사용하면 쿼리 실행 계획을 예측 가능하게 만들 수 있다.
  3. 테스트: 특정 힌트를 사용하면 실행 계획이 어떻게 바뀌는지 확인할 수 있다. 이를 통해 쿼리 실행 계획에 대한 이해도를 높일 수 있다.

옵티마이저 힌트

 

옵티마이저 힌트는 데이터베이스 옵티마이저가 쿼리 실행 계획을 선택할 때 사용되는 힌트이다.

쿼리에 대한 실행 계획을 수동으로 지정할 수 있다.

일반적으로는 데이터베이스 옵티마이저가 자동으로 최적의 실행 계획을 선택하지만,

특정한 상황에서는 수동으로 실행 계획을 지정해야 할 필요가 있다.

 

옵티마이저 힌트는 범위에 따라 적용된다.

  • Global : 전체 쿼리
  • Query Block: 특정 쿼리 블록에 사용 할 수 있다. 힌트가 명시된 쿼리 블록에 대해서만 영향이 미침.
  • Table-Level: 특정 레이블의 이름을사용할 수 있는 힌트
  • Index-Level: 특정 인덱스의 이름을 사용할 수 있는 힌트

STRAIGHT_JOIN  : 조인 순서 강제 지시

SELECT * FROM table1 STRAIGHT_JOIN table2 WHERE ...

첫 번째 테이블을 읽고, 두 번째 테이블에서 해당 레코드를 가져오도록 하여 JOIN 성능을 최적화할 수 있다.

 

SQL_BUFFER_RESULT : 결과를 버퍼링하여 쿼리 수행시간 단축

SELECT SQL_BUFFER_RESULT * FROM table1 WHERE ...

이 힌트는 결과를 디스크가 아닌 메모리에 캐시하도록 MySQL 옵티마이저에게 지시한다.

이를 사용하면 쿼리가 실행되고 결과가 반환될 때까지 전체 결과 집합을 서버에서 캐시할 수 있으며,

이를 통해 더 빠른 결과 반환 및 다른 쿼리 실행 시간 감소 효과를 얻을 수 있다

SQL_NO_CACHE : 캐시 사용 무시하여 쿼리 수행시간 단축

SELECT SQL_NO_CACHE * FROM table1 WHERE ...

이 힌트는 결과를 캐시하지 않도록 MySQL 옵티마이저에게 지시한다,

이를 사용하면 결과를 캐시하지 않으므로 결과 집합이 변경되었을 때 항상 최신 결과를 가져올 수 있다.

인덱스 힌트

 

인덱스 힌트는 데이터베이스 엔진이 쿼리를 실행할 때 사용할 인덱스를 지정하는 방법,

인덱스 힌트를 사용하면 데이터베이스 엔진이 자체적으로 결정한 최적의 실행 계획과는 다른 실행 계획을 수행할 수 있다.

 

 

USE INDEX  : 특정 인덱스 사용하도록 지시 가장 자주 사용되는 힌트다

SELECT /*+ USE INDEX (index1) */ * FROM table1 WHERE column1 = 1;

SELECT USE INDEX (index1) FROM table1 WHERE column1 = 1;

옵티마이저 힌트를 사용할때는 /*+ */ 을 사용을 권장한다. 하지만 아랫줄 코드처름 주석처리없이 코드작성이 가능하다

 

IGNORE INDEX : 특정 인덱스 무시하도록 지시 

SELECT * FROM table1 IGNORE INDEX (index1) WHERE ...

FORCE INDEX : 특정 인덱스 강제로 사용하도록 지시 USE INDEX 보다 옵티마이저에게 미치는 영향이 더 강한 힌트다

SELECT * FROM table1 FORCE INDEX (index1) WHERE ...

 

 

예시 

힌트를 사용 하지 않았을때이다

SELECT *
FROM customer
WHERE city = 'New York';

 

옵티마이저 힌트

SELECT /*+ INDEX(customer city) */ *
FROM customer
WHERE city = 'New York';

 

인덱스 힌트

SELECT *
FROM customer USE INDEX (city)
WHERE city = 'New York';

 

같이 사용하는 경우

SELECT /*+ INDEX(customer city) */ *
FROM customer
USE INDEX (city)
WHERE city = 'New York';

 

 

 

 

USE INDEX,IGNORE INDEX 등 겹치는 힌트들이 있다.

 

즉 간단하게 말하면 

옵티마이저 힌트는 select 문에 쓰고 >>> 쿼리 전체에 영향을 미친다.

인덱스 힌트는 from 절에 쓰는걸로 이해하면 된다 >> 쿼리의 일부분에만 영향을 끼친다

 

반응형

댓글