PostgreSQL 공통 테이블 표현식 대 임시 테이블?


11

WITH 의 PostgreSQL 설명서 는 다음 예제를 보여줍니다.

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

또한 메모 :

WITH 쿼리의 유용한 속성은 부모 쿼리 또는 형제 WITH 쿼리에 의해 두 번 이상 참조되는 경우에도 부모 쿼리 실행 당 한 번만 평가된다는 것입니다.

WITH재귀 평가와 같은 다른 용도로 사용할 수 있다는 것을 알았습니다 . 그러나 위의 예에서 WITH임시 테이블을 사용 하고 만드는 것 사이에 중요한 차이점이 있습니까?


당신은 쿼리를 구축에 다른 열을 추가 CTE를 사용하는 경우 SELECT에 WITH단지 이름을 입력하고 다시 실행됩니다. 임시 테이블을 사용하는 동안 DROP및 CREATE. 반면에 쿼리를 작성하고 정적 데이터를 여러 번 재사용하려는 경우 인덱스가 포함 된 임시 테이블을 작성하면 CTE에 확실히 도움이됩니다.
— Vao Tsun

@VaoTsun 쿼리 내에서 사용 TEMPORARY TABLE하는 경우 ON COMMIT DROP쿼리를 수정하고 다시 실행하는 것의 문제입니까? postgresql.org/docs/9.6/static/sql-createtable.html
— Nathan Long

답변:


16

몇 가지 미묘한 차이점이 있지만 과감한 것은 없습니다.

  • 임시 테이블에 인덱스를 추가 할 수 있습니다.
  • 임시 테이블은 세션의 수명 동안 (또는 if ON COMMIT DROP이면 트랜잭션) 존재하며 WITH항상 쿼리의 범위가 지정됩니다.
  • 쿼리가 함수 / 프로 시저를 호출하면 임시 테이블은 볼 수 있지만 테이블 표현식 은 볼 수 없습니다WITH .
  • 임시 테이블 VACUUM은 WITH그렇지 않은 시스템 카탈로그에 대한 작업을 생성 하고이를 생성 / 채우기 위해 추가 왕복이 필요하며 서버의 캐시 관리에 대한 추가 작업이 필요하므로 약간 덜 효율적입니다.

전체적으로 WITH인덱스 작성의 이점을 알지 못하면 임시 테이블을 선호해야합니다 .

그러나 FROM절의 하위 쿼리 인 다른 옵션 에는 매우 다른 장점이 있습니다. 특히 인라인 될 수 있으며 한정자를 올리거나 내릴 수 있습니다. 최근 블로그 기사 에서 이에 대해 썼습니다 .


조회수와 임시 조회수는 어떻습니까?
— CMCDragonkai

1
CTE 용어보다 임시 테이블에 가깝지만 더 가깝습니다. 색인이 없습니다. 세션 범위. 기능 / 프로 시저에 표시됩니다. 카탈로그 진공이 필요합니다.
— Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.