|
|
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, создадим для теста таблицу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Заполним 1 млн пользователей по 100 атрибутов со ссылками на 1000 значений: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Поищем что-нибудь (тайминги домашнего компа): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 22:38 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
web_foxВасисуалий Пупкинсон, создадим для теста таблицу ........ Спасибо! Завтра помедитирую над этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 22:49 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 11.01.2011 3:07, Васисуалий Пупкинсон wrote: > не лезет ни в какие ворота (более 10 секунд). А если будет не очень селективный > запрос с бОльшим числом параметров, то у пользователя определенно все зависнет. Ты запрос-то покажи, и структуру. Как бы проблема неселективных атрибутов -- она есть и от неё никуда не дется. Только sort-merge join более менее может её решить, наверное. И то с большим треском, с напрягом. У тебя например есть два критерия -- мужчина и блондин. Две половины таблицы про-JOIN-ить надо между собой и получить при этом, скажем, 1/8 таблицы в результате. Операция сложная, долгая, и особенно ничем не ускоряемая. Я даже пытался > сделать сам такой велосипед посредством скрипта в Postgres. Но ничего путного из > этого не вышло. В PG вроде бы есть поддержка пространственных индексов. И вроде бы они то, что надо. Не пробовал ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2011, 00:53 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий ПупкинсонSergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты? Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы.ну дык денормализуйте немного у вас же основные критерии - это логика - так и храните их прямо в той же таблице битиками поля, на 50 аттрибутов хватит двух интежеров в итоге таблица будет из записей по 20 байт ( 4 - ссылка на основные аттрибуты, 8 - 50 битовых атрибутов, 4 - возраст, 4 - город) сканирование должно проходить мгновенно даже если и 5 млн записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2011, 10:48 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
SergSuperну дык денормализуйте немногоНет смысла что-то изобретать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2011, 14:06 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
web_foxCREATE INDEX "table1_idx" ON "public"."table1" USING gin ("property_arr" "public"."gin__int_ops");[/src] Вот, наконец, дошли руки продолжить эту задачу. Попробовал испытать этот способ, но получаю ошибку: "ERROR: operator class "public.gin__int_ops" does not exist for access method "gin"" Если я правильно понимаю, это значит что модуль intarray не установлен. Посмотрел в доках, там написано, что нужно запускать gmake для этого, если модуль не установлен, а если установлен, то скрипт из папки contrib. Но у меня в этой папке скрипта для intarray нет (т.е. похоже, что этот модуль нужно скачивать отдельно, но что-то нигде не видно, откуда его можно скачать), да и вообще, postgres (9-й) у меня сейчас установлен на Windows, да и без исходников. Вобщем, что-то я с этим застрял. Если не трудно, подскажите, пожалуйста, что тут надо сделать, чтобы на gin__int_ops не ругалось, я просто с postgres до этого дела не имел вообще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 10:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
я думаю, что лучше вашу проблему с модулем gin озвучить в разделе по POstgre, ответ будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 10:45 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, у меня тоже на виндовс. Для виндовс достаточно просто запустить файл C:\Program Files\PostgreSQL\xxxxxx\share\contrib\_int.sql. И всё. Качал я PG в виде инсталятора, а не бинарника. Если у вас этого файла там почему-то нет и вы ставили через инсталятор, то пишите в профильный форум "Все форумы/PostgreSQL" - там ответят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 12:20 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, кстати, на bitmap-поиске скорость на PG аналогичная, тока придётся создавать кучу индексов на кажд столбец и кучу колонок под каждый атрибут, ну вы знаете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 12:42 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
web_foxВасисуалий Пупкинсон, у меня тоже на виндовс. Для виндовс достаточно просто запустить файл C:\Program Files\PostgreSQL\xxxxxx\share\contrib\_int.sql. О, спасибо, сработало. Файл этот у меня есть, я просто думал, что он должен называться intarray.sql. Жаль, что такой штуки нет для типа smallint, заметная экономия места была бы, да и ускорение опять-же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 13:42 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
-2-MasterZivИ тебе придётся таки трахаться с OR Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Попкорн съеден, ответа не дождались :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2011, 15:35 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 13.01.2011 15:35, web_fox wrote: > ----------------------------------------------------------------------------------------------- > | Id | Operation | Name |Rows | Bytes | Cost (%CPU)| Time | > ----------------------------------------------------------------------------------------------- > |*0* |SELECT STATEMENT | |*16978* | 646K|*29* (*0*)|*00*:*00*:*01* | > |*1* |TABLE ACCESS BY INDEX ROWID | TEST_BM |*16978* | 646K|*29* (*0*)|*00*:*00*:*01* | > |*2* | BITMAP CONVERSIONTO ROWIDS| | | | | | > |*3* | BITMAPOR | | | | | | > |*4* | BITMAP MERGE | | | | | | > |**5* | BITMAPINDEX RANGE SCAN |TEST_BM#HEIGHT | | | | | > |*6* | BITMAP MERGE | | | | | | > |**7* | BITMAPINDEX RANGE SCAN |TEST_BM#AGE | | | | | > > > > Попкорн съеден, ответа не дождались :) Ну круто, PG умеет это делать. Или это не PG ? Оракл ? Ну рад за любого из них. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2011, 14:00 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivНу круто, PG умеет это делать. Или это не PG ? Оракл ? Ну рад за любого из них. А что, кто-то не умеет?? Ну, не считая всякого бесплатного шлака, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2011, 17:04 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 15.01.2011 17:04, Apex wrote: > А что, кто-то не умеет?? Ну, не считая всякого бесплатного шлака, конечно. Умеют далеко не все. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2011, 11:00 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
я вот уже 4 страницы не понимаю этот цирк. расскажите для кокой хотя бы немного реальной задачи нужно джойнить между собой 30 раз по миллиону записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2011, 23:04 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrow, а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования? а мы посмотрим. Возможно, даже человеку поможете ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2011, 23:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrowя вот уже 4 страницы не понимаю этот цирк. расскажите для кокой хотя бы немного реальной задачи нужно джойнить между собой 30 раз по миллиону записей? Дык вот, поиск пользователей... 30 раз и миллион записей - это конечно не так уж чтобы совсем реально, но всё-таки хотелось бы иметь определенный запас прочности, чтобы даже и при таких условиях приложение давало ответ за более-менее разумное время. На данный момент ситуация такова - попробовал разные способы, предложенные уважаемыми коллегами в этом топике, подходящий вариант найти трудно, т.к. сильно осложняет дело то обстоятельство, что результаты нужно выдавать в отсортированном виде (по времени регистрации пользователя), страницами. Если бы всё сводилось к тому, чтобы выдать просто некоторое количество любых пользователей, подходящих под указанные критерии, то отлично работал бы способ с gin индексом по intarray, предложенный web_fox-ом. Но в случае если подходящих под условие строк оказывается очень много, то серверу приходится сначала выбрать их все, отсортировать, и лишь потом выдать определенную порцию. И это сразу всё тормозит. Что касается gist индекса, то он не показывает особенно впечатляющих результатов. Пробовал MongoDB. Вопреки ожиданиям, скорость поиска тоже не ахти. Использовал подход с Multikeys. То есть две колонки - _id (int) и а (массив int-ов длиной 100 элементов). Индекс по a. На миллионе записей запрос на наличие в атрибутах 6-ти указанный чисел выполняется секунд 40. Запрос такой: Код: plaintext Пробовал вариант с индивидуальной колонкой (и индексом по ней) для каждого атрибута (тестил для 200 колонок и миллиона записей). В принципе, работает неплохо, но очень уж неказистый сам способ, да и поддержка... От формата EAV отказался совсем. Надежных по скорости результатов для любых ситуаций достичь затруднительно, мягко говоря. Памятуя о неоднократных советах, данных в этом топике, использовать сквозное сканирование, как последнее средство решил испытать и это. И что вы думаете? Успех! Испробовал вариант с битовой строкой длиной 250 бит (это в PostgreSQL), в котором каждому атрибуту соответствует определенная позиция в строке (дело в том, что у меня подавляющее большинство атрибутов - флаги, или можно свести атрибут к набору флагов). Строк - миллион. То есть два поля - user_id и битовая строка. Коэффициент заполнения страниц поставил 100%, чтобы поплотнее запихнуть. Работает меньше секунды даже если нужно просмотреть всю таблицу. Конечно, надо было гораздо раньше это испробовать, но как-то интуитивно казалось, что при такой ширине строки перебор будет занимать всё-же слишком много времени. Сегодня потестирую это более основательно, и если всё ок, не вылезет никаких граблей, то наверно на этом и остановлюсь, ибо просто и надежно. Да и запас прочности хороший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 10:59 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Результат аховый =) Я думаю, что с Монго что то не так. Потому что хранение там весьма компактное. Может убрать индекс, и там тоже будет фуллскан? Причем в Монго чтение базы сделано через memory mapping. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 11:36 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий ПупкинсонУспех! Ну, раз мы вам помогали, значит, ждём от вас публикации результатов :) Покажите, пожалуйста, лучший по времени EXPLAIN ANALYZE каждого из трёх вариантов запроса (только на одинаковых данных c одинаковым поиском) с сортировкой, которую хотели, и т.п.: 1. Через отдельные колонки (там, где bitmap-скан будет). 2. Через intarray. 3. Через bit string. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 13:05 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
web_foxScareCrow, а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования? а мы посмотрим. Возможно, даже человеку поможете ;) все нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 13:31 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrowвсе нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным.Если я хочу 10 блондинок с ростом 180, возрастом 22-25 и весом 60-65кг, то сначала надо отобрать 10 человек, а потом приджоинить парики на лысину и отрезать все лишнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 16:33 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
сортированы они по какому полю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 16:42 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrowсортированы они по какому полю?По первичному ключу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 16:50 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrowweb_foxScareCrow, а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования? а мы посмотрим. Возможно, даже человеку поможете ;) все нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным. жесть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 17:20 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
iscrafmScareCrowвсе нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным. жесть Ну, в некотором смысле девушка права. Она только забыла упомянуть, что говорит о традиционном алгоритме знакомства на улице, а не о сайте знакомств ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2011, 17:24 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=37064443&tid=1552724]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 388ms |

| 0 / 0 |
