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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2007, 11:26   #1  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
Использование индекса ClosedItemDimIdx
На табличке InventSum есть индекс ClosedItemDimIdx в который входят 2 поля Closed и ItemId. Поскольку поле Closed имеет всего 2 значения, то индекс не эффективный
по планам выполнения эффективнее использовать кластерный индекс ItemDimIdx, а индекс ClosedItemDimIdx вообще грохнуть.. Есть ли у кого какие комментарии по этому поводу..?
За это сообщение автора поблагодарили: mazzy (5).
Старый 19.03.2007, 11:40   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
В принципе, от характера запроса зависит (ну, и от набора данных, конечно). Скажем, если у вас постоянно добавляется номенклатура (например, позаказное конфигурируемое производство), а в запросе нужно получить остатки в наличии, то при накоплении определенного критического количества записей в InventSum индекс ClosedItemDimIdx будет более эффективен, чем ItemDimIdx. С другой стороны, можно InventSum просто периодически чистить, избавляясь от лишних записей, и тогда ClosedItemDimIdx действительно не нужен.

А чем он Вам мешает? Пусть живет. Грохать его не стоит хотя бы потому, что значительная часть кода перестанет компилироваться (он много где в качестве index hint указан). Хотя, можно его просто отключить, не удаляя. И тем не менее, а чем он все-таки мешает?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 19.03.2007, 11:47   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
>>> Поскольку поле Closed имеет всего 2 значения, то индекс не эффективный

Мне кажется, это зависит от количества значений. Например, в Оракле действовало правило 5% - если индекс отбирает 5% записей, то он эффективен. Возможно, если у вас 95% закрыто а 5% открыто то для поиска жтих 5% индекс эффективен.
Старый 19.03.2007, 12:05   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от sergeypp Посмотреть сообщение
Поскольку поле Closed имеет всего 2 значения, то индекс не эффективный
Зависит от числа записей с каждым значением.

Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
С другой стороны, можно InventSum просто периодически чистить
Это перебор, по-моему.

Цитата:
Сообщение от belugin Посмотреть сообщение
Мне кажется, это зависит от количества значений. Например, в Оракле действовало правило 5% - если индекс отбирает 5% записей, то он эффективен. Возможно, если у вас 95% закрыто а 5% открыто то для поиска жтих 5% индекс эффективен.
Именно так.
Этот индекс должен будет эффективно работать через некоторое достаточно продолжительное время.

Не факт, что этот индекс нужно оставлять сейчас.
Но в будущем вы к нему вернетесь скорее всего.
Сейчас этот индекс можно просто отключить свойствами, если есть такое желание и оно обосновано собранной статистикой.
__________________
полезное на axForum, github, vk, coub.
Старый 19.03.2007, 12:13   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Да, удалять, наверное, не стоит. Тем более, учитывая то, что проверка целостности все равно недостающие записи будет упорно восстанавливать.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 19.03.2007, 15:14   #6  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
пишу след запрос
X++:
select Closed, count(*) from inventsum
group by Closed
вот результат
Closed
----------- -----------
0 396231
1 923596
просто при использовании некластерного индекса в планах появляется еще и Bookmark Lookup
вот два плана. .с использованием индекса и нет

X++:
1           1             |--Compute Scalar(DEFINE:([Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017]))                                                                                                                     46          2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017])                                                        [Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017]  1.0                      0.0                      1.6147925E-6             41          9.701564E-3              [Expr1002], [Expr1003]                                 NULL     PLAN_ROW                       0        1.0
1           1                  |--Stream Aggregate(DEFINE:([Expr1015]=Count(*), [Expr1016]=SUM([A].[POSTEDQTY]), [Expr1017]=SUM([A].[POSTEDVALUE])))                                                                                                                                     46          3           2           Stream Aggregate               Aggregate                      NULL                                                                                                                                                                           [Expr1015]=Count(*), [Expr1016]=SUM([A].[POSTEDQTY]), [Expr1017]=SUM([A].[POSTEDVALUE])                         1.0                      0.0                      1.6147925E-6             41          9.701564E-3              [Expr1015], [Expr1016], [Expr1017]                     NULL     PLAN_ROW                       0        1.0
22          1                       |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[INVENTDIMID]) WITH PREFETCH)                                                                                                                                                                      46          4           3           Nested Loops                   Inner Join                     OUTER REFERENCES:([A].[INVENTDIMID]) WITH PREFETCH                                                                                                                             NULL                                                                                                            16.147924                0.0                      6.7498324E-5             337         9.6999491E-3             [A].[POSTEDQTY], [A].[POSTEDVALUE]                     NULL     PLAN_ROW                       0        1.0
22          1                            |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([domoNew].[dbo].[INVENTSUM] AS [A]))                                                                                                                                                           46          6           4           Bookmark Lookup                Bookmark Lookup                BOOKMARK:([Bmk1000]), OBJECT:([domoNew].[dbo].[INVENTSUM] AS [A])                                                                                                              [A].[INVENTDIMID], [A].[POSTEDQTY], [A].[POSTEDVALUE]                                                           16.147924                7.8122527E-4             1.7762717E-5             234         4.098813E-3              [A].[INVENTDIMID], [A].[POSTEDQTY], [A].[POSTEDVALUE]  NULL     PLAN_ROW                       0        1.0
22          1                            |    |--Index Seek(OBJECT:([domoNew].[dbo].[INVENTSUM].[I_174CLOSEDITEMDIMIDX] AS [A]), SEEK:([A].[DATAAREAID]='dat' AND [A].[CLOSED]=0 AND [A].[ITEMID]='0000005') ORDERED FORWARD)                                                            46          8           6           Index Seek                     Index Seek                     OBJECT:([domoNew].[dbo].[INVENTSUM].[I_174CLOSEDITEMDIMIDX] AS [A]), SEEK:([A].[DATAAREAID]='dat' AND [A].[CLOSED]=0 AND [A].[ITEMID]='0000005') ORDERED FORWARD, FORCEDINDEX  [Bmk1000]                                                                                                       16.147924                3.2034011E-3             9.6424199E-5             78          3.2998251E-3             [Bmk1000]                                              NULL     PLAN_ROW                       0        1.0
22          22                           |--Clustered Index Seek(OBJECT:([domoNew].[dbo].[INVENTDIM].[I_698DIMIDIDX] AS [B]), SEEK:([B].[DATAAREAID]='dat' AND [B].[INVENTDIMID]=[A].[INVENTDIMID]) ORDERED FORWARD)                                                                     46          9           4           Clustered Index Seek           Clustered Index Seek           OBJECT:([domoNew].[dbo].[INVENTDIM].[I_698DIMIDIDX] AS [B]), SEEK:([B].[DATAAREAID]='dat' AND [B].[INVENTDIMID]=[A].[INVENTDIMID]) ORDERED FORWARD, FORCEDINDEX                NULL                                                                                                            1.0                      3.2034011E-3             7.9607002E-5             111         5.5336375E-3             NULL                                                   NULL     PLAN_ROW                       0        16.147924

1           1             |--Compute Scalar(DEFINE:([Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017]))                                                                                                                     49          2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017])                                                        [Expr1002]=If ([Expr1015]=0) then NULL else [Expr1016], [Expr1003]=If ([Expr1015]=0) then NULL else [Expr1017]  1.0                      0.0                      1.6147925E-6             41          1.1219452E-2             [Expr1002], [Expr1003]                                               NULL     PLAN_ROW         0        1.0
1           1                  |--Stream Aggregate(DEFINE:([Expr1015]=Count(*), [Expr1016]=SUM([A].[POSTEDQTY]), [Expr1017]=SUM([A].[POSTEDVALUE])))                                                                                                                                     49          3           2           Stream Aggregate               Aggregate                      NULL                                                                                                                                                                           [Expr1015]=Count(*), [Expr1016]=SUM([A].[POSTEDQTY]), [Expr1017]=SUM([A].[POSTEDVALUE])                         1.0                      0.0                      1.6147925E-6             41          1.1219452E-2             [Expr1015], [Expr1016], [Expr1017]                                   NULL     PLAN_ROW         0        1.0
22          1                       |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[INVENTDIMID]) WITH PREFETCH)                                                                                                                                                                      49          4           3           Nested Loops                   Inner Join                     OUTER REFERENCES:([A].[INVENTDIMID]) WITH PREFETCH                                                                                                                             NULL                                                                                                            16.147924                0.0                      6.7498324E-5             337         1.1217837E-2             [A].[POSTEDQTY], [A].[POSTEDVALUE]                                   NULL     PLAN_ROW         0        1.0
22          1                            |--Clustered Index Seek(OBJECT:([domoNew].[dbo].[INVENTSUM].[I_174ITEMDIMIDX] AS [A]), SEEK:([A].[DATAAREAID]='dat' AND [A].[ITEMID]='0000005'),  WHERE:([A].[CLOSED]=0) ORDERED FORWARD)                                                       49          6           4           Clustered Index Seek           Clustered Index Seek           OBJECT:([domoNew].[dbo].[INVENTSUM].[I_174ITEMDIMIDX] AS [A]), SEEK:([A].[DATAAREAID]='dat' AND [A].[ITEMID]='0000005'),  WHERE:([A].[CLOSED]=0) ORDERED FORWARD, FORCEDINDEX  [A].[INVENTDIMID], [A].[CLOSED], [A].[POSTEDQTY], [A].[POSTEDVALUE]                                             16.147924                2.7128116E-3             7.8514153E-5             234         5.5826516E-3             [A].[INVENTDIMID], [A].[CLOSED], [A].[POSTEDQTY], [A].[POSTEDVALUE]  NULL     PLAN_ROW         0        1.0
22          22                           |--Clustered Index Seek(OBJECT:([domoNew].[dbo].[INVENTDIM].[I_698DIMIDIDX] AS [B]), SEEK:([B].[DATAAREAID]='dat' AND [B].[INVENTDIMID]=[A].[INVENTDIMID]) ORDERED FORWARD)                                                                     49          7           4           Clustered Index Seek           Clustered Index Seek           OBJECT:([domoNew].[dbo].[INVENTDIM].[I_698DIMIDIDX] AS [B]), SEEK:([B].[DATAAREAID]='dat' AND [B].[INVENTDIMID]=[A].[INVENTDIMID]) ORDERED FORWARD, FORCEDINDEX                NULL                                                                                                            1.0                      3.2034011E-3             7.9607002E-5             111         5.5336375E-3             NULL                                                                 NULL     PLAN_ROW         0        16.147924
Старый 19.03.2007, 15:17   #7  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
а если индекс закрыть конфигурационным ключем, то там где он используется в хинтах - будет игнорироваться?
Старый 19.03.2007, 15:19   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Будет.

Но зачем плодить конфигурационные ключи? Изменение свойства Enabled = No даст точно такой же эффект.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 19.03.2007, 15:49   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Но зачем плодить конфигурационные ключи?
Я согласен, что можно и свойством.
Но конфигурационные ключи позволят собрать в одно место отключаемую функциональность.

В дальнейшем можно будет провести эксперимент с включенными/выключенными индексами из одного места - настройка конфигурационных ключей.

Согласен, что это вопрос скорее эстетический.
Технически никакой разницы.
__________________
полезное на axForum, github, vk, coub.
Старый 19.03.2007, 16:18   #10  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
в продолжении этой темы след вопрос
имеем запрос
X++:
            while select itemId from inventSum
                // + spp DOMO 06.03.07 sppSet_001_Optimization_Inventsum
                //index hint closedItemDimIdx
                // - spp DOMO 06.03.07 sppSet_001_Optimization_Inventsum
                group by ItemId
                where inventSum.Closed              == noYes::No &&
                      inventSum.physicalInvent      != 0
Однако не смотря на закоментированный хинт аксапта генерит след запрос
X++:
SELECT A.ITEMID FROM INVENTSUM A(INDEX(I_174CLOSEDITEMDIMIDX))  WHERE ((DATAAREAID=?) AND ((CLOSED=?) AND (PHYSICALINVENT<>?))) GROUP BY A.ITEMID ORDER BY A.ITEMID OPTION(FAST 20)
Зачем ядро подставляет хинт по индексу?
Старый 19.03.2007, 16:23   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Кернел роллап не используете часом?
__________________
Axapta v.3.0 sp5 kr2
Старый 19.03.2007, 16:33   #12  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
Рос верси
Solution-Axapta 3.0 CIS SP3 Build #9.2
Retail 3.030.503.000

Сист версия
Solution-Axapta 3.0 Build #1951.3730/514-193 sp3/OP023-71

нету (
Старый 19.03.2007, 16:49   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от sergeypp Посмотреть сообщение
в продолжении этой темы след вопрос
имеем запрос
В каком слое? Есть ли нижние слои?
Например, если данный запрос в CUS, а ниже в USR есть старый код, то будет выполняться код из USR.

Цитата:
Сообщение от sergeypp Посмотреть сообщение
Зачем ядро подставляет хинт по индексу?
Если не слои, то AOS "знает" об изменениях? все AOSы знают об изменениях?
Как правил код через двухвенку, то AOS должен узнать об изменениях чуть позже.
__________________
полезное на axForum, github, vk, coub.
Старый 19.03.2007, 16:55   #14  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
слои ни при чем.. я сделал новый джоб, где состряпал зарос, включил мониторинг запросов в инфолог, оттуда запрос и взял
конфигурация 3-х уровневая, но это тоже не имеет значение в данном случае
Старый 19.03.2007, 16:58   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
тогда не знаю.

знаю одно - барабашки нет.
надо разбираться.
__________________
полезное на axForum, github, vk, coub.
Старый 19.03.2007, 17:14   #16  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
Так и не понял в чем дело.. выяснил только одно при подстановки хинта по кластерному индексу работает правильно.. если убрать хинт, то вставляется хинт по индексу closedItemDimIdx. Если исключить поле поле Closed из запроса хинт не подставляется.. Видимо есть еще какой то внутренний оптимизатор, который начинает работать если не указан хинт.. только зачем - так и не понял, гораздо проще отдать запрос на растерзание скулю..
Кстати запрос с использованием кластерного индека отрабатывается за 4 сек, а с использованием индекса closedItemDimIdx за 14 секунд.. Если индекс и начнет когда либо работать лучше кластерного, то это случится не скоро.. Принимаю решение об его выключении (по лиц ключу, ключик уже есть и выключен)
За это сообщение автора поблагодарили: mazzy (5).
Старый 20.03.2007, 09:37   #17  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
По поводу автоматического подставления индекса у mazzy
Цитата:
HINT_INDEX (1) – если параметр включен, будут работать операторы INDEX HINT из X ++ кода. Кроме того, при использовании FORCELITERALS имеет побочное действие – при использовании SELECT по одной таблице с условиями в части WHERE по индексированному полю использование этого индекса будет указано в запросе автоматически;
sergeypp, Вы уверены, что ВСЕГДА ItemDimIdx лучше чем ClosedItemIdx и что ВСЕГДА так будет... или после Вас, через полгодика, кто-то опять полезет в базу в поисках "волшебного индекса"?
Старый 20.03.2007, 10:56   #18  
sergeypp is offline
sergeypp
Ищу людей. Дорого.
Аватар для sergeypp
 
433 / 174 (6) ++++++
Регистрация: 08.11.2003
Адрес: Казань
2 Warm
Сегодня еще раз пробежался по коду
Если условие идет только по двум полям ItemId и Closed - вставлял хинт по индексу ClosedItemIdx, если в условие добавлялось еще одно поле, то хинт выключал или смотрел какой индекс подходит лучше и в хинте использовал его. Выключать индекс все таки не стал. Так будет правильнее..
А по поводу FORCELITERALS.. У меня на тестовом аосе действительно включено Direct execution.. Видимо поэтому
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как формируется в Axapta название табличного индекса для СУБД? dn DAX: База знаний и проекты 4 09.10.2007 16:21
Волшебное превращение неуникального индекса... IPv6 DAX: База знаний и проекты 4 10.01.2007 16:46
Блокировка ключа индекса Sequel DAX: Программирование 4 06.07.2006 16:08
Использование индекса по RecId не разрешено! 3oppo DAX: Программирование 1 25.07.2005 14:54
Отображение связных таблиц. Сплиттер. Автоувеличение индекса. Delete Action. sguryev DAX: База знаний и проекты 0 14.12.2001 06:15

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

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

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