Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / "SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET / 11 сообщений из 11, страница 1 из 1
16.09.2011, 15:10
    #37443688
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Здравствуйте, у меня 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
16.09.2011, 15:47
    #37443771
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
ZLOI13Скажите, из-за чего в моём коде запрос выполняется так медленно
Предикат LIKE кагбэ скорости и не обещает...
...
Рейтинг: 0 / 0
16.09.2011, 16:23
    #37443876
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
krvsa , закомментил строчку вывода в treeview. Случай с Like выполняется за 3100, без Like за 3500.
Запрос не должен выполняться больше пол секунды, что уж говорить, когда первый раз он выполняется 14-18 секунд.
Но, естественно, запрос к пользовательским или демонстрационным классам, а не %Dictionary.CompiledClass, выполняется за 50-150 мс, при таком же количестве экземпляров.
...
Рейтинг: 0 / 0
17.09.2011, 09:42
    #37444608
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
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
17.09.2011, 10:08
    #37444619
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Вообще говоря, %Dictionary.CompiledClass довольно медленный класс, это происходит от его структуры данных.
...
Рейтинг: 0 / 0
17.09.2011, 10:44
    #37444626
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Можно глянуть, например, что хранится по классу
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
17.09.2011, 12:09
    #37444671
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Turk1. В Вашем случае стоит попробовать %STARTSWITH вместо LIKE.
Либо завести некий "первородный" абстрактный класс со параметром и делать запросы не из описания классов, а из описания параметров... Т.е. выбрать все классы с наличием такого параметра...
Т.о. может быть задействован индекс по имени параметра... Возможно это даст еще большее ускорение... :)
...
Рейтинг: 0 / 0
17.09.2011, 12:19
    #37444680
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Еще вариант - проекция класса на системный глобал.
Код: 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
17.09.2011, 17:22
    #37444889
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
doublefint,

Это закэшировалось. После рестарта сервера сколько? Думаю, здесь по super не задействован индекс и особо не выиграешь.
Как вариант, можно делать по oddDEF, т.е. по %Dictionary.ClassDefinition
...
Рейтинг: 0 / 0
18.09.2011, 04:55
    #37445173
ZLOI13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Итак, господа, очень приятно, что вы меня выручили.
Выражение:
Код: 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
19.09.2011, 14:23
    #37446337
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET
Блок А.Н., да, закешировалось, прошу прощения. После рестарта ~2 секунды
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / "SELECT * FROM %Dictionary.CompiledClass", 18 секунд, .NET / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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