powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Выбор индекса движком SQL
16 сообщений из 16, страница 1 из 1
Выбор индекса движком SQL
    #36811956
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С приближающимся завершением отпускного сезона Вас, дорогие коллеги.

У меня неприятность. Примерно вот такая:

Есть иерархия наследования, состоящая из 3-х хранимых классов. Наверху - очень много объектов, внизу - почти нету (так получилось в конкретном случае)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class test.A Extends (%Persistent,%Populate)
{

Property P As %String;

Index PIndex1 On P;

}
Код: plaintext
1.
2.
3.
4.
5.
Class test.B Extends test.A
{

Index PIndex2 On P;

}
Код: plaintext
1.
2.
3.
4.
5.
Class test.C Extends test.B
{

Index PIndex3 On P;

}
Код: plaintext
1.
2.
3.
4.
>d ##class(test.A).Populate( 100000 )
 
>d ##class(test.B).Populate( 10000 )
 
>d ##class(test.C).Populate( 1000 )

для первой тысячи записей:

select * from test.A
Быстродействие: 0.036 Секунд 5009 глобальных ссылок
План запроса
Относительная стоимость = 947000
Read master map test.A.IDKEY, looping on ID.
For each row:
Output the row.

select * from test.B
Быстродействие: 0.154 Секунд 408012 глобальных ссылок
План запроса
Относительная стоимость = 587000
Read master map test.B.IDKEY, looping on ID.
For each row:
Output the row.

select * from test.C
Быстродействие: 0.168 Секунд 448008 глобальных ссылок

План запроса
Относительная стоимость = 551000
Read master map test.C.IDKEY, looping on ID.
For each row:
Output the row.

Читать так: С УМЕНЬШЕНИЕ КОЛИЧЕСТВА ДАННЫХ В ТАБЛИЦЕ ВРЕМЯ ВЫБОРКИ ИЗ НЕЕ РАСТЕТ (а как вы хотели!?)

ORDER BY серьезно меняет картину, ибо движок SQL наконец становится похожим на результат работы нормального программиста, а не козла какого-то плохого программиста...
Он вдруг понимает таки, что можно было пройтись по короткому индексу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Текст запроса 
select * from test.C order by P 
План запроса 
Относительная стоимость =  210398  
Read index map test.C.PIndex3, looping on %SQLUPPER(P) and ID.
For each row:
 Read master map test.C.IDKEY, using the given idkey value. 
 Output the row.
Быстродействие: 0.046 Секунд 14008 глобальных ссылок

Ну да и х... с ним... (я хотел сказать "хрен", но передумал) То, что в Каше проблему гланд должен решать проктолог, всем давно известно, и все давно привыкли (соответствующие резиновые перчаточки, уверен, есть у всех...)

Теперь, собственно о неприятностях:

1. Явное указание
Parameter EXTENTSIZE As INTEGER = 100;
Не решает проблему (хотя для чего оно тогда нужно!?)

2. Непонятно, как исключить проход по IDKEY в случае, когда для движка IDKEY - не последний в ряду возможных индексов, тоже непонятно... Т.е. SQL сразу кидается на IDKEY и я не могу ему сказать
%IGNOREINDICES "IDKEY" или %IGNOREINDICES "test.A.IDKEY", чтобы он "узрел", наконец, #@$@*, что есть довольно удобный, а главное, быстрый индекс???

3. Непонятно, как гарантировать, что при действиях пользователя с таблицей (например, изменение поля, по которому идет сортировка), не приведет к уходу индекса в IDKEY - где мильены записей...

И вообще, что это за "test.B.IDKEY" такой. Судя по структуре глобалов, сразу достучаться в данные класса test.B невозможно.
И "test.B.IDKEY" равнозначно "test.А.IDKEY при условии, что первый элемент в списке данных ~test.B~"

Вот так примерно и начинаются рабочие будни... блин...
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36811964
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажу проще:

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

Но в мегасуперобъектнопостреляционной Cache за последние 10 лет (и даже больше кажись объекты у них) до этого не додумались...

Все, складываю манатки и сваливаю...
Шутка.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36812152
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У вас общий Storage, чтобы разделить объекты подклассов используется
extent index .

Например,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class test.B Extends test.A
{

Index PIndex2 On P;

Index BIndex [Extent];

}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Class test.C Extends test.B
{

Index PIndex3 On P;

Index CIndex [Extent];
}

заполняем индексы:
Код: plaintext
1.
2.
3.
d ##class(test.B).%BuildIndices()
 
d ##class(test.C).%BuildIndices()

Потом смотрим планы запросов select * from test.B, select * from test.C
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36812360
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie',

Спасибо, буду посмотреть... А я мимо "пулял" оказывается... Вашу ссылку читал, но пытался использовать вот так:

Index PIndex2 On P [ Extent ];

На что компилер ругался...
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36812430
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie',

Все равно чаще пытается идти по "длинному" индексу. Если в условии использовано индексированное свойство.

И ищет полторы секунды ;( (нолик должен быть)

Если отсекать индексы этого свойства (унаследованные в т.ч.), то заканчивается все равно на IDKEY, а до созданного с Вашей помощью индекса оптимизатор вообще не доходит.

Как-то так... Получается, пользы от такого индекса почти и нету - только для выборки всех данных класса...
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36812467
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо, как вариант, поддержка индекса по имени класса в родителе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Class test.A Extends (%Persistent,%Populate)
{

Property P As %String;

Index PIndex1 On P;

Property CLS As %String(TRUNCATE =  1 );

Index CLSIndex On CLS;

Method %OnNew(initval As %Library.String) As %Library.Status
{
	Set ..CLS=..%ClassName( 1 )
	Quit $$$OK
}
}
Код: plaintext
1.
2.
3.
4.
5.
6.
Class test.B Extends test.A
{

Index PIndex2 On P;

}
Код: plaintext
1.
2.
3.
4.
5.
6.
Class test.C Extends test.B
{

Index PIndex3 On P;

}
Тогда в запросах дополнительно всегда указывается исловие по CLS предикате WHERE:
Код: plaintext
1.
2.
3.
select * from test.A WHERE CLS='test.A'
select * from test.B WHERE CLS='test.B'
select * from test.C WHERE CLS='test.C'
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36817589
Бред
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesovСкажу проще:

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

Но в мегасуперобъектнопостреляционной Cache за последние 10 лет (и даже больше кажись объекты у них) до этого не додумались...

Все, складываю манатки и сваливаю...
Шутка.

Плохой оптимизатор в Cache следствие плохой модели данных, выбранной из политических соображений:) Он и в других "Р"СУБД тоже плохой.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36820394
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d $system.SQL.TuneTable("test.*",1,1)
делали?
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36820412
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.d $system.SQL.TuneTable("test.*",1,1)
делали?

Я против того, чтобы делать то, что непонятно как работает... Да еще и зависит от текущего количества записей в базе. Сразу после завершения проектирования эта команда сильно мешает жить... Как показал мой опыт, применять ее можно только после "набивки" базы данными. И то в случае экстренной необходимости выправить производительность.

Ручками с экстентсайзом и селективностями игрался. Результат либо никакой, либо отрицательный. В этом конкретном случае, конечно.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36821477
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А без селективностей каше не может адекватно оценить применимость индексов. Понятно что в пустой базе смысла не несет никакого, но в пустой базе и с производительностью все ок ;-)
Кстати, в последнее время наша команда склонятся к тому, чтобы не перегружать классы индексами до того, как написаны программы, использующие эти классы и определены узкие места.

И еще, после выполнения TuneTable правка селективностей как аттрибутов полей игнорируется - нужно править в структуре хранения.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36821553
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретно в вашем случае мне помогло создание екстент-индекса в каждом классе, и в каждом классе нужно делать его со своим именем.
Хотя, опять же, это все хорошо для select *, в более сложных запросах вряд ли поможет

Как вариант, кодировать имя класса в каком-нибудь поле и крутить его (запихивать в любые индексы) как угодно.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36822807
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.,

Спасибо, ход мыслей примерно понятен... Но остаюсь при своем мнении - ИС должны были об этом позаботиться лет 5-ть назад.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36824666
Rus000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolesovБлок А.Н.d $system.SQL.TuneTable("test.*",1,1)
делали?

Я против того, чтобы делать то, что непонятно как работает... Да еще и зависит от текущего количества записей в базе. Сразу после завершения проектирования эта команда сильно мешает жить... Как показал мой опыт, применять ее можно только после "набивки" базы данными. И то в случае экстренной необходимости выправить производительность.

Ручками с экстентсайзом и селективностями игрался. Результат либо никакой, либо отрицательный. В этом конкретном случае, конечно.


тоже напоролись - компилятор статических скл-запросов учитывает селективити на девелоперской машине где база рукотворная и далека от действительности. Поставка кода еще идет в объектно представлении.
На промышленных объемах/пользователях программа тупила неподецки, пока не догадались положить селективити с пром.базы на девелоперскую машину.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36824682
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпока не догадались положить селективити с пром.базы на девелоперскую машину.
А как это? мне казалось, что при экспорте классов селективность не экспортируется.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36824970
andrew_tcvetsikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rus000 компилятор статических скл-запросов учитывает селективити на девелоперской машине
Это понятно - These embedded SQL statements are converted to optimized, executable code at compilation time. Using Embedded SQL
Непонятно другое: как при такой схеме поставки кода оптимизировать Embedded SQL? Если поставлять исходники, то поможет перекомпиляция класса.
...
Рейтинг: 0 / 0
Выбор индекса движком SQL
    #36830269
Rus000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrew_tcvetsikhRus000 компилятор статических скл-запросов учитывает селективити на девелоперской машине
Это понятно - These embedded SQL statements are converted to optimized, executable code at compilation time. Using Embedded SQL
Непонятно другое: как при такой схеме поставки кода оптимизировать Embedded SQL? Если поставлять исходники, то поможет перекомпиляция класса.


сейчас для объектного кода вариантов два
1) отказаться от эмбедед СКЛ - использовать динамические запросы
2) периодически обновлять селективити на девелоперской машине с пром.сервера

если исходники также поставляются, то поможет перекомпиляция на целевой машине
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Выбор индекса движком SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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