PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

THAM GIA TRÁI chậm trên CTE với các khoảng thời gian

Tính đúng đắn trước tiên :Tôi nghi ngờ có lỗi trong truy vấn của bạn:

 LEFT JOIN historical_ohlcv ohlcv ON ohlcv.time_open >= g.start_time
                                 AND ohlcv.time_close < g.end_time

Không giống như câu trả lời được tham khảo của tôi, bạn tham gia vào một khoảng thời gian :(time_open, time_close] . Cách bạn thực hiện sẽ loại trừ các hàng trong bảng mà khoảng thời gian vượt qua biên giới nhóm. Chỉ các khoảng được chứa đầy đủ trong một số nhóm. Tôi không nghĩ đó là dự định?

Một cách khắc phục đơn giản là quyết định tư cách thành viên nhóm dựa trên time_open (hoặc time_close ) một mình. Nếu bạn muốn tiếp tục làm việc với cả hai, bạn phải xác định chính xác cách đối phó với các khoảng thời gian chồng chéo với nhiều nhóm.

Ngoài ra, bạn đang tìm kiếm max(high) mỗi nhóm, có bản chất khác với count(*) trong câu trả lời được tham khảo của tôi.

Và nhóm của bạn là khoảng thời gian đơn giản mỗi giờ?

Sau đó, chúng ta có thể đơn giản hóa một cách triệt để. Làm việc chỉ với time_open :

SELECT date_trunc('hour', time_open) AS hour, max(high) AS max_high
FROM   historical_ohlcv
WHERE  exchange_symbol = 'BINANCE'
AND    symbol_id = 'ETHBTC'
AND    time_open >= now() - interval '5 months'  -- frame_start
AND    time_open <  now()                        -- frame_end
GROUP  BY 1
ORDER  BY 1;

Có liên quan:

  • Lấy lại mẫu trên dữ liệu chuỗi thời gian

Thật khó để nói về việc tối ưu hóa hiệu suất hơn nữa trong khi những điều cơ bản vẫn chưa rõ ràng. Và chúng tôi cần thêm thông tin.

WHERE biến điều kiện?
Có bao nhiêu giá trị khác biệt trong exchange_symbolsymbol_id ?
Trung bình kích thước hàng? Bạn nhận được gì:

SELECT avg(pg_column_size(t)) FROM historical_ohlcv t TABLESAMPLE SYSTEM (0.1);

Bảng có chỉ đọc không?

Giả sử bạn luôn lọc trên exchange_symbolsymbol_id và các giá trị có thể thay đổi, bảng của bạn ở chế độ chỉ đọc hoặc autovacuum có thể theo kịp tải ghi, vì vậy chúng tôi có thể hy vọng về các lần quét chỉ lập chỉ mục, tốt nhất bạn nên có chỉ mục đa cột trên (exchange_symbol, symbol_id, time_open, high DESC) để hỗ trợ truy vấn này. Chỉ mục các cột theo thứ tự này. Có liên quan:

  • Hiệu suất và chỉ mục nhiều cột

Tùy thuộc vào phân phối dữ liệu và các chi tiết khác, LEFT JOIN LATERAL giải pháp có thể là một lựa chọn khác. Có liên quan:

  • Cách tìm giá trị trung bình cho các khoảng thời gian trong postgres
  • Tối ưu hóa truy vấn GROUP BY để truy xuất bản ghi mới nhất cho mỗi người dùng

Ngoài tất cả những điều đó, bạn EXPLAIN kế hoạch triển lãm một số rất ước tính xấu :

  • https://explain.depesz.com/s/E5yI

Bạn có đang sử dụng hiện tại phiên bản của Postgres? Bạn có thể phải làm việc trên cấu hình máy chủ của mình - hoặc ít nhất là đặt mục tiêu thống kê cao hơn trên các cột có liên quan và cài đặt autovacuum tích cực hơn cho bảng lớn. Có liên quan:

  • Giữ cho PostgreSQL đôi khi chọn một kế hoạch truy vấn không tốt
  • Autovacuum tích cực trên PostgreSQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giám sát cơ sở dữ liệu PostgreSQL:Mẹo để giám sát những gì

  2. Kiểu dữ liệu Postgres JSON Truy vấn đường ray

  3. Tạo một kết xuất cơ sở dữ liệu cho các bảng và mục nhập cụ thể Postgres

  4. Không thể tìm thấy tiêu đề 'libpq-fe.h khi cố gắng cài đặt pg gem

  5. Loại THAM GIA nào để sử dụng