본문 바로가기
IT

[쿼리] WITH 구문 사용하기

by urosie 2017. 4. 5.

기존 조회 쿼리에서 조회조건을 복잡한 것 하나 더 추가했더니

속도가 기존대비 느려져서~ 찾아보던 중에 with 절! 을 활용한 쿼리 사용법 발견!

 

case문으로 select 해서 가져와야 하는 데이터라 join을 걸지 않고 with절을 이용해서 데이터가 많은 테이블을 뷰변수로 만들어 놓고 쓸 수 있다는 점에서 더 좋은 성능을 낼 수 있다.

 

특히 !!

가독성이 좋다~~  이런경우 보통 임시테이블 생성해서 쓰곤 했는데

with 구문이 훠얼씬 더 편한 것 같다.

 

MSDN에서 찾아보니 CTE(공통 테이블 식) 이라는 표현을 써서 설명을 하고 있다.

 

"CTE(공통 테이블 식)는 SELECT, INSERT, UPDATE, DELETE 또는 CREATE VIEW 문 하나의 실행 범위 내에서 정의되는 임시 결과 집합이라고 볼 수 있습니다. CTE는 개체로 저장되지 않고 쿼리 지속 시간 동안만 존재한다는 점에서 파생 테이블과 비슷합니다. 그러나 CTE는 파생 테이블과 달리 자체 참조가 가능하며 동일 쿼리에서 여러 번 참조될 수 있습니다."

 

"CTE를 사용하면 가독성이 향상되고 복잡한 쿼리를 쉽게 유지 관리할 수 있는 이점이 있습니다. 쿼리를 개별적이고 단순한 논리적 구성 블록으로 나눌 수 있습니다. 그런 다음 이 단순한 블록을 사용하여 최종 결과 집합이 생성될 때까지 보다 복잡한 중간 CTE를 작성할 수 있습니다. "

 

"CTE는 CTE를 나타내는 식 이름, 선택적인 열 목록 및 CTE를 정의하는 쿼리로 구성되어 있습니다. CTE를 정의한 후에는 SELECT, INSERT, UPDATE 또는 DELETE 문에서 테이블이나 뷰처럼 참조할 수 있습니다. CTE는 CREATE VIEW 문에서 정의하는 SELECT 문의 일부분으로 사용될 수도 있습니다. "

 

CTE 구문은 간단하다

 

WITH expression_name [ ( column_name [,...n] ) ]

AS

( CTE_query_definition )

SELECT <column_list>

FROM expression_name;

 

나는 실제로 사용할때는 아래처럼 사용했다.

데이터 양이 많은 테이블 구조가 제대로 인덱스가 잡혀있지 않고 파티셔닝이 없다면.. 그리고 단순 하나의 컬럼이 문제가 되는 경우라서 아래와 같이 수정!

 

WITH TABLE_A AS (

SELECT...   (데이터 양이 많은 A 테이블)

)

, TABLE_B AS (

SELECT...   (데이터 양이 많은 A 테이블)

)

, TABLE_C AS (

SELECT...   (조회시 CASE 구문이 많은 테이블)

)

SELECT ~...

 

댓글