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


11

WITHPostgreSQL 설명서 는 다음 예제를 보여줍니다.

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를 사용하는 경우 SELECTWITH단지 이름을 입력하고 다시 실행됩니다. 임시 테이블을 사용하는 동안 DROPCREATE. 반면에 쿼리를 작성하고 정적 데이터를 여러 번 재사용하려는 경우 인덱스가 포함 된 임시 테이블을 작성하면 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 .
  • 임시 테이블 VACUUMWITH그렇지 않은 시스템 카탈로그에 대한 작업을 생성 하고이를 생성 / 채우기 위해 추가 왕복이 필요하며 서버의 캐시 관리에 대한 추가 작업이 필요하므로 약간 덜 효율적입니다.

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

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


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

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