powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
109 сообщений из 109, показаны все 5 страниц
EAV с возможностью быстрой выборки по сложным условиям
    #37050668
Здравствуйте! Прошу совета, ибо уже сломал голову пытаясь решить задачу.
Нужно сделать поиск по пользователям сайта.
У пользователей могут быть указаны некоторые атрибуты (число возможных атрибутов 200-300).
В основном эти атрибуты не имеют значений, а являются, по сути, просто флагами (например, "есть борода").
Но есть и атрибуты со значениями (например, "рост" - "185").
Реально каждому пользователю присваивается порядка 5-50 атрибутов.
Количество пользователей - сотни тысяч. Но нужно иметь уверенность, что это сможет быть без проблем смасштабировано еще на пару порядков.

Таким образом, вроде бы, эта задача идеально ложится на Entity-attribute-value модель.
В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутами, но поддержка решения при этом заметно усложняется (особенно учитывая, что оно должно работать в режиме 24/7, а новые виды атрибутов появляются довольно часто). Да к тому же индексирование каждой из этих колонок тоже повлечет свои проблемы.

В общем, типовой use case - это выборка пользователей, подпадающих под заданные критерии.
Критериев может быть указано довольно много (от единиц до десятков), нужно поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.
И трудность заключается в том, что это должно работать быстро. Для рядовых запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго).

Я пробовал моделировать это на Postgres, для 100 тыс. пользователей, для запросов по нескольким критериям работает конечно нормально. Но при увеличении количества критериев в запросе быстро умирает, даже при оптимизации по самые помидоры.
SQL Server заметно более шустрый, но все равно, большое количество критериев быстро обработать не получается.

Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050678
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы (они отлично подходят под ваши условия). Возможно, что разделил таблицу для запросов и таблицу для добавления новых данных. Таблицу для запросов бы периодически перестраивал.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050971
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.
Запросы в Оракле вполне приемлемо работают через банальные GROUP BY ... HAVING COUNT(*)=..., а вот для MySQL пришлось покумекать над оптимизацией.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050975
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно еще попробовать indexed view или взрослый партитионинг по юзер ид.
имхо ничего лучше реляционной субд для такой задачи не найти
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37050983
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!взрослый партитионинг по юзер ид.Ну если только по достаточно крупному диапазону (например, с шагом в тысячу или десять тысяч). Иначе ораклоиды не одобрят - 9963426 .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote:

> Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база,
> но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый

Кто тебе мешает использовать гибрид обычной реляционной БД с EAV ?

Важные атрибуты -- в виде обычных колонок таблиц, остальные, дополнительные -- в
виде EAV.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051003
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 8:24, Alexander Ryndin wrote:

> В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы
> (они отлично подходят под ваши условия). Возможно, что разделил таблицу для

Они вообще мало подо что подходят. Да и вообще они не индексы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051072
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 8:24, Alexander Ryndin wrote:

> В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы
> (они отлично подходят под ваши условия). Возможно, что разделил таблицу для

Они вообще мало подо что подходят. Да и вообще они не индексы.
Аргументы?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051134
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная задачка. Поддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051151
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.

+1. Решение, оправдавшее себя многолетней практикой.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051165
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051247
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 15:15, Alexander Ryndin wrote:

> Они вообще мало подо что подходят. Да и вообще они не индексы.
>
> Аргументы?

Аргументов не будет. Так же, как и флейма на тему "Занахрена кому
нужны битмап-индексы".
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051256
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote:
> Критериев может быть указано довольно много (от единиц до десятков), нужно
> поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.

Сторонники решения проблемы с помощью битмап-индексов могут рассказать
автору топика о том, как они собираются применять эти индексы для
вышепроцитированой задачи.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051261
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote:

> В общем, типовой use case - это выборка пользователей, подпадающих под заданные
> критерии.
> Критериев может быть указано довольно много (от единиц до десятков), нужно
> поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.
> И трудность заключается в том, что это должно работать быстро. Для рядовых
> запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго).

А типовые запросы можно увидеть ?

Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно
проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность
тут вообще ни при чём.

А NOT IN вообще очень тяжёлая операция.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051303
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

Найли тут iv_an_ru. У него как раз подобные психованные запросы на virtuoso обрабатываются.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051458
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bitmap -индексы в СУБД Caché.

ПримерClass del.a Extends %Persistent
{
Index ia On a [ Type = bitmap ];
Index ib On b [ Type = bitmap ];
Index ic On c [ Type = bitmap ];
Index id On d [ Type = bitmap ];
Property a As %Integer;
Property b As %String;
Property c As %Date;
Property d As %Boolean;

ClassMethod Fill(N As %Integer = {1e6}) As %Status
{
  do ##class(del.a).%KillExtent()
  set c=0
  for i=1:1:N set c=c+1,^del.aD(c)=$lb("",$r(1e5),$r(1e5),$r(1e5),$r(2))
  s ^del.aD=c
  do ##class(del.a).%BuildIndices()
  q $$$OK
}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
select count(*) from del.a where 
(
  a in ( 1 , 78 ) 
  and year(c) between year(current_date)- 5  and year(current_date) 
  and d= 0 
) or b like '%75%'
На моих данных запрос отрабатывает <1с. (результат - 39734 записей)
Васисуалий ПупкинсонТут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал.Если без SQL, то посмотрите здесь .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051459
miksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.

Сейчас в таблице есть три поля:
attribute_id int
value int
user_id int

Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051468
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОни вообще мало подо что подходят. Да и вообще они не индексы.
Аргументов не будет. Так же, как и флейма на тему "Занахрена кому
нужны битмап-индексы".Мдя-я-я. Не ел, но уверен, что гадость.
MasterZivOn 10.01.2011 7:13, Васисуалий Пупкинсон wrote:

> В общем, типовой use case - это выборка пользователей, подпадающих под заданные
> критерии.
> Критериев может быть указано довольно много (от единиц до десятков), нужно
> поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.
> И трудность заключается в том, что это должно работать быстро. Для рядовых
> запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго).

А типовые запросы можно увидеть ?

Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно
проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность
тут вообще ни при чём.

А NOT IN вообще очень тяжёлая операция.
BITMAP-индекс как раз отлично решает эту задачу с AND и OR.
Они также специально предназначен именно для случаев, когда количество различных значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.
Как применять? Строим на часто используемые поля BITMAP-индексы и все.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051469
Yo.!можно еще попробовать indexed view или взрослый партитионинг по юзер ид.
имхо ничего лучше реляционной субд для такой задачи не найти

Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.
Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051470
pkarklinGgg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу.

+1. Решение, оправдавшее себя многолетней практикой.

Спасибо, попробую поэкспериментировать с этим.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051478
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..


Как-то с ходу не очень понятно как их прикрутить-то с таким прицелом...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051489
MasterZivА типовые запросы можно увидеть ?

Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно
проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность
тут вообще ни при чём.

А NOT IN вообще очень тяжёлая операция.


Типовой запрос с AND и OR например такой:

женщина
И
город - С.Петербург
И
не замужем
И
цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба)
И
цвет волос - блондинка
EXCLUDE
курит

Насчет NOT IN - тут может быть несколько облегчает задачу то, что это условие можно накладывать в самом конце, на то, что уже выбрано предыдущими операторами. Т.е. в теле основного запроса этих ограничений встечаться не будет.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051498
Alexander RyndinMasterZivОни вообще мало подо что подходят. Да и вообще они не индексы.
Аргументов не будет. Так же, как и флейма на тему "Занахрена кому
нужны битмап-индексы".Мдя-я-я. Не ел, но уверен, что гадость.
MasterZivOn 10.01.2011 7:13, Васисуалий Пупкинсон wrote:

> В общем, типовой use case - это выборка пользователей, подпадающих под заданные
> критерии.
> Критериев может быть указано довольно много (от единиц до десятков), нужно
> поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN.
> И трудность заключается в том, что это должно работать быстро. Для рядовых
> запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго).

А типовые запросы можно увидеть ?

Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно
проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность
тут вообще ни при чём.

А NOT IN вообще очень тяжёлая операция.
BITMAP-индекс как раз отлично решает эту задачу с AND и OR.
Они также специально предназначен именно для случаев, когда количество различных значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.
Как применять? Строим на часто используемые поля BITMAP-индексы и все.

Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не хочется с Ораклом связываться. При всем уважении, конечно. Если бы это корпоративный софт был, за который есть кому хорошо заплатить, тогда без вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051518
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Васисуалий Пупкинсон
Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.
Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите.

запутался в терминах - я partitioning view имел ввиду, они в стандарт эдишене есть. взрослый оракловый партитионинг как и битмап индексы вам врядле подойдут, они только в ЕЕ редакции, т.е. по $47000 за процессор.
у постгреса нет взрослого партитионинга, но есть аналог partitioning view
http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html

партиции делать на то, что обязательно заполняют, типа пол и город аля женщина-мск, женщина-питер. правда принципиально наверно не решит ...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051615
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 20:08, Alexander Ryndin wrote:

> BITMAP-индекс как раз отлично решает эту задачу с AND и OR.

Это-то да.

> Они также специально предназначен именно для случаев, когда количество различных
> значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.

Как критерии будем объединять ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051617
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 20:22, Васисуалий Пупкинсон wrote:

> Типовой запрос с AND и OR например такой:
>
> женщина
> И
> город - С.Петербург
> И
> не замужем
> И
> цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба)
> И
> цвет волос - блондинка
И
> NOT курит

Что-то не видно тут OR.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051620
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv> Они также специально предназначен именно для случаев, когда количество различных
> значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.
Как критерии будем объединять ?
Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051621
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 20:27, Васисуалий Пупкинсон wrote:

> Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не
> хочется с Ораклом связываться. При всем уважении, конечно. Если бы это
> корпоративный софт был, за который есть кому хорошо заплатить, тогда без
> вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы.

Подозреваю, что ключевое умение СУБД тут -- возможность при запросе использовать
несколько индексов по одной таблице, делая merge join таблицы самой с собой
(каждая отобрана по условию с использованием индекса).

В принципе можно добиться работы этого в любой субд, особым образом написав
запросы. Но это без OR и NOT IN. Про них я пока ничего не понял.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051763
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКак критерии будем объединять ?

Про star query что-нибудь когда-нибудь слышали?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051782
MasterZivOn 10.01.2011 20:22, Васисуалий Пупкинсон wrote:

> Типовой запрос с AND и OR например такой:
>
> женщина
> И
> город - С.Петербург
> И
> не замужем
> И
> цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба)
> И
> цвет волос - блондинка
И
> NOT курит

Что-то не видно тут OR.


Да, и правда, то что я имел в виду под OR - это не что иное как IN для значений.
Тогда правильный пример будет таким:

женщина
И
город - С.Петербург
И
не замужем
И
цель знакомства IN (брак, романтические отношения, дружба)
И
цвет волос - блондинка
И
NOT курит

В принципе, если с реализацией OR возникнут проблемы, то без него можно и обойтись, прибегнув к данной тактике - превратив атрибуты, которые могут употребляться через OR в значения, объединенные каким-нибудь общим атрибутом.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051788
MasterZivПодозреваю, что ключевое умение СУБД тут -- возможность при запросе использовать
несколько индексов по одной таблице, делая merge join таблицы самой с собой
(каждая отобрана по условию с использованием индекса).

В принципе можно добиться работы этого в любой субд, особым образом написав
запросы.


Со способом, использующим соединение таблиц, есть проблема, если в условии поиска заданы не очень селективные атрибуты. Например, условия поиска такие:

Страна: Россия или Украина (допустим, есть 300 тыс. записей с таким атрибутом).
Пол: мужской (есть 170 тыс. записей)
Семейное положение: холост (есть 100 тыс. записей)
Цель знакомства: брак (есть 80 тыс. записей)
Цвет волос: брюнет (70 тыс. записей)
Возраст: от 25 до 45 (50 тыс. записей)

Таким образом, в лучшем случае (если планировщик выберет правильный порядок соединения) будет сделано как минимум 5 соединений по 50 тыс. записей. И хорошо еще если только 5 и только по 50 тысяч - что, в принципе, отрабатывает за приемлемое время при разогретом кеше. Но если кеш холодный, то время отклика уже не лезет ни в какие ворота (более 10 секунд). А если будет не очень селективный запрос с бОльшим числом параметров, то у пользователя определенно все зависнет.

Естественно, на выходе нужно получить всего лишь десяток записей. Но этот десяток должен быть выбран из списка, отсортированного по времени регистрации пользователей. И никуда не деться от того, чтобы не проделать прежде все эти соединения.
Вот если бы СУБД умела соединять таблицы не последовательно (сначала полностью первую пару, потом к тому что получилось, полностью третью таблицу, и т.д.), а выбирать совпадающие записи из этих таблиц (отсортированных, конечно) по одной, пока не наберется количество, указанное в опции LIMIT (или TOP). Я даже пытался сделать сам такой велосипед посредством скрипта в Postgres. Но ничего путного из этого не вышло.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051789
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати там только поиск или изменения тоже?
Васисуалий Пупкинсон В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутамиЯ бы начал с этого варианта не связываясь с EAV. Пустые значения хранится не должны, в блоке будет довольно много записей, для произвольных запросов полное сканирование таблицы - некое последнее средство. Соответсвенно хэш-партиционирование способ его ускорить. Плюс вложится в память, чтобы таблица залезла в буферный кэш и хорошую дисковую подсистему. Для новых признаков можно завести EAV с тем чтобы потом перетащить их в основную таблицу. Правда без простоев тут не получится.

Васисуалий Пупкинсон Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения,Технически это копия части таблицы, поддерживаемая например триггерами с наложенными условиями. Хитрость в том, чтобы оптимизатор догадался просканировать именно ее, а не базовую таблицу
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051790
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что мешает разбить аттрибуты на группы и хранить их в разных таблицах, связываемых с основной?

тогда сможете хранить аттрибуты с множественными значеними и производительность будет на высоте
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051791
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пусть основная таблица хранит общие данные типа дата регистрации, логин, фио, дата рождения - имхо, это самый оптимальный путь
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051795
pilot911а что мешает разбить аттрибуты на группы и хранить их в разных таблицах, связываемых с основной?
тогда сможете хранить аттрибуты с множественными значеними и производительность будет на высоте

Да, это я пробовал делать. Для каждого вида атрибута - отдельная таблица. Действительно, хорошая оптимизация. Но к сожалению, это не устраняет основного камня преткновения - ситуаций, когда нужно сделать много (5 - 10, а то и больше) связываний таблиц, где каждое связывание - по нескольку десятков тысяч записей. Естественно, такие ситуации будут встречаться не на каждом шагу. И может быть даже придется с этим смириться. Но хотелось бы прежде испробовать все возможности найти решение, которое позволило бы с приемлемой скоростью обрабатывать даже такие вот неудобные запросы.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051798
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

надеюсь, в проведенных тестах ваш запрос выглядел INNER JOIN a ON a.id=b.id AND a.have_boroda=1 AND a.have_girl=1
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051799
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если так - то запрос должен выполняться очень быстро даже на миллионах записей
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051812
servit Bitmap -индексы в СУБД Caché.


Почитал, хорошее дело. Вот правда, непонятно, сколько стоит лицензия. На сайте указано только
авторI love Caché! How can I purchase a license?
We offer a variety of license types – one of them is sure to be right for you. Please call us toll-free at +1.800.753.2571, or contact your local InterSystems office to discuss your needs.

Как-то мутно это... Вообще, когда вижу такой подход к делу (типа цену озвучивают только при личном общении), как-то сразу интерес снижается. Навевает что-то вроде
"Скажите, сколько стоит ваша пищевая добавка? - Это зависит от множества факторов! Для начала скажите, пожалуйста, какой марки Ваш автомобиль?".
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051813
Вдогон к предыдущему посту - в общем, написал я им вопрос, сколько стоит эта радость для использования на веб-сайте. Посмотрим, что скажут.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051814
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон пока не наберется количество, указанное в опции LIMIT (или TOP).То есть вам нужно время отклика до первых limit записей. Тогда сам бог велел разбить таблицу на две - м и ж, кластеризовать по дате регистрации и читать последовательно.

Васисуалий Пупкинсон Почитал, хорошее дело.
Таки да битмап индекс самый эффективный по io способ. Правда как оно реализовано в Каше не знаю, а Oracle EE вам не подходит.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051815
pilot911Васисуалий Пупкинсон,

надеюсь, в проведенных тестах ваш запрос выглядел INNER JOIN a ON a.id=b.id AND a.have_boroda=1 AND a.have_girl=1
если так - то запрос должен выполняться очень быстро даже на миллионах записей

Да, принцип именно такой. И действительно, даже на миллионах записей выполняется очень быстро, если количество джойнов не превышает примерно 5 штук. Если больше, и при этом джойнится большое количество строк каждый раз, то вот тогда уже появляются тормоза.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051824
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я недавно оставил работу с каше, точнее с ее частью, так вот, бит индекс - не панацея в вашем варианте, поскольку позволяет искать точное совпадение, с диапазоном дат как вы битиндекс будете использовать?

и каше плохо работает на миллионах записей, я вам не советую, хотя ради интереса можете потестировать
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051873
pilot911я недавно оставил работу с каше, точнее с ее частью, так вот, бит индекс - не панацея в вашем варианте, поскольку позволяет искать точное совпадение, с диапазоном дат как вы битиндекс будете использовать?
и каше плохо работает на миллионах записей, я вам не советую, хотя ради интереса можете потестировать

Насчет диапазонов - на их сайте написано вот это:

авторThe SQL Engine can use bitmap indices for the following operations:
* ANDing of multiple conditions on a given table.
* ORing of multiple conditions on a given table.
* RANGE conditions on a given table.
* COUNT operations on a given table.

вроде бы, пункт про RANGE - как раз на эту тему. Но я, как говорится, за что купил, за то продал, судить не берусь.

Насчет "плохо работает на миллионах записей" - тоже конечно судить не берусь, т.к. не юзал, но вообще просто интересно - как же тогда они на этом строят учетные системы государственного масштаба?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051875
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051879
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В точку. Это основная причина (поддержка старья), мало кто больше хочет с таким чудом связываться (с трудом удерживаюсь от использования более крепких эпитетов). Тем не менее, такие чудаки есть - я уже говорил про них выше, те же деятели что написали ту delphi приладу. Я их спросил: ну почему, почему, почему, мать вашу, каша? Говорят, как с рекламки читают: "Быстро, секурно, не требует поддержки, совместимо на уровне SQL с Oracle / SS". Я чуть не заплакал, пока все это слушал... от умиления. Потом выяснилось, что, по странному совпадению, другими СУБД эти товарищи пользоваться не умеют. Единственное разумное обоснование, что я услышал: в каше легко писать полу-нативный код взаимодействующий по TCP/IP или последовательным/параллельным (RS232/LPT) портам с внешним оборудованием. То есть, хранимая процедура (или там рутина, я до сих пор путаюсь в кэшевской терминологии) может слазить за данными по TCP/IP и засунуть их в таблицу. А в условиях лабораторий это приходится делать очень часто при использовании 3-е стороннего оборудования.

Справедливости ради, замечу, что под SQL Server, к примеру, такое сделать можно - через extended stored proc, но чтобы ее поставить и заактивировать, надо встать раком и почесать левой пяткой за правым ухом, хотя, номинально это вполне легко. Другое дело, что я бы не стал такую хрень делать на СУБД, а написал бы отдельный сервис для сборки данных (что и придется делать в скором времени, чует мое седалище*).
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051894
pilot911Васисуалий Пупкинсон,

системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь

Да, пожалуй, с госмаштабом я возможно погорячился :). Просто когда их сайт просматривал, то создалось впечатление, что национальная система здравоохранения это дело использует. Но при ближайшем рассмотрении - просто отдельные госпитали.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051936
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pilot911я недавно оставил работу с каше, точнее с ее частью, так вот, бит индекс - не панацея в вашем варианте, поскольку позволяет искать точное совпадение, с диапазоном дат как вы битиндекс будете использовать?

и каше плохо работает на миллионах записей, я вам не советую, хотя ради интереса можете потестировать
Выше я приводил пример запроса для миллиона записей.
Специальные Bitmap/Bitslice индексы активно используются в DeepSee (оперативная бизнес-аналитика на транзакционных данных без создания отдельного хранилища).

pilot911системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь
Государственный сектор

Ещё
На недавнем Симпозиуме я даже встречался с некоторыми из разработчиков Пенсионного Фонда РФ.
Посмотрите одну из презентаций с этого мероприятия.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37051995
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052047
ikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ikk
Гость
Храните аттрибуты в MongoDB. А остальные данные в текущей базе.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052090
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?
Вот блин, только хотел спросить, сколько занимает фуллскан по денормализованной базе )))))))

Кстати, темка вполне актуальна для NoSQL БД. Как раз ТС не помещается в прокрустово ложе SQLя
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052104
ikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ikk
Гость
Да и вообще, для поиска можно (и даже нужно) использовать тот же Sphinx.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052191
Фотография pilot911
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit Выше я приводил пример запроса для миллиона записей.

не хочу умалять достоинство и труд разработчиков каше и прикладных систем, я лишь хочу предупредить от плохих эмоций тех людей, кто собирается работать с каше на больших объемах данных (миллионы и десятки миллионов записей)

ПС. возможно, вы меня поправите, насколько мне известно, в США самая большая база обслуживает 4 млн ветеранов, на мой взгляд, это немного и у меня нет достоверной информации о том, что база используется в более масштабных нагруженных проектах
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052250
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонmiksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей.Сейчас в таблице есть три поля:
attribute_id int
value int
user_id int

Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные..."нормализованные" - вынесенные в отдельную табличку-справочник.
Т.е. таблички получатся примерно такие:
Основная таблица:
user_idattribute_value_id
Справочник значений атрибутов:
attribute_value_idattribute_idvaluedisplay_order
Справочник атрибутов:
attribute_idattributedisplay_orderЕсли атрибуты могут быть иерархическими, то в последнюю таблицу еще нужно добавить поле для указания родительского атрибута.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052294
DPH3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонЕсли нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.

Ну, можно посмотреть на бесплатный DB2 Express C, по идее задача как раз для него.
Но вот оперативки в бесплатной лицензии может оказаться маловато - тут надо пробовать.
Зато оптимизатор хороший :)
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052315
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 20:08, Alexander Ryndin wrote:

> BITMAP-индекс как раз отлично решает эту задачу с AND и OR.

Это-то да.

> Они также специально предназначен именно для случаев, когда количество различных
> значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210.

Как критерии будем объединять ?
Сам-то понял, что спросил?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052832
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

По одному критерию по его полю строим индекс (хотя бы и битмап), получаем
быстрый поиск записей по этому критерию. Критериев много. Нужно найти
пересечение множеств записей, удовлетворяющих каждому критерию.
Как это делать ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052839
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 2:21, Васисуалий Пупкинсон wrote:

> Тогда правильный пример будет таким:
>

Т.е. на самом деле таким:
> женщина
> И
> город - С.Петербург
> И
> не замужем
> И
(
цель знакомства = брак
ИЛИ
цель знакомства = романтические отношения
ИЛИ
цель знакомства = дружба
)
> И
> цвет волос - блондинка
> И
> NOT курит

И тебе придётся таки трахаться с OR.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052842
Deadman2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052847
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 3:11, SERG1257 wrote:

> Я бы начал с этого варианта не связываясь с EAV. Пустые значения хранится не

Да пока проблема-то не в нём.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052850
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 4:16, pilot911 wrote:
> если так - то запрос должен выполняться очень быстро даже на миллионах записей

Что заставляет тебя так думать ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052872
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

По одному критерию по его полю строим индекс (хотя бы и битмап), получаем
быстрый поиск записей по этому критерию. Критериев много. Нужно найти
пересечение множеств записей, удовлетворяющих каждому критерию.
Как это делать ?

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052878
а такс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
И тебе придётся таки трахаться с OR.




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Where пол = 'женщина'
  and город = 'С.Петербург'
  and семья = 'не замужем'
  and цель знакомства in ('брак','романтические отношения','дружба')
  and цвет волос = 'блондинка'
  and курение is null

[/quot]
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052887
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а такс,

вообще говоря, in==or
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052916
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..
Очччень интересно было бы почитать, каким образом R-tree помогает селекать по куче атрибутов и вообще, как GIS относится к проблеме. Вот даже просто.... что-то типа "кажется, именно философия Канта призвана бороться со смертностью детей в Африке".
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052922
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ApexMasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

По одному критерию по его полю строим индекс (хотя бы и битмап), получаем
быстрый поиск записей по этому критерию. Критериев много. Нужно найти
пересечение множеств записей, удовлетворяющих каждому критерию.
Как это делать ?

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...Ага точно. Star Transformation Query. Упрощенно описано в документации .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052940
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ тебе придётся таки трахаться с OR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
create table test_bm 
as 
select rownum id
   , trunc(dbms_random.value( 100 , 210 + 1 )) height 
   , trunc(dbms_random.value( 16 , 100 + 1 )) age 
from dual 
connect  by level <= 100000 ;

create bitmap index tesT_bm#height on test_bm(height);
create bitmap index tesT_bm#age on test_bm(age);

explain plan for
select * 
from tesT_bm 
where height between  165  and  175  or age between  18  and  25  and age !=  22 ;

select * from table(dbms_xplan.display());

Plan hash value:  1289150775 
 
-----------------------------------------------------------------------------------------------
| 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 CONVERSION TO ROWIDS|                |       |       |            |          |
|    3  |    BITMAP OR                 |                |       |       |            |          |
|    4  |     BITMAP MERGE             |                |       |       |            |          |
|*   5  |      BITMAP INDEX RANGE SCAN | TEST_BM#HEIGHT |       |       |            |          |
|    6  |     BITMAP MERGE             |                |       |       |            |          |
|*   7  |      BITMAP INDEX RANGE SCAN | TEST_BM#AGE    |       |       |            |          |
-----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
    5  - access("HEIGHT">= 165  AND "HEIGHT"<= 175 )
    7  - access("AGE">= 18  AND "AGE"<= 25 )
       filter("AGE"<> 22 )
 
Note
-----
   - dynamic sampling used for this statement (level= 2 )
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37052970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerОчччень интересно было бы почитать, каким образом R-tree помогает селекать по куче
атрибутов и вообще, как GIS относится к проблеме.

Понятия не имею, но вот есть один аффтар настаивает:
http://tech.groups.yahoo.com/group/Firebird-Architect/message/11369
http://tech.groups.yahoo.com/group/Firebird-Architect/message/11381
Утверждает, что запрос с кучей index range scan по разным B-tree индексам сливает, а
R-tree рулит со страшной силой.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053098
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПонятия не имею, но вот есть один аффтар настаивает:
Боюсь, эти ссылки без регистрации показывают пустой экран.

Мм... настаивать он может сколько угодно. В принципе, конечно, R-tree действительно рулит, но только есть два момента: во-первых, оно рулит для поиска объектов, обладающих протяжённостью (то есть для запросов вида "покажи мне отрезки, хоть насколько-то пересекающиеся с отрезком (A, B)") а во-вторых, сколь мне помнится, многомерные R-индексы требуют задания всех атрибутов (ну или ведущих в списке - в общем аналогично B-tree).
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerнастаивать он может сколько угодно

Ну, он там приводит в пример как запрос класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
where
x1_y1 >= <#randomnumber1> -  20  and
x1_y1 <= <#randomnumber1> +  20  and
x1_y2 >= <#randomnumber2> -  20  and
x1_y2 <= <#randomnumber2> +  20  and
x1_y3 >= <#randomnumber3> -  20  and
x1_y3 <= <#randomnumber3> +  20  and
x1_y4 >= <#randomnumber4> -  20  and
x1_y4 <= <#randomnumber4> +  20  and
x1_y5 >= <#randomnumber5> -  20  and
x1_y5 <= <#randomnumber5> +  20 ;
выполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree
индексами при числе записей в таблице на уровне десятков миллионов. Условия в этом запросе
мне сильно напомнили то, что говорит ТС, поэтому я и посоветовал ему обратить внимание на GiS.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053197
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovвыполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree
Дык неудивительно. Но стоит выкинуть условие на какую-либо координату, и R-индекс займётся оральным сексом, что топикстартера вряд ли порадует :) Собственно, именно этот запрос и в случае аналогичного B-индекса cкорее всего неплохо отработает, и проявит бОльшую к выкидыванию не-первых координат.

Суть r-индекса показана здесь .
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053310
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо за приличные деньги использовать Oracle с bitmap indexes, либо эксперименитровать с PostgreSQL R-tree indexes. Оракловская имплементация R-tree индекса здесь бесполезна, поскольку ограничена 4 измерениями. У PostgreSQL такого искусственного ограничения вроде нет, но R-tree индексы жрут немерянно памяти, и я очень сомневаюсь наскольку эффективно они будут работать для вырожденных запросов (пропущенные измерения). Должно также сильно тормозить на вставку/модификацию.
Попробуйте найти open source базу с поддержкой bitmap indexes. LusidDB вроде умеет это делать, но опять же это только для чтения.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053327
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглил немножко, интересно стало. Похоже, что R-tree индексы быстро теряют в производительности при росте числа измерений, и при 10-20 измерениях full scan для поиска данных становится быстрее ( и проще :^) )
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053341
SergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?

Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053387
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

Без EAV 100т строк с заполненными 50 полями (~1000байт) по объему 100МБ будет сидеть в кеше. Фулскан будет занимать миллисекунды.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053435
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

если вы использовали PostreSQL, то пробовали ли вы реализацию через GIN-индекс на intarray/hstore? Можно даже поверх 10052526 , а можно и без.

F.15. intarray
F.13. hstore

F.15.1. intarray Functions and OperatorsThe @@ and ~~ operators test whether an array satisfies a query, which is expressed as a value of
a specialized data type query_int. A query consists of integer values that are checked against the
elements of the array, possibly combined using the operators & (AND), | (OR), and ! (NOT). Parentheses
can be used as needed. For example, the query 1&(2|3) matches arrays that contain 1 and also
contain either 2 or 3.
для старта можно попробовать заиспользовать intarray для хранения ссылок на значения.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053539
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

создадим для теста таблицу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE "public"."table1" (
  "id" INTEGER NOT NULL, 
  "property_arr" INTEGER[], 
  CONSTRAINT "table1_pkey" PRIMARY KEY("id")
) WITHOUT OIDS;

ALTER TABLE "public"."table1"
  ALTER COLUMN "id" SET STATISTICS  0 ;

CREATE INDEX "table1_idx" ON "public"."table1"
  USING gin ("property_arr" "public"."gin__int_ops");


Заполним 1 млн пользователей по 100 атрибутов со ссылками на 1000 значений:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TRUNCATE public.table1;

INSERT INTO public.table1
select s.i,
       array
       (
        select (random() *  1000 )::integer + s.i - s.i
        from generate_series( 1 ,  100 ) as s2(i)
       )
from generate_series( 1 ,  1000000 ) as s(i);


analyze public.table1;


Поищем что-нибудь (тайминги домашнего компа):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select count( 1 ) from public.table1 t1 where t1.property_arr @@ '1'
-----------
 94802 
 1  rows fetched ( 172  ms)


select t1.id from public.table1 t1 where t1.property_arr @@ '(1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|501|502|503|504|505|506|507|508|509)'
------------
 941783 
 1  rows fetched ( 2 , 465  sec)


select t1.id from public.table1 t1 where t1.property_arr @@ '1&2&3&(4|5|6|7)'
-----------
 273 
 1  rows fetched ( 328  ms)


select count( 1 ) from public.table1 t1 where t1.property_arr @@ '1&!99&(9|10)'
 15408 
 1  rows fetched ( 218  ms)

...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053552
web_foxВасисуалий Пупкинсон,
создадим для теста таблицу
........

Спасибо! Завтра помедитирую над этим.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053643
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 11.01.2011 3:07, Васисуалий Пупкинсон wrote:

> не лезет ни в какие ворота (более 10 секунд). А если будет не очень селективный
> запрос с бОльшим числом параметров, то у пользователя определенно все зависнет.

Ты запрос-то покажи, и структуру.

Как бы проблема неселективных атрибутов -- она есть и от неё никуда не дется.
Только sort-merge join более менее может её решить, наверное. И то с большим
треском, с напрягом.

У тебя например есть два критерия -- мужчина и блондин. Две половины
таблицы про-JOIN-ить надо между собой и получить при этом, скажем, 1/8
таблицы в результате. Операция сложная, долгая, и особенно ничем не
ускоряемая.

Я даже пытался
> сделать сам такой велосипед посредством скрипта в Postgres. Но ничего путного из
> этого не вышло.

В PG вроде бы есть поддержка пространственных индексов. И вроде бы они то, что
надо. Не пробовал ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37053975
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонSergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?

Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы.ну дык денормализуйте немного
у вас же основные критерии - это логика - так и храните их прямо в той же таблице битиками поля, на 50 аттрибутов хватит двух интежеров
в итоге таблица будет из записей по 20 байт ( 4 - ссылка на основные аттрибуты, 8 - 50 битовых атрибутов, 4 - возраст, 4 - город)
сканирование должно проходить мгновенно даже если и 5 млн записей
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37054477
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperну дык денормализуйте немногоНет смысла что-то изобретать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
я@линух:~> find / -ls > big.table  2 > /dev/null
я@линух:~> wc big.table
   535847    5917094   72173665  big.table
я@линух:~> head big.table
      2      4  drwxr-xr-x   27  root     root          4096  Oct  15   01 : 29  /
 303105      4  drwxr-xr-x    4  root     root          4096  May   5    2010  /srv
 303106      4  drwxr-xr-x    2  root     root          4096  May   5    2010  /srv/ftp
 303107      4  drwxr-xr-x    4  root     root          4096  May   5    2010  /srv/www
 303108      4  drwxr-xr-x    2  root     root          4096  May   5    2010  /srv/www/cgi-bin
 303109      4  drwxr-xr-x    2  root     root          4096  May   5    2010  /srv/www/htdocs
 163841     12  drwxr-xr-x    3  root     root         12288  Oct  14   15 : 30  /sbin
 163898     60  -rwxr-xr-x    4  root     root         56488  May   8    2010  /sbin/mke2fs
 163890    308  -rwxr-xr-x    2  root     root        307208  Feb  23    2009  /sbin/reiserfsck
 163900      0  lrwxrwxrwx    1  root     root             3  Oct  11   12 : 39  /sbin/lvcreate -> lvm
я@линух:~> time awk '($5=="root"||size>1073741824)&&$8!="May"{s++}END{printf "Count=%d", s}' big.table
Count= 157496 
real    0m0.355s
user    0m0.344s
sys     0m0.008s
парс 500К строк 70МБ неструктурированного плоского файла - 0,35 сек
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056021
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 до этого дела не имел вообще...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056083
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я думаю, что лучше вашу проблему с модулем gin озвучить в разделе по POstgre, ответ будет быстрее.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056384
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

у меня тоже на виндовс. Для виндовс достаточно просто запустить файл C:\Program Files\PostgreSQL\xxxxxx\share\contrib\_int.sql. И всё.

Качал я PG в виде инсталятора, а не бинарника.

Если у вас этого файла там почему-то нет и вы ставили через инсталятор, то пишите в профильный форум "Все форумы/PostgreSQL" - там ответят.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056447
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий Пупкинсон,

кстати, на bitmap-поиске скорость на PG аналогичная, тока придётся создавать кучу индексов на кажд столбец и кучу колонок под каждый атрибут, ну вы знаете...
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056621
web_foxВасисуалий Пупкинсон,
у меня тоже на виндовс. Для виндовс достаточно просто запустить файл C:\Program Files\PostgreSQL\xxxxxx\share\contrib\_int.sql.
О, спасибо, сработало. Файл этот у меня есть, я просто думал, что он должен называться intarray.sql.
Жаль, что такой штуки нет для типа smallint, заметная экономия места была бы, да и ускорение опять-же.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37056979
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-MasterZivИ тебе придётся таки трахаться с OR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table test_bm 
...
-----------------------------------------------------------------------------------------------
| 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 CONVERSION TO ROWIDS|                |       |       |            |          |
|    3  |    BITMAP OR                 |                |       |       |            |          |
|    4  |     BITMAP MERGE             |                |       |       |            |          |
|*   5  |      BITMAP INDEX RANGE SCAN | TEST_BM#HEIGHT |       |       |            |          |
|    6  |     BITMAP MERGE             |                |       |       |            |          |
|*   7  |      BITMAP INDEX RANGE SCAN | TEST_BM#AGE    |       |       |            |          |


Попкорн съеден, ответа не дождались :)
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37059002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37060565
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу круто, PG умеет это делать. Или это не PG ? Оракл ?
Ну рад за любого из них.

А что, кто-то не умеет?? Ну, не считая всякого бесплатного шлака, конечно.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37061930
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 15.01.2011 17:04, Apex wrote:

> А что, кто-то не умеет?? Ну, не считая всякого бесплатного шлака, конечно.

Умеют далеко не все.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37063454
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот уже 4 страницы не понимаю этот цирк. расскажите для кокой хотя бы немного реальной задачи нужно джойнить между собой 30 раз по миллиону записей?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37063474
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования?

а мы посмотрим. Возможно, даже человеку поможете ;)
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37063953
ScareCrowя вот уже 4 страницы не понимаю этот цирк. расскажите для кокой хотя бы немного реальной задачи нужно джойнить между собой 30 раз по миллиону записей?

Дык вот, поиск пользователей... 30 раз и миллион записей - это конечно не так уж чтобы совсем реально, но всё-таки хотелось бы иметь определенный запас прочности, чтобы даже и при таких условиях приложение давало ответ за более-менее разумное время.

На данный момент ситуация такова - попробовал разные способы, предложенные уважаемыми коллегами в этом топике, подходящий вариант найти трудно, т.к. сильно осложняет дело то обстоятельство, что результаты нужно выдавать в отсортированном виде (по времени регистрации пользователя), страницами. Если бы всё сводилось к тому, чтобы выдать просто некоторое количество любых пользователей, подходящих под указанные критерии, то отлично работал бы способ с gin индексом по intarray, предложенный web_fox-ом. Но в случае если подходящих под условие строк оказывается очень много, то серверу приходится сначала выбрать их все, отсортировать, и лишь потом выдать определенную порцию. И это сразу всё тормозит. Что касается gist индекса, то он не показывает особенно впечатляющих результатов.
Пробовал MongoDB. Вопреки ожиданиям, скорость поиска тоже не ахти. Использовал подход с Multikeys. То есть две колонки - _id (int) и а (массив int-ов длиной 100 элементов). Индекс по a. На миллионе записей запрос на наличие в атрибутах 6-ти указанный чисел выполняется секунд 40. Запрос такой:
Код: plaintext
attribute_values.find(a : {$all : [ 37 ,  45 ,  50 ,  60 ,  67 ,  90 ]}}, {_id :  1 }).limit( 20 )
Смотрел explain, индекс используется. Черт его знает что за фигня, вроде всё правильно сделал... По идее, эта БД как раз ведь для таких задач и заточена...

Пробовал вариант с индивидуальной колонкой (и индексом по ней) для каждого атрибута (тестил для 200 колонок и миллиона записей). В принципе, работает неплохо, но очень уж неказистый сам способ, да и поддержка...

От формата EAV отказался совсем. Надежных по скорости результатов для любых ситуаций достичь затруднительно, мягко говоря.

Памятуя о неоднократных советах, данных в этом топике, использовать сквозное сканирование, как последнее средство решил испытать и это. И что вы думаете? Успех!
Испробовал вариант с битовой строкой длиной 250 бит (это в PostgreSQL), в котором каждому атрибуту соответствует определенная позиция в строке (дело в том, что у меня подавляющее большинство атрибутов - флаги, или можно свести атрибут к набору флагов).
Строк - миллион. То есть два поля - user_id и битовая строка. Коэффициент заполнения страниц поставил 100%, чтобы поплотнее запихнуть. Работает меньше секунды даже если нужно просмотреть всю таблицу. Конечно, надо было гораздо раньше это испробовать, но как-то интуитивно казалось, что при такой ширине строки перебор будет занимать всё-же слишком много времени.
Сегодня потестирую это более основательно, и если всё ок, не вылезет никаких граблей, то наверно на этом и остановлюсь, ибо просто и надежно. Да и запас прочности хороший.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37064046
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат аховый =)

Я думаю, что с Монго что то не так. Потому что хранение там весьма компактное. Может убрать индекс, и там тоже будет фуллскан?
Причем в Монго чтение базы сделано через memory mapping.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37064346
web_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васисуалий ПупкинсонУспех!
Ну, раз мы вам помогали, значит, ждём от вас публикации результатов :)

Покажите, пожалуйста, лучший по времени EXPLAIN ANALYZE каждого из трёх вариантов запроса (только на одинаковых данных c одинаковым поиском) с сортировкой, которую хотели, и т.п.:
1. Через отдельные колонки (там, где bitmap-скан будет).
2. Через intarray.
3. Через bit string.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37064443
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
web_foxScareCrow,

а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования?

а мы посмотрим. Возможно, даже человеку поможете ;)
все нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37064989
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowвсе нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным.Если я хочу 10 блондинок с ростом 180, возрастом 22-25 и весом 60-65кг, то сначала надо отобрать 10 человек, а потом приджоинить парики на лысину и отрезать все лишнее.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37065020
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сортированы они по какому полю?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37065037
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowсортированы они по какому полю?По первичному ключу.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37065118
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowweb_foxScareCrow,

а, может, вы просто приведёте свой вариант решения сразу на SQL без лишнего разговора про джоины, материальные представления и партицирования?

а мы посмотрим. Возможно, даже человеку поможете ;)
все нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным.
жесть
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37065125
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmScareCrowвсе нормальные люди СНАЧАЛА выбирают 10/20/100 записей для показа, а ПОТОМ их джойнят со всем остальным.
жесть
Ну, в некотором смысле девушка права. Она только забыла упомянуть, что говорит о традиционном алгоритме знакомства на улице, а не о сайте знакомств
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37066413
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander RyndinScareCrowсортированы они по какому полю?По первичному ключу.
и что мешает взять вдвое/втрое больше записей, чем нужно для показа, фильтрованных по паре/тройке наиболее селективных условий, а потом приджойнить к ним нужное?
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37066450
ScareCrowAlexander Ryndinпропущено...
По первичному ключу.
и что мешает взять вдвое/втрое больше записей, чем нужно для показа, фильтрованных по паре/тройке наиболее селективных условий, а потом приджойнить к ним нужное?
Дело в том, что все джойны, которые здесь обсуждались, как раз-таки и нужны для того, чтобы определить записи, которые можно показать. Т.е. джойны делаются по тем условиям, которые имеют значения для отбора. И всё это обсуждалось для формата хранения данных EAV. Вы, как я понял, когда говорите "приджойнить к ним нужное" - имеете в виду приджойнить имя пользователя и т.п. Но это и не обсуждается, естественно, это делается когда уже ясно - какие пользователи подходят а какие нет.
То есть ваш вопрос похоже вызван тем что вы как-то иначе себе представляете исходное условие задачи.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37066579
web_foxПокажите, пожалуйста, лучший по времени EXPLAIN ANALYZE каждого из трёх вариантов запроса (только на одинаковых данных c одинаковым поиском) с сортировкой, которую хотели, и т.п.:
1. Через отдельные колонки (там, где bitmap-скан будет).
2. Через intarray.
3. Через bit string.
О кей, на днях постараюсь это сделать. Пока что урывками (т.к. увы очень мало свободного времени) тестирую более тщательно и в том виде, как это будет выглядеть на практике, вариант с фуллсканом. На данный момент могу сказать, что миллион записей в данном случае - это пожалуй крайний предел. Уже на полутора миллионах думает около минуты. Так что если число пользователей подойдет к миллиону (эх, чем черт не шутит), придется думать снова :).
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37107418
AnyaNartova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему-бы вам не обратить внимание на СУБД которые хранят данные по колонкам? На Sybase IQ например? По идее - она идеально ложится на вашу задачу: складываете все в одну большую таблицу, индексируеете все поля и вперед - делайте запросы как вашей душе угодно.
При этом у вас еще будет следующее:
За счет хранения данных по колонкам, IQ довольно просто позволяет добавлять/удалять колонки и индексировать их отдельно.
За счет того, что у вас статистическая информация с довольно небольшим набором значений для каждой колонки - в вашем случае коэффициент сжатия данных будет ооочень большим - база со всеми индексами будет занимать реально немного места (гораздо меньше чем ваши исходные данные).
Большинство ваших полей скорее всего нужно будет проиндексировать bitmap/bitwise индексами, скорее всего понадобятся еще индексы других типов (в IQ их много и разных) - но это уже нужно смотреть по конкретным данным.
Поскольку принцип индексирование в IQ зависит не от запросов, а от данных, которые в ней лежат, - вы действительно сможете делать запросы, какие вашей душе угодно. (кстати IQ очень элегантно обрабатывает конструкцию NOT IN, - это одна из ее сильных сторон)

Сразу скажу, - удовольствие это конечно не дешевое, - но за счет того, что архитектура IQ сильно отличается от архитектуры стандартной СУБД, - она будет требовать существенно меньше аппаратных ресурсов и дискового пространства, - так что возможно на этом удастся сэкономить. Подумайте в эту сторону.
Подробнее можно посмотреть здесь , а вот здесь - отчет который дает неплохое представление о сути продукта.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37107435
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IQ стоит 30-40к$ по западному прайсу. В СНГ, где сайбейз тщательно скрывает цены от клиентов думаю ценник потянет на 50-60k$ за процессор. В итоге сервак на 4 проца станет не реальным по цене. И да, IQ вы нигде не найдете и не достанете просто так.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37107445
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nartova@sybase.ruстандартной СУБДХочу до десяти раз ...!
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37107541
AnyaNartova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я собственно и не скрывала что это не дешево, но только кто вам сказал что проца понадобится 4 а не, скажем 1 ну или максимум 2? Мы похожие базы на ноутбуке средней паршивости гоняли - и ничего, прекрасно все отрабатывает.

А вот здесь справа есть кнопка на скачивания 30-дневного триала IQ 15.2, заполнили форму с данными и качайте себе - триалы под разные платформы есть.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37107958
AnyaNartovaА почему-бы вам не обратить внимание на СУБД которые хранят данные по колонкам? На Sybase IQ например?
Спасибо! Вполне возможно, что в будущем воспользуюсь для для этой или других задач.
Ну а пока что вполне приемлемым оказалось решение на PostgreSQL - для каждого атрибута своя колонка (а не все поля в битовой строке, как я пытался в предыдущем варианте), ну и не забывать про экономию места, чтобы больше данных влезло на страницу - например использовать тип "char" вместо smallint, поля по возможности null-able, и частичные индексы (учитывающие только не null значения) .
Поскольку у меня данные состоят по большей части из флагов, получается довольно компактно, т.к. в случае если флаг не установлен, то он и места не занимает (ибо null). То же самое с целочисленными данными. То есть хотя возможных атрибутов и довольно много, всё-же (учитывая статистику именно моих данных) более компактно получается с отдельными полями, чем с битовыми строками (особенно если учесть, что они хранятся в Postgre с приличным оверхедом). Ну и частичные индексы тоже занимают намного меньше места и следовательно работают быстрее.
В общем, на десяти миллионах это всё работает вполне шустро, и сложность запроса особой роли не играет.
Единственно, понадобились некоторые ухищрения для того, чтобы индексы реально использовались планировщиком в ситуации, когда нужно вернуть результаты в отсортированном по id виде (то есть с указанием order by id desc). Индексы, во-первых, должны быть составными, такого типа:
Код: plaintext
1.
CREATE INDEX search_attributes_country ON search_attributes(country asc, id desc) WHERE country is not null;
и во-вторых, в условии запроса нужно для каждого поля нужно не просто указывать желаемое значение, а с заклинанием IS NOT NULL, например:
Код: plaintext
WHERE city IS NOT NULL AND city =  1 
, ну а для флагов просто IS NOT NULL (или IS NULL, если нужен сброшенный флаг), а не true/false.
Вполне возможно, адепты PostgreSQL найдут здесь какие-нить вопиющие косяки, но я в ней нуб, что поделать, во всяком случае пляска с бубном дала вполне приемлемый результат.
...
Рейтинг: 0 / 0
EAV с возможностью быстрой выборки по сложным условиям
    #37108690
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 09.02.2011 23:46, Васисуалий Пупкинсон wrote:

> Спасибо! Вполне возможно, что в будущем воспользуюсь для для этой или других задач.

Тут надо чётко разграничить направление БД. Если у тебя OLTP, то IQ не подходит
ни в каком виде. Если MIXED, тоже. IQ только для OLAP. Это типа на будущее для
понимания.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
109 сообщений из 109, показаны все 5 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / EAV с возможностью быстрой выборки по сложным условиям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]