Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
С приближающимся завершением отпускного сезона Вас, дорогие коллеги. У меня неприятность. Примерно вот такая: Есть иерархия наследования, состоящая из 3-х хранимых классов. Наверху - очень много объектов, внизу - почти нету (так получилось в конкретном случае) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. для первой тысячи записей: 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. Ну да и х... с ним... (я хотел сказать "хрен", но передумал) То, что в Каше проблему гланд должен решать проктолог, всем давно известно, и все давно привыкли (соответствующие резиновые перчаточки, уверен, есть у всех...) Теперь, собственно о неприятностях: 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~" Вот так примерно и начинаются рабочие будни... блин... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 07:47 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Скажу проще: Если мне нужно сделать выборку по классу, находящемуся в иерархии наследования, последнее, что я стал бы использовать, это IDKEY. Если в моем, конкретном классе определен хотя-бы один, пусть самый завалящий, но в нужном классе, индекс, проход по этому индексу даст тыщапицотразовый выигрыш в производительности без ущерба логике. Но в мегасуперобъектнопостреляционной Cache за последние 10 лет (и даже больше кажись объекты у них) до этого не додумались... Все, складываю манатки и сваливаю... Шутка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 08:02 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
У вас общий Storage, чтобы разделить объекты подклассов используется extent index . Например, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. заполняем индексы: Код: plaintext 1. 2. 3. Потом смотрим планы запросов select * from test.B, select * from test.C ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 10:12 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
newbie', Спасибо, буду посмотреть... А я мимо "пулял" оказывается... Вашу ссылку читал, но пытался использовать вот так: Index PIndex2 On P [ Extent ]; На что компилер ругался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 11:12 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
newbie', Все равно чаще пытается идти по "длинному" индексу. Если в условии использовано индексированное свойство. И ищет полторы секунды ;( (нолик должен быть) Если отсекать индексы этого свойства (унаследованные в т.ч.), то заканчивается все равно на IDKEY, а до созданного с Вашей помощью индекса оптимизатор вообще не доходит. Как-то так... Получается, пользы от такого индекса почти и нету - только для выборки всех данных класса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 11:30 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Либо, как вариант, поддержка индекса по имени класса в родителе: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2010, 11:38 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
kolesovСкажу проще: Если мне нужно сделать выборку по классу, находящемуся в иерархии наследования, последнее, что я стал бы использовать, это IDKEY. Если в моем, конкретном классе определен хотя-бы один, пусть самый завалящий, но в нужном классе, индекс, проход по этому индексу даст тыщапицотразовый выигрыш в производительности без ущерба логике. Но в мегасуперобъектнопостреляционной Cache за последние 10 лет (и даже больше кажись объекты у них) до этого не додумались... Все, складываю манатки и сваливаю... Шутка. Плохой оптимизатор в Cache следствие плохой модели данных, выбранной из политических соображений:) Он и в других "Р"СУБД тоже плохой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2010, 11:38 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
d $system.SQL.TuneTable("test.*",1,1) делали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 09:32 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.d $system.SQL.TuneTable("test.*",1,1) делали? Я против того, чтобы делать то, что непонятно как работает... Да еще и зависит от текущего количества записей в базе. Сразу после завершения проектирования эта команда сильно мешает жить... Как показал мой опыт, применять ее можно только после "набивки" базы данными. И то в случае экстренной необходимости выправить производительность. Ручками с экстентсайзом и селективностями игрался. Результат либо никакой, либо отрицательный. В этом конкретном случае, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 09:46 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
А без селективностей каше не может адекватно оценить применимость индексов. Понятно что в пустой базе смысла не несет никакого, но в пустой базе и с производительностью все ок ;-) Кстати, в последнее время наша команда склонятся к тому, чтобы не перегружать классы индексами до того, как написаны программы, использующие эти классы и определены узкие места. И еще, после выполнения TuneTable правка селективностей как аттрибутов полей игнорируется - нужно править в структуре хранения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 15:28 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Конкретно в вашем случае мне помогло создание екстент-индекса в каждом классе, и в каждом классе нужно делать его со своим именем. Хотя, опять же, это все хорошо для select *, в более сложных запросах вряд ли поможет Как вариант, кодировать имя класса в каком-нибудь поле и крутить его (запихивать в любые индексы) как угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2010, 15:56 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Блок А.Н., Спасибо, ход мыслей примерно понятен... Но остаюсь при своем мнении - ИС должны были об этом позаботиться лет 5-ть назад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2010, 09:16 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
kolesovБлок А.Н.d $system.SQL.TuneTable("test.*",1,1) делали? Я против того, чтобы делать то, что непонятно как работает... Да еще и зависит от текущего количества записей в базе. Сразу после завершения проектирования эта команда сильно мешает жить... Как показал мой опыт, применять ее можно только после "набивки" базы данными. И то в случае экстренной необходимости выправить производительность. Ручками с экстентсайзом и селективностями игрался. Результат либо никакой, либо отрицательный. В этом конкретном случае, конечно. тоже напоролись - компилятор статических скл-запросов учитывает селективити на девелоперской машине где база рукотворная и далека от действительности. Поставка кода еще идет в объектно представлении. На промышленных объемах/пользователях программа тупила неподецки, пока не догадались положить селективити с пром.базы на девелоперскую машину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2010, 19:59 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
авторпока не догадались положить селективити с пром.базы на девелоперскую машину. А как это? мне казалось, что при экспорте классов селективность не экспортируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2010, 20:13 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
Rus000 компилятор статических скл-запросов учитывает селективити на девелоперской машине Это понятно - These embedded SQL statements are converted to optimized, executable code at compilation time. Using Embedded SQL Непонятно другое: как при такой схеме поставки кода оптимизировать Embedded SQL? Если поставлять исходники, то поможет перекомпиляция класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2010, 08:33 |
|
||
|
Выбор индекса движком SQL
|
|||
|---|---|---|---|
|
#18+
andrew_tcvetsikhRus000 компилятор статических скл-запросов учитывает селективити на девелоперской машине Это понятно - These embedded SQL statements are converted to optimized, executable code at compilation time. Using Embedded SQL Непонятно другое: как при такой схеме поставки кода оптимизировать Embedded SQL? Если поставлять исходники, то поможет перекомпиляция класса. сейчас для объектного кода вариантов два 1) отказаться от эмбедед СКЛ - использовать динамические запросы 2) периодически обновлять селективити на девелоперской машине с пром.сервера если исходники также поставляются, то поможет перекомпиляция на целевой машине ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2010, 17:19 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36812430&tid=1557976]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 425ms |

| 0 / 0 |
