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

Postgres Materialized Path – Jaké jsou výhody používání ltree?

TL;DR Opakovaně použitelné štítky, složité vzorce vyhledávání a vyhledávání předků proti více uzlům potomků (nebo jedinému uzlu, jehož cesta ještě nebyla načtena) nelze provést pomocí materializovaného indexu cesty.

Pro zájemce o krvavé detaily...

Za prvé, vaše otázka je relevantní pouze v případě, že v popisu uzlů znovu nepoužíváte žádné štítky. Pokud byste byli, l-strom je skutečně jedinou možností z těchto dvou. Ale implementace materializovaných cest to obvykle nepotřebují, takže to nechme stranou.

Jeden zřejmý rozdíl bude ve flexibilitě typů vyhledávání, které vám l-tree poskytuje. Zvažte tyto příklady (z ltree dokumenty odkazované ve vaší otázce):

foo         Match the exact label path foo
*.foo.*     Match any label path containing the label foo
*.foo       Match any label path whose last label is foo

První dotaz je samozřejmě dosažitelný s materializovanou cestou. Poslední je také dosažitelné, kde byste dotaz upravili jako sourozenecké vyhledávání. Střední případ však není přímo dosažitelný jediným vyhledáváním indexu. Buď to budete muset rozdělit na dva dotazy (všichni potomci + všichni předci), nebo se uchýlit ke skenování tabulky.

A pak jsou tu opravdu složité dotazy, jako je tento (také z dokumentů):

Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain

Zhmotněný index cesty by zde byl k ničemu a ke zpracování by bylo zapotřebí úplné prohledání tabulky. l-tree je jediná možnost, pokud to chcete provést jako dotaz SARGable.

Ale pro standardní hierarchické operace, nalezení některého z:

  • rodič
  • děti
  • potomci
  • kořenové uzly
  • listové uzly

zhmotněná cesta bude fungovat stejně dobře jako l-strom. Na rozdíl od článku odkazovaného výše , hledání všech potomků společného předka je velmi proveditelné pomocí b-stromu. Formát dotazu WHERE path LIKE 'A.%' je SARGable za předpokladu, že je váš index správně připraven (musel jsem explicitně označit svůj index cesty pomocí varchar_pattern_ops aby to fungovalo).

Co v tomto seznamu chybí, je nalezení všech předků za potomka. Formát dotazu WHERE 'A.B.C.D' LIKE path || '.%' bohužel nebude používat index. Jedním z řešení, které některé knihovny implementují, je analyzovat uzly předků z cesty a přímo se na ně dotazovat:WHERE id IN ('A', 'B', 'C') . To však bude fungovat pouze v případě, že cílíte na předky konkrétního uzlu, jehož cestu jste již získali. l-tree v tomto vyhraje.




  1. Vytvoření aplikace Django Movie Recommendation pomocí Jaccard Index

  2. jak získat přístup k datům z mysql

  3. T-SQL:Jak vybrat hodnoty v seznamu hodnot, které NEJSOU V tabulce?

  4. Odezva konkrétní řádky z databáze mysql