Tôi đang cố gắng tạo các chỉ mục một phần cho một bảng tĩnh lớn (1,2TB) trong Postgres 9.4.
Dữ liệu của tôi hoàn toàn tĩnh, vì vậy tôi có thể chèn tất cả dữ liệu, sau đó tạo tất cả các chỉ mục.
Trong bảng 1,2TB này, tôi có một cột được run_id
phân chia rõ ràng dữ liệu. Chúng tôi đã đạt được hiệu suất tuyệt vời bằng cách tạo các chỉ mục bao gồm một phạm vi run_id
s. Đây là một ví dụ:
CREATE INDEX perception_run_frame_idx_run_266_thru_270
ON run.perception
(run_id, frame)
WHERE run_id >= 266 AND run_id <= 270;
Các chỉ mục một phần này cho chúng ta tốc độ truy vấn mong muốn. Thật không may, việc tạo ra mỗi chỉ số một phần mất khoảng 70 phút.
Có vẻ như chúng tôi bị giới hạn CPU ( top
đang hiển thị 100% cho quy trình).
Có bất cứ điều gì tôi có thể làm để tăng tốc độ tạo ra các chỉ mục một phần của chúng tôi không?
Thông số hệ thống:
- Xeon 18 lõi
- RAM 192GB
- 12 ổ SSD trong RAID
- Autovacuums được TẮT
- bảo trì_work_mem: 64GB (Quá cao?)
Bảng thông số kỹ thuật:
- Kích thước: 1,26 TB
- Số lượng hàng: 10,537 tỷ
- Kích thước chỉ mục điển hình: 3,2GB (có phương sai ~ .5GB)
Bảng định nghĩa:
CREATE TABLE run.perception(
id bigint NOT NULL,
run_id bigint NOT NULL,
frame bigint NOT NULL,
by character varying(45) NOT NULL,
by_anyone bigint NOT NULL,
by_me bigint NOT NULL,
by_s_id integer,
owning_p_id bigint NOT NULL,
obj_type_set bigint,
seq integer,
subj_id bigint NOT NULL,
subj_state_frame bigint NOT NULL,
CONSTRAINT perception_pkey PRIMARY KEY (id))
(Đừng đọc quá nhiều vào tên cột - Tôi đã làm xáo trộn chúng phần nào.)
Thông tin cơ bản:
- Chúng tôi có một nhóm riêng tại chỗ tiêu thụ dữ liệu này, nhưng thực sự chỉ có một hoặc hai người dùng. (Dữ liệu này được tạo tất cả thông qua một mô phỏng.) Người dùng chỉ bắt đầu phân tích dữ liệu sau khi chèn xong và các chỉ mục được xây dựng hoàn chỉnh. Mối quan tâm chính của chúng tôi là giảm thời gian cần thiết để tạo dữ liệu có thể sử dụng và ngay bây giờ, nút cổ chai là thời gian tạo chỉ mục.
- Tốc độ truy vấn đã hoàn toàn đầy đủ khi sử dụng partials. Trên thực tế, tôi nghĩ rằng chúng tôi có thể tăng số lần chạy mà mỗi chỉ mục bao trùm và vẫn duy trì hiệu suất truy vấn đủ tốt.
- Tôi đoán là chúng ta sẽ phải phân vùng bảng. Chúng tôi đang cố gắng làm cạn kiệt tất cả các lựa chọn khác trước khi đi theo con đường đó.
completely static
, thì bạn có ý nghĩa We have a separate team onsite that consumes this data
gì? Bạn chỉ cần lập chỉ mục phạm vi run_id >= 266 AND run_id <= 270
hoặc toàn bộ bảng? Tuổi thọ của mỗi chỉ số là bao nhiêu / bao nhiêu truy vấn sẽ sử dụng nó? Có bao nhiêu giá trị khác nhau cho run_id
? Âm thanh như ~ 15 Mio. hàng trên mỗi run_id
, sẽ làm cho nó khoảng 800 giá trị khác nhau cho run_id
? Tại sao obj_type_set
, by_s_id
, seq
không được định nghĩa NOT NULL? Bao nhiêu phần trăm giá trị NULL cho mỗi?
run_id
? Chia đêu? Kích thước của chỉ số kết quả trên đĩa? Dữ liệu là tĩnh, ok. Nhưng bạn có phải là người dùng duy nhất?