sql >> Databáze >  >> RDS >> PostgreSQL

Postgresql - výkon použití pole ve velké databázi

Myslím, že byste měli použít elements tabulka:

  • Postgres by byl schopen použít statistiky k předpovědi, kolik řádků se bude shodovat před provedením dotazu, takže by byl schopen použít nejlepší plán dotazů (je důležitější, pokud vaše data nejsou rovnoměrně distribuována);

  • budete moci lokalizovat data dotazu pomocí CLUSTER elements USING elements_id_element_idx;

  • až bude vydán Postgres 9.2, budete moci využívat skenování pouze indexu;

Ale udělal jsem nějaké testy pro 10M prvky:

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

Takže na druhé straně jsou pole menší a mají menší index. Než se rozhodnu, provedl bych nějakých 200 milionů testů prvků.




  1. PHP rekurzivní menu ve struktuře seznamu HTML

  2. PHP - Laravel 5 získává data do html tabulky ze 3 databázových tabulek SQL se sloupcem DATA jako záhlavím

  3. Co je Oracle SQL &PL/SQL? Vše, co začátečník potřebuje vědět

  4. MySQL alias zkratka?