Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context) / 16 сообщений из 16, страница 1 из 1
13.10.2016, 18:45
    #39326577
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
Коллеги, Добрый день/вечер/утро!

Предположим, что мы взяли очень популярную социальную сеть, закачали к себе.
Задача: мы хотим сделать поиск по любому слову, которое может присутствовать в профиле странички средствами oracle database, имея сервак с количеством процессоров = 100.
Мы точно знаем, что у любого профиля есть Имя (ник), фамилия, день и месяц рожедния. Иногда даже год
Предположим (1) , что у нас получилось 200 млн. уникальных сочетаний ФИО+ДР.

1. Сделаем таблицу PROFILE_ID | FAM | IM | OT | BIRTH_DATE

Собственно дальше включается полет фантазии. Как сделать так, чтобы поиск по любому сочетанию любых слов выполнялся менее 1 секунды (понятно, совсем гугл не получиться, но объем индексированных данных значительно меньше, впрочем как и количество серверов = 1)


Предположим (2), что у одного профиля может быть не более 30 различных параметров (пол, вес, рост, адрес 1 , адрес 2, количество фото, количество альбомов, любимые цитаты, любимые книги и т.д.)

2. Принимаем решение сделать следующий вариант:
а. Создается таблица PROFILE_ID | TAGVALUE и наполняется значениями (получилось 200 млн * 30 вариантов) = 6 млрд строк
б. Создаем 50 партиций по RANGE (PROFILE_ID)
в. Для каждой партиции создаем субпартиции по HASH (TAGVALUE)
г. Делаем LOCAL INDEX .... TAGVALUE PARALLEL 100
д. select /*+parallel(100) */ * from ... where tagvalue='XX' and PROFILE_ID in ( select .... where tagvalue='YY' and profile id in ( select .... where PROFILE_ID in... ))

Как результат: время работы 6-7 секунд. И в основном тратиться на JOIN самой таблицы с собою же по PROFILE_ID.

3. Вариант с ctxsys.context - позволяет делать только лишь партиционирование по PROFILE_ID, и работает на таком объеме дольше, чем хотелось.. (5 сек - 3 минуты)


Может быть, задачу как-то можно решить иначе?
...
Рейтинг: 0 / 0
13.10.2016, 18:47
    #39326578
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkas, Заранее прошу прощения за тся и ться
...
Рейтинг: 0 / 0
13.10.2016, 18:52
    #39326580
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkas,

формулируйте дальше

это -
автор поиск по любому сочетанию любых слов
вам не по бюджету
...
Рейтинг: 0 / 0
13.10.2016, 19:08
    #39326590
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
orawish, бюджет располагает хоть построение bigdata. Я думаю правильным образом секционированная / индексированная таблица даст мне нужный результат. Объем данных 6 млрд строк - это потолок, который будет загружен в таблицу. Пользователей не много, а желание выжать максимум скорости из минимума характеристик - не угасает. 6-7 секунд добился - это уже победа. Кто бы мог подумать, что такая скорость на данных характеристиках на данной задаче это реальность?
...
Рейтинг: 0 / 0
13.10.2016, 19:10
    #39326592
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
одной из причин "хоть построение bigdata" появилось как раз в ответ на "бюджета хоть на oracle"
...
Рейтинг: 0 / 0
13.10.2016, 19:15
    #39326593
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkasorawish, бюджет располагает хоть построение bigdata. Я думаю правильным образом секционированная / индексированная таблица даст мне нужный результат. Объем данных 6 млрд строк - это потолок, который будет загружен в таблицу. Пользователей не много, а желание выжать максимум скорости из минимума характеристик - не угасает. 6-7 секунд добился - это уже победа. Кто бы мог подумать, что такая скорость на данных характеристиках на данной задаче это реальность?
это - полная ( т.е. половая ) противоположность организации данных, как любое сочетание любых слов
...
Рейтинг: 0 / 0
13.10.2016, 19:21
    #39326595
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
orawish, на Ваш взгляд какая технология была бы эффективнее? В организации oracle имеется, время ограничено. Закупка нового софта и серверов - это время.
...
Рейтинг: 0 / 0
13.10.2016, 20:47
    #39326633
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkas2. Принимаем решение сделать следующий вариант:
а. Создается таблица PROFILE_ID | TAGVALUE и наполняется значениями (получилось 200 млн * 30 вариантов) = 6 млрд строк
б. Создаем 50 партиций по RANGE (PROFILE_ID)
в. Для каждой партиции создаем субпартиции по HASH (TAGVALUE)
г. Делаем LOCAL INDEX .... TAGVALUE PARALLEL 100
д. select /*+parallel(100) */ * from ... where tagvalue='XX' and PROFILE_ID in ( select .... where tagvalue='YY' and profile id in ( select .... where PROFILE_ID in... ))

Как результат: время работы 6-7 секунд. И в основном тратиться на JOIN самой таблицы с собою же по PROFILE_ID.
Было проверено, что unpivot до 6 млрд быстрее чем 30 bitmap indexes?
Поскольку число атрибутов известно и фиксировано - намного лучше секционирование по TAGVALUE делать list (subpartition template).

Если достаточно памяти чтоб туда все влезло, то вероятно можно достичь менее секунды c in memory option 12c.
Важно не только in memory, но и возможность хранения по колонкам а не по строкам.

askkasбюджет располагает хоть построение bigdataaskkasколичество серверов = 1Ключевой момент bigdata - это количество серверов <> 1.
...
Рейтинг: 0 / 0
13.10.2016, 20:54
    #39326637
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
dbms_photoshopaskkas2. Принимаем решение сделать следующий вариант:
а. Создается таблица PROFILE_ID | TAGVALUE и наполняется значениями (получилось 200 млн * 30 вариантов) = 6 млрд строк
б. Создаем 50 партиций по RANGE (PROFILE_ID)
в. Для каждой партиции создаем субпартиции по HASH (TAGVALUE)
г. Делаем LOCAL INDEX .... TAGVALUE PARALLEL 100
д. select /*+parallel(100) */ * from ... where tagvalue='XX' and PROFILE_ID in ( select .... where tagvalue='YY' and profile id in ( select .... where PROFILE_ID in... ))

Как результат: время работы 6-7 секунд. И в основном тратиться на JOIN самой таблицы с собою же по PROFILE_ID.
Было проверено, что unpivot до 6 млрд быстрее чем 30 bitmap indexes?
Поскольку число атрибутов известно и фиксировано - намного лучше секционирование по TAGVALUE делать list (subpartition template).

Если достаточно памяти чтоб туда все влезло, то вероятно можно достичь менее секунды c in memory option 12c.
Важно не только in memory, но и возможность хранения по колонкам а не по строкам.

askkasбюджет располагает хоть построение bigdataaskkasколичество серверов = 1Ключевой момент bigdata - это количество серверов <> 1.Кстати, возможно, достаточно просто list по TAGVALUE (я так понимаю под этим имеется в виду имя атрибута).
Соответственно будет для каждого атрибута по сегменту и при указании parallel Оракл будет читать его в несколько потоков получая нужные profile id.
RANGE (PROFILE_ID) выглядит сомнительно, поскольку никаких фильтров по ID не предусмотрено.

Ну есс-но имеет смысл сравнить с битмапами и без unpivot если этого не делали.
...
Рейтинг: 0 / 0
14.10.2016, 10:37
    #39326850
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkasorawish, на Ваш взгляд какая технология была бы эффективнее? В организации oracle имеется, время ограничено. Закупка нового софта и серверов - это время.
ну, вашей задачи я же не знаю..

а технологию (как минимум - попробовать ) предлагаю традиционную
реляционные структуры (т.е., соответственно, без сливания всего атрибутива в одну яму кучу)
да, над ними - контроль качества исходных данных, весовые характеристики, правила нечёткого поиска (куда же вам без него?! )
и, таки, секции-индексы
...
Рейтинг: 0 / 0
14.10.2016, 14:37
    #39327116
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
dbms_photoshop, мысль про in memory интересная, однако при постоянно увеличивающимся количестве атрибутов (сейчас до 20, а потом может быть и до 40), оперативной памяти будет не хватать. На стойке же физической памяти предостаточно. Если отбросить опцию inmemopry, то проблема с pivot table будет следующего характера:
FAM | IM | OT
ИВАНОВ ИВАН ИВАНОВИЧ
ПЕТРОВ ПЕТР ПЕТРОВИЧ


Пользователь в строку поиска ввел ИВАН ИВАНОВ ИВАНОВИЧ.
соотетственно имея 3 параметра, запрос преобразуется в нечто сложное
...where (fam='ИВАН' or im ='ИВАН' or ot='ИВАН' ) and (FAM='ИВАНОВ' or IM ='ИВАНОВ' or OT='ИВАНОВ') and (FAM='ИВАНОВИЧ'....)....

таким образом вариант с использованием многоколоночной таблицы создает сложности. А если аргументов еще больше, то запрос получится просто зверским.

Вернемся к варианту profile_id,tag,tagname,tagvalue

Насчет list по TAGVALUE видимо в ответе имелось ввиду TAGNAME ... Есть у меня такой столбец. Раз пользователь не указывает при поиске то, по чему он ищет (фамилия, имя, отчество и другие названия тегов), то количество используемых parallel соответственно будет равно 20 (число различных параметров)., из этого вытекает, что 80 процессоров будут относительно простаивать. RANGE (PROFILE_ID) позволяет мне разделить 200 млн профилей пользователя по 2 млн на каждый процессор.
Можете раскрыть Вашу идею, может я что-то не так прочитал, и в Вашей мысли действительно есть профит?
Коллеги, кто еще может что посоветовать? Любые варианты рассмотрю :)
...
Рейтинг: 0 / 0
14.10.2016, 14:53
    #39327135
Alex__kK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkas,

Oracle Text не поможет?
...
Рейтинг: 0 / 0
14.10.2016, 15:01
    #39327147
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
Alex__kK, тестировал. Для того, чтобы все теги внести использую clob (ввиду длинного значения совокупности тегов). К сожалению, очень долгий update при добавлении нового тега. Я сейчас протестирую еще раз эту фичу, может что и получится хорошего.
...
Рейтинг: 0 / 0
14.10.2016, 15:05
    #39327156
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
askkas, вспомнил проблему - в решении tagname-tagvalue я могу тэги разбивать по типам. Чтобы была возможность указать, что этот поиск-только по тэгам с типом FAM, другой поиск - по тэгам ADDRESS... Свалив все в кучу для индексирования oracle text, я потеряю эту возможность. Если индексировать не кладя все в 1 колонку, строить индекс по набору столбцов - при моих количествах построение контекстных индексов грузит процы на 100 и не успевает завершиться даже за несколько часов. Дальше ждать нет смысла, да еще и при добавлении нового тега-столбца в такую реализацию будет трудозатратно все снова переиндексировать.
...
Рейтинг: 0 / 0
15.10.2016, 16:08
    #39327570
askkas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
Коллеги, проблема так и не решена. Есть еще дельные советы?
...
Рейтинг: 0 / 0
15.10.2016, 17:01
    #39327584
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context)
можно если думаете об oracle text заюзать json, только хранить в blob его, а не в clob. в blob он раза в 2 быстрее. ну и строить по нему json-индекс. другое дело, что в oracle json глючит и обязательно столкнётесь с багами при or, но они обходятся (поищите мои посты). печаль конечно будет, если захотите перестроить индексы.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание "гугла" на основе oracle 12c (ИД - тег - значение, партиции, ctxsys.context) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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