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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.02.2014, 14:17   #1  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Стандартные неиспользуемые индексы
Может я сейчас глупость спрошу... На некоторых таблицах индексы занимают в 3-5 раз больше места, чем данные. Многие индексы со слоя sys нигде не используются. Например на таблице LedgerTrans из семи индексов четыре в коде аксапты не обнаружены.

Собственно вопрос, нужно ли держать эти индексы в системе или удалить их дабы сберечь место и ускорить работу с таблицей?
Если удалять, какие могут возникнуть проблемы?

AX 2009 SP1 RU5
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 04.02.2014, 14:31   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Link Посмотреть сообщение
удалить
не удалять, а выключить.

еще к некоторым индексам не добавляют конфигурационный ключ.
поэтому при выключении некоторых ключей поля действительно исчезают, а индексы - нет. в результате на SQL получается два-три полностью идентичных индекса.

выключать однозначно.
выключение безопасно с точки зрения целостности кода.
За это сообщение автора поблагодарили: Logger (1).
Старый 04.02.2014, 14:31   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
То что индекс в коде не упомянут нигде - не значит что он не используется.
В БД должно быть средство посмотреть статистику используемых индексов. На него и нужно полагаться.
Старый 04.02.2014, 14:48   #4  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от mazzy Посмотреть сообщение
не удалять, а выключить.

еще к некоторым индексам не добавляют конфигурационный ключ.
поэтому при выключении некоторых ключей поля действительно исчезают, а индексы - нет. в результате на SQL получается два-три полностью идентичных индекса.

выключать однозначно.
выключение безопасно с точки зрения целостности кода.
За редким исключением конфигурационные ключи на этих индексах нигде не стоят. Т.е. правильный подход:
1) Включить ключ SysDeletedObjects
2) Выставить ключ на нужных индексах
3) В нужный момент снова отключить ключ и при синхронизации ненужные индексы удалятся.

Спасибо
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 04.02.2014, 14:51   #5  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Logger Посмотреть сообщение
То что индекс в коде не упомянут нигде - не значит что он не используется.
В БД должно быть средство посмотреть статистику используемых индексов. На него и нужно полагаться.
Я правильно понимаю, что если индекс не находится обновленными перекрестными ссылками, то он самой Аксаптой не используется и что в этом случае может идти речь только об использовании базы сторонними приложениями? Речь о версии 2009.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 04.02.2014, 15:02   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да при чем здесь сторонние приложения.
Индекс может использоваться самой базой данных

Ей же наплевать на Аксапту и на приложение. Она получает запрос выбирает план исполнения и использует для него оптимальный с точки зрения оптимизатора индекс.
Индекс может ни разу в коде приложения не упоминаться, но активно использоваться самой базой данных.
Старый 04.02.2014, 15:07   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
В большинстве случаев в коде индекс упомянут и не должен быть, а значит и перекрестными ссылками он не найдется. SQL Server сам решает, какой из индексов надо использовать.

Статистику использования индексов можно посмотреть во вьюшке sys.dm_db_index_usage_stats. Отсюда можно определить и выключить реально неиспользуемые индексы.
http://technet.microsoft.com/en-us/l.../ms188755.aspx

Еще есть полезная вьюшка sys.dm_db_index_operational_stats.
http://msdn.microsoft.com/en-us/library/ms174281.aspx

О различиях между ними тут: http://blogs.msdn.com/b/craigfr/arch...nal-stats.aspx
За это сообщение автора поблагодарили: mazzy (5), sukhanchik (4), Logger (10), lev (5), Link (4), gl00mie (5), alex55 (1).
Старый 04.02.2014, 15:30   #8  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Logger Посмотреть сообщение
Да при чем здесь сторонние приложения.
Индекс может использоваться самой базой данных

Ей же наплевать на Аксапту и на приложение. Она получает запрос выбирает план исполнения и использует для него оптимальный с точки зрения оптимизатора индекс.
Индекс может ни разу в коде приложения не упоминаться, но активно использоваться самой базой данных.
Спасибо, именно это я и хотел понять. У клиента накручено много всего, из аксаптовской БД тянут много инфы. А в самой аксапте очень много создали индексов. К тому же за чем то создали несколько индексов в самой базе, что выдает ошибки синхронизации.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 04.02.2014, 15:31   #9  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от oip Посмотреть сообщение
В большинстве случаев в коде индекс упомянут и не должен быть, а значит и перекрестными ссылками он не найдется. SQL Server сам решает, какой из индексов надо использовать.

Статистику использования индексов можно посмотреть во вьюшке sys.dm_db_index_usage_stats. Отсюда можно определить и выключить реально неиспользуемые индексы.
http://technet.microsoft.com/en-us/l.../ms188755.aspx

Еще есть полезная вьюшка sys.dm_db_index_operational_stats.
http://msdn.microsoft.com/en-us/library/ms174281.aspx

О различиях между ними тут: http://blogs.msdn.com/b/craigfr/arch...nal-stats.aspx
Спасибо за конструктив, понял куда копать!
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: leva (1).
Старый 04.02.2014, 17:16   #10  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Готовый запрос
Этот запрос возвращает список индексов, которые никогда не использовались в планах исполнения запросов,
и показывает число изменений на страницах каждого такого индекса. Вы можете найти не только индексы,
которые лежат в базе данных мёртвым грузом, но и те индексы,
которые за счёт большого числа изменений приносят только вред
(в виде затрат на изменения значений ключей индекса).

X++:
SELECT   OBJECT_NAME(i.object_id) AS [Table Name],
         i.name AS [Not Used Index Name],
         s.last_user_update AS [Last Update Time],
         s.user_updates AS [Updates]
FROM     sys.dm_db_index_usage_stats AS s
JOIN     sys.indexes AS i
ON       i.object_id = s.object_id
AND      i.index_id = s.index_id
JOIN     sys.objects AS o
ON       o.object_id = s.object_id
WHERE    s.database_id = DB_ID()
AND      (    user_scans   = 0
          AND user_seeks   = 0
          AND user_lookups = 0
          AND last_user_scan   IS NULL
          AND last_user_seek   IS NULL
          AND last_user_lookup IS NULL 
         )
AND      OBJECTPROPERTY(i.[object_id],         'IsSystemTable'   ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsAutoStatistics') = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsHypothetical'  ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsStatistics'    ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsFulltextKey'   ) = 0
AND      (i.index_id between 2 AND 250 OR (i.index_id=1 AND OBJECTPROPERTY(i.[object_id],'IsView')=1))
AND      o.type <> 'IT'
--ORDER BY OBJECT_NAME(i.object_id) 
order by [Updates] desc
если будете удалять индексы - следите за TransactionLog-ом. Индекс удаляется в транзакции и лог может запросто вырасти в разы, если удалить сразу несколько больших индексов (это актуально только есть ограничения на размер лога).

Последний раз редактировалось AlexeyS; 04.02.2014 в 17:21.
За это сообщение автора поблагодарили: mazzy (5), Logger (3), Link (4), Kabardian (6).
Старый 04.02.2014, 17:38   #11  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
2AlexeyS: если обновление статистики и/или реиндексация происходит периодически, то информация будет не корректна
Старый 04.02.2014, 18:00   #12  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
И надо не забывать о том, что данные в этих вьюшках могут очищаться:
Цитата:
The counters are initialized to empty whenever the SQL Server (MSSQLSERVER) service is started. In addition, whenever a database is detached or is shut down (for example, because AUTO_CLOSE is set to ON), all rows associated with the database are removed.
Старый 04.02.2014, 18:18   #13  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от AlexeyS Посмотреть сообщение
Этот запрос возвращает список индексов, которые никогда не использовались в планах исполнения запросов,
и показывает число изменений на страницах каждого такого индекса. Вы можете найти не только индексы,
которые лежат в базе данных мёртвым грузом, но и те индексы,
которые за счёт большого числа изменений приносят только вред
(в виде затрат на изменения значений ключей индекса).
Спасибо, нашел похожий запрос здесь.

Цитата:
Сообщение от AlexeyS Посмотреть сообщение
если будете удалять индексы - следите за TransactionLog-ом. Индекс удаляется в транзакции и лог может запросто вырасти в разы, если удалить сразу несколько больших индексов (это актуально только есть ограничения на размер лога).
Очень полезное замечание, у нас как раз очень огромные индексы, собственно больше половины всей базы занимают индексы. Недавно перезапускали Сиквел, так что теперь придется ждать пока статистика накопится.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 06.02.2014, 14:18   #14  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Еще один вопрос назрел по теме. Перешел я к анализу, но сомневаюсь можно ли полагаться на статистику, если очень много индексов имеют сильную фрагментацию. Подозреваю, что можно, но все же хочется уточнить. Базой никто не занимался, поэтому больше тысячи индексов имеют фрагментацию от 30 до 99%.

Еще может кому будет полезно, в сиквеле (2008) уже есть встроенный отчеты по статистике индексов, то о чем выше писал уважаемый oip. Запустил, сохранил в эксель и можно анализировать. Очень удобно, особенно в сильно запущенных случаях. Так же в отчете (Service Dashboard) можно посмотреть дату перезапуска службы.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 06.02.2014, 14:48   #15  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Вот что пишут:
Код:
 When an Index Logical Scan Fragmentation exceeds 50%, SQL will ignore the Statistics recommendations and perform a Table Scan instead.
Получается, что нельзя полагаться на статистику по индексу, если фрагментация больше 50%?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Теги
sql server, администратор бд, анализ, индекс, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
позволяют ли стандартные классы Аксапты проводить валидацию XML? (XMLTextReader, XMLSchema и т п) Cardagant DAX: Программирование 1 15.03.2013 00:24
Стандартные затраты и Отборочная накладная Димитрий DAX: Программирование 0 31.05.2012 09:40
Как часто вы кастомизируете стандартные сервисы номенклатур. Ievgenii DAX: Функционал 8 14.12.2009 13:35
Перестали работать индексы в запросах Antant DAX: Администрирование 2 03.08.2009 19:01
При каждом обращении строит индексы в Old nicko DAX: Администрирование 0 16.02.2005 08:57
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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