Condividi tramite


Использование прямых запросов 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

  • Anonymous
    July 16, 2007
    Microsoft SQL Server 2005 SP2 обрабатывает прямые SQL запросы от  Microsoft Dynamics AX 4.0 .... не настолько эффективно, как это было в Microsoft Dynamics AX 3.0Что-то в этой фразе не так, мне кажется.Почему SQL2005 стал обрабатывать запросы хуже?И как это зависит от версии DAX? Ведь структура прямого SQL-запроса от версии Аксапты никак не зависит.
  • Anonymous
    July 19, 2007
    Согласен, несколько расплывчато, попробую детализировать. Сравниваются две  версии 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 и т.п.)• Кэширование данных• …