Использование прямых запросов SQL



Написание прямых SQL запросов для оптимизации производительности приложения было достаточно распространено среди партнеров и клиентов, использующих Microsoft Dynamics AX 3.0.


Вместе с тем, есть официальная позиция вендора, что в Microsoft Dynamics AX 4.0 и последующих версиях будет улучшаться X++ (обработка запросов ядром), но не работа с прямыми SQL запросами. Соответственно, желательно переводить свои запросы в код X++ для последующей оптимизации выполнения запросов ядром.


Более того, текущая ситуация такова, что Microsoft SQL Server 2005 SP2 обрабатывает прямые SQL запросы от  Microsoft Dynamics AX 4.0 лучше, чем Microsoft SQL Server 2005 RTM или SP1, но не настолько эффективно, как это было в Microsoft Dynamics AX 3.0.

Comments (2)

  1. Alexey Golubkov says:

    Microsoft SQL Server 2005 SP2 обрабатывает прямые SQL запросы от  Microsoft Dynamics AX 4.0 …. не настолько эффективно, как это было в Microsoft Dynamics AX 3.0


    Что-то в этой фразе не так, мне кажется.

    Почему SQL2005 стал обрабатывать запросы хуже?

    И как это зависит от версии DAX? Ведь структура прямого SQL-запроса от версии Аксапты никак не зависит.

  2. Согласен, несколько расплывчато, попробую детализировать. Сравниваются две  версии Microsoft Dynamics AX (3.0KR3 и 4.0SP1), работающие с одним и тем же сервером базы данных. Microsoft SQL Server 2005 упомянут потому, что тесты проводились на нем.

    Полностью быть независимым от ядра Microsoft Dynamics AX при запуске прямых SQL запросов не получится. Если запрос полностью подготовлен и выполнен на стороне сервера баз данных, то проблем нет. В случае, когда мы имеем некую обработку, то есть необходимость сохранения промежуточного результата в буфере. В этом случае вполне возможны варианты, при которых возникает задержка.

    Например:

    static void doReadCustTable()

    {

        SQLStatementExecutePermission         perm;

        connection                              connection;

        statement                                                     statement;

        resultset                                                       resultset;

        notes                                                             queryString;

        str                                                                   accountStr;

        ;

        connection = new connection();

        queryString +=     " SELECT   TOP (5000)  

                   CUSTTABLE.ACCOUNTNUM, CUSTTABLE.NAME,

                   CUSTTABLE.ADDRESS, CUSTTABLE.PHONE,      

                   CUSTTABLE.TELEFAX, ";

        queryString +=     " CUSTTABLE.INVOICEACCOUNT,

                  CUSTTABLE.CUSTGROUP ";

        queryString +=     " FROM     CUSTTABLE INNER JOIN ";

        queryString +=     " CUSTGROUP ON CUSTGROUP.CUSTGROUP

                  = CUSTTABLE.CUSTGROUP AND

                  CUSTGROUP.DATAAREAID = CUSTTABLE.DATAAREAID ";

        queryString +=      " WHERE     (CUSTTABLE.DATAAREAID =  ‘" +

                  appl.company().ext() + "’) AND

                  (CUSTGROUP.DATAAREAID =  ‘" + appl.company().ext() + "’) ";

        perm = new SQLStatementExecutePermission(QueryString);

        perm.assert();

        statement = connection.createStatement();

        resultset = statement.executeQuery(QueryString);

        if ( resultSet )

        {

            while ( resultset.next()) //–> Использование resultset

            {

                accountStr = resultSet.getString(1);

            }

        }

        CodeAccessPermission::revertAssert();

    }

    Использование resultset и последующая выборка конструкцией типа while(recordset.next()) занимает время.

    С точки зрения ‘заточки’ конкретного решения в некоторых случаях можно использовать прямые SQL запросы, но разрабатывать распространяемые (копируемые) решения не рекомендуется из-за необходимости поддерживать различную структуру запросов для Microsoft SQL Server и Oracle Database. Кроме того, это может привести к дополнительным затратам при обновлении версий как Microsoft Dynamics AX, так и серверов баз данных.

    Также использование запросов в коде X++ позволяют использовать возможности, недоступные для прямых SQL запросов:

    • Функциональность Optimistic Concurrency Control (OCC), управление целостностью чтения и записи

    • Обеспечение защиты данных (Безопасность на уровне записей – RLS, аутентикакция на уровне таблиц, проверка доступа AOS и т.п.)

    • Кэширование данных

    • …

Skip to main content