|
|
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
Всем привет, ЭТОТ ЖЕ ТОПИК ОТКРЫТ В РАЗДЕЛЕ ПО ПОСТГРЕСТУ Есть задачка сохранять некий объект в базу и искать его там. Появляется вопрос как сделать в плане оптимальности :-) Количество объектов около 1кк. Объект имеет около 50 свойств или другими словами ссылок на справочники: - селективность справочников от 3 до 50, а 4 свойства просто цифровая величена (int). - одно свойство true/false + (null) - только два свойства обязательны (not null) . - 15 свойств не обязательны ... но скорее всего будут почти всегда присутствовать ! вероятность 95-99% - 30 свойств будут присутствовать редко ... вероятность 5-10% поиск соответственно нужно будет огранизовать по всем этим свойствам и скорость поиска является приоритетной ... тоесть удобства хранения и/или излишнего места на втором плане, а потому появляется вопрос о организации базы : 1 Вариант. Всё засунуть в одну табличку ... , построить отдельные индексы по самым селективным полям и пусть постгрес сам разбирается какие индексы ему комбинировать. 2 Вариант Создать табличку с часто используемыми свойствами (например от 10%) построить индексы , а остальные данные расскидать по дочерним табличкам , тоесть ещо 30 табличек .. при поиске использовать джоин. 3 Вариант Все данные раскидать по дочерним табличкам ... тоесть 1 таблица главная и 40-50 таблиц дочерних ... при поиске джойн ... ЗЫ Во время поиска в среднем участвуют около 10 полей ... в основном из часто используемых и один два из редко используемых Кто что может посоветовать .. кроме реализовать самому и попробовать ? Забыл добавить ... в результате будет около 2-5 тыс объектов , а с использованием редко используемых свойст до 200 . Результататы будут сортироваться по дате вставки или по одному из свойств (цене) и показываться пользователям по 20-50 штук. Вот придумал ещо один вариант ... использовать полнотекстовый поиск :-) При поиске одного слова в наборе текстов в 200к поиск на моей тестовой машине работал мухой :-) , а как если я буду в поиск включать несколько слов ? насколько будет всё быстро/плохо ? ЗЫ так же интерестно ... если воспользоваться этим методом ... какой индекс будет предпочтительнее ? GIST ili GIN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 15:07 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
KRED, в том топике Вам все основное уже посоветовали. Уточнение: 1кк = 1м ? Миллион записей имеется ввиду? Или сколько? В принципе, я за 1 вариант. В больших корпоративных системах таблицы с 50 полями - считаются не очень большими, во всю используются таблицы с 150-300 полей и более. Правда, я не видел таблицы более чем с 20-30 индексами... - это к вопросу о хранении, т.к. основной объем, в Вашем случае, будут занимать именно индексы, а не данные. Напомню - большой объем чтения индексов - те же тормоза, а в некоторых случаях от индекса прийдется отказаться вообще, либо битовый индекс - есть он в постгресе? автор... в результате будет около 2-5 тыс объектов И еще: т.к. упоминулась дата, то, наверное, "старые" данные - тоже менее актуальны, чем "свежие"? Т.е. имеет смысл подумать о партициях? (Вроде про это там тоже писали) ИИ еще: есть ли в постгресе, как в оракле, материлизованные вьюхи с автоматическим выбором данных из них, если запрос позволяет (не помню как там точно это называется, это из OLAP-темы)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 15:38 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
Доброго дня. Такая же задача - есть объекты из множества таблиц с тучей полей, в таблицах млн записей. Выборки нельзя назвать ad-hoc, однако они разнообразны и будут определяться пользователями. СУБД не позволяет использовать множество индексов на одну таблицу в запросе, хотя даже если бы и позволяла, ни к чему хорошему это не привело при таких кол-вах полей и записей. Естественно при такой постановке задачи игра в угадайку по типа "Наделаю составных индексов, авось пригодится", тоже не прошла бы. В итоге на чем остановился: Вынес в отдельную таблицу поля, которые железно будут участвовать в выборках (например Код-натуральный ключ или Наименование). Основные по ним выборки - поисковые операции нужных объектов (то есть единичных). Ввел в систему понятие именованные выборки. Пользователь имеет возможность задать различные условия выборки и сохранить описание этих условий в БД под именем. При сохранении условий в БД, так же автоматически по ним формируется SQL запрос, возвращающий список id объектов, которые соответствуют запросу. Текст запроса тоже сохраняется в БД. После сохранения по этому фильтру в постоянную таблицу заносятся все id объектов, подходящих под выборку, то есть идет долгий и неприятный table scan. Таким образом, пользователь теперь может просто указав нужную выборку, моментально получить все нужные объекты, где в запросе вместо условия выборки будет достаточно подставить WHERE id IN (SELECT object_id FROM Выборка WHERE КодВыборки = <Код>). Для того, чтобы не плодить хранение результатов выборок, пользователю дана возможность на базе именованной выборки писать свои приватные условия. То есть он может создать именованную выборку "Все у кого Поле1 между 500 и 1000", а затем используя ее в запросах, добавлять в запрос к вышеуказанному запросу в WHERE еще свое условие "AND Поле1 BETWEEN 400 AND 600", что будет моментально отрабатывать на объемах в миллионы записей. Естественно, для того, чтобы выборки были актуальные, их надо перестраивать - динамически при изменении в таблицах на триггерах или периодически - это зависит от способов пополнения информации и более выгодной логики. У меня например записи вливаются ручным вводом, поэтому выгоднее динамически, если бы я грузил записи большими порциями с внешних источников, то использовал бы периодически. Идея взята по мотивам материализованных представлений. Конечно, если бы у меня в этом проекте использовалась СУБД та же ASA 11, мне бы вообще мало что пришлось делать - генерил бы по выборкам мат представления и не о чем не думал, они бы сами даже обновлялись при изменении записей в таблицах, на которые завязан запрос. К сожалению используется другая СУБД, поэтому все придется делать руками. Но считаю данное решение оптимальным для поставленной задачи, во всяком случае лучше ничего придумать не удалось ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 15:50 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHKRED, в том топике Вам все основное уже посоветовали. Уточнение: 1кк = 1м ? Миллион записей имеется ввиду? Или сколько? В принципе, я за 1 вариант. В больших корпоративных системах таблицы с 50 полями - считаются не очень большими, во всю используются таблицы с 150-300 полей и более. Правда, я не видел таблицы более чем с 20-30 индексами... - это к вопросу о хранении, т.к. основной объем, в Вашем случае, будут занимать именно индексы, а не данные. Напомню - большой объем чтения индексов - те же тормоза, а в некоторых случаях от индекса прийдется отказаться вообще, либо битовый индекс - есть он в постгресе? автор... в результате будет около 2-5 тыс объектов И еще: т.к. упоминулась дата, то, наверное, "старые" данные - тоже менее актуальны, чем "свежие"? Т.е. имеет смысл подумать о партициях? (Вроде про это там тоже писали) ИИ еще: есть ли в постгресе, как в оракле, материлизованные вьюхи с автоматическим выбором данных из них, если запрос позволяет (не помню как там точно это называется, это из OLAP-темы)? Пока битовых нету ... , но они строются в памяти во время поиска из простых индексов. Потому несколько использовать несколько индексов вполне возможно ... К сожалению нету материлизованных вьюх ... такой вариант допускаю , но если скорости мне не будет хватать :-) тогда буду сам строить отдельные таблички и тригерами обновлять ... Но есть частичные/партиционированиые индексы ... у них есть условие по которому они строятся ... например только для тех у кого поле1=2 и соответственно имеют приоритет при поиске (если конечно их можно использовать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 16:05 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
ASCRUS, Честно слово .... сложно это и по большей части я очень подумаю или пойти на такой вариант. Такие самописные матерчатые вьюхи пока не хочется даже планировать ... Буду пытаться сделать на основе одной таблички... не получиться так начнём этим заморачиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 16:13 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
Партиционировать по дате было бы хорошо .... , но основная сортировка будет по цене :-( Вообщем как мне видится два основных пункта : - найти общее количество быстро ... без сортировки - найти первые 20/50 (или следущие 20/50 ) штук с условиями сортировки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 16:19 |
|
||
|
Таблица и справочники или ?
|
|||
|---|---|---|---|
|
#18+
KREDASCRUS, Честно слово .... сложно это и по большей части я очень подумаю или пойти на такой вариант. Такие самописные матерчатые вьюхи пока не хочется даже планировать ... Буду пытаться сделать на основе одной таблички... не получиться так начнём этим заморачиваться. Не спорю. Все будет зависеть от сложности выборок, кол-ва записей и временем отклика системы, которое устроит пользователя. Делать конечно же нужно как можно проще, усложнять в крайних случаях, когда простых решений не было найдено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2009, 16:33 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35820019&tid=1543433]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
22ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 343ms |

| 0 / 0 |
