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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2009, 14:09   #1  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Didukh84 Посмотреть сообщение
Добрый день.
Возможно это уже обсуждалось, но полной информации я, к сожалению, не нашел :-(
Выполняется аксаптовский код
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans
where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
На профайлере SQL отлавливаю данный запрос. Получаю следующее

exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(1000),@P2 varchar(1000),@P3 int,@P4 int,@P5 varchar(1000)',N'SELECT SUM(A.COSTAMOUNTPOSTED),SUM(A.COSTAMOUNTADJUSTMENT) FROM INVENTTRANS A(INDEX(I_177STATUSITEMIDX)) WHERE ((DATAAREAID=@P1) AND ((((INVENTTRANSID=@P2) AND (STATUSISSUE=@P3)) AND (STATUSRECEIPT=@P4)) AND (INVOICEID=@P5))) OPTION(FAST 2)',@p5 output,@p6 output,@p7 output,'guk',' 03045451',0,1,' 90003347'

Вопрос в следующем, откуда взялся хинт по индексу I_177STATUSITEMIDX? Насколько я понимаю индекс приходит уже с приложения (проверял через Query Analyzer без него - работает быстрее и индекс берется другой). Я так понимаю, аксапта где-то хранит у себя в кеше или еще где-то данный индекс. Где это можно посмотрет? Чем руководствуется Система, когда сюда его подцепляет (данный индекс неоптимален ( )
Заранее благодарю за помощь
Версия аксапты AX3Sp3CU1, версия сервера БД SQL2005 SP2 x64, версия ОС - Win2003SP2 x64
А вы уверены, что в AX именно такой код выполняется?
X++:
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
А не такой :
X++:
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans
index hint StatusItemIdx
where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
Я так понимаю, что когда выполняется данный запрос в QA подхватывается индекс TransIdIdx?

1. Напишите джоб с данным запросом, и посмотрите, что уйдет на SQL(потом поставьте index hint TransIdIdx)

2. Вообще использование данного индекса в запросе (StatusItemIdx) навязывается самой аксаптой при помощи index hint(если функционал дорабатывался советую поискать подобный запрос и убрать hint должно стать лучше), однако если я не ошибаюсь в 4 в настройках АОС(на вкладке DataBase Tuning есть 'Allow Index Hints in queries' и если он установлен, то будет использоваться index, который навязан AX, а не тот, который СУБД посчитает лучшим). Посмотрите есть ли у вас подобный параметр(к сожалению тройки под рукой нет) и установлен ли он?
(P.S. С даным параметром нужно быть придельно аккуратным)

Последний раз редактировалось SRF; 28.05.2009 в 14:11. Причина: Опечатки
Старый 28.05.2009, 14:40   #2  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Цитата:
Сообщение от SRF Посмотреть сообщение
А вы уверены, что в AX именно такой код выполняется?
X++:
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
Попроовала у себя - аксапта тоже выдала запрос "SELECT SUM(A.COSTAMOUNTPOSTED),SUM(A.COSTAMOUNTADJUSTMENT) FROM INVENTTRANS A(INDEX(I_177INVENTTRANSIDSTATUSR20002))" подставив откуда то (???) свой индекс хинт. Замечала подобное поведение и на других запросах.
В 3-шке параметра 'Allow Index Hints in queries' нет.
Старый 28.05.2009, 15:31   #3  
Didukh84 is offline
Didukh84
Участник
 
57 / 10 (1) +
Регистрация: 09.06.2006
Цитата:
Сообщение от ViV Посмотреть сообщение
Попроовала у себя - аксапта тоже выдала запрос "SELECT SUM(A.COSTAMOUNTPOSTED),SUM(A.COSTAMOUNTADJUSTMENT) FROM INVENTTRANS A(INDEX(I_177INVENTTRANSIDSTATUSR20002))" подставив откуда то (???) свой индекс хинт. Замечала подобное поведение и на других запросах.
В 3-шке параметра 'Allow Index Hints in queries' нет.
да, к сожалению . Кстати, еще наблюдал в ГК tablescan по ledgerTrans хотя в коде прописано
X++:
    qBd.addSortIndex(indexnum(LedgerTrans, BondBatchIdx_RU));
а потом добавлено было
X++:
qbd.indexIsHint(true);
но tablescan все равно запускается (на SQL запрос приходит без индекса!) (
__________________
Жить все веселей!.. AX3SP3CU1
Старый 28.05.2009, 15:35   #4  
ViV is offline
ViV
Axapta Retail User
Самостоятельные клиенты AX
Axapta Retail User
 
200 / 79 (3) ++++
Регистрация: 14.09.2005
Цитата:
Сообщение от AndyD Посмотреть сообщение
Это ядро Аксапты, начиная с какого-то из KR-ов, вставляет собственные хинты.
У нас ни одного из KR не стоит.
Старый 28.05.2009, 15:23   #5  
Didukh84 is offline
Didukh84
Участник
 
57 / 10 (1) +
Регистрация: 09.06.2006
Цитата:
Сообщение от SRF Посмотреть сообщение
А вы уверены, что в AX именно такой код выполняется?
X++:
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
А не такой :
X++:
select sum(CostAmountPosted), sum(CostAmountAdjustment) from inventTrans
index hint StatusItemIdx
where inventTrans.InventTransId == '03045451' &&
inventTrans.StatusIssue == StatusIssue::None &&
inventTrans.StatusReceipt == StatusReceipt::Purchased &&
inventTrans.InvoiceId == '90003347';
Я так понимаю, что когда выполняется данный запрос в QA подхватывается индекс TransIdIdx?
да уверене. Проверял на джобе
Цитата:
Сообщение от SRF Посмотреть сообщение
1. Напишите джоб с данным запросом, и посмотрите, что уйдет на SQL(потом поставьте index hint TransIdIdx)
написал. В первом случае то, что написано выше, а во-втором с TransIdIdx.
P.S. даже и хинта не нужно: просто index TransIdIdx хватило ;-)
__________________
Жить все веселей!.. AX3SP3CU1
Теги
hint, index, kernel rollup, полезное, ax3.0, kr (kernel rollup)

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не работает трассировка SQL Corel DAX: Администрирование 2 20.05.2009 11:30
Не работает индекс в отчете dreamer DAX: Программирование 8 10.07.2008 16:00
aEremenko: Использование прямых запросов SQL Blog bot DAX Blogs 4 18.07.2007 10:09
JOIN программно на форме не работает rohlenko DAX: Программирование 2 31.03.2005 15:41
CRM ABC, SWOT анализ Как это работает и работает ли вообще. ShadowFromXZone DAX: Функционал 16 02.03.2004 18:09

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

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

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