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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.12.2011, 14:20   #1  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Интересное мнение насчет индексов было у fed.


Цитата:
Сообщение от fed Посмотреть сообщение
А это вообще не на аксаптовском уровне происходит. И даже не на уровне трейсинга SQL-операторов в SQL Profiler. Вот представь себе: У тебя есть таблица персонала. Есть куча индексов, один из которых по полю Пол. Ты говоришь - удалить сотрудника с employeeId=='Иванов И.И.'. Система находит по индексу emplIdIdx физический адрес записи и фетчит ее. Далее - надо удалить из всех индексов ключи, которые на эту запись ссылаются. Система рассчитывает значения индексных ключей (по данным из записи) и пытается найти и удалить все индексные ключи. Для этого она ПЕРЕБИРАЕТ все индексные ключи со значением равным вычисленному до тех пор, пока не наткнется на ключ, ссылающийся на нужную запись (то есть с сохраненным в индексном входе Row_Id==Row_ID нашей записи). Если индекс уникален, то этот перебор не требуется. Если относительно уникален (ну скажем - номер паспорта без серии) - то перебор будет недолгим. А вот если это индекс по полю типа Пол (два возможных значения) - перебор будет медленным и печальным. Собственно - по этому в книжках и не советуют строить индексы по полям с 2-5-10 возможными значениями - обновление такой индекс затормозит, а при выборке редко будет нужен. Но тем не менее - иногда приходится строить индексы по достаточно часто повторяющемуся полю. Даже если на каждое значение будет приходиться порядка 200-300 записей - все равно обновление тормозить будет изрядно.

Насколько я знаю - некоторые БД пытались решить эту проблему за счет того, что индекс подспудно сортировался по сочетанию ключ+физический адрес записи (ROW_ID). (То есть - значение ссылки на запись становилась некой виртуальной частью ключа). Однако - на практике это приводило к изрядным проблемам, поскольку приводило к усиленной перебалансировке дерева страниц при вставке новых записей. Кроме того - при реорганизации и упаковке таблиц, это усложняло перестроение индексов.
Так что - насколько я понимаю, в текущих версиях и SQL Server и Oracle используется именно такой подход к удалению ключей, который я описал...
Старый 20.12.2011, 15:06   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Интересное мнение насчет индексов было у fed.
Если почитать тему дальше, то видно, что это мнение, по крайней мере по отношению к MS SQL, было неправильное


2 Vadik
Если Cancelled входит в кластерный индекс, да еще на перевом месте (или на втором, после DataAreaId?), то имеет ли смысл добавлять его в другие индексы (на последнее место, правильно?)?
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Kabardian (4).
Старый 21.12.2011, 02:13   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1853 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от AndyD Посмотреть сообщение
Если Cancelled входит в кластерный индекс, да еще на перевом месте (или на втором, после DataAreaId?), то имеет ли смысл добавлять его в другие индексы ?
Вопрос хороший, правильный, и я бы даже сказал - философский. Теоретически - нет. На практике - при прочих равных условиях оптимизатор стабильно выбирает для index seek индекс с явно входящим в него Cancelled. Его в принципе можно понять - все же приятнее когда значения (пусть даже их всего два) ключевого поля (Cancelled) явно отсортированы а не лежат где-то "рядом" наподобие included. Так что я добавляю..
Цитата:
на последнее место, правильно ?
Предпочитаю строить некластерные индексы "правильно" (в соответствии с запросами) без оглядки на наличие и структуру кластерного - меньше шансов "нарваться" при его смене. Так как Cancelled используется практически всегда, добавляю его обычно одним из первых полей
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: AndyD (5).
Теги
inventsettlement, быстродействие, закрытие склада, производительность, индекс

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Программное воссоздание записей SqlDictionary для определенной таблицы gl00mie DAX: Программирование 17 04.05.2023 20:13
Отмена закрытия склада. Оптимизация. vallys DAX: Программирование 20 23.08.2012 11:14
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16

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

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

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