Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
Класс classB произведен от класса classA как показано ниже. Как "select * from classB" находит объекты класса classB? Никакого индекса по имени класса нет, перебором все объектов в таблице classA?Class User.classA Extends %Persistent { Storage Default { <Data name="classADefaultData"> <Value name="1"> <Value>%%CLASSNAME</Value> </Value> </Data> <DataLocation>^User.classAD</DataLocation> <DefaultData>classADefaultData</DefaultData> <IdLocation>^User.classAD</IdLocation> <IndexLocation>^User.classAI</IndexLocation> <StreamLocation>^User.classAS</StreamLocation> <Type>%Library.CacheStorage</Type> } } Class User.classB Extends classA { Storage Default { <Type>%Library.CacheStorage</Type> } } |
5 сен 18, 22:27 [21666325] Ответить | Цитировать Сообщить модератору |
DAiMor Member Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow Сообщений: 2633 |
alatalo, да, перебирая все объекты. И проверяет класс в хранении. |
6 сен 18, 13:39 [21666911] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
Но ведь тогда, без дополнительных индексов по типу, все это имеет сомнительную пременимость поскольку будет серьезно подтормаживать при большом колве записей |
6 сен 18, 21:58 [21667519] Ответить | Цитировать Сообщить модератору |
logist Member Откуда: InterSystems Сообщений: 262 |
alatalo, Если не складывать все объекты в одну глобаль то делать select * from ClassA будет невозможно. Можно класс А сделать абстрактным, тогда объекты подклассов будут попадать в отдельные глобали Для ускорения поиска по подклассу можно создать extent индекс https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_index_extent |
7 сен 18, 08:35 [21667661] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
logist, про extent не знал, спасибо. Что интересно, Каше его использует только в запросе "select %ID from classB", "select *" предпочитает перебирать все. А про Abstract не понял. По крайней мере, побавление [Abstact] в декларацию classA ничего не меняет. Storage каждому подклассу свой делать нужно? |
7 сен 18, 10:43 [21667812] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Тут кагбэ нужно понять какую цель ты преследуешь так изворачиваясь с классами... Тогда можно было бы предложить путнее решение пока ты не вырыл подземный ход на чердак. |
||
7 сен 18, 10:52 [21667837] Ответить | Цитировать Сообщить модератору |
Блок А.Н. Member Откуда: Новосибирск Сообщений: 3797 |
alatalo, Если наследованный класс будет в первую очередь наследоваться от %Persistent, то у него автоматически свое хранилище создастся. |
7 сен 18, 14:19 [21668196] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
krvsa, logist предложил два решения проблемы перебора все таблицы. С extent-ом все понятно, про Abstract - нет |
9 сен 18, 20:43 [21669384] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
Блок А.Н., да, это понятно |
9 сен 18, 20:44 [21669385] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
alatalo, повторюсь, без знания твоей проблемы нет проку что-либо советовать... Но ты делаешь явно не то. |
10 сен 18, 09:09 [21669540] Ответить | Цитировать Сообщить модератору |
Блок А.Н. Member Откуда: Новосибирск Сообщений: 3797 |
Вообще, я бы 10 раз подумал перед тем, как делать единое хранилище для всех классов. Нужно будет намного аккуратнее продумывать индексы и запросы, чтобы работа с ними не просадила быстродействие. |
||
10 сен 18, 11:13 [21669643] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
krvsa, по дефолту "select * from classB" будет перебирать всю таблицу что не оптимально. Варианта решения два, индекс по контенту или под-классы пишут в отдельные глобали. Вопрос как организовать второй вариант. |
11 сен 18, 11:48 [21670729] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
Блок А.Н., >По идее (емнип), у абстрактного класса не создается хранилище Я попробовал, abstract не меняет вообще ничего в плане хранилища |
11 сен 18, 11:54 [21670737] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
alatalo, спрошу по другому... Что ты хранить собрался в тех классах? Нужно не проблему решать, а ее не создавать вовсе. |
12 сен 18, 08:43 [21671723] Ответить | Цитировать Сообщить модератору |
doublefint Member Откуда: Беларусь, Минск Сообщений: 937 |
alatalo, возможно это поможет |
12 сен 18, 16:20 [21672439] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
krvsa, смотри на это как на абстракную задачу: есть производный класс, нужно сделать select по нему быстрым |
13 сен 18, 11:05 [21673216] Ответить | Цитировать Сообщить модератору |
alatalo Member Откуда: Хельсинки Сообщений: 104 |
doublefint, чуть в сторону: >Если не закрывать открытый объект ( kill, не %Close()! ), то да - рано или поздно Cache "встанет". это почему так? Разве каше не должен закрыть объект после того, как умрет последняя ссылка на него? |
13 сен 18, 11:17 [21673244] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
На задачи по оптимизации не стоит смотреть абстрактно. Вся оптимизация строится именно на конкретике. Не хочешь объяснять проблему - твое дело... Тебе с этим мурыжиться. ![]() |
||
14 сен 18, 10:19 [21674421] Ответить | Цитировать Сообщить модератору |
doublefint Member Откуда: Беларусь, Минск Сообщений: 937 |
Эм.. Это сильно в сторону и не ко мне |
||
14 сен 18, 13:01 [21674633] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Ты посмотри на даты тех сообщений. Это было почти 8 лет назад. И нет примера как такового, который "опустит" сервер на "миллионах записей". Меня лично заверяли, что методы %Close() устарели и ничего не делают. Де нужно использовать именно kill. Что я и сделал... Никаких "зависаний" не происходило. Хотя конвертировались данные областного значения, переводил с dbf-файлов на классы. |
||
14 сен 18, 13:23 [21674662] Ответить | Цитировать Сообщить модератору |
doublefint Member Откуда: Беларусь, Минск Сообщений: 937 |
alatalo, если пройти по цепочке наследования вверх от %Persistent до %Library.SystemBase, то в документации ( Cache 2017.2 ) к его методу %Close() [Final, Internal] можно прочитать: "This method is deprecated because we now reference count objects automatically so there is no need to call this method. It is a no-op and just returns success %Status code." Похоже, приведенная вами цитата, начиная с какой то версии, утратила актуальность. |
14 сен 18, 16:57 [21674938] Ответить | Цитировать Сообщить модератору |
logist Member Откуда: InterSystems Сообщений: 262 |
alatalo,
Да, в какой то из версий слегка поменялось, нужно еще ClassType снять. Теперь нужно как то так делать: Class User.A Extends %Persistent [Abstract, ClassType=""] { Property A As %String; } Class User.B Extends User.A [ClassType = persistent] { Property AAA As %String; Storage Default { <Data name="BDefaultData"> <Value name="1"> <Value>%%CLASSNAME</Value> </Value> <Value name="2"> <Value>A</Value> </Value> <Value name="3"> <Value>AAA</Value> </Value> </Data> <DataLocation>^User.BD</DataLocation> <DefaultData>BDefaultData</DefaultData> <IdLocation>^User.BD</IdLocation> <IndexLocation>^User.BI</IndexLocation> <StreamLocation>^User.BS</StreamLocation> <Type>%Library.CacheStorage</Type> } } |
||
20 сен 18, 04:44 [21680225] Ответить | Цитировать Сообщить модератору |
kolesov Member Откуда: Владивосток Сообщений: 755 |
Не "теперь", а при первой(!) возможности - бережет массу сил и времени. Визг про "все в одной глобали" - он от профанов идет. Наследование хранимых - часть хорошей архитектуры... если Каше, конечно ;) (эх, было бы наследование таблиц в MySQL...) |
||
8 окт 18, 10:58 [21697795] Ответить | Цитировать Сообщить модератору |
doublefint Member Откуда: Беларусь, Минск Сообщений: 937 |
"Favor object composition over class inheritance” the Gang of Four "Subclasses are dependent on the implementation and entire hierarchy of the parent class: the tightest form of coupling available in OO design" |
||
8 окт 18, 16:22 [21698324] Ответить | Цитировать Сообщить модератору |
doublefint Member Откуда: Беларусь, Минск Сообщений: 937 |
|
||
8 окт 18, 16:25 [21698331] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M | ![]() |