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

Jsou postgresové indexy JSON dostatečně účinné ve srovnání s klasickými normalizovanými tabulkami?

Budu potřebovat nějaké dotazy ve formě "seznam všech objektů, kde jeden z názvů je 'foobar'." Očekávaná velikost tabulky je řádově několik milionů záznamů. K tomu lze použít Postgres JSON dotazy a lze to i indexovat (např. Index For Finding Element v JSON poli). MÁ SE to však dělat tímto způsobem, nebo je to zvrácené řešení, které se nedoporučuje?

může udělat to tak, ale to neznamená, že byste to měli udělat. V určitém smyslu je osvědčený postup již dobře zdokumentován (viz např. použití hstore vs použití XML vs použití EAV vs použití samostatné tabulky) s novým datovým typem, který se pro všechny záměry a praktické účely (kromě ověřování a syntaxe) nijak neliší. z předchozích nestrukturovaných nebo polostrukturovaných opcí.

Jinak řečeno, je to stejné staré prase s novým make-upem.

JSON nabízí možnost používat invertované indexy vyhledávacího stromu , stejně jako hstore, typy polí a tsvectors. Fungují dobře, ale mějte na paměti, že jsou primárně určeny pro extrahování bodů v sousedství (přemýšlejte o typech geometrie) uspořádaných podle vzdálenosti, spíše než pro extrahování seznamu hodnot v lexikografickém pořadí.

Pro ilustraci si vezměte dva plány, které Romanova odpověď nastiňuje:

  • Ten, který provádí skenování indexu projíždí stránky disku přímo a načítá řádky v pořadí uvedeném indexem.
  • Ten, který provádí skenování indexu bitmap začíná identifikací každé stránky disku, která může obsahovat řádek, a čte je tak, jak se objevují na disku, jako by to bylo (a vlastně přesně jako) prohledávání sekvence, které přeskakuje zbytečné oblasti.

Vraťme se k vaší otázce:Přeplněné a příliš velké převrácené indexy stromů skutečně zlepší výkon vaší aplikace, pokud budete tabulky Postgres používat jako obří obchody JSON. Ale ani oni nejsou stříbrná kulka a při řešení úzkých míst vás nedostanou tak daleko, jak je správný vztahový design.

Závěr se nakonec neliší od toho, co byste získali, když se rozhodnete použít hstore nebo EAV:

  1. Pokud potřebuje index (tj. často se objevuje v klauzuli where nebo, což je ještě důležitější, v klauzuli spojení), pravděpodobně budete chtít data v samostatném poli.
  2. Pokud je to primárně kosmetické, JSON/hstore/EAV/XML/whatever-makes-you-sleep-at-night funguje dobře.


  1. Dokončení SQL. Příběhy úspěchu a neúspěchu

  2. chyba:'Nelze se připojit k místnímu serveru MySQL přes soket '/var/run/mysqld/mysqld.sock' (2)' -- Chybí /var/run/mysqld/mysqld.sock

  3. Oracle:aktualizace více tabulek => ORA-01779:nelze upravit sloupec, který se mapuje na tabulku bez zachování klíčů

  4. Kde jsou protokoly PostgreSQL na macOS?