PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Достатъчно ефективни ли са postgres JSON индексите в сравнение с класическите нормализирани таблици?

Ще ми трябват някои заявки във формата "списък на всички обекти, където едно от алтните е 'foobar'." Очакваният размер на таблицата е от порядъка на няколко милиона записа. За това могат да се използват Postgres JSON заявки, а също и да се индексират (Индекс за намиране на елемент в JSON масив, например). Въпреки това ТРЯБВА ЛИ да се направи по този начин или това е извратено решение, което не се препоръчва?

То може да се направи по този начин, но това не означава, че трябва. В известен смисъл най-добрата практика вече е добре документирана (вижте например използване на hstore срещу използване на XML срещу използване на EAV срещу използване на отделна таблица) с нов тип данни, който, за всички намерения и практически цели (освен валидиране и синтаксис), не се различава от предишни неструктурирани или полуструктурирани опции.

Казано по друг начин, това е същото старо прасе с нов грим.

JSON предлага възможност за използване на индекси на обърнато дърво за търсене , по същия начин, както правят hstore, типовете масиви и tsvectors. Те работят добре, но имайте предвид, че са предназначени основно за извличане на точки в квартал (мисля за типове геометрия), подредени по разстояние, а не за извличане на списък със стойности в лексикографски ред.

За да илюстрирате, вземете двата плана, които очертава отговорът на Роман:

  • Този, който извършва индексно сканиране преглежда дискови страници директно, извличайки редовете в реда, посочен от индекса.
  • Този, който извършва сканиране на индекс на растерна карта започва с идентифициране на всяка дискова страница, която може да съдържа ред, и ги чете така, както се появяват на диска, сякаш (и всъщност точно като) извършва последователно сканиране, което пропуска безполезни области.

Връщайки се към въпроса ви:Претрупани и големи индекси на обърнато дърво наистина ще подобри производителността на вашето приложение, ако използвате Postgres таблици като гигантски JSON магазини. Но те също не са сребърен куршум и няма да ви стигнат до правилния релационен дизайн, когато се справяте с тесните места.

Изводът в крайна сметка не се различава от това, което бихте получили, когато решите да използвате hstore или EAV:

  1. Ако има нужда от индекс (т.е. често се появява в клауза where или, още по-важно, в клауза за присъединяване), вероятно искате данните в отделно поле.
  2. Ако е основно козметичен, JSON/hstore/EAV/XML/whatever-vakes-you-sleep-at-night работи добре.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направя заявка за всички редове в радиус от 5 мили от моите координати?

  2. Свържете се с отдалечена база данни PostgreSql с помощта на Powershell

  3. Как мога да изпратя имейл от тригера на PostgreSQL?

  4. Как да изброя индекси, създадени за таблица в postgres

  5. 2 начина да получите размера на база данни в PostgreSQL