PostgreSQL Biểu thức bảng chung so với bảng tạm thời?


11

Các tài liệu PostgreSQL trên VỚI chương trình ví dụ sau:

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;

Nó cũng ghi chú:

Một thuộc tính hữu ích của các truy vấn VỚI là chúng chỉ được đánh giá một lần cho mỗi lần thực hiện truy vấn cha, ngay cả khi chúng được truy vấn nhiều lần bởi truy vấn cha hoặc anh chị em với các truy vấn.

Tôi thấy rằng WITHcó thể được sử dụng cho những thứ khác, như đánh giá đệ quy. Nhưng trong ví dụ trên, có sự khác biệt quan trọng nào giữa việc sử dụng WITHvà tạo các bảng tạm thời không?


khi bạn sử dụng CTE để xây dựng truy vấn, việc thêm một cột khác SELECTvào WITHchỉ là gõ tên và chạy lại. Trong khi với bảng tạm thời, nó sẽ mất DROPCREATE. Mặt khác, nếu bạn xây dựng một truy vấn và bạn sẽ sử dụng lại dữ liệu tĩnh rất nhiều lần - xây dựng bảng tạm thời với các chỉ mục chắc chắn có lợi cho CTE.
Vao Tsun

@VaoTsun nếu sử dụng TEMPORARY TABLEvới ON COMMIT DROPvòng một truy vấn, nó cũng chỉ là vấn đề sửa đổi các truy vấn và tái chạy, phải không? postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

Câu trả lời:


15

Có một vài khác biệt tinh tế, nhưng không có gì quyết liệt:

  • Bạn có thể thêm các chỉ mục trên một bảng tạm thời;
  • Các bảng tạm thời tồn tại trong vòng đời của phiên (hoặc, nếu ON COMMIT DROP, giao dịch), các máy ảnh WITHluôn nằm trong phạm vi truy vấn;
  • Nếu một truy vấn gọi một hàm / thủ tục, nó có thể thấy bảng tạm thời, nhưng nó không thể thấy bất kỳ WITHbiểu thức bảng nào ;
  • Một bảng tạm thời tạo ra VACUUMcông việc trên các danh mục hệ thống mà WITHkhông cần, nó cần thêm một chuyến đi khứ hồi để tạo / lấp đầy nó và nó đòi hỏi thêm công việc trong quản lý bộ đệm của máy chủ, vì vậy nó hơi kém hiệu quả.

Nhìn chung, bạn nên thích WITHcác bảng tạm thời trừ khi bạn biết bạn sẽ được hưởng lợi từ việc tạo một chỉ mục.

Tuy nhiên, tùy chọn khác, một truy vấn con trong FROMmệnh đề, có một lợi thế rất khác. Nó có thể được nội tuyến, đặc biệt, và vòng loại có thể được kéo lên / đẩy xuống. Tôi đã viết về điều này trong một bài viết blog gần đây .


Còn quan điểm và quan điểm tạm thời thì sao?
CMCDragonkai

1
Loại trung gian nhưng gần với bảng tạm thời hơn thuật ngữ CTE. Không có chỉ số. Phiên họp có phạm vi. Hiển thị các chức năng / thủ tục. Cần danh mục chân không.
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.