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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.10.2006, 16:01   #1  
Blog bot is offline
Blog bot
Участник
 
25,607 / 848 (80) +++++++
Регистрация: 28.10.2006
aEremenko: Порядок полей в индексе для DAX 3.0
Источник: http://blogs.msdn.com/aeremenk/archi...14/825247.aspx
==============

Все время забываю записать, что есть параметр для конфигурационной утилиты, позволяющий допускать изменение полей в индексе.
Это актуально при тюнинге производительности системы, когда необходимо управлять порядком системного поля DATAAREAID в индексе. Не секрет, что перемещение данного поля в конец индекса может дать ощутимый прирост в производительности системы при небольшом количестве компаний.
Параметр должен быть указан в поле Advanced конфигурационной утилиты:
-internal=CROSSCOMPANY
Параметр позволяет добавлять вручную поле DATAAREAID в индекс, соответственно, можно самому определять порядок. Параметр не влияет на прочие индексы.
Применять осторожно, тестировать в любом случае.
Есть ли клиенты, использующие данный параметр длительное время? Есть, я знаю как минимум одного, но не в России.


Источник: http://blogs.msdn.com/aeremenk/archi...14/825247.aspx
За это сообщение автора поблагодарили: alex55 (1).
Старый 07.11.2006, 10:26   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Странно. Не нашел этот параметр в списке

В любом случае, конфигурационная утилита, по-моему, не лучшее место для указания такого рода параметров. Что будет, если одному из клиентов такой параметр в утилите забудут прописать?

Есть еще один способ достижения точно такого же эффекта. Для этого надо изменить значение параметра INDEX в таблице SQLSYSTEMVARIABLES. Вот описание значений этого параметра:
Цитата:
System Variable
INDEX

Values
Value ‘0’ for indexes not supported, or
one or more of the other options
added together:


0 : Not supporting indexes.

1 : Default flag for enabling index
support.

2 : Index generation reversed (i.e.
most important index generated last).

4 : Allow DESC on index components
in CREATE INDEX statement.

8 : Add table qualifiers to index
names.

16: Put the DATAAREAID (the
“company field) last in indexes, and do
not put the field in the ORDER BY
clause at all.

32: This session is using “RECIDs per
company”, which consequently will
add the DATAAREAID to the built-in
RecId-index.

64: This session is using “RECIDs per
company+table”
Сразу хочу предупредить, что описание не исчерпывающее. Например, у меня в БД значение этого параметра - 297 (256 + 32 + 8 + 1). За что отвечает значение 256, я не знаю.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me

Последний раз редактировалось Maxim Gorbunov; 07.11.2006 в 10:43.
За это сообщение автора поблагодарили: mazzy (5), Garic (2), belugin (8), Logger (2), alex55 (1), SRF (2).
Старый 22.11.2006, 12:39   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,936 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Спасибо за информацию.

А не знаете как использовать такой параметр на практике ?
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
4 : Allow DESC on index components
in CREATE INDEX statement.
Потыкал индексы на таблицах - там негде указать параметр "DESC"
Старый 22.11.2006, 13:13   #4  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Спасибо за информацию.

А не знаете как использовать такой параметр на практике ?


Потыкал индексы на таблицах - там негде указать параметр "DESC"
Эта настройка производится в таблице SQLSYSTEMVARIABLE для строки INDEX. Внимательней читайте, пожалуйста, сообщения.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 22.11.2006, 13:21   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Logger, насколько я понял, спрашивал, как после установки этого значения в INDEX в БД установить ниспадающий порядок сортировки у какого-то из индексов в АОТ?
Старый 22.11.2006, 14:24   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,936 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Logger, насколько я понял, спрашивал, как после установки этого значения в INDEX в БД установить ниспадающий порядок сортировки у какого-то из индексов в АОТ?
Ага, именно это меня и интересует.
А то какой смысл в этой настройке, если неясно как ей воспользоваться.
Старый 22.11.2006, 15:16   #7  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Попробовал настройку. Переиндексировал табличку SalesLine.
Действительно DataAreaId встал теперь последним.
Во всех индексах кроме TransIdIdx, странно - чем этот индекс особенный-то?
__________________
С уважением, Игорь Ласийчук.
Старый 22.11.2006, 15:21   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
TransIdIdx выбран как PrimaryIndex для этой таблицы
Старый 22.11.2006, 15:24   #9  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Синхронизирую PurchTable - Primary index = PurchIdx
Тем не менее, dataAreaId встаёт последним.
__________________
С уважением, Игорь Ласийчук.
Старый 22.11.2006, 15:31   #10  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Ага, именно это меня и интересует.
А то какой смысл в этой настройке, если неясно как ей воспользоваться.
Извините. Решил сам поиграть со значением для Index. Установил по максимуму в 383 и ... Никаких новых свойств не увидел. Будет ждать ответ от гуру
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 22.11.2006, 15:40   #11  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Аха. Через manage index проверил табличку Address:
- в индексах DataAreaId съехал в конец;
- поменялся порядок индексов в таблице (?). Раньше индекс по RecId (DA + RI) был в конце, теперь влез между двумя другими индексами. Интересно почему.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 22.11.2006, 15:43   #12  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Цитата:
Сообщение от Garic Посмотреть сообщение
Попробовал настройку. Переиндексировал табличку SalesLine.
Действительно DataAreaId встал теперь последним.
Во всех индексах кроме TransIdIdx, странно - чем этот индекс особенный-то?
Ещё поигрался.
Получилось что если в salesLine есть записи только в одной компании, то TransIdIdx получается нормальным - с DataAreaId вконце.
Видимо система ещё учитывает записи по компаниям.
__________________
С уважением, Игорь Ласийчук.
Старый 22.11.2006, 17:10   #13  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Упс. Решил проверить значение 255. Синхронизация упала при невозможности создать индекс по recId. Пришлось восстанавливать базу. Хорошо, что в ней только справочники.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 18.06.2009, 08:27   #14  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
372 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
... За что отвечает значение 256, я не знаю.
Думаю, что наверное Вы уже знаете, про данный параметр, но кто-то может и не знать.

Если заглянуть в класс SQLDataBaseInit, то в определении класса можно увидеть макрос #define.transidsPerCompany(256), откуда можно сделать предположение, это значение отвечает за генерацию TransactionId в разрезе компании(проверил на DAX 4.0, так оно и оказалось ), про 256 можно сказать так :
Цитата:
256: This session is using “TransactionsID per company”
Посмотрел как используется значение 4 параметра INDEX в AX.
Цитата:
4 : Allow DESC on index components
in CREATE INDEX statement.
Как оказалось, используется это значение по-умолчанию только с СУБД Oracle, так же как и значение 128 (#define.indexOraStrFunctional(128)).
Выскажу предположение, что это может быть как-то связано с тем, что до версии Oracle 8i ключевое слово DESC игнорировалось в инструкции CREATE INDEX(т.е. возможно, что нужны еще какие-то доп. условия, чтобы параметр desc подставлялся в инструкцию create index)

Оффтоп : Пока смотрел как используется значение 4, обнаружил интересный момент(багофича). В AX 3.0 и AX 4.0 есть класс SqlscanSQLIndex, который используется при проверки\синхронизации таблиц(Администрирование\Периодические операции\SQL Администрирование).
У данного класса есть метод isDescendingOrder, который по логике вещей должен определять порядок сортировки поля в индексе, однако он всегда возвращает false, несмотря на то, что использует массив descendingOrder, просто разработчики видимо забыли что, его нужно тоже заполнять

Причем не заполняется он ни для Oracle, ни для MS SQL Server. Более того, для MS SQL Server - для определения структуры индекса используется хранимая процедура sp_helpindex, которая в случае если поле в индексе имеет порядок сортировки desc возвращает после него "(-)", что тоже никак не учтено .
Т.е. к примеру - у вас есть таблица, у нее есть индекс, содержащий поле field1. Теперь если вы не посредственно на SQL Server для данного поля в индексе выставите сортировку DESC, а потом запустите проверку\синхронизацию таблицы, то в отчете будет выведено, что поле индекса в БД имеет имя field1(-), а в AOT field1, хотя изменился только порядок сортировки. Ниже приведен код для DAX 4.0, исправляющий данную ситуацию(тестировал на SQL 2005), изменения нужно внести в метод sqlServerGetIndexInfo класса SqlscanSQLIndex:
X++:
private void sqlServerGetIndexInfo()
{
    Statement       stmt      = con.createStatement();
    Statement       stmt1     = con.createStatement();
    ResultSet       resultSet;
    str             columns;
    str             columnToken;
    str             realIndexes[ #DEFINE.MAX_INDEX_PER_TABLE ];
    int             nbrRealIndexes = 0;
    str             queryString;
    str             result2;
    str             indexName;
    int             len, columnNo, i;
    int             strCount;
    boolean         sysTraceActive = xSession::getSysTraceActive();
    SqlStatementExecutePermission ssep;
    //srf -->
    boolean         isDescOrder;
    str             descToken = "(-)";
    //srf <--
    ;
    xSession::setSysTraceActive(true);
    queryString = 'SELECT name FROM sysindexes WHERE indid>0 AND indid<255 AND id=object_id(\'' + sQLIndexTable + '\')'+
                  ' AND INDEXPROPERTY(id, name, \'IsStatistics\') = 0';
    //Assert executeQuery a Dangerous APi
    ssep = new SqlStatementExecutePermission ( queryString );
    ssep.assert();
    //BP Deviation Documented
    resultSet = stmt.executeQuery( queryString );
    while (resultSet.next() )
    {
        nbrRealIndexes++;
        realIndexes[nbrRealIndexes] = resultSet.getString( 1 );
    }
    if (!nbrRealIndexes)
        return;
    //revert assert
    CodeAccessPermission::revertAssert();
    queryString = '/*SP*/ exec sp_helpindex ' + sQLIndexTable;
    //Assert executeQuery a Dangerous APi
    ssep = new SqlStatementExecutePermission ( queryString );
    ssep.assert();
    //BP Deviation Documented
    resultSet = stmt.executeQuery( queryString );
    while( resultSet.next() )
    {
        indexName = resultSet.getString( 1 );
        for (i=1;i<=nbrRealIndexes;i++)
        {
            if (realIndexes[i] == indexName) break;
        }
        if (i<=nbrRealIndexes)  /* not a statistics index */
        {
            result2 = resultSet.getString( 2 );
            this.completeIndex();
            this.addIndex(indexName);
            isUnique[idxCnt]    = (strscan(result2, 'unique', 0, strlen(result2)) ? true : false );
            isCluster[idxCnt]   = (strscan(result2, 'clustered', 0, strlen(result2)) ? true : false );
            if (isCluster[idxCnt] && strscan(result2, 'nonclustered', 0, strlen(result2)))
                isCluster[idxCnt] = false;
            isPrimary[idxCnt] = (strscan(result2, 'primary key', 0, strlen(result2)) ? true : false );
            columns       = resultSet.getString( 3 );
            len           = strlen( columns );
            strCount      = 1;
            columnNo      = 0;
            while( strCount <= len )
            {
                columnToken = '';
                //srf -->
                isDescOrder = false;
                //srf <--
                while( strCount <= len && substr( columns, strCount, 1 ) != ',' && substr( columns, strCount, 1 ) != ' ' )
                {
                    columnToken += substr( columns, strCount, 1 );
                    strCount++;
                }
                //srf -->
                if (Global::strEndsWith(columnToken, descToken))
                {
                    isDescOrder = true;
                    columnToken = substr(columnToken, 1, strlen(columnToken) - strlen(descToken));
                }
                //srf <--
                if( this.generalFieldHandling( columnToken, columnNo ) )
                {
                    fldCnt++;
                    columnNo++;
                    fieldNames[fldCnt] = columnToken;
                    fieldNo[fldCnt]    = columnNo;
                    //srf -->
                    descendingOrder[fldCnt] = isDescOrder;
                    //srf <--
                }
                while( strCount <= len && substr( columns, strCount, 1 ) == ',' || substr( columns, strCount, 1 ) == ' ' )
                    strCount++;
            }
        }
    }
    this.completeIndex();
    xSession::setSysTraceActive(sysTraceActive);
}
После данного изменения при попытке проверки\синхронизации увидим вполне логичную надпись о том, что есть различия в порядке сортировки поля field1

Кстати, в AX 2009 - данный класс отсутсвует совсем, а проверка и синхронизация таблиц, была вынесена на уровень ядра.
За это сообщение автора поблагодарили: mazzy (2), Logger (2).
Старый 18.06.2009, 09:25   #15  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Я пробовал устанавливать параметр 16 для индексов (DATAAREA в конце индекса), но, честно говоря, не увидел никаких изменений в поведении системы. Кол-во блокировок осталось тем-же - в общем не нашел положительных моментов. На Оракле оставил как есть по дефолту.
Старый 31.12.2010, 12:50   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,936 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Blog bot Посмотреть сообщение
Источник: http://blogs.msdn.com/aeremenk/archi...14/825247.aspx
==============
Параметр должен быть указан в поле Advanced конфигурационной утилиты:
-internal=CROSSCOMPANY
Параметр позволяет добавлять вручную поле DATAAREAID в индекс, соответственно, можно самому определять порядок. Параметр не влияет на прочие индексы.


Источник: http://blogs.msdn.com/aeremenk/archi...14/825247.aspx
Похоже в 2009-й Аксапте этот параметр включен по умолчанию.
Причем это очень полезная фича когда используется запрос по многим компаниям, например тут
\Classes\LedgerJournalCheckPost\interCompanyTransferToCustPayment
генерится такой запрос

X++:
        select firstonly forceplaceholders crossCompany vendSettlement
               where vendSettlement.OffsetTransVoucher == ledgerJournalTrans.Voucher
                  && vendSettlement.OffsetCompany      == ledgerJournalTrans.Company
        join vendTrans
             where vendTrans.RecId      == vendSettlement.TransRecId
             &&    vendTrans.AccountNum == vendSettlement.AccountNum
             &&    vendTrans.Invoice;
а индекс
\Data Dictionary\Tables\VendSettlement\Indexes\OffsetVoucherIdx
с полями по dataareaId, OffsetTransVoucher - неоптимален. Причем чем больше компаний в базе тем сильнее эффект.
Достаточно запихнуть dataareaId в конец и все в порядке.
Теги
ax2009, ax3.0, crosscompany, индекс, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
aEremenko: Поддержка портала в DAX 4.0 на 64 бит Blog bot DAX Blogs 2 21.04.2008 18:13
aEremenko: Тестирование производительности в DAX 4.0 Blog bot DAX Blogs 0 12.03.2008 16:05
aEremenko: Как сопоставить пользователя DAX и сессию в Microsoft SQL? Blog bot DAX Blogs 2 04.10.2007 20:08
aEremenko: DAX 4.1 Blog bot DAX Blogs 0 04.03.2007 23:04
aEremenko: Порядок с драйверами от HP Blog bot DAX Blogs 0 28.10.2006 16:01

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

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

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