sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql - ydeevne ved brug af array i stor database

Jeg synes, du skal bruge et elements tabel:

  • Postgres ville være i stand til at bruge statistik til at forudsige, hvor mange rækker der matcher, før forespørgslen udføres, så det ville være i stand til at bruge den bedste forespørgselsplan (det er vigtigere, hvis dine data ikke er jævnt fordelt);

  • du vil være i stand til at lokalisere forespørgselsdata ved hjælp af CLUSTER elements USING elements_id_element_idx;

  • når Postgres 9.2 ville blive frigivet, ville du være i stand til at drage fordel af kun indeksscanninger;

Men jeg har lavet nogle test for 10M elementer:

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

Så på den anden side er arrays mindre og har mindre indeks. Jeg ville lave nogle 200 millioner elementtests, før jeg tog en beslutning.




  1. Sådan bygger du en Rest API med Spring Boot ved hjælp af MySQL og JPA

  2. TNS-12505:TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen

  3. PHP/MySQL - inkluderer flertalsformer, men ekskluder ental

  4. postgres:få eksekverbar forespørgsel fra forespørgsel med parametre