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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.11.2015, 09:01   #1  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Red face Разное количество индексов в axapta и sql
Добрый день.

Предыстория:
Переносил процедуру с тестовой SQL на рабочую и при компиляции получил ошибку, что SQL не знает такого индекса. Думаю, ладно может новый индекс и его не перенесли на рабочею, но не тут-то было. Индекс коробочной аксапты и находиться на слое SYS. Через форму администрирования пересоздал этот индекс. Все стала хорошо и SQL принял процедуру как родную.

Тут у меня появилась мысль, а сколько еще индексов не хватает в SQL.



Сделал запрос в SQL:
PHP код:
select count(*)
from sysobjects t 
inner join sysindexes i on t
.id i.id where i.name like 'I_%' 
вернул число 5496.

Хорошо, теперь нужно как-то понять, сколько индексов должно быть.
Нашел в системных таблицах UtilIdElements и UtilElements.
Вопрос к сообществу №1: В чем разница между UtilIdElements и UtilElement?
Через обозреватель таблиц на первый взгляд информация одинаковая.

X++:
static void utilIdElementsCount(Args _args)
{
    UtilIdElements  utilIdElements;
    ;
    select count(RecId)
        from utilIdElements order by parentId
        where utilIdElements.recordType == UtilElementType::TableIndex;

    
    info(int2str(utilIdElements.RecId));
}
вернул число 6623.

Тут я совсем расстроился и что-то приуныл. В SQL не хватает 1/6 индексов.

Далее мое извращенное сознание извергла следующий алгоритм:
X++:
static void getListIndexNameSql(Args _args)
{
    UtilIdElements  utilIdElements;
    DictTable       dictTable;
    str             textRow = 'Имя таблицы SQL;Имя таблицы;Имя индекса SQL;Имя индекса;Код таблицы;Код индекса\n';
    ;
    while select utilIdElements order by parentId
        where utilIdElements.recordType == UtilElementType::TableIndex
    {
        if(tableId2Name(utilIdElements.parentId) != 'UNKNOWN')
        {
            dictTable = new DictTable(utilIdElements.parentId);

            textRow += strFmt('%1;%2;%3;%4;%5;%6\n', 
                              dictTable.name(DbBackend::Sql), 
                              dictTable.name(), 
                              dictTable.indexName(utilIdElements.id, DbBackend::SQL), 
                              utilIdElements.name, 
                              utilIdElements.parentId, 
                              utilIdElements.id);
        }
    }

    info(textRow);
}
Вопрос к сообществу №2: Насколько корректны полученные данные? Если другой способ получение индексов, которые должны быть по версии axapta?

P.S. AX2009, SQL 2008
Старый 10.11.2015, 09:28   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Наличие в Аксапте конфигурационных ключей и временных таблиц вы не учитываете?

Пробегитесь по DictTable и связанными с таблицами DictIndex, с учетом isSql() - тогда узнаете, сколько Аксаптовских объектов сохранено в БД
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: demianimp (1).
Старый 10.11.2015, 09:39   #3  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от AndyD Посмотреть сообщение
Наличие в Аксапте конфигурационных ключей и временных таблиц вы не учитываете?

Пробегитесь по DictTable и связанными с таблицами DictIndex, с учетом isSql() - тогда узнаете, сколько Аксаптовских объектов сохранено в БД
Я правильно понимаю, что нужно в алгоритм добавить:
X++:
...
            if(dictTable.isSql())
            {
                dictIndex = new DictIndex(utilIdElements.parentId, utilIdElements.id);
                
                if(!dictIndex.isSql())
                {
...
                }
            }
...
и тогда я пойму каких индексов не хватает?
Старый 10.11.2015, 10:03   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не совсем)

isSql() показывает, что объект ДОЛЖЕН быть сохранен в сиквеле, с точки зрения Аксапты. Т.е. для отключенных конф. ключем объектов и временных таблиц isSql() вернет false

А вот сохранен фактически он или нет - можно узнать только сделав запрос к метаданным самого сиквела
__________________
Axapta v.3.0 sp5 kr2
Старый 10.11.2015, 10:20   #5  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от AndyD Посмотреть сообщение
Не совсем)

isSql() показывает, что объект ДОЛЖЕН быть сохранен в сиквеле, с точки зрения Аксапты. Т.е. для отключенных конф. ключем объектов и временных таблиц isSql() вернет false

А вот сохранен фактически он или нет - можно узнать только сделав запрос к метаданным самого сиквела
Спасибо большое.

Чем больше с умными людьми общаюсь, тем больше понимаю на сколько ничтожны мои знания
Старый 10.11.2015, 10:28   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от demianimp Посмотреть сообщение
Я правильно понимаю, что нужно в алгоритм добавить...
Неправильно. Нужно один раз синхронизовать БД и перестать использовать индексные подсказки
__________________
-ТСЯ или -ТЬСЯ ?
Теги
ax2009, sql 2008, индекс

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как узнать имя пользователя Axapta на SQL? Didukh84 DAX: Программирование 36 06.02.2014 14:14
SQL с базой Axapta занимает всю оперативную память alesander DAX: Администрирование 9 23.06.2010 12:45
Версия SQL 2005 Axapta 4.0 и Axapta 2009 tolstjak DAX: Администрирование 8 10.11.2009 11:11
Как же все таки добраться из Axapta до SQL Кандидат DAX: Программирование 5 02.12.2005 11:50

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

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

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