Tôi có một bảng với khoảng 100 triệu hàng. Nó chỉ được chèn dữ liệu một lần / ngày nhưng chúng ta cần phải làm select
rất nhiều. Các select
s thường đơn giản nhưng đôi khi cần trả về hàng trăm ngàn hàng.
Đó là độc đáo dựa trên ba cột node_id
, pricedate
, hour
đó là số nguyên, dấu thời gian, số nguyên tương ứng. Đó là chậm đối với hầu hết các truy vấn nhưng tôi nhóm nó node_id
, pricedate
và đó cố định chậm đối với hầu hết các truy vấn. Những truy vấn đó thuộc loại:
select * from mytable where node_id in (1,2,3,4)
Thỉnh thoảng chúng tôi vẫn cần thực hiện các truy vấn như:
select * from mytable where pricedate>='2016-05-01'
Những điều này vẫn còn chậm bởi vì nó được nhóm node_id
trước. Chúng tôi đã có một chỉ số trên pricedate
. Vấn đề là người dùng thường cần đủ dữ liệu mà công cụ truy vấn ném ra chỉ mục và sử dụng quét seq. Khi nó sử dụng quét seq, nó có lợi rất nhiều từ việc dữ liệu được nhóm lại theo cách nó được truy vấn. Điều này dẫn đến vấn đề mà tôi gặp phải khi một số truy vấn được hưởng lợi từ một cụm và các truy vấn khác từ cụm khác:
Sẽ thật tuyệt nếu có một cách để có hai bản sao vật lý của bảng trong đó một bản sao được nhóm một cách và một bản khác được phân cụm nhưng người dùng truy cập vào nó xuất hiện như thể chỉ có 1 bảng và công cụ DB sẽ đảm bảo chúng đang đồng bộ hóa. Rõ ràng là sẽ có hình phạt bằng văn bản khi làm điều này nhưng điều đó không hợp lý cho việc sử dụng của chúng tôi.
Điều gì đó như thế này sẽ có thể?
Tôi đoán không có cách xây dựng để làm những gì tôi mô tả. Để làm điều đó, tôi đoán tôi sẽ tạo một bảng được gọi mytable_dup
với cùng một ràng buộc khóa duy nhất nhưng với phân cụm thay thế và sau đó thiết lập kích hoạt để chèn vào nó bất cứ khi nào chủ được chèn / cập nhật / xóa. Điều đó có vẻ khả thi nhưng từ đây, liệu có một cách hợp lý để select
từ bảng trùng lặp sẽ hiệu quả?
Tôi đang chạy PostgreSQL 9.4 tại nhà và 9.5 trên Google.