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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.08.2010, 14:10   #1  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Вопрос о значимости порядка поле в индексной ноде.
Вопрос звучит следующим образом:
Играет ли роль порядок полей в индексной ноде таблицы или только их набор?

Решил уточнить, так как есть тень сомнения по этому поводу, хотя логика подсказывает, что только набор.

Косвенные доказательства в пользу этого утверждения:
1. После создания и заполнения индексной ноды поменять порядок полей невозможно(хотя добавить новые - запросто). Обычно, такая политика аксапты(не давать что-то изменить, например подкорректировать названия поля, сменив первую букву на заглавную) дает понять, что эти действия незначимы\не приведут к реальным изменениям.
2. В стандарте(4ка) есть очень мало таблиц(до 5ти, по-моему) у которых есть индексы с тем же набором полей, но в разном порядке, причем использование их под сомнением(скорее всего при миграции с 3ки).

Тем не менне, хотелось бы услышать ваши мнения.
__________________
Axapta has seduced me deadly!
Старый 30.08.2010, 14:16   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да, база данных будет использовать или не использовать индекс в зависимости от порядка полей в нем. Про это можно почитать в любой книге про базы данных.
Аксапта просто создает индекс на таблице в БД, поэтому к ней утверждение выше также относится.
Старый 30.08.2010, 14:27   #3  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Цитата:
Аксапта просто создает индекс на таблице в БД
Вот это собственно и ответ. Спасибо.
__________________
Axapta has seduced me deadly!
Старый 30.08.2010, 14:29   #4  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Однозначно играет! Чем выше поле которое разбивает таблицу на более крупные сегменты, тем быстрее поиск. Даты вроде рекомендуют ставить ниже, они тормозные.

Цитата:
После создания и заполнения индексной ноды поменять порядок полей невозможно
Причем поменять порядок можно легко... нет ничего невозможного... встаем на поле... удерживая Alt жмем стрелку вниз (вверх)... поле встает ниже (выше)...
Старый 30.08.2010, 14:39   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
одно меленькое замечание. не надо забывать ещё и про встроенный оптимизатор БД. иногда вроде по всем параметрам индекс подходит под ваш запрос (и по составу, и по порядку), но запрос все равно тормозит. А происходит это потому, что оптимизатор посчитал лучшем (на основе своей статистики) взять другой, менее селективный индекс. Лечится соответственно обновлением статистики.

P.S. я имел опыт такого поведения в ORACLE.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.08.2010, 14:51   #6  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
...в таком случае индекс назначается дерективой index
или фривольно index hint
Старый 30.08.2010, 14:56   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от ansoft Посмотреть сообщение
...в таком случае индекс назначается дерективой index
или фривольно index hint
Не совсем.
index просто отсортирует выборку в соответствии с полями, указанными в индексе
index hint порекомендует оптимизатору использовать именно указанный индекс
Старый 30.08.2010, 14:58   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ansoft Посмотреть сообщение
...в таком случае индекс назначается дерективой index
или фривольно index hint
так же в БД могут быть отключены хинты, т.е. что базе не посылай, она будет все равно пользоваться своим оптимизатором, игнорируя все указания из вне.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.08.2010, 15:02   #9  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
...во как... не знал.
Спасибо за интересную информацию, только непонятно почему сортировка будет выполнена по индексу и при этом сам индекс возможно не будет использован... странно... кроме того при использовании директивы index аксапта ругается (exception) если такого индекса нет...
Старый 30.08.2010, 15:04   #10  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Согласен.
Старый 30.08.2010, 15:04   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от ansoft Посмотреть сообщение
...в таком случае индекс назначается дерективой index
или фривольно index hint
кстати, про index и index hint уже обсуждалось вот здесь
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.08.2010, 15:18   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ansoft Посмотреть сообщение
...во как... не знал.
Спасибо за интересную информацию, только непонятно почему сортировка будет выполнена по индексу и при этом сам индекс возможно не будет использован... странно... кроме того при использовании директивы index аксапта ругается (exception) если такого индекса нет...
Сортировка будет выполнена не по индексу. Просто при конструировании запроса, посылаемого на сервер в директиве ORDER BY будут перчислены те поля, которые указаны в узле соответствующего индекса в Axapta.

К оптимизации запроса это не имеет никакого отношения. Это просто способ сокращенного написания ORDER BY. Соответственно, будет ругань, если такого индекса нет. Написали ключевое слово ORDER BY, а списка полей - нет.

А вот "index hint" - это как раз оптимизация. Точнее, рекомендация серверу по принципу "не будет ли любезен, многоуважаемый джин..." . Разумеется, "джин" может и отказаться.

Впрочему, "ручной тюнинг" (оптимизация) запросов при помощи хинтов, как правило, выходит "себе дороже". Лучше не использовать.
Старый 31.08.2010, 11:38   #13  
Skvorcal is offline
Skvorcal
Участник
 
36 / 10 (1) +
Регистрация: 16.08.2010
А как лучше поступить в следующей ситуации...

Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям.
При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно.

В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям?

Последний раз редактировалось Skvorcal; 31.08.2010 в 11:41.
Старый 31.08.2010, 11:53   #14  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Skvorcal Посмотреть сообщение
А как лучше поступить в следующей ситуации...

Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям.
При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно.

В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям?
Создайте два индекса:
Индекс1
Поле1
Поле2

Индекс2
Поле2
Поле1
Старый 31.08.2010, 12:31   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Для того, что бы ответить на этот вопрос надо знать как распределены значения в ваших полях (или оценить заполнение таблицы в будущем). Не забывайте также, что в Аксапте в индексы неявно добавляется поле DataAreaId, если компании не отключены в таблице

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

Чем менее уникальны значения в полях, тем больше вероятность того, что оптимизатор предпочтет прямое сканирование таблицы
__________________
Axapta v.3.0 sp5 kr2
Старый 31.08.2010, 13:00   #16  
Skvorcal is offline
Skvorcal
Участник
 
36 / 10 (1) +
Регистрация: 16.08.2010
Цитата:
Сообщение от AndyD Посмотреть сообщение
Для того, что бы ответить на этот вопрос надо знать как распределены значения в ваших полях (или оценить заполнение таблицы в будущем). Не забывайте также, что в Аксапте в индексы неявно добавляется поле DataAreaId, если компании не отключены в таблице

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

Чем менее уникальны значения в полях, тем больше вероятность того, что оптимизатор предпочтет прямое сканирование таблицы
А Вы не могли бы дать общие рекомендации, когда стоит делать два отдельных индекса по каждому полю, а когда стоит сделать один индекс сразу по двум полям?

У нас сейчас общее количество строк около 300 тыс, ежемесячный прирост около 15 тыс. Таблица по структуре чем-то напоминает PurchLine или SalesLine. Два поля - это идентификатор операции и идентификатор сущности, участвующей в операции (аналог PurchId и ItemId). Комбинация PurchId и ItemId уникальна. С одной стороны при открытии журнала операции система всегда делает выборку строк по идентификатору операции, с другой - пользователи регулярно строят отчеты по коду сущности и анализируют операции.
Старый 31.08.2010, 13:25   #17  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Skvorcal Посмотреть сообщение
У нас сейчас общее количество строк около 300 тыс, ежемесячный прирост около 15 тыс. Таблица по структуре чем-то напоминает PurchLine или SalesLine. Два поля - это идентификатор операции и идентификатор сущности, участвующей в операции (аналог PurchId и ItemId). Комбинация PurchId и ItemId уникальна. С одной стороны при открытии журнала операции система всегда делает выборку строк по идентификатору операции, с другой - пользователи регулярно строят отчеты по коду сущности и анализируют операции.
1. Для отображения на форме Вам нужен такой индекс.
SalesId
ItemId

При отображении данных на форме он подходит идеально. Сначала идет ограничение записей по SalesId, потом можно сортировать данные в форме по ItemId.

2. Если я правильно понял, то отчет будет что-то типа обороты по номенклатуре, с возможностью детализации оборотов по операциям. Посмотрите в сторону OLAP, задача ложится туда идеально и не надо никаких дополнительных индексов на эту таблицу, тем более что в нее происходит много вставок. Если же Вы все-таки решитесь строить такой отчет на OLTP данных AX, то здесь для ускорения работы отчета нужен индекс:
ItemId - для первой группировки по номенклатуры
SalesId - для второй группировки по операциям.

P.S. И вообще, конечно, отчеты лучше строить по проводкам.
Старый 31.08.2010, 13:37   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Skvorcal Посмотреть сообщение
А как лучше поступить в следующей ситуации...

Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям.
При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно.

В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям?
Если у вас MS SQL...
и если в нем включено автосоздание индексов...
то ничего не делайте.

подождите немножко, а потом посмотрите что MS SQL насоздавал.
потом примете решение.
__________________
полезное на axForum, github, vk, coub.
Старый 31.08.2010, 14:43   #19  
Skvorcal is offline
Skvorcal
Участник
 
36 / 10 (1) +
Регистрация: 16.08.2010
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Если я правильно понял, то отчет будет что-то типа обороты по номенклатуре, с возможностью детализации оборотов по операциям.
Что-то типа того...

Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Посмотрите в сторону OLAP, задача ложится туда идеально и не надо никаких дополнительных индексов на эту таблицу, тем более что в нее происходит много вставок.
OLAP не подходит по двум причинам:
1. Слишком дорого и муторно разворачивать OLAP ради одного-двух отчетов.
2. Отчет является оперативным. Его формируют по нескольку раз в день и отслеживают тем самым исполнение операций. Плюс некоторое планирование...

Цитата:
Сообщение от _scorp_ Посмотреть сообщение
P.S. И вообще, конечно, отчеты лучше строить по проводкам.
Отчеты лучше строить по тем таблицам, в которых содержиться максимум требуемой информации и обеспечивается максимальная скорость построения и достоверность данных. А проводки с трехэтажными джоинами или хитрыми комбинациями аналитик - это имхо на любителя...

Цитата:
Сообщение от mazzy Посмотреть сообщение
Если у вас MS SQL...
и если в нем включено автосоздание индексов...
то ничего не делайте.

подождите немножко, а потом посмотрите что MS SQL насоздавал.
потом примете решение.
А разве при очередном обновлении приложения (обновляем слоем, а не проектами) и последующей синхронизации словаря Аксапта не удалит все неаксаптовые индексы?
Старый 31.08.2010, 15:30   #20  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Цитата:
Сообщение от Skvorcal Посмотреть сообщение
...
А разве при очередном обновлении приложения (обновляем слоем, а не проектами) и последующей синхронизации словаря Аксапта не удалит все неаксаптовые индексы?
Может имелось ввиду:
http://msmvps.com/blogs/gladchenko/a...3/1311293.aspx

тогда можно на основе рекомендаций сделать индексы в АОТе.

Или есть еще какой-нибудь другой механизм?
Теги
индекс, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопрос по резервированию Spiker DAX: Программирование 9 28.01.2010 09:19
Поле mandatory, а 0 вставить нужно Smith DAX: Программирование 5 15.06.2007 12:04
вычисляемое поле ZhanR DAX: Программирование 8 28.09.2006 10:25
Где взять материалы и еще один конкретный вопрос Andronov DAX: Программирование 6 19.02.2003 10:48

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

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

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