30.08.2010, 14:10 | #1 |
Участник
|
Вопрос о значимости порядка поле в индексной ноде.
Вопрос звучит следующим образом:
Играет ли роль порядок полей в индексной ноде таблицы или только их набор? Решил уточнить, так как есть тень сомнения по этому поводу, хотя логика подсказывает, что только набор. Косвенные доказательства в пользу этого утверждения: 1. После создания и заполнения индексной ноды поменять порядок полей невозможно(хотя добавить новые - запросто). Обычно, такая политика аксапты(не давать что-то изменить, например подкорректировать названия поля, сменив первую букву на заглавную) дает понять, что эти действия незначимы\не приведут к реальным изменениям. 2. В стандарте(4ка) есть очень мало таблиц(до 5ти, по-моему) у которых есть индексы с тем же набором полей, но в разном порядке, причем использование их под сомнением(скорее всего при миграции с 3ки). Тем не менне, хотелось бы услышать ваши мнения.
__________________
Axapta has seduced me deadly! |
|
30.08.2010, 14:16 | #2 |
Участник
|
Да, база данных будет использовать или не использовать индекс в зависимости от порядка полей в нем. Про это можно почитать в любой книге про базы данных.
Аксапта просто создает индекс на таблице в БД, поэтому к ней утверждение выше также относится. |
|
30.08.2010, 14:27 | #3 |
Участник
|
Цитата:
Аксапта просто создает индекс на таблице в БД
__________________
Axapta has seduced me deadly! |
|
30.08.2010, 14:29 | #4 |
Участник
|
Однозначно играет! Чем выше поле которое разбивает таблицу на более крупные сегменты, тем быстрее поиск. Даты вроде рекомендуют ставить ниже, они тормозные.
Цитата:
После создания и заполнения индексной ноды поменять порядок полей невозможно
|
|
30.08.2010, 14:39 | #5 |
Ищущий знания...
|
одно меленькое замечание. не надо забывать ещё и про встроенный оптимизатор БД. иногда вроде по всем параметрам индекс подходит под ваш запрос (и по составу, и по порядку), но запрос все равно тормозит. А происходит это потому, что оптимизатор посчитал лучшем (на основе своей статистики) взять другой, менее селективный индекс. Лечится соответственно обновлением статистики.
P.S. я имел опыт такого поведения в ORACLE.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.08.2010, 14:51 | #6 |
Участник
|
...в таком случае индекс назначается дерективой index
или фривольно index hint |
|
30.08.2010, 14:56 | #7 |
Участник
|
Цитата:
index просто отсортирует выборку в соответствии с полями, указанными в индексе index hint порекомендует оптимизатору использовать именно указанный индекс |
|
30.08.2010, 14:58 | #8 |
Ищущий знания...
|
так же в БД могут быть отключены хинты, т.е. что базе не посылай, она будет все равно пользоваться своим оптимизатором, игнорируя все указания из вне.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.08.2010, 15:02 | #9 |
Участник
|
...во как... не знал.
Спасибо за интересную информацию, только непонятно почему сортировка будет выполнена по индексу и при этом сам индекс возможно не будет использован... странно... кроме того при использовании директивы index аксапта ругается (exception) если такого индекса нет... |
|
30.08.2010, 15:04 | #10 |
Участник
|
Согласен.
|
|
30.08.2010, 15:04 | #11 |
Ищущий знания...
|
Цитата:
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.08.2010, 15:18 | #12 |
Участник
|
Цитата:
Сообщение от ansoft
...во как... не знал.
Спасибо за интересную информацию, только непонятно почему сортировка будет выполнена по индексу и при этом сам индекс возможно не будет использован... странно... кроме того при использовании директивы index аксапта ругается (exception) если такого индекса нет... К оптимизации запроса это не имеет никакого отношения. Это просто способ сокращенного написания ORDER BY. Соответственно, будет ругань, если такого индекса нет. Написали ключевое слово ORDER BY, а списка полей - нет. А вот "index hint" - это как раз оптимизация. Точнее, рекомендация серверу по принципу "не будет ли любезен, многоуважаемый джин..." . Разумеется, "джин" может и отказаться. Впрочему, "ручной тюнинг" (оптимизация) запросов при помощи хинтов, как правило, выходит "себе дороже". Лучше не использовать. |
|
31.08.2010, 11:38 | #13 |
Участник
|
А как лучше поступить в следующей ситуации...
Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям. При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно. В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям? Последний раз редактировалось Skvorcal; 31.08.2010 в 11:41. |
|
31.08.2010, 11:53 | #14 |
Участник
|
Цитата:
Сообщение от Skvorcal
А как лучше поступить в следующей ситуации...
Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям. При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно. В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям? Индекс1 Поле1 Поле2 Индекс2 Поле2 Поле1 |
|
31.08.2010, 12:31 | #15 |
Участник
|
Для того, что бы ответить на этот вопрос надо знать как распределены значения в ваших полях (или оценить заполнение таблицы в будущем). Не забывайте также, что в Аксапте в индексы неявно добавляется поле DataAreaId, если компании не отключены в таблице
Т.е., по крайней мере, общее количество строк в таблице, количество уникальных значений в полях, по которым выполняется выборка, а так же количество уникальных пар значений в этих полях. Чем менее уникальны значения в полях, тем больше вероятность того, что оптимизатор предпочтет прямое сканирование таблицы
__________________
Axapta v.3.0 sp5 kr2 |
|
31.08.2010, 13:00 | #16 |
Участник
|
Цитата:
Сообщение от AndyD
Для того, что бы ответить на этот вопрос надо знать как распределены значения в ваших полях (или оценить заполнение таблицы в будущем). Не забывайте также, что в Аксапте в индексы неявно добавляется поле DataAreaId, если компании не отключены в таблице
Т.е., по крайней мере, общее количество строк в таблице, количество уникальных значений в полях, по которым выполняется выборка, а так же количество уникальных пар значений в этих полях. Чем менее уникальны значения в полях, тем больше вероятность того, что оптимизатор предпочтет прямое сканирование таблицы У нас сейчас общее количество строк около 300 тыс, ежемесячный прирост около 15 тыс. Таблица по структуре чем-то напоминает PurchLine или SalesLine. Два поля - это идентификатор операции и идентификатор сущности, участвующей в операции (аналог PurchId и ItemId). Комбинация PurchId и ItemId уникальна. С одной стороны при открытии журнала операции система всегда делает выборку строк по идентификатору операции, с другой - пользователи регулярно строят отчеты по коду сущности и анализируют операции. |
|
31.08.2010, 13:25 | #17 |
Участник
|
Цитата:
Сообщение от Skvorcal
У нас сейчас общее количество строк около 300 тыс, ежемесячный прирост около 15 тыс. Таблица по структуре чем-то напоминает PurchLine или SalesLine. Два поля - это идентификатор операции и идентификатор сущности, участвующей в операции (аналог PurchId и ItemId). Комбинация PurchId и ItemId уникальна. С одной стороны при открытии журнала операции система всегда делает выборку строк по идентификатору операции, с другой - пользователи регулярно строят отчеты по коду сущности и анализируют операции.
SalesId ItemId При отображении данных на форме он подходит идеально. Сначала идет ограничение записей по SalesId, потом можно сортировать данные в форме по ItemId. 2. Если я правильно понял, то отчет будет что-то типа обороты по номенклатуре, с возможностью детализации оборотов по операциям. Посмотрите в сторону OLAP, задача ложится туда идеально и не надо никаких дополнительных индексов на эту таблицу, тем более что в нее происходит много вставок. Если же Вы все-таки решитесь строить такой отчет на OLTP данных AX, то здесь для ускорения работы отчета нужен индекс: ItemId - для первой группировки по номенклатуры SalesId - для второй группировки по операциям. P.S. И вообще, конечно, отчеты лучше строить по проводкам. |
|
31.08.2010, 13:37 | #18 |
Участник
|
Цитата:
Сообщение от Skvorcal
А как лучше поступить в следующей ситуации...
Есть таблица, в таблице куча полей, но 99% запросов фильтруют данные по двум полям. При этом 33% запросов фильтруют данные по одному полю, 33% запросов фильтруют данные по другому полю, а оставшиеся 33% запросов фильтруют данные по двум полям одновременно. В такой ситуации лучше построить два отдельных индекса по каждому полю, или один индекс по двум полям? и если в нем включено автосоздание индексов... то ничего не делайте. подождите немножко, а потом посмотрите что MS SQL насоздавал. потом примете решение. |
|
31.08.2010, 14:43 | #19 |
Участник
|
Цитата:
Цитата:
1. Слишком дорого и муторно разворачивать OLAP ради одного-двух отчетов. 2. Отчет является оперативным. Его формируют по нескольку раз в день и отслеживают тем самым исполнение операций. Плюс некоторое планирование... Отчеты лучше строить по тем таблицам, в которых содержиться максимум требуемой информации и обеспечивается максимальная скорость построения и достоверность данных. А проводки с трехэтажными джоинами или хитрыми комбинациями аналитик - это имхо на любителя... А разве при очередном обновлении приложения (обновляем слоем, а не проектами) и последующей синхронизации словаря Аксапта не удалит все неаксаптовые индексы? |
|
31.08.2010, 15:30 | #20 |
Участник
|
Цитата:
http://msmvps.com/blogs/gladchenko/a...3/1311293.aspx тогда можно на основе рекомендаций сделать индексы в АОТе. Или есть еще какой-нибудь другой механизм? |
|
Теги |
индекс, как правильно |
|
Похожие темы | ||||
Тема | Ответов | |||
Вопрос по резервированию | 9 | |||
Поле mandatory, а 0 вставить нужно | 5 | |||
вычисляемое поле | 8 | |||
Где взять материалы и еще один конкретный вопрос | 6 |
|