PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres Materialized Path - Apa manfaat menggunakan ltree?

TL;DR Label yang dapat digunakan kembali, pola pencarian yang kompleks, dan pencarian ancestry terhadap beberapa node turunan (atau satu node yang jalurnya belum diambil) tidak dapat diselesaikan menggunakan indeks jalur yang terwujud.

Bagi mereka yang tertarik dengan detail mengerikan...

Pertama, pertanyaan Anda hanya relevan jika Anda tidak menggunakan kembali label apa pun dalam deskripsi simpul Anda. Jika ya, l-tree benar-benar satu-satunya pilihan dari keduanya. Tetapi implementasi jalur yang terwujud biasanya tidak membutuhkan ini, jadi kesampingkan itu.

Satu perbedaan yang jelas adalah fleksibilitas dalam jenis pencarian yang diberikan l-tree kepada Anda. Pertimbangkan contoh-contoh ini (dari ltree dokumen yang ditautkan dalam pertanyaan Anda):

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

Permintaan pertama jelas dapat dicapai dengan jalur terwujud. Yang terakhir juga dapat dicapai, di mana Anda akan menyesuaikan kueri sebagai pencarian saudara. Kasus tengah, bagaimanapun, tidak dapat dicapai secara langsung dengan pencarian indeks tunggal. Anda harus memecahnya menjadi dua kueri (semua turunan + semua leluhur), atau menggunakan pemindaian tabel.

Dan kemudian ada pertanyaan yang sangat kompleks seperti ini (juga dari dokumen):

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

Indeks jalur yang terwujud tidak akan berguna di sini, dan pemindaian tabel lengkap akan diperlukan untuk menangani ini. l-tree adalah satu-satunya pilihan jika Anda ingin melakukan ini sebagai kueri yang dapat di-SARG.

Tetapi untuk operasi hierarki standar, menemukan salah satu dari:

  • orang tua
  • anak-anak
  • keturunan
  • simpul akar
  • simpul daun

jalur terwujud akan bekerja sama baiknya dengan l-tree. Bertentangan dengan artikel yang ditautkan di atas , mencari semua keturunan dari nenek moyang yang sama sangat bisa dilakukan dengan menggunakan b-tree. Format kueri WHERE path LIKE 'A.%' apakah SARGable asalkan indeks Anda disiapkan dengan benar (saya harus secara eksplisit menandai indeks jalur saya dengan varchar_pattern_ops agar ini berfungsi).

Apa yang hilang dari daftar ini adalah menemukan semua leluhur untuk seorang keturunan. Format kueri WHERE 'A.B.C.D' LIKE path || '.%' sayangnya tidak akan menggunakan index. Salah satu solusi yang diterapkan oleh beberapa pustaka adalah mengurai simpul leluhur dari jalur, dan menanyakannya secara langsung:WHERE id IN ('A', 'B', 'C') . Namun, ini hanya akan berfungsi jika Anda menargetkan leluhur dari simpul tertentu yang jalurnya telah Anda ambil. l-tree akan menang dalam hal ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Daftar hibah dan hak istimewa untuk tampilan terwujud di PostgreSQL

  2. Agregat PostgreSQL atau fungsi jendela untuk mengembalikan nilai terakhir saja

  3. PostgreSQL 9.3:Cara memasukkan UUID huruf besar ke dalam tabel

  4. Apakah mungkin untuk membangun kembali pg_depend?

  5. Mengimpor dump postgresql ke Heroku