기존 조회 쿼리에서 조회조건을 복잡한 것 하나 더 추가했더니
속도가 기존대비 느려져서~ 찾아보던 중에 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 ~...
'IT' 카테고리의 다른 글
[Python] Python numpy, matplotlib 라이브러리 설치! (1) | 2018.01.20 |
---|---|
[도커] Docker 명령어 정리! (0) | 2018.01.19 |
[JavaScript] Ajax란 뭘까 (0) | 2018.01.19 |
[기타] FTP passive/active 모드 (0) | 2017.04.11 |
[JavaScript] JSON.parse(), JSON.stringify() 사용하는법 (0) | 2017.04.05 |
댓글