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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2016, 08:45   #1  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
? sqlDataDictionary.tableReindex
Добрый день.

Столкнулся с такой проблемой. При вызове sqlDataDictionary.tableReindex с параметрами не всегда на SQL отправляет команду на удаление и создание индекса. sqlDataDictionary.tableReindex возвращает 0, что согласно MSDN означает, что нет ошибки

Что также наблюдается через форму "Администрирование SQL" -> "Действия над индексами" -> "Переиндексация". Как на группе таблиц, так и на группе индексов.

Что я делаю не так?

Вот пример джоба, который нужно запускать через пункт меню с параметром запуска на server.

X++:
static server void ReIndex(Args _args)
{
    SqlDataDictionary       sqlDataDictionary;
    ;
    sqlDataDictionary = new SqlDataDictionary();
        
    new SqlDataDictionaryPermission(methodstr(SqlDataDictionary,  tableReindex)).assert();
    info(int2str(sqlDataDictionary.tableReindex(tableId, IndexId)));
    CodeAccessPermission::revertAssert();
}
Может есть какие-то другие варианты программного запуска переиндексации через AX?
Старый 09.08.2016, 09:17   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А таблица над которой вы пытаетесь выполнить операцию точно физически существует на SQL сервере? Может быть она временная или выключена конфигурационным ключём?
Старый 09.08.2016, 09:25   #3  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А таблица над которой вы пытаетесь выполнить операцию точно физически существует на SQL сервере?
Таблица есть на сервере, т.е. он не темповая. Если повторно вызвать без параметра индекса, то он по всей таблице нормально пройдет.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Может быть она временная или выключена конфигурационным ключём?
На индексах я не вижу конфигурационных ключей.

я правильно понимаю, что Id индекса этот то значение, которое прописано в свойства индекса в АОТ?
Старый 09.08.2016, 09:54   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от demianimp Посмотреть сообщение
На индексах я не вижу конфигурационных ключей.
Я вижу. AX2009. И ещё на самих полях есть.

Цитата:
Сообщение от demianimp Посмотреть сообщение
я правильно понимаю, что Id индекса этот то значение, которое прописано в свойства индекса в АОТ?
похоже на то. Ещё его можно по имени указать через IndexNum, по аналогии с TableNum, FieldNum и т.д.
Старый 09.08.2016, 10:05   #5  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Я вижу. AX2009. И ещё на самих полях есть.
Если дело в ключах, то почему sqlDataDictionary.tableReindex(tableId) выполняется, а sqlDataDictionary.tableReindex(tableId, indexId) нет?


Вот например таблица 865 CustTransOpen и индекс 3 AccountDateIdx

Нормально выполняется sqlDataDictionary.tableReindex(865, 3) - процент фрагментации на SQL приближен к 0?
Старый 10.08.2016, 08:41   #6  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Еще заметил, что не отрабатывает
X++:
sqlDataDictionary.indexDrop(tableId, indexId);
, хотя
X++:
sqlDataDictionary.indexCreate(tableId, indexId)
пытается отправить запрос на создание.

Может какие-то настройки я упустил?
Старый 10.08.2016, 11:29   #7  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Экспериментальным путем выяснил, что sqlDataDictionary.indexDrop и sqlDataDictionary.tableReindex не выполняются у индексов, которые прописаны в свойствах таблицы PrimaryIndex и ClusterIndex.

Отсюда вопрос, как их можно программно переиндексировать?
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 10.08.2016, 11:53   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от demianimp Посмотреть сообщение
Что я делаю не так?
Да все. Не надо обслуживание SQL Server-а автоматизировать в AX
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.08.2016, 12:25   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от demianimp Посмотреть сообщение
Отсюда вопрос, как их можно программно переиндексировать?
maintanance plan в SQL.
если уж очень хочется запланировать выполнение из аксапты, то вызывайте sql-агента, чтобы он запустил maintanance plan.

согласен с Vadik. оставьте задачи обслуживания базы администраторам SQL.

Последний раз редактировалось mazzy; 10.08.2016 в 12:28.
Старый 10.08.2016, 12:28   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от demianimp Посмотреть сообщение
При вызове sqlDataDictionary.tableReindex с параметрами не всегда на SQL отправляет команду на удаление и создание индекса. sqlDataDictionary.tableReindex возвращает 0, что согласно MSDN означает, что нет ошибки
"Не отправляет" - это вряд ли.
скорее аксапта отправляет, а SQL ее не слушается.

если вы таки будете настаивать на именно таком подходе,
то проверьте права пользователей.

тот пользователь SQL, который принимает команды из аксапты, имеет права на выполнение обслуживающих команд?

Последний раз редактировалось mazzy; 10.08.2016 в 12:34.
Старый 10.08.2016, 12:50   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Тема "А нафига тогда эти функции есть в X++, если ни фига не работают так как ожидается" - не раскрыта.
По-моему они сделаны изначально для джобов по конвертации базы, чтобы можно было из кода все же делать эти операции. А для обычной работы конечно удобнее средствами БД все сделать.
Старый 10.08.2016, 12:58   #12  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от mazzy Посмотреть сообщение
тот пользователь SQL, который принимает команды из аксапты, имеет права на выполнение обслуживающих команд?
По правам все хорошо, т.е. если выполнять sqlDataDictionary.tableReindex без указания индекса, то все отработает.

Цитата:
Сообщение от demianimp Посмотреть сообщение
Экспериментальным путем выяснил, что sqlDataDictionary.indexDrop и sqlDataDictionary.tableReindex не выполняются у индексов, которые прописаны в свойствах таблицы PrimaryIndex и ClusterIndex.
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.08.2016, 14:43   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Тема "А нафига тогда эти функции есть в X++, если ни фига не работают так как ожидается" - не раскрыта.
По-моему они сделаны изначально для джобов по конвертации базы...
нет. это унаследованные функции еще к конкорда.

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

функции еще были актуальны, когда аксапта работала на двух базах - Оракл и МС СКЛ. Сейчас не актуальны от слова совсем. Используйте инструменты обслуживания самой бд
За это сообщение автора поблагодарили: Logger (1), S.Kuskov (2).
Старый 12.08.2016, 07:33   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Тема "А нафига тогда эти функции есть в X++, если ни фига не работают так как ожидается" - не раскрыта.
Напомню историю, что функции, которые "есть в Х++, но не работают, как ожидается" специально не создавались. Братья Дамгаарды, когда делали EXE-шник для АХ (а может еще и для конкорда - уж точно не помню) - который сейчас ax32.exe - взяли некий компилятор С++ и скрестили с компилятором Java. Что они конкретно использовали - сейчас уже вряд ли кто вспомнит. Но суть состоит в том, что функции специально не добавлялись, а просто не вычищались. Т.е. они адаптировались по необходимости их применения в системе АХ путем "фиксов ядра" и все.

В далекое-далекое время, когда приезжал в Россию Эрик Дамгаард - он говорил (я сам не был - инфа со слов товарищей, которые там были), что они систему создают для работы пользователей, а не для разработчиков. Поэтому у них в планах не стоит вычищение такого рода мусора.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 12.08.2016 в 07:55.
За это сообщение автора поблагодарили: Logger (1), S.Kuskov (2).
Теги
ax2009, reindex

 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:55.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.