|
Деревья в PG
|
|||
---|---|---|---|
#18+
Так и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов. Суть задачи: есть таблица древовидная таблица свойств объектов и таблица объектов, где у объекта может быть несколько свойств. Древовидная таблица~1000 записей, объектов 1000000 записей. В финал вышли 2 варианта. 1. Расширение intarray таблица tree-свойства Код: sql 1. 2. 3.
таблица object Код: sql 1. 2. 3.
2. Расширение ltree таблица tree-свойства Код: sql 1. 2.
таблица object Код: sql 1. 2. 3.
По функционалу мне больше нравится 2-й вариант, пусть даже он и на диске много места занимает, но в первую очередь интересует общая производительность на такой структуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 11:15 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
TrogloditТак и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов. Да потому что нет его. Из распространённых: - Adjacency List - Materialized Path - Nested Sets - Closure Table И их гибриды. У каждой есть сильные и слабые стороны. Серебряной пули здесь нет. Изучите все, выберите ту структуру, для которой ваши задачи подходят лучше и слабые стороны которой для вас менее важны. parent_id - это Adjacency List ltree - реализация Materialized Path ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 13:29 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Melkij, спасибо за ответ. я про приоритет в общем написал выше. На 1000 чтений будет 1 запись, т.е. основной критерий быстрый поиск при SELECT. Для меня выбор не очевиден, т.к. древовидные структуры до этого редко использовал (обычно пользовался тем что уже было), поэтому и спрашиваю. По найденной информации народ хвалит ltree, но практики использования у меня не было, хотя на мой взгляд по идее реализация intarray c рекурсией должна быть быстрее, но вот вопрос а на сколько быстрее, т.е. удобство ltree неоспоримо, при этом если потеря производительности будет, например, в пределах 10%-это того стоит, если кратно уже печально. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 14:47 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Trogloditя про приоритет в общем написал выше. Нет, не написали. Для деревьев важно не только соотношение чтение/запись но и чтение чего именно и запись чего именно. Сравните задачу вычитать ветвь дерева для AL и для MP. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 15:13 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Melkij, меня запись не волнует, даже если и будут проблемы их можно решить, при соотношении 1000 к 1 или 100000 к 1 (чтение/запись). Есть типовые операции с деревьями на чтение, у меня вряд ли будет новая америка. Основной вопрос я описал, насколько в среднем на наборе типовых операций на чтение ltree медленнее. Если цена вопроса 10-30% это не страшно, более 100% уже повод задуматься. Есть еще вариант держать все в JSON'е и с помощью jsonpath доставать ветви деревьев,но там чую будет гигантская проблема на запись, и из-за размера данных JSON будет вываливаться в toast. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 16:39 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Troglodit, ещё раз: имеет значение не только соотношение чтения к записи но и что именно вы хотите читать. На задаче "прочитать заданную ветвь дерева" AL очевидный аутсайдер. На задаче "получить детей заданного родителя" - AL очевидный фаворит, ведь как раз parent_id у него в явном виде хранится и элементарно извлекается за один index scan. Для ltree возможно с этим может поспособствовать gist, но надо смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 17:52 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Melkij, и еще раз, я с вами не спорю, вы пишете все абсолютно корректно на сравнение одной и той же операции. Но вы меня не слышите. Я не говорю про конкретную операцию. Я говорю про среднюю температуру по больнице на НАБОРЕ операций на чтение. Мне нравится само дополнение ltree, я бы выбрал его, я хочу понять, что я теряю по производительности. То, что я теряю, на физическом размещении данных+индекса меня не волнует, так же как и накладные расходы при вставке, изменении значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 19:10 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Troglodit, Насколько Камаз лучше ferrari? Насколько в среднем по больнице бетон лучше стекла? На 10% или на 15%? Что выбрать, сталь или пластик? Серебряной пули для древовидных структур в рсубд как я уже писал - нет. Каждый вариант окажется лучше на одних операциях и хуже на других. Если хотите случайный результат без учёта своих задач - подкиньте монетку. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 21:15 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Melkij, Мы с вами зашли в тупик, ваши примеры не корректны. Я сравниваю два сравнимых в одной категории инструмента, т.е. они оба могут решать все задачи. В ваших примерах применение разное, что некорректно. Я не использовал ltree и вопрос был практический, вы увели тему в академическую плоскость, где в общем случае вы правы. У кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2019, 22:45 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
TrogloditMelkij, Мы с вами зашли в тупик, ваши примеры не корректны. Я сравниваю два сравнимых в одной категории инструмента, т.е. они оба могут решать все задачи. В ваших примерах применение разное, что некорректно. Я не использовал ltree и вопрос был практический, вы увели тему в академическую плоскость, где в общем случае вы правы. У кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос. Вопрос в контексте "Я не говорю про конкретную операцию." - тоже исключительно академический. Какие то задачи будет ltree на порядки быстрее решать... какие то задачи integer[] будет быстрее решать тоже на порядки быстрее, на каких то они будут сравнимые. Можно легко придумать задачи и на первый случай и на второй случай и на третий случай. Например задача перенести свойство в другую ветку дерева - в первой модели почти бесплатное... а во второй превращается в полный ад с обновлением всех обьектов (и там разница будет не на 1 порядок а на все 6 легко). PS: кстати в общем случае intarray расширение для использования integer[] не нужно. PPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2019, 10:16 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
TrogloditВ ваших примерах применение разное, что некорректно Так именно о чём и я пытаюсь сказать. И камаз и феррари - транспорт. Можно взять для того чтобы человека куда-то отвезти. Корпус некоторого устройства возможно изготовить из металла или пластика. (бетон со стеклом наверное перегнул, ладно) Так на сколько процентов камаз лучше феррари? А если везти не одного человека, а гору песка? Maxim BogukPPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим. gist я так предполагаю, штатный опкласс для ltree[] есть. TrogloditУ кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос. Не сможет. И уж тем более "однозначно" Насколько ltree быстрее и компактнее такого же MP собранного на коленке из text - да, замерить можно и в этом смысл будет. Свести различия между AL и MP к одной цифре - невозможно, это будет бесполезным враньём. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2019, 11:42 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
TrogloditТак и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов. Суть задачи: есть таблица древовидная таблица свойств объектов и таблица объектов, где у объекта может быть несколько свойств. Древовидная таблица~1000 записей, объектов 1000000 записей. В финал вышли 2 варианта. 1. Расширение intarray таблица tree-свойства Код: sql 1. 2. 3.
таблица object Код: sql 1. 2. 3.
т.е. свойства у вас неизмеримые (не имеют велью, но только тип). скорее "теги" ,чем "св-ва" 2. Расширение ltree таблица tree-свойства Код: sql 1. 2.
таблица object Код: sql 1. 2. 3.
для 1000 тегов вполне допустим лишний хеш-джойн т.е. структура ~ таблица tree-свойства Код: sql 1. 2. 3.
таблица object Код: sql 1. 2. 3.
со снятием вопроса про индексирование массивов лтрии. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2019, 13:22 |
|
Деревья в PG
|
|||
---|---|---|---|
#18+
Maxim BogukВопрос в контексте "Я не говорю про конкретную операцию." - тоже исключительно академический. Какие то задачи будет ltree на порядки быстрее решать... какие то задачи integer[] будет быстрее решать тоже на порядки быстрее, на каких то они будут сравнимые. Можно легко придумать задачи и на первый случай и на второй случай и на третий случай. Например задача перенести свойство в другую ветку дерева - в первой модели почти бесплатное... а во второй превращается в полный ад с обновлением всех обьектов (и там разница будет не на 1 порядок а на все 6 легко). PS: кстати в общем случае intarray расширение для использования integer[] не нужно. PPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим. Я понимаю, что в частном конкретном запросе результаты будут разные. Меня пока не интересует производительность связанная с вставкой и обновлением, я писал неоднократно выше. массив ltree нужен потому как у одного объекта будет привязка к НЕСКОЛЬКИМ веткам дерева, а не одно как по классике. Другого способа с ltree разместить данные с этими вводными я не знаю. используя ltree @> ltree[] (из доки) я смогу найти объекты-потомки любого узла. В доке написано, что @>использует индексы в отличии от ^@>. про intarray читал, что только с ним работают индексы с операциями над массивами, возможно уже не так, я его года 3-4 назад смотрел, мне понравилось расширение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2019, 19:51 |
|
|
start [/forum/topic.php?fid=53&fpage=35&tid=1994979]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 274ms |
total: | 411ms |
0 / 0 |