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

Postgresql - hiệu suất sử dụng mảng trong cơ sở dữ liệu lớn

Tôi nghĩ bạn nên sử dụng elements bảng:

  • Postgres có thể sử dụng thống kê để dự đoán số hàng sẽ khớp trước khi thực hiện truy vấn, do đó, nó có thể sử dụng kế hoạch truy vấn tốt nhất (điều quan trọng hơn nếu dữ liệu của bạn không được phân phối đồng đều);

  • bạn sẽ có thể bản địa hóa dữ liệu truy vấn bằng cách sử dụng CLUSTER elements USING elements_id_element_idx;

  • khi Postgres 9.2 được phát hành thì bạn sẽ có thể tận dụng lợi thế của việc quét chỉ mục;

Nhưng tôi đã thực hiện một số thử nghiệm cho 10 triệu phần tử:

create table elements (id_item bigint, id_element bigint);
insert into elements
  select (random()*524288)::int, (random()*32768)::int
    from generate_series(1,10000000);

\timing
create index elements_id_item on elements(id_item);
Time: 15470,685 ms
create index elements_id_element on elements(id_element);
Time: 15121,090 ms

select relation, pg_size_pretty(pg_relation_size(relation))
  from (
    select unnest(array['elements','elements_id_item', 'elements_id_element'])
      as relation
  ) as _;
      relation       | pg_size_pretty 
---------------------+----------------
 elements            | 422 MB
 elements_id_item    | 214 MB
 elements_id_element | 214 MB



create table arrays (id_item bigint, a_elements bigint[]);
insert into arrays select array_agg(id_element) from elements group by id_item;

create index arrays_a_elements_idx on arrays using gin (a_elements);
Time: 22102,700 ms

select relation, pg_size_pretty(pg_relation_size(relation))
  from (
    select unnest(array['arrays','arrays_a_elements_idx']) as relation
  ) as _;
       relation        | pg_size_pretty 
-----------------------+----------------
 arrays                | 108 MB
 arrays_a_elements_idx | 73 MB

Vì vậy, mặt khác, các mảng nhỏ hơn và có chỉ số nhỏ hơn. Tôi sẽ thực hiện một số bài kiểm tra 200 triệu phần tử trước khi đưa ra quyết định.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tiết kiệm data.frame lớn vào PostgreSQL với R

  2. Định cấu hình kết nối từ xa RubyMine với Heroku PostgreSQL

  3. Không cài đặt được pg gem, mkmf.rb không thể tìm thấy tệp tiêu đề cho ruby ​​(Mac OSX 10.6.5)

  4. Đặt dấu thời gian bên trong giao dịch

  5. Chèn NULL vào DB PostgreSQL qua PHP khi trường ngày trống