Hãy tưởng tượng một bảng với cấu trúc sau đây trên PostgreSQL 9.0:PostgreSQL: Đang tải dữ liệu vào sao Schema hiệu quả
create table raw_fact_table (text varchar(1000));
Vì lợi ích của việc đơn giản hóa tôi chỉ đề cập đến một cột văn bản, trên thực tế nó có một chục. Bảng này có 10 tỷ hàng và mỗi cột có nhiều bản sao. Bảng được tạo từ một tệp phẳng (csv) bằng COPY FROM.
Để tăng hiệu suất Tôi muốn chuyển đổi cơ cấu schema sao sau:
create table dimension_table (id int, text varchar(1000));
Bảng thực tế sau đó sẽ được thay thế bằng một bảng thực tế như sau:
create table fact_table (dimension_table_id int);
phương pháp hiện tại của tôi về cơ bản sẽ chạy truy vấn sau để tạo bảng thứ nguyên:
Create table dimension_table (id int, text varchar(1000), primary key(id));
sau đó để tạo điền vào bảng chiều tôi sử dụng:
insert into dimension_table (select null, text from raw_fact_table group by text);
Sau đó tôi cần phải chạy truy vấn sau đây:
select id into fact_table from dimension inner join raw_fact_table on (dimension.text = raw_fact_table.text);
Chỉ cần tưởng tượng hiệu suất khủng khiếp tôi nhận được bằng cách so sánh tất cả các chuỗi để tất cả các chuỗi khác nhiều lần.
Trên MySQL, tôi có thể chạy thủ tục được lưu trữ trong COPY FROM. Điều này có thể tạo ra một băm của một chuỗi và tất cả so sánh chuỗi tiếp theo được thực hiện trên băm thay vì chuỗi thô dài. Điều này dường như không thể thực hiện được trên PostgreSQL, tôi phải làm gì sau đó?
dữ liệu mẫu sẽ là một tập tin CSV có chứa một cái gì đó như thế này (tôi sử dụng dấu ngoặc kép cũng xung quanh số nguyên và tăng gấp đôi):
"lots and lots of text";"3";"1";"2.4";"lots of text";"blabla"
"sometext";"30";"10";"1.0";"lots of text";"blabla"
"somemoretext";"30";"10";"1.0";"lots of text";"fooooooo"
Thời gian này có vẻ như thế nào? Bạn mong đợi nó mất bao lâu? –
Tôi chưa bao giờ hoàn thành nó bằng số lượng dữ liệu được đề cập. Nhưng trên 15 triệu hàng phải mất vài giờ. Tôi đã xem xét tất cả các công cụ tối ưu hóa máy chủ tiêu chuẩn (work_mem, vv) vì vậy tôi sau khi một phương pháp khác nhau để đạt được kết quả tương tự. – David
Đăng dữ liệu mẫu và DDL. –