성능고려 SQL 작성 프로세스

 

 

최적의 성능을 위한 SQL작성시 고려사항

 

*집합적 사고

*인덱스(Index(집합적 사고 및 인덱스 정책에 대한 부분))

*조인방식(Join Method)

*조인순서(Join Order)

*조인 연결고리(Join Link)

*인라인 뷰(Inline View)

*서브쿼리(Subquery)

*실행계획(Execution Plan)

*저장형 함수(Stored Procedure)

*스칼라 서브쿼리(Scalar Subquery)

 

고려사항6. 실행계획 확인

 

*실행계획을 확인해야 하는 이유

-SQL 작성시 자신이 예상하였던 실행계획과 옵티마이저가 생성한 실행계획과의 비교

-옵티마이저가 작성자가 생각했던 최적의 처리경로와 같이 실행계획을 수립했는지에 대한 판단이 필요

-옵티마이저의 한계로 인해 사용자가 생각하는 논리적인 판단과의 차이 확인

 

최적의 SQL로 보아도 무방함

사용자가 생각했던 최적의 처리 경로 = 옵티마이저가 생각한 최적의 처리 경로

 

사용자의 논리적 판단과 옵티마이저의 논리적 판단을 비교할 필요가 있음

사용자가 생각했던 최적의 처리 경로 ≠ 옵티마이저가 생각한 최적의 처리 경로

 

고려사항5. Subquery

 

*Subquery의 정의

-메인쿼리에 종속되는 하위의 쿼리를 의미함

-종속의 의미는 반드시 메인쿼리의 집합 레벨을 변경할 수 없음

-메인쿼리는 서브쿼리의 모든 속성을 사용할 수 없음

-서브쿼리는 메인쿼리의 모든 속성을 사용할 수 없음

-대표적인 연산자로는 IN, EXISTS가 있음

 

*제공자형 서브쿼리

-메인쿼리의 처리범위를 줄여줄 수 있을 때 사용 고려

-메인쿼리에 상수값을 공급한는 것과 동일한 효과를 얻을 수 있음

-서브쿼리로부터 상수값을 공급받는 Where절의 조건에 인덱스가 필요함

 

*확인자형 서브쿼리

-메인쿼리에서 산출된 결과가 다른 테이블의 조건을 만족하는지 여부를 확인하고자 할때 사용

-만족하는 결과만 존재하면 처리를 더 이상 만족하는 로우를 찾지 않음으로 처리가 빠름

 

 

 

 

고려사항4. inline View

 

*Inline View의 정의

-인라인 뷰란 FROM 절 상에 오는 서브쿼리로서 VIEW처럼 동작을 함

-적절한 크기의 중간집합을 생성하기 위하여 사용됨

-데이터 처리의 순서를 의도적으로 지정하기 위해 사용됨

-정상적이지 않은 데이터 구조를 연결하기 위해 사용됨

-실행계획의 제어를 위한 목적으로 사용됨

 

*Inline View vs View vs Subquery Factoring

 

 

고려사항3. JOIN LINK

 

*연결고리(Join Link)란 무엇인가?

-Where절에서 조인에 참여하는 각 테이블의 컬럼 간 다양한 연산자(=,<>,=, in...)로 연결되어 있는 부분을 연결고리라고 함

 

*연결고리 종류

-연결고리는 오로지'='만 존재하는 것이 아님

 

 

*연결고리 상태

-양쪽 정상

 。조인 오더에 상관없이 항상 인덱스를 사용

 。양쪽 연결고리가 정상일 경우 처리범위가 적은 테이블부터 드라이빙 되는 것이 유리

 

-한쪽 정상

 。논리적으로 연결고리가 비정상인 테이블(연결고리에 인덱스가 사용할 수 없는 테이블)에서 연결고리가 정상적인 테이블로의 조인오더는 양쪽 정상과 같이 문제가 되지 않음

 。단, 반대의 경우로 수행이 될 경우 성능상의 문제를 야기할 수 있음

 

-양쪽 이상

 。대부분 Nested Loops 조인 형태 보다는 Hash Join으로 풀리게 된느 경우가 대부분임

고려사항2. JOIN Order

 

*Driving Table

-드라이빙 테이블이란 두개의 테이블이 조인을 할 경우 먼저 처리 되는 테이블을 의미한다.

-WHERE절의 상수 조건에 가용할 수 있는 인덱스가 존재해야 함

 

*Driven Table

-두 개의 테이블이 조인을 할 경우 뒤에 처리되는 테이블을 의미한다.

-드라이빙 테이블로부터 상수값을 공급받아 처리됨

-연결고리를 통해 상수 값은 공급받게 됨

-따라서, 연결고리에 인덱스가 정상적으로 존재해야 함

-또는, 연결고리와 WHERE절의 상수조건을 포함한 인덱스가 존재해야 함

 

*최적화된 Join Order란?

-모든 연결고리가 정상상태일 경우 처리범위가 적은 쪽에서 부터 드라이빙 되도록 처리하는 것이 일반적으로 최적화된 조인 오더임

 

고려사항 1. JOIN Method

 

 

+ Recent posts