Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
14.03.2015, 09:40
|
|||
---|---|---|---|
|
|||
SQL индекс по элементам массива |
|||
#18+
Класс event содержит список объектов класса user и индекс по ELEMENTS. Класс userClass User.user Extends %Persistent [ SqlTableName = UserTable ] { Index uniqueIdx On name [ IdKey, PrimaryKey, Unique ]; Property name As %String [ ReadOnly ]; Method %OnNew(name As %String) As %Status [ Private, ServerOnly = 1 ] { Set i%name = $G(name) Quit $$$OK } ClassMethod get(name As %String) As %String { Quit:..uniqueIdxExists(name) name Set obj = ..%New(name) If $IsObject(obj) { Set sc = obj.%Save() Quit:$$$ISOK(sc) obj.%Id() } Quit "" } } Класс eventClass User.event Extends (%Persistent, %Populate) { Index usersIdx On users(ELEMENTS); Property name As %String(POPSPEC = "City()"); Property users As list Of User.user(POPSPEC = "##class(User.user).get(##class(%PopulateUtils).Name()):100:Integer(1,100)"); } FROM event WHERE FOR SOME %ELEMENT(users) (%VALUE = 'Sorenson,Stavros P.')План запроса (относительная стоимость = 1232): Код: xml 1. 2. 3. 4.
Индекс используется, всё работает быстро. Переделаем users в массив. Класс event2Class User.event2 Extends (%Persistent, %Populate) { Index usersIdx On users(ELEMENTS); Property name As %String(POPSPEC = "City()"); Property users As array Of User.user(POPSPEC = "##class(User.user).get(##class(%PopulateUtils).Name()):100:Integer(1,100)"); } Т.к. users это массив, поля users в таблице event2 нет, зато есть таблица event2_users:SELECT %NOLOCK event2->name, element_key FROM event2_users WHERE users = 'Sorenson,Stavros P.'План запроса (относительная стоимость = 49132): Код: xml 1. 2. 3. 4.
Индекс не используется. Объявить индекс для таблицы event2_users возможности нет. Единственное что мне удалось придумать, это костыль вызов SqlProc:ClassMethod getEventsByUser(user As %String) As %List [ SqlName = GetEvents, SqlProc ] { Set result = "" Set key = $O(^User.event2I("usersIdx",user,"")) While key'="" { Set result = result_$LB(key) Set key = $O(^User.event2I("usersIdx",user,key)) } Quit result }SELECT %NOLOCK event2->name, element_key FROM event2_users WHERE users = 'Sorenson,Stavros P.' AND u.event2 %INLIST GetEvents('Sorenson,Stavros P.')План запроса (относительная стоимость = 733.28): Код: xml 1. 2. 3. 4.
Как должен выглядеть SQL запрос к таблице events2, который будет использовать индекс usersIdx? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.03.2015, 11:44
|
|||
---|---|---|---|
SQL индекс по элементам массива |
|||
#18+
xml с классами, do ##class(User.user).RepopulateAll(100) для генерации данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.03.2015, 11:37
|
|||
---|---|---|---|
SQL индекс по элементам массива |
|||
#18+
eduard93 ,
... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.03.2015, 14:52
|
|||
---|---|---|---|
|
|||
SQL индекс по элементам массива |
|||
#18+
servit, Спасибо, такое решение подходит. Правда получается, что данные хранятся дважды (>_<). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.03.2015, 15:41
|
|||
---|---|---|---|
SQL индекс по элементам массива |
|||
#18+
Petr0vi4444Правда получается, что данные хранятся дваждыКакие именно и как смотрите: по таблице или по глобалам? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.03.2015, 17:46
|
|||
---|---|---|---|
|
|||
SQL индекс по элементам массива |
|||
#18+
servit, По глобалам. Event2 хранит ^(eventid,"users",key,userid), а в индексе тоже самое в другом порядке ключей: ^("usersidx",userid,key,eventid). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.03.2015, 19:09
|
|||
---|---|---|---|
SQL индекс по элементам массива |
|||
#18+
Petr0vi4444 , Индексы - они такие, т.е. всегда избыточны, если только данные не хранить исключительно в них ( пример ). Если хотите сэкономить, используйте отношения : parent-children или one-many: parent-childrenClass User.p Extends (%Persistent, %Populate) { Index uniqueIdx On name [ IdKey, PrimaryKey, Unique ]; Property name As %String(POPSPEC = "City()"); Relationship children As User.c [ Cardinality = children, Inverse = parent ]; } Class User.c Extends (%Persistent, %Populate) { Index usersIdx On users; Property users As %String(POPSPEC = "##class(User.user).get(##class(%PopulateUtils).Name())"); Relationship parent As User.p [ Cardinality = parent, Inverse = children ]; } SELECT %NOLOCK parent->name FROM c WHERE users = 'Sorenson,Stavros P.' one-manyClass User.main Extends (%Persistent, %Populate) { Index uniqueIdx On name [ IdKey, PrimaryKey, Unique ]; Property name As %String(POPSPEC = "City()"); Relationship many As User.many [ Cardinality = many, Inverse = main ]; } Class User.many Extends (%Persistent, %Populate) { Index usersIdx On users; Property users As %String(POPSPEC = "##class(User.user).get(##class(%PopulateUtils).Name())"); Relationship main As User.main [ Cardinality = one, Inverse = many ]; } SELECT %NOLOCK main->name FROM many WHERE users = 'Sorenson,Stavros P.' ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.03.2015, 14:26
|
|||
---|---|---|---|
SQL индекс по элементам массива |
|||
#18+
Petr0vi4444Спасибо, такое решение подходит. Правда получается, что данные хранятся дваждыЕсть решение получше . ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=39&mobile=1&tid=1556702]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 283ms |
total: | 438ms |
0 / 0 |