AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.03.2006, 14:27   #1  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Oracle - снова индексы
Заметил странную особенность...

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

Выполняю запрос в 3-х уровневой конфигурации - индексы не подхавтываются..
Выполняю в 2-х уровневой, индекс подхватывается и запрос выполняется быстро..

index hint в конфигурационной утилите равно 0.

С чем это может быть связано?
Старый 21.03.2006, 15:34   #2  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Может это?
Управление опциями SQL запроса
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 21.03.2006, 16:04   #3  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
может следующие проверки и удары в бубен помогут

1. в конфиге самого аоса, который доступен через панель управления хинты то же выключены?
2. Галочки "force literals in..." в двухровневой и в конфиге аоса одинаковые?
3. закешировался плохой план запроса. например статистики не было, запрос выполнили, потом собрали статистику, но план все равно останется старый. хотя кеш планов живет в SGA и плохо должно быть по любому. попробуйте alter sytem flush shared pool
4. ну и на всяк случай - пересоберите статистику по всем индексам своей таблицы.
Старый 21.03.2006, 16:17   #4  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
еще глупый вопрос, но лучше все таки спрошу - планы запросов действительно разные?
т.е вы реально видели планы запросов, а не просто тут быстро, а тут медленно, потому что наверное индекс не используется. если запрос выполнять несколько раз с одними и теми же параметрами и с размером кеша у оракла все в порядке, то данные запросто могут выгребаться из кеша, без обращения к дискам - разница по скорости несколько порядков
Старый 21.03.2006, 16:26   #5  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Цитата:
Сообщение от db
еще глупый вопрос, но лучше все таки спрошу - планы запросов действительно разные?
да смотрел план запроса... в одном случае цепляет индекс, во втором плане - обращается напрямую к таблице и пишет .. TABLE ACCES (FULL)
Старый 21.03.2006, 18:10   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
А сами данные в критериях одинаковые?
Старый 21.03.2006, 19:47   #7  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Bars
да смотрел план запроса... в одном случае цепляет индекс, во втором плане - обращается напрямую к таблице и пишет .. TABLE ACCES (FULL)
Слей сюда запросы то... Интересно всё ж таки с академической точки зрения
Ась?
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 21.03.2006, 22:12   #8  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Цитата:
Сообщение от belugin
А сами данные в критериях одинаковые?
абсолютно идентичный запрос..
Старый 22.03.2006, 09:48   #9  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Абсолютно идентичный запрос в аксапте или в профайлере?? Если в профайлере - может наполнение таблиц данными меняется?
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 22.03.2006, 11:50   #10  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Цитата:
Сообщение от Recoilme
Абсолютно идентичный запрос в аксапте или в профайлере?? Если в профайлере - может наполнение таблиц данными меняется?
в Аксапте ..

текст запроса примерно следующий...

select count(RecId) from
myTable
where myTable.PeriodStart >= 13\03\2006
&& myTable.PeriodEnd <= 20\03\2006
&& myTable.InventDimId == 'АН0000031'
&& myTable.ItemId == '0140101020'
&& myTable.AverageSale > 0;
Старый 22.03.2006, 13:33   #11  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
в профайлере запросы возможно разные
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 22.03.2006, 13:42   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Есть "правило 5%" по которому используется Full Table Scan если селективность индекса по данному значению больше 5%.

Может быть данные в запросе разные?
Старый 22.03.2006, 14:35   #13  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Цитата:
Сообщение от belugin
Есть "правило 5%" по которому используется Full Table Scan если селективность индекса по данному значению больше 5%.

Может быть данные в запросе разные?
данные... нет, одни и те же выбираются...

Про селективность, что вы имеете ввиду?
Старый 22.03.2006, 15:13   #14  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Селективность = 1/(Keys - TotalDup), где
Keys: Число ключей в индексе. Обычно равно Records в таблице
TotalDup: Всего повторений ключей. Чем ближе это число к Keys, тем менее эффективен данный индекс при поиске, особенно когда оптимизатор использует несколько индексов.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 23.03.2006, 11:11   #15  
Bars is offline
Bars
Участник
Аватар для Bars
 
312 / 14 (1) ++
Регистрация: 04.03.2005
Адрес: Москва
Цитата:
Сообщение от Recoilme
Селективность = 1/(Keys - TotalDup), где
Keys: Число ключей в индексе. Обычно равно Records в таблице
TotalDup: Всего повторений ключей. Чем ближе это число к Keys, тем менее эффективен данный индекс при поиске, особенно когда оптимизатор использует несколько индексов.
спасибо за объяснение
Старый 23.03.2006, 14:41   #16  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Bars
в Аксапте ..

текст запроса примерно следующий...

select count(RecId) from
myTable
where myTable.PeriodStart >= 13\03\2006
&& myTable.PeriodEnd <= 20\03\2006
&& myTable.InventDimId == 'АН0000031'
&& myTable.ItemId == '0140101020'
&& myTable.AverageSale > 0;
Уже интереснее ...
А поля в индексе в каком порядке идут? Если в том-же, в котором критерии указаны в запросе, то оптимизатор скорее всего предпочтет сканирование. Все поля, по которым идет выборка не по == надо сдвигать в хвост индекса
Старый 23.03.2006, 14:57   #17  
savel is offline
savel
Участник
 
74 / 13 (1) ++
Регистрация: 26.02.2004
Адрес: Санкт-Петербург
Цитата:
Сообщение от db
...оптимизатор скорее всего предпочтет сканирование
тогда почему в 2х уровневой у человека сканирование не происходит?
Старый 23.03.2006, 15:13   #18  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от Bars
спасибо за объяснение

Попробуя сформулировать своими словами:
есть таблица 1
есть поле1, число, все значения в поле =1 - такой индекс будет бесполезен вообще
есть поле2, логика, тут индекс тоже будет бесполезен, т.к. обладает низкой слективностью, он делит таблицу примерно на 2 части, мало "селективит" и оптимизатор его проигнорирует
есть поле3, например дата - если большинство дат в таблице разные - индекс будет хорошим, потому что из миллиона записей он позволит отобрать 100 при условии по определенной дате

С составными индексами - сложнее - там сам плохо понимаю

Примерно так. СУБД считает селективность, примерно по той формуле что я привел, как точно считает оракл надо глядеть в доках. Там может быть ещё ряд условий, например макс кол дубликатов в индексе и т.п. На основании селективности оптимизатор решает свалиться в скан или юзать индекс. Процесс рассчета селективности называется сбор статистики, собрать её db ещё давно советовал.

Бывают ещё всякие причины не юзанья индекса. Например в версионных базах данных КАУНТ не использует индекс постольку-поскольку там идеология другая. Считаются "живые" версии записей, о кот. нет инфы в индексе, поэтому там фуллскан всегда и каунт тормозней чем в блокировочниках. Но т.к. оракл наполовину блокировочник, наполовину версионник как там работает каунт - сложно сказать. Есть ещё всякие фьючерс чтоб обмануть оптимизатор и заставить его НЕ пользовать индекс, например where a = b, заменяют на a+0=b

Бывает наоборот когда приложение посылает оптимизатору хинты заставляющие его использовать индекс даже если он неоптимален. Об этом я писал тут вначале.

Уфф устал. Вобщем гораздо толковей и лучше всё это написано тут: www.sql.ru, www.ibase.ru
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 23.03.2006, 15:15   #19  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от savel
тогда почему в 2х уровневой у человека сканирование не происходит?
человек до сих пор так и не рассказал что там у него происходит ни про данные, ни про настройки, ни про конфиг, ни про версии аксапты, ни про версии оракла.

инфу в студию. а то еще окажется в итоге, что базы разные - одна на ноуте, вторая на серваке (шутка)
Старый 23.03.2006, 15:31   #20  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Ага, мне тоже надоело. Другой бы уже давно вывалил и скрипт таблицы и запросы из профайлера. Такое ощущение что это "развод на поболтать"
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Установка Dynamics 4.0 под Oracle Paul_ST DAX: Администрирование 6 20.04.2007 16:36
aEremenko: История об установке Microsoft Dynamics Ax 4.0 и Oracle 10G Blog bot DAX Blogs 0 28.10.2006 16:01
Ускорение выполнения запроса Oracle + MS Axapta Горбунов Дмитрий DAX: Программирование 17 15.11.2005 18:13
Знатокам Oracle listener DAX: Администрирование 1 23.01.2004 10:53
Не отрабатывают индексы в Oracle Garic DAX: Администрирование 3 14.01.2004 15:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:12.