|
![]() |
#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 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'; 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. Причина: Опечатки |
|
![]() |
#2 |
Axapta Retail User
|
Цитата:
Сообщение от 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'; В 3-шке параметра 'Allow Index Hints in queries' нет. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от ViV
![]() Попроовала у себя - аксапта тоже выдала запрос "SELECT SUM(A.COSTAMOUNTPOSTED),SUM(A.COSTAMOUNTADJUSTMENT) FROM INVENTTRANS A(INDEX(I_177INVENTTRANSIDSTATUSR20002))" подставив откуда то (???) свой индекс хинт. Замечала подобное поведение и на других запросах.
В 3-шке параметра 'Allow Index Hints in queries' нет. ![]() X++: qBd.addSortIndex(indexnum(LedgerTrans, BondBatchIdx_RU)); X++: qbd.indexIsHint(true); ![]()
__________________
Жить все веселей!.. AX3SP3CU1 ![]() |
|
![]() |
#4 |
Axapta Retail User
|
|
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от 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'; Цитата:
P.S. даже и хинта не нужно: просто index TransIdIdx хватило ;-)
__________________
Жить все веселей!.. AX3SP3CU1 ![]() |
|
Теги |
hint, index, kernel rollup, полезное, ax3.0, kr (kernel rollup) |
|
|