Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
ikk
Guest
Да и вообще, для поиска можно (и даже нужно) использовать тот же Sphinx.
11 янв 11, 11:40    [10051940]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
pilot911
Member [заблокирован]

Откуда: Москва
Сообщений: 3906
servit
Выше я приводил пример запроса для миллиона записей.


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

ПС. возможно, вы меня поправите, насколько мне известно, в США самая большая база обслуживает 4 млн ветеранов, на мой взгляд, это немного и у меня нет достоверной информации о том, что база используется в более масштабных нагруженных проектах
11 янв 11, 12:22    [10052296]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
miksoft
Member

Откуда:
Сообщений: 38919
Васисуалий Пупкинсон
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 янв 11, 12:47    [10052526]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
DPH3
Member

Откуда:
Сообщений: 456
Васисуалий Пупкинсон
Если нет, то подскажите плиз какие-нить бесплатные решения, очень уж не хочется на Оракл или SQL Server завязываться, т.к. лицензии стоят весьма ощутимо.

Ну, можно посмотреть на бесплатный DB2 Express C, по идее задача как раз для него.
Но вот оперативки в бесплатной лицензии может оказаться маловато - тут надо пробовать.
Зато оптимизатор хороший :)
11 янв 11, 13:05    [10052660]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
-2-
Member

Откуда:
Сообщений: 15330
MasterZiv
On 10.01.2011 20:08, Alexander Ryndin wrote:

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

Это-то да.

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

Как критерии будем объединять ?
Сам-то понял, что спросил?
11 янв 11, 13:13    [10052718]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

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

Posted via ActualForum NNTP Server 1.4

11 янв 11, 16:07    [10054508]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 11.01.2011 2:21, Васисуалий Пупкинсон wrote:

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

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

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

Posted via ActualForum NNTP Server 1.4

11 янв 11, 16:10    [10054526]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Deadman2014
Member

Откуда: Москва
Сообщений: 144
Вот это не хотите к базе прикрутить?
Или я мимо?
11 янв 11, 16:11    [10054536]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 11.01.2011 3:11, SERG1257 wrote:

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

Да пока проблема-то не в нём.

Posted via ActualForum NNTP Server 1.4

11 янв 11, 16:12    [10054550]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 11.01.2011 4:16, pilot911 wrote:
> если так - то запрос должен выполняться очень быстро даже на миллионах записей

Что заставляет тебя так думать ?

Posted via ActualForum NNTP Server 1.4

11 янв 11, 16:13    [10054554]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3910
MasterZiv
On 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

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

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...
11 янв 11, 16:21    [10054620]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
а такс
Guest
MasterZiv

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





Where пол = 'женщина'
  and город = 'С.Петербург'
  and семья = 'не замужем'
  and цель знакомства in ('брак','романтические отношения','дружба')
  and цвет волос = 'блондинка'
  and курение is null

[/quot]
11 янв 11, 16:22    [10054635]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
а такс,

вообще говоря, in==or
11 янв 11, 16:27    [10054672]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67454
Блог
Dimitry Sibiryakov
Кажется, именно с проблемой выборок по большому количеству критериев призваны бороться
GIS-расширения. Всякие там R-tree индексы и т.д... Почему бы не попробовать их?..

Очччень интересно было бы почитать, каким образом R-tree помогает селекать по куче атрибутов и вообще, как GIS относится к проблеме. Вот даже просто.... что-то типа "кажется, именно философия Канта призвана бороться со смертностью детей в Африке".
11 янв 11, 16:40    [10054786]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Alexander Ryndin
Member

Откуда:
Сообщений: 4919
Блог
Apex
MasterZiv
On 10.01.2011 22:29, Alexander Ryndin wrote:
> Как критерии будем объединять ?
>
> Вопроса не понял. Но все равно можно расслабиться - человеку бесплатно нужно

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

Еще раз, для особо одаренных - STAR QUERY. Делался как раз под эту задачу, чтоб на сотнях миллионов записей как раз такие вот пересечения искать.
Правда, если у автора данных кот наплакал (пара сотен тысяч), то это все суета вокруг дивана...
Ага точно. Star Transformation Query. Упрощенно описано в документации.
11 янв 11, 16:43    [10054812]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
-2-
Member

Откуда:
Сообщений: 15330
MasterZiv
И тебе придётся таки трахаться с OR
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)
11 янв 11, 16:48    [10054865]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

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 янв 11, 16:59    [10054971]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67454
Блог
Dimitry Sibiryakov
Понятия не имею, но вот есть один аффтар настаивает:

Боюсь, эти ссылки без регистрации показывают пустой экран.

Мм... настаивать он может сколько угодно. В принципе, конечно, R-tree действительно рулит, но только есть два момента: во-первых, оно рулит для поиска объектов, обладающих протяжённостью (то есть для запросов вида "покажи мне отрезки, хоть насколько-то пересекающиеся с отрезком (A, B)") а во-вторых, сколь мне помнится, многомерные R-индексы требуют задания всех атрибутов (ну или ведущих в списке - в общем аналогично B-tree).
11 янв 11, 17:39    [10055351]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54790

softwarer
настаивать он может сколько угодно

Ну, он там приводит в пример как запрос класса
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

11 янв 11, 18:04    [10055544]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67454
Блог
Dimitry Sibiryakov
выполняется на SQLite с его R-tree индексами намного быстрее чем на Firebird с B-tree

Дык неудивительно. Но стоит выкинуть условие на какую-либо координату, и R-индекс займётся оральным сексом, что топикстартера вряд ли порадует :) Собственно, именно этот запрос и в случае аналогичного B-индекса cкорее всего неплохо отработает, и проявит бОльшую к выкидыванию не-первых координат.

Суть r-индекса показана здесь.
11 янв 11, 18:24    [10055672]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Sergei.Agalakov
Member

Откуда:
Сообщений: 575
Либо за приличные деньги использовать Oracle с bitmap indexes, либо эксперименитровать с PostgreSQL R-tree indexes. Оракловская имплементация R-tree индекса здесь бесполезна, поскольку ограничена 4 измерениями. У PostgreSQL такого искусственного ограничения вроде нет, но R-tree индексы жрут немерянно памяти, и я очень сомневаюсь наскольку эффективно они будут работать для вырожденных запросов (пропущенные измерения). Должно также сильно тормозить на вставку/модификацию.
Попробуйте найти open source базу с поддержкой bitmap indexes. LusidDB вроде умеет это делать, но опять же это только для чтения.
11 янв 11, 19:24    [10056015]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Sergei.Agalakov
Member

Откуда:
Сообщений: 575
Погуглил немножко, интересно стало. Похоже, что R-tree индексы быстро теряют в производительности при росте числа измерений, и при 10-20 измерениях full scan для поиска данных становится быстрее ( и проще :^) )
11 янв 11, 19:40    [10056084]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
Васисуалий Пупкинсон
Member

Откуда: Москва
Сообщений: 23
SergSuper
вобще странно, мне кажется что для 100 тыч записей полное сканирование должно занимать доли секунды
может имеет смысл наиболее селективные атрибуты записывать в одну таблицу, делать простейший запрос, а потом проверять дополнительные атрибуты?


Я тестил для 100 тыс. пользователей, у которых в среднем есть по 50 атрибутов. Поэтому получилось 5 миллионов записей. А на 100 тыс. записей думаю да, проблем не было бы.
11 янв 11, 19:46    [10056111]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
-2-
Member

Откуда:
Сообщений: 15330
Васисуалий Пупкинсон,

Без EAV 100т строк с заполненными 50 полями (~1000байт) по объему 100МБ будет сидеть в кеше. Фулскан будет занимать миллисекунды.
11 янв 11, 20:21    [10056255]     Ответить | Цитировать Сообщить модератору
 Re: EAV с возможностью быстрой выборки по сложным условиям  [new]
web_fox
Member

Откуда: Киев
Сообщений: 444
Васисуалий Пупкинсон,

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

F.15. intarray
F.13. hstore

F.15.1. intarray Functions and Operators
The @@ 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 янв 11, 21:00    [10056380]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить