powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / "SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
11 сообщений из 11, страница 1 из 1
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37443688
ZLOI13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, у меня Cache сборки 2011.1.0.532.0.
Пишу приложение, которое работает с иерархией классов. В идеале хочется, чтобы можно было строить дерево классов при помощи компонента TreeView.
Писал код с рекурсией, который заполняет всё дерево, но это оказалось настолько долго, что я сначаа должен разобраться с малым. Скажите, из-за чего в моём коде запрос выполняется так медленно (18 секунд!), может можно другим способом обратиться к %Dictionary.CompiledClass?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private void button1_Click(object sender, EventArgs e)
        {
            
            
            int i = System.Environment.TickCount; // i - количество милисекунд, прошедших после запуска функции до её завершения
            CacheConnect = new CacheConnection("Server = localhost; Port = 1972; Namespace = User; User ID = _SYSTEM; Password = SYS;");//---
            CacheConnect.Open();//Соединяемся с кашэ
            string SQLtext = "SELECT * FROM %Dictionary.CompiledClass WHERE Super LIKE 'Base%'";//***
            Command = new CacheCommand(SQLtext, CacheConnect);//---
            CacheDataReader reader = Command.ExecuteReader();//Выбираем все классы 
            while (reader.Read())//***
            {
                treeView1.Nodes.Add(reader[reader.GetOrdinal("ID")].ToString());//Записываем их в дерево, пока плоской структурой
            };
            reader.Close();
            i = System.Environment.TickCount - i;
            CacheConnect.Close();
            MessageBox.Show(i.ToString());
       }
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37443771
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZLOI13Скажите, из-за чего в моём коде запрос выполняется так медленно
Предикат LIKE кагбэ скорости и не обещает...
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37443876
ZLOI13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa , закомментил строчку вывода в treeview. Случай с Like выполняется за 3100, без Like за 3500.
Запрос не должен выполняться больше пол секунды, что уж говорить, когда первый раз он выполняется 14-18 секунд.
Но, естественно, запрос к пользовательским или демонстрационным классам, а не %Dictionary.CompiledClass, выполняется за 50-150 мс, при таком же количестве экземпляров.
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444608
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZLOI13 krvsa , закомментил строчку вывода в treeview. Случай с Like выполняется за 3100, без Like за 3500.
Запрос не должен выполняться больше пол секунды, что уж говорить, когда первый раз он выполняется 14-18 секунд.
Но, естественно, запрос к пользовательским или демонстрационным классам, а не %Dictionary.CompiledClass, выполняется за 50-150 мс, при таком же количестве экземпляров.
1. В Вашем случае стоит попробовать %STARTSWITH вместо LIKE.
2. Отбирать все поля в большинстве случаев нежелательно. В %Dictionary.CompiledClass 74! поля, а Вы отбираете только одно.
3. Сколько времени выполняется запрос в портале управления и/или внешней ODBC-программе? (Не забудьте задать значение количества отображаемых записей не меньшее, чем их есть в базе. Либо используйте TOP для обоих запросов - через Вашу программу и через портал/ODBC.)
4. Если использовать вывод в TreeView, то запрос выполняется 18 секунд. Без вывода в TreeView - ~3. Значит либо treeView1.Nodes.Add() выполняется долго, либо reader.GetOrdinal("ID"), либо просто в запросе без вывода Cache уже использовал закешированные результаты. В любом случае Вам стоит обратить внимание на эти операции, т.к. они составляют ~80% всего времени выполнения кода (если причина не в кеше Cache).
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444619
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря, %Dictionary.CompiledClass довольно медленный класс, это происходит от его структуры данных.
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444626
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно глянуть, например, что хранится по классу
zw ^oddCOM("%Library.Persistent")

считаем строки
s g="^oddCOM(""%Library.Persistent"")",i=0 f{s g=$q(@g) q:g="" q:$qs(g,1)'="%Library.Persistent" s i=i+1} w i
615

Т.е. один класс занимает около одного блока данных, а то и больше.
пусть чтения блока данных занимает 0.004 сек (250 иопсов на поток).
Одних библиотечных классов больше 4000, т.е. это должно быть 4000*.004=16 сек,
индексов по super там нет, так что в любом случае запрос будет выбираться перебором.

Естественно, данные кэшируются, так что при повторном проходе выборка пройдет быстрее.
Скорее странно, что на моем домашнем компе
SELECT * FROM %Dictionary.CompiledClass where super like '%Library.Persistent'
выполняется 6 секунд (всего)
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444671
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Turk1. В Вашем случае стоит попробовать %STARTSWITH вместо LIKE.
Либо завести некий "первородный" абстрактный класс со параметром и делать запросы не из описания классов, а из описания параметров... Т.е. выбрать все классы с наличием такого параметра...
Т.о. может быть задействован индекс по имени параметра... Возможно это даст еще большее ускорение... :)
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444680
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант - проекция класса на системный глобал.
Код: 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.
/// Compiled class
Class cc.fast Extends %Persistent [ Abstract, StorageStrategy = SqlStorage ] {
///Имя класса 
Property Name As %String [ ReadOnly ];
Index NameIDX On Name [ IdKey, PrimaryKey, Unique ];
///Список базовых классов 
Property Super As %String [ ReadOnly ];

/// Проекция на системный глобал
/// Просмотр - Просмотр способа хранения 
<Storage name="SqlStorage">
<DataLocation>^oddCOM</DataLocation>
<ExtentSize> 100000 </ExtentSize>
<IndexLocation>^cc.fastI</IndexLocation>
<SequenceNumber> 4 </SequenceNumber>
<SQLMap name="DataMap">
<Data name="Super">
<Node> 45 </Node>
</Data>
<Global>^oddCOM</Global>
<RowIdSpec name="1">
<Expression>{L1}</Expression>
<Field>Name</Field>
</RowIdSpec>
<Subscript name="1">
<Expression>{Name}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^cc.fastS</StreamLocation>
<Type>%CacheSQLStorage</Type>
</Storage>
}

У такого варианта есть ряд недостатков, но
Код: plaintext
Select * From cc.fast Where Super Like '%Library.Persistent%'
в моем случае 0.163 cекунд
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37444889
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint,

Это закэшировалось. После рестарта сервера сколько? Думаю, здесь по super не задействован индекс и особо не выиграешь.
Как вариант, можно делать по oddDEF, т.е. по %Dictionary.ClassDefinition
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37445173
ZLOI13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, господа, очень приятно, что вы меня выручили.
Выражение:
Код: plaintext
SELECT ID, Super FROM %Dictionary.CompiledClass WHERE %STRING(Super) %STARTSWITH %STRING('Base.%')
первый раз выполняется 1,5 секунды. а после кэширования 50-90 мс, что не может не радовать. Думаю пользователи один раз в день потерпят 1,5 секундную паузу :) А я уже думал генерить прокси классы к %Dictionary.CompiledClass с одним свойством Super :)

TurkСколько времени выполняется запрос в портале управления и/или внешней ODBC-программе?
Turk , первый раз 600мс, следующие 50-90мс.

doublefint , очень интересный вариант, думаю немного такой глубокой системщины не повредит :)
...
Рейтинг: 0 / 0
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
    #37446337
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н., да, закешировалось, прошу прощения. После рестарта ~2 секунды
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / "SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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