|
|
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Прошу совета, ибо уже сломал голову пытаясь решить задачу. Нужно сделать поиск по пользователям сайта. У пользователей могут быть указаны некоторые атрибуты (число возможных атрибутов 200-300). В основном эти атрибуты не имеют значений, а являются, по сути, просто флагами (например, "есть борода"). Но есть и атрибуты со значениями (например, "рост" - "185"). Реально каждому пользователю присваивается порядка 5-50 атрибутов. Количество пользователей - сотни тысяч. Но нужно иметь уверенность, что это сможет быть без проблем смасштабировано еще на пару порядков. Таким образом, вроде бы, эта задача идеально ложится на Entity-attribute-value модель. В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутами, но поддержка решения при этом заметно усложняется (особенно учитывая, что оно должно работать в режиме 24/7, а новые виды атрибутов появляются довольно часто). Да к тому же индексирование каждой из этих колонок тоже повлечет свои проблемы. В общем, типовой use case - это выборка пользователей, подпадающих под заданные критерии. Критериев может быть указано довольно много (от единиц до десятков), нужно поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. И трудность заключается в том, что это должно работать быстро. Для рядовых запросов - моментально, для тяжелых - в пределах 5-10 секунд (и то это уже долго). Я пробовал моделировать это на Postgres, для 100 тыс. пользователей, для запросов по нескольким критериям работает конечно нормально. Но при увеличении количества критериев в запросе быстро умирает, даже при оптимизации по самые помидоры. SQL Server заметно более шустрый, но все равно, большое количество критериев быстро обработать не получается. Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый стенд, не поймешь - будет-ли быстро работать выборка по сложному условию. Поэтому обращаюсь к коллективному разуму - может кто такое уже делал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 07:13 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы (они отлично подходят под ваши условия). Возможно, что разделил таблицу для запросов и таблицу для добавления новых данных. Таблицу для запросов бы периодически перестраивал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 08:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Я бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей. Запросы в Оракле вполне приемлемо работают через банальные GROUP BY ... HAVING COUNT(*)=..., а вот для MySQL пришлось покумекать над оптимизацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 14:07 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
можно еще попробовать indexed view или взрослый партитионинг по юзер ид. имхо ничего лучше реляционной субд для такой задачи не найти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 14:09 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Yo.!взрослый партитионинг по юзер ид.Ну если только по достаточно крупному диапазону (например, с шагом в тысячу или десять тысяч). Иначе ораклоиды не одобрят - 9963426 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 14:14 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > Тут, видимо, нужен какой-то принципиально другой подход нежели реляционная база, > но какой выбрать - хз. Вариантов вроде бы много, но пока не сделаешь тестовый Кто тебе мешает использовать гибрид обычной реляционной БД с EAV ? Важные атрибуты -- в виде обычных колонок таблиц, остальные, дополнительные -- в виде EAV. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 14:26 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 8:24, Alexander Ryndin wrote: > В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы > (они отлично подходят под ваши условия). Возможно, что разделил таблицу для Они вообще мало подо что подходят. Да и вообще они не индексы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 14:26 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 10.01.2011 8:24, Alexander Ryndin wrote: > В случае с Oracle я бы использовал таблицу с 200-300 атрибутами и bitmap-индексы > (они отлично подходят под ваши условия). Возможно, что разделил таблицу для Они вообще мало подо что подходят. Да и вообще они не индексы. Аргументы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 15:15 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Интересная задачка. Поддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 15:48 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Ggg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. +1. Решение, оправдавшее себя многолетней практикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 15:53 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Кажется, именно с проблемой выборок по большому количеству критериев призваны бороться GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 15:59 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 15:15, Alexander Ryndin wrote: > Они вообще мало подо что подходят. Да и вообще они не индексы. > > Аргументы? Аргументов не будет. Так же, как и флейма на тему "Занахрена кому нужны битмап-индексы". Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 17:12 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 7:13, Васисуалий Пупкинсон wrote: > Критериев может быть указано довольно много (от единиц до десятков), нужно > поддерживать их сочетания для AND и OR, а также крайне желательно и NOT IN. Сторонники решения проблемы с помощью битмап-индексов могут рассказать автору топика о том, как они собираются применять эти индексы для вышепроцитированой задачи. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 17:17 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 17:20 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, Найли тут iv_an_ru. У него как раз подобные психованные запросы на virtuoso обрабатываются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 17:47 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:02 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
miksoftЯ бы предложил использовать EAV c нормализованными attribute-value. Тогда основная табличка сокращается всего до двух числовых полей. Сейчас в таблице есть три поля: attribute_id int value int user_id int Как это будет выглядеть в случае нормализованных attribute-value? Просто я честно говоря немного не в курсе что значит нормализованные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:03 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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-индексы и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:08 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Yo.!можно еще попробовать indexed view или взрослый партитионинг по юзер ид. имхо ничего лучше реляционной субд для такой задачи не найти Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо. Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:09 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
pkarklinGgg_oldПоддерживаю идею с гибридным подходом. Наверняка какие-то атрибуты являются наиболее используемыми/селективными в поиске - их в колонки. Остальные атрибуты в отдельную таблицу. +1. Решение, оправдавшее себя многолетней практикой. Спасибо, попробую поэкспериментировать с этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:10 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?.. Как-то с ходу не очень понятно как их прикрутить-то с таким прицелом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:13 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivА типовые запросы можно увидеть ? Просто хотя бы "поддерживать их сочетания для AND и OR" уже будет достаточно проблематично (в смысле OR) для ЛЮБОЙ БД, не только реляционной, реляционность тут вообще ни при чём. А NOT IN вообще очень тяжёлая операция. Типовой запрос с AND и OR например такой: женщина И город - С.Петербург И не замужем И цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба) И цвет волос - блондинка EXCLUDE курит Насчет NOT IN - тут может быть несколько облегчает задачу то, что это условие можно накладывать в самом конце, на то, что уже выбрано предыдущими операторами. Т.е. в теле основного запроса этих ограничений встечаться не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:22 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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-индексы и все. Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не хочется с Ораклом связываться. При всем уважении, конечно. Если бы это корпоративный софт был, за который есть кому хорошо заплатить, тогда без вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:27 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо. Насчет партицирования - честно говоря не очень понятно как тут это может помочь. По идее, надо наоборот стремиться все в одну кучу, на одну машину собрать, сколько бы не было записей в базе. Иначе (вроде бы) затраты времени на агрегирование информации с разных машин будут очень уж ощутимы. Да и не очень понятно, по какому признаку партицировать... Ну или поясните плиз, как Вы это видите. запутался в терминах - я partitioning view имел ввиду, они в стандарт эдишене есть. взрослый оракловый партитионинг как и битмап индексы вам врядле подойдут, они только в ЕЕ редакции, т.е. по $47000 за процессор. у постгреса нет взрослого партитионинга, но есть аналог partitioning view http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.html партиции делать на то, что обязательно заполняют, типа пол и город аля женщина-мск, женщина-питер. правда принципиально наверно не решит ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 20:51 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 20:08, Alexander Ryndin wrote: > BITMAP-индекс как раз отлично решает эту задачу с AND и OR. Это-то да. > Они также специально предназначен именно для случаев, когда количество различных > значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как критерии будем объединять ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 22:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 20:22, Васисуалий Пупкинсон wrote: > Типовой запрос с AND и OR например такой: > > женщина > И > город - С.Петербург > И > не замужем > И > цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба) > И > цвет волос - блондинка И > NOT курит Что-то не видно тут OR. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 22:27 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZiv> Они также специально предназначен именно для случаев, когда количество различных > значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как критерии будем объединять ? Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 22:29 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 20:27, Васисуалий Пупкинсон wrote: > Ох, попробую конечно, если больше никаких вариантов не будет. Просто очень уж не > хочется с Ораклом связываться. При всем уважении, конечно. Если бы это > корпоративный софт был, за который есть кому хорошо заплатить, тогда без > вопросов, но тут ситуация несколько другая... Бюджет довольно-таки ограничен, увы. Подозреваю, что ключевое умение СУБД тут -- возможность при запросе использовать несколько индексов по одной таблице, делая merge join таблицы самой с собой (каждая отобрана по условию с использованием индекса). В принципе можно добиться работы этого в любой субд, особым образом написав запросы. Но это без OR и NOT IN. Про них я пока ничего не понял. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2011, 22:30 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivКак критерии будем объединять ? Про star query что-нибудь когда-нибудь слышали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 01:43 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 10.01.2011 20:22, Васисуалий Пупкинсон wrote: > Типовой запрос с AND и OR например такой: > > женщина > И > город - С.Петербург > И > не замужем > И > цель знакомства - (брак ИЛИ романтические отношения ИЛИ дружба) > И > цвет волос - блондинка И > NOT курит Что-то не видно тут OR. Да, и правда, то что я имел в виду под OR - это не что иное как IN для значений. Тогда правильный пример будет таким: женщина И город - С.Петербург И не замужем И цель знакомства IN (брак, романтические отношения, дружба) И цвет волос - блондинка И NOT курит В принципе, если с реализацией OR возникнут проблемы, то без него можно и обойтись, прибегнув к данной тактике - превратив атрибуты, которые могут употребляться через OR в значения, объединенные каким-нибудь общим атрибутом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 02:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivПодозреваю, что ключевое умение СУБД тут -- возможность при запросе использовать несколько индексов по одной таблице, делая merge join таблицы самой с собой (каждая отобрана по условию с использованием индекса). В принципе можно добиться работы этого в любой субд, особым образом написав запросы. Со способом, использующим соединение таблиц, есть проблема, если в условии поиска заданы не очень селективные атрибуты. Например, условия поиска такие: Страна: Россия или Украина (допустим, есть 300 тыс. записей с таким атрибутом). Пол: мужской (есть 170 тыс. записей) Семейное положение: холост (есть 100 тыс. записей) Цель знакомства: брак (есть 80 тыс. записей) Цвет волос: брюнет (70 тыс. записей) Возраст: от 25 до 45 (50 тыс. записей) Таким образом, в лучшем случае (если планировщик выберет правильный порядок соединения) будет сделано как минимум 5 соединений по 50 тыс. записей. И хорошо еще если только 5 и только по 50 тысяч - что, в принципе, отрабатывает за приемлемое время при разогретом кеше. Но если кеш холодный, то время отклика уже не лезет ни в какие ворота (более 10 секунд). А если будет не очень селективный запрос с бОльшим числом параметров, то у пользователя определенно все зависнет. Естественно, на выходе нужно получить всего лишь десяток записей. Но этот десяток должен быть выбран из списка, отсортированного по времени регистрации пользователей. И никуда не деться от того, чтобы не проделать прежде все эти соединения. Вот если бы СУБД умела соединять таблицы не последовательно (сначала полностью первую пару, потом к тому что получилось, полностью третью таблицу, и т.д.), а выбирать совпадающие записи из этих таблиц (отсортированных, конечно) по одной, пока не наберется количество, указанное в опции LIMIT (или TOP). Я даже пытался сделать сам такой велосипед посредством скрипта в Postgres. Но ничего путного из этого не вышло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 03:07 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Кстати там только поиск или изменения тоже? Васисуалий Пупкинсон В принципе, можно конечно иметь в таблице несколько сотен колонок со всеми этими атрибутамиЯ бы начал с этого варианта не связываясь с EAV. Пустые значения хранится не должны, в блоке будет довольно много записей, для произвольных запросов полное сканирование таблицы - некое последнее средство. Соответсвенно хэш-партиционирование способ его ускорить. Плюс вложится в память, чтобы таблица залезла в буферный кэш и хорошую дисковую подсистему. Для новых признаков можно завести EAV с тем чтобы потом перетащить их в основную таблицу. Правда без простоев тут не получится. Васисуалий Пупкинсон Да, насчет indexed view пожалуй неплохая мысль. А в PostgreSQL или в MySQL это можно реализовать? Если нет, то подскажите плиз какие-нить бесплатные решения,Технически это копия части таблицы, поддерживаемая например триггерами с наложенными условиями. Хитрость в том, чтобы оптимизатор догадался просканировать именно ее, а не базовую таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 03:11 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
а что мешает разбить аттрибуты на группы и хранить их в разных таблицах, связываемых с основной? тогда сможете хранить аттрибуты с множественными значеними и производительность будет на высоте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 03:15 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
пусть основная таблица хранит общие данные типа дата регистрации, логин, фио, дата рождения - имхо, это самый оптимальный путь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 03:17 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
pilot911а что мешает разбить аттрибуты на группы и хранить их в разных таблицах, связываемых с основной? тогда сможете хранить аттрибуты с множественными значеними и производительность будет на высоте Да, это я пробовал делать. Для каждого вида атрибута - отдельная таблица. Действительно, хорошая оптимизация. Но к сожалению, это не устраняет основного камня преткновения - ситуаций, когда нужно сделать много (5 - 10, а то и больше) связываний таблиц, где каждое связывание - по нескольку десятков тысяч записей. Естественно, такие ситуации будут встречаться не на каждом шагу. И может быть даже придется с этим смириться. Но хотелось бы прежде испробовать все возможности найти решение, которое позволило бы с приемлемой скоростью обрабатывать даже такие вот неудобные запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 03:54 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, надеюсь, в проведенных тестах ваш запрос выглядел INNER JOIN a ON a.id=b.id AND a.have_boroda=1 AND a.have_girl=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 04:15 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
если так - то запрос должен выполняться очень быстро даже на миллионах записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 04:16 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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. Как-то мутно это... Вообще, когда вижу такой подход к делу (типа цену озвучивают только при личном общении), как-то сразу интерес снижается. Навевает что-то вроде "Скажите, сколько стоит ваша пищевая добавка? - Это зависит от множества факторов! Для начала скажите, пожалуйста, какой марки Ваш автомобиль?". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 05:25 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Вдогон к предыдущему посту - в общем, написал я им вопрос, сколько стоит эта радость для использования на веб-сайте. Посмотрим, что скажут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 05:37 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон пока не наберется количество, указанное в опции LIMIT (или TOP).То есть вам нужно время отклика до первых limit записей. Тогда сам бог велел разбить таблицу на две - м и ж, кластеризовать по дате регистрации и читать последовательно. Васисуалий Пупкинсон Почитал, хорошее дело. Таки да битмап индекс самый эффективный по io способ. Правда как оно реализовано в Каше не знаю, а Oracle EE вам не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 05:37 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
pilot911Васисуалий Пупкинсон, надеюсь, в проведенных тестах ваш запрос выглядел INNER JOIN a ON a.id=b.id AND a.have_boroda=1 AND a.have_girl=1 если так - то запрос должен выполняться очень быстро даже на миллионах записей Да, принцип именно такой. И действительно, даже на миллионах записей выполняется очень быстро, если количество джойнов не превышает примерно 5 штук. Если больше, и при этом джойнится большое количество строк каждый раз, то вот тогда уже появляются тормоза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 05:40 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
я недавно оставил работу с каше, точнее с ее частью, так вот, бит индекс - не панацея в вашем варианте, поскольку позволяет искать точное совпадение, с диапазоном дат как вы битиндекс будете использовать? и каше плохо работает на миллионах записей, я вам не советую, хотя ради интереса можете потестировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 06:08 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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 - как раз на эту тему. Но я, как говорится, за что купил, за то продал, судить не берусь. Насчет "плохо работает на миллионах записей" - тоже конечно судить не берусь, т.к. не юзал, но вообще просто интересно - как же тогда они на этом строят учетные системы государственного масштаба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 08:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 08:33 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
В точку. Это основная причина (поддержка старья), мало кто больше хочет с таким чудом связываться (с трудом удерживаюсь от использования более крепких эпитетов). Тем не менее, такие чудаки есть - я уже говорил про них выше, те же деятели что написали ту delphi приладу. Я их спросил: ну почему, почему, почему, мать вашу, каша? Говорят, как с рекламки читают: "Быстро, секурно, не требует поддержки, совместимо на уровне SQL с Oracle / SS". Я чуть не заплакал, пока все это слушал... от умиления. Потом выяснилось, что, по странному совпадению, другими СУБД эти товарищи пользоваться не умеют. Единственное разумное обоснование, что я услышал: в каше легко писать полу-нативный код взаимодействующий по TCP/IP или последовательным/параллельным (RS232/LPT) портам с внешним оборудованием. То есть, хранимая процедура (или там рутина, я до сих пор путаюсь в кэшевской терминологии) может слазить за данными по TCP/IP и засунуть их в таблицу. А в условиях лабораторий это приходится делать очень часто при использовании 3-е стороннего оборудования. Справедливости ради, замечу, что под SQL Server, к примеру, такое сделать можно - через extended stored proc, но чтобы ее поставить и заактивировать, надо встать раком и почесать левой пяткой за правым ухом, хотя, номинально это вполне легко. Другое дело, что я бы не стал такую хрень делать на СУБД, а написал бы отдельный сервис для сборки данных (что и придется делать в скором времени, чует мое седалище*). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 08:38 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
pilot911Васисуалий Пупкинсон, системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь Да, пожалуй, с госмаштабом я возможно погорячился :). Просто когда их сайт просматривал, то создалось впечатление, что национальная система здравоохранения это дело использует. Но при ближайшем рассмотрении - просто отдельные госпитали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 09:01 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
pilot911я недавно оставил работу с каше, точнее с ее частью, так вот, бит индекс - не панацея в вашем варианте, поскольку позволяет искать точное совпадение, с диапазоном дат как вы битиндекс будете использовать? и каше плохо работает на миллионах записей, я вам не советую, хотя ради интереса можете потестировать Выше я приводил пример запроса для миллиона записей. Специальные Bitmap/Bitslice индексы активно используются в DeepSee (оперативная бизнес-аналитика на транзакционных данных без создания отдельного хранилища). pilot911системы госмасштаба на каше мне неизвестны, может вам известны? поделитесь Государственный сектор Ещё На недавнем Симпозиуме я даже встречался с некоторыми из разработчиков Пенсионного Фонда РФ. Посмотрите одну из презентаций с этого мероприятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 09:40 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
вобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 10:33 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Храните аттрибуты в MongoDB. А остальные данные в текущей базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 11:00 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
SergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты? Вот блин, только хотел спросить, сколько занимает фуллскан по денормализованной базе ))))))) Кстати, темка вполне актуальна для NoSQL БД. Как раз ТС не помещается в прокрустово ложе SQLя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 11:26 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Да и вообще, для поиска можно (и даже нужно) использовать тот же Sphinx. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 11:40 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
servit Выше я приводил пример запроса для миллиона записей. не хочу умалять достоинство и труд разработчиков каше и прикладных систем, я лишь хочу предупредить от плохих эмоций тех людей, кто собирается работать с каше на больших объемах данных (миллионы и десятки миллионов записей) ПС. возможно, вы меня поправите, насколько мне известно, в США самая большая база обслуживает 4 млн ветеранов, на мой взгляд, это немного и у меня нет достоверной информации о том, что база используется в более масштабных нагруженных проектах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 12:22 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон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Если атрибуты могут быть иерархическими, то в последнюю таблицу еще нужно добавить поле для указания родительского атрибута. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 12:47 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий ПупкинсонЕсли нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо. Ну, можно посмотреть на бесплатный DB2 Express C, по идее задача как раз для него. Но вот оперативки в бесплатной лицензии может оказаться маловато - тут надо пробовать. Зато оптимизатор хороший :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 13:05 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 10.01.2011 20:08, Alexander Ryndin wrote: > BITMAP-индекс как раз отлично решает эту задачу с AND и OR. Это-то да. > Они также специально предназначен именно для случаев, когда количество различных > значений невелико. Тут подойдет даже рост, который имеет диапазон от 100 до 210. Как критерии будем объединять ? Сам-то понял, что спросил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 13:13 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 10.01.2011 22:29, Alexander Ryndin wrote: > Как критерии будем объединять ? > > Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно По одному критерию по его полю строим индекс (хотя бы и битмап), получаем быстрый поиск записей по этому критерию. Критериев много. Нужно найти пересечение множеств записей, удовлетворяющих каждому критерию. Как это делать ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:07 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 11.01.2011 2:21, Васисуалий Пупкинсон wrote: > Тогда правильный пример будет таким: > Т.е. на самом деле таким: > женщина > И > город - С.Петербург > И > не замужем > И ( цель знакомства = брак ИЛИ цель знакомства = романтические отношения ИЛИ цель знакомства = дружба ) > И > цвет волос - блондинка > И > NOT курит И тебе придётся таки трахаться с OR. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:10 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Вот это не хотите к базе прикрутить? Или я мимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:11 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 11.01.2011 3:11, SERG1257 wrote: > Я бы начал с этого варианта не связываясь с EAV. Пустые значения хранится не Да пока проблема-то не в нём. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:12 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 11.01.2011 4:16, pilot911 wrote: > если так - то запрос должен выполняться очень быстро даже на миллионах записей Что заставляет тебя так думать ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:13 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote: > Как критерии будем объединять ? > > Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно По одному критерию по его полю строим индекс (хотя бы и битмап), получаем быстрый поиск записей по этому критерию. Критериев много. Нужно найти пересечение множеств записей, удовлетворяющих каждому критерию. Как это делать ? Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать. Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
MasterZiv И тебе придётся таки трахаться с OR. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:22 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
а такс, вообще говоря, in==or ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:27 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКажется, именно с проблемой выборок по большому количеству критериев призваны бороться GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?.. Очччень интересно было бы почитать, каким образом R-tree помогает селекать по куче атрибутов и вообще, как GIS относится к проблеме. Вот даже просто.... что-то типа "кажется, именно философия Канта призвана бороться со смертностью детей в Африке". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:40 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ApexMasterZivOn 10.01.2011 22:29, Alexander Ryndin wrote: > Как критерии будем объединять ? > > Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно По одному критерию по его полю строим индекс (хотя бы и битмап), получаем быстрый поиск записей по этому критерию. Критериев много. Нужно найти пересечение множеств записей, удовлетворяющих каждому критерию. Как это делать ? Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать. Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...Ага точно. Star Transformation Query. Упрощенно описано в документации . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:43 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:48 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 16:59 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПонятия не имею, но вот есть один аффтар настаивает: Боюсь, эти ссылки без регистрации показывают пустой экран. Мм... настаивать он может сколько угодно. В принципе, конечно, R-tree действительно рулит, но только есть два момента: во-первых, оно рулит для поиска объектов, обладающих протяжённостью (то есть для запросов вида "покажи мне отрезки, хоть насколько-то пересекающиеся с отрезком (A, B)") а во-вторых, сколь мне помнится, многомерные R-индексы требуют задания всех атрибутов (ну или ведущих в списке - в общем аналогично B-tree). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 17:39 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
softwarerнастаивать он может сколько угодно Ну, он там приводит в пример как запрос класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. индексами при числе записей в таблице на уровне десятков миллионов. Условия в этом запросе мне сильно напомнили то, что говорит ТС, поэтому я и посоветовал ему обратить внимание на GiS. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 18:04 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovвыполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree Дык неудивительно. Но стоит выкинуть условие на какую-либо координату, и R-индекс займётся оральным сексом, что топикстартера вряд ли порадует :) Собственно, именно этот запрос и в случае аналогичного B-индекса cкорее всего неплохо отработает, и проявит бОльшую к выкидыванию не-первых координат. Суть r-индекса показана здесь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 18:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Либо за приличные деньги использовать Oracle с bitmap indexes, либо эксперименитровать с PostgreSQL R-tree indexes. Оракловская имплементация R-tree индекса здесь бесполезна, поскольку ограничена 4 измерениями. У PostgreSQL такого искусственного ограничения вроде нет, но R-tree индексы жрут немерянно памяти, и я очень сомневаюсь наскольку эффективно они будут работать для вырожденных запросов (пропущенные измерения). Должно также сильно тормозить на вставку/модификацию. Попробуйте найти open source базу с поддержкой bitmap indexes. LusidDB вроде умеет это делать, но опять же это только для чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 19:24 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Погуглил немножко, интересно стало. Похоже, что R-tree индексы быстро теряют в производительности при росте числа измерений, и при 10-20 измерениях full scan для поиска данных становится быстрее ( и проще :^) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 19:40 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
SergSuperвобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты? Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 19:46 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, Без EAV 100т строк с заполненными 50 полями (~1000байт) по объему 100МБ будет сидеть в кеше. Фулскан будет занимать миллисекунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 20:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Васисуалий Пупкинсон, если вы использовали 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 для хранения ссылок на значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2011, 21:00 |
|
||
|
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 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
Alexander RyndinScareCrowсортированы они по какому полю?По первичному ключу. и что мешает взять вдвое/втрое больше записей, чем нужно для показа, фильтрованных по паре/тройке наиболее селективных условий, а потом приджойнить к ним нужное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2011, 12:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
ScareCrowAlexander Ryndinпропущено... По первичному ключу. и что мешает взять вдвое/втрое больше записей, чем нужно для показа, фильтрованных по паре/тройке наиболее селективных условий, а потом приджойнить к ним нужное? Дело в том, что все джойны, которые здесь обсуждались, как раз-таки и нужны для того, чтобы определить записи, которые можно показать. Т.е. джойны делаются по тем условиям, которые имеют значения для отбора. И всё это обсуждалось для формата хранения данных EAV. Вы, как я понял, когда говорите "приджойнить к ним нужное" - имеете в виду приджойнить имя пользователя и т.п. Но это и не обсуждается, естественно, это делается когда уже ясно - какие пользователи подходят а какие нет. То есть ваш вопрос похоже вызван тем что вы как-то иначе себе представляете исходное условие задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2011, 12:35 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
web_foxПокажите, пожалуйста, лучший по времени EXPLAIN ANALYZE каждого из трёх вариантов запроса (только на одинаковых данных c одинаковым поиском) с сортировкой, которую хотели, и т.п.: 1. Через отдельные колонки (там, где bitmap-скан будет). 2. Через intarray. 3. Через bit string. О кей, на днях постараюсь это сделать. Пока что урывками (т.к. увы очень мало свободного времени) тестирую более тщательно и в том виде, как это будет выглядеть на практике, вариант с фуллсканом. На данный момент могу сказать, что миллион записей в данном случае - это пожалуй крайний предел. Уже на полутора миллионах думает около минуты. Так что если число пользователей подойдет к миллиону (эх, чем черт не шутит), придется думать снова :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2011, 13:10 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
А почему-бы вам не обратить внимание на СУБД которые хранят данные по колонкам? На Sybase IQ например? По идее - она идеально ложится на вашу задачу: складываете все в одну большую таблицу, индексируеете все поля и вперед - делайте запросы как вашей душе угодно. При этом у вас еще будет следующее: За счет хранения данных по колонкам, IQ довольно просто позволяет добавлять/удалять колонки и индексировать их отдельно. За счет того, что у вас статистическая информация с довольно небольшим набором значений для каждой колонки - в вашем случае коэффициент сжатия данных будет ооочень большим - база со всеми индексами будет занимать реально немного места (гораздо меньше чем ваши исходные данные). Большинство ваших полей скорее всего нужно будет проиндексировать bitmap/bitwise индексами, скорее всего понадобятся еще индексы других типов (в IQ их много и разных) - но это уже нужно смотреть по конкретным данным. Поскольку принцип индексирование в IQ зависит не от запросов, а от данных, которые в ней лежат, - вы действительно сможете делать запросы, какие вашей душе угодно. (кстати IQ очень элегантно обрабатывает конструкцию NOT IN, - это одна из ее сильных сторон) Сразу скажу, - удовольствие это конечно не дешевое, - но за счет того, что архитектура IQ сильно отличается от архитектуры стандартной СУБД, - она будет требовать существенно меньше аппаратных ресурсов и дискового пространства, - так что возможно на этом удастся сэкономить. Подумайте в эту сторону. Подробнее можно посмотреть здесь , а вот здесь - отчет который дает неплохое представление о сути продукта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2011, 17:35 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
IQ стоит 30-40к$ по западному прайсу. В СНГ, где сайбейз тщательно скрывает цены от клиентов думаю ценник потянет на 50-60k$ за процессор. В итоге сервак на 4 проца станет не реальным по цене. И да, IQ вы нигде не найдете и не достанете просто так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2011, 17:41 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
nartova@sybase.ruстандартной СУБДХочу до десяти раз ...! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2011, 17:45 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
А я собственно и не скрывала что это не дешево, но только кто вам сказал что проца понадобится 4 а не, скажем 1 ну или максимум 2? Мы похожие базы на ноутбуке средней паршивости гоняли - и ничего, прекрасно все отрабатывает. А вот здесь справа есть кнопка на скачивания 30-дневного триала IQ 15.2, заполнили форму с данными и качайте себе - триалы под разные платформы есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2011, 18:21 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
AnyaNartovaА почему-бы вам не обратить внимание на СУБД которые хранят данные по колонкам? На Sybase IQ например? Спасибо! Вполне возможно, что в будущем воспользуюсь для для этой или других задач. Ну а пока что вполне приемлемым оказалось решение на PostgreSQL - для каждого атрибута своя колонка (а не все поля в битовой строке, как я пытался в предыдущем варианте), ну и не забывать про экономию места, чтобы больше данных влезло на страницу - например использовать тип "char" вместо smallint, поля по возможности null-able, и частичные индексы (учитывающие только не null значения) . Поскольку у меня данные состоят по большей части из флагов, получается довольно компактно, т.к. в случае если флаг не установлен, то он и места не занимает (ибо null). То же самое с целочисленными данными. То есть хотя возможных атрибутов и довольно много, всё-же (учитывая статистику именно моих данных) более компактно получается с отдельными полями, чем с битовыми строками (особенно если учесть, что они хранятся в Postgre с приличным оверхедом). Ну и частичные индексы тоже занимают намного меньше места и следовательно работают быстрее. В общем, на десяти миллионах это всё работает вполне шустро, и сложность запроса особой роли не играет. Единственно, понадобились некоторые ухищрения для того, чтобы индексы реально использовались планировщиком в ситуации, когда нужно вернуть результаты в отсортированном по id виде (то есть с указанием order by id desc). Индексы, во-первых, должны быть составными, такого типа: Код: plaintext 1. Код: plaintext Вполне возможно, адепты PostgreSQL найдут здесь какие-нить вопиющие косяки, но я в ней нуб, что поделать, во всяком случае пляска с бубном дала вполне приемлемый результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2011, 23:46 |
|
||
|
EAV с возможностью быстрой выборки по сложным условиям
|
|||
|---|---|---|---|
|
#18+
On 09.02.2011 23:46, Васисуалий Пупкинсон wrote: > Спасибо! Вполне возможно, что в будущем воспользуюсь для для этой или других задач. Тут надо чётко разграничить направление БД. Если у тебя OLTP, то IQ не подходит ни в каком виде. Если MIXED, тоже. IQ только для OLAP. Это типа на будущее для понимания. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2011, 12:16 |
|
||
|
|

start [/forum/topic.php?all=1&fid=35&tid=1552724]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
108ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 434ms |

| 0 / 0 |
