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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.07.2007, 17:26   #1  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Выборка лишних полей ( kr2 )
Почему из

X++:
        ret = (select firstOnly startDate from UKS_VillageTask
            where UKS_VillageTask.VillageID == this.VillageID
                  &&
                  UKS_VillageTask.TaskType == _type
        ).startDate;
получается вот такой SQL?

Код:
SELECT A.VILLAGEID,A.TASKTYPE,A.STARTDATE,A.ENDDATE,A.ENABLED,A.MODIFIEDDATE,A.MODIFIEDTIME,A.MODIFIEDBY,A.MODIFIEDTRANSACTIONID,A.CREATEDDATE,A.CREATEDTIME,A.CREATEDBY,A.CREATEDTRANSACTIONID,A.RECVERSION,A.RECID FROM UKS_VILLAGETASK A WITH( INDEX(I_50984VILLAGETASKIDX)) WHERE ((DATAAREAID=?) AND ((VILLAGEID=?) AND (TASKTYPE=?))) OPTION(FAST 2)
CacheLookup == None
За это сообщение автора поблагодарили: petr (1).
Старый 27.07.2007, 18:04   #2  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
В inside Dax читал что то про то что среда исполнения работает с record и поэтому ей трудно определять какие поля выбираются, из за этого шарашит по всем
Хотя конечно не красиво получается.
Старый 27.07.2007, 19:06   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
нет под рукой приложения с KR2, но на KR3 и LedgerTrans не воспроизводится

X++:
static void fieldListTest(Args _args)
{
    Voucher voucher()
    {
        Voucher     ret;
        ;

        ret = (select firstonly Voucher from LedgerTrans where LedgerTrans.Correct).Voucher;
        return ret;
    }
    ;

    print voucher();
    pause;
}
приводит к
X++:
SELECT A.VOUCHER,A.RECID,A.RECVERSION 
FROM LEDGERTRANS A 
WHERE ((DATAAREAID=@P1/*''hrm''*/) AND (CORRECT=@P2/*1*/)) 
OPTION(FAST 2)
__________________
-ТСЯ или -ТЬСЯ ?
Старый 30.07.2007, 09:08   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Странно, но н других таблицах у меня тоже не воспроизводится.
Старый 30.07.2007, 14:46   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Путем экспериментов и с помощью других людей выяснилось:
*если в условии только одно поле, которое проиндексированно уникальным индексом - в выборку попадают все поля
*если добавить еще условий то количество полей в выборке снижается, но индексированное поле остается
За это сообщение автора поблагодарили: gl00mie (9).
Старый 31.07.2007, 19:19   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
У меня тоже не воспроизвелось, тестировал на SP3 CU1, KR2, KR3, делал выборку CustTable.AccountNum (там есть уникальный индекс по этому полю). Получались такие результаты.
AX 3.0 SP3 CU1, база Oracle (всякие SUBSTR(NLS_LOWER()), видимо - заморочки админов СУБД):
X++:
SELECT A.ACCOUNTNUM,A.RECID
FROM   CUSTTABLE A 
WHERE  ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER('dat')) AND
   NOT ((SUBSTR(NLS_LOWER(ACCOUNTNUM),1,10)=NLS_LOWER('        00'))))
ORDER BY SUBSTR(NLS_LOWER(A.DATAAREAID),1,3),
         SUBSTR(NLS_LOWER(A.ACCOUNTNUM),1,10)
AX 3.0 KR2, база SQL 2005:
X++:
SELECT A.ACCOUNTNUM,A.RECID,A.RECVERSION
FROM   CUSTTABLE A
WHERE ((DATAAREAID='dat') AND NOT ((ACCOUNTNUM='          00')))
ORDER BY A.DATAAREAID,A.ACCOUNTNUM OPTION(FAST 9)
AX 3.0 KR3, база опять Oracle:
X++:
SELECT A.ACCOUNTNUM,A.RECID,A.RECVERSION 
FROM   CUSTTABLE A 
WHERE  ((SUBSTR(NLS_LOWER(DATAAREAID),1,3)=NLS_LOWER('dat')) AND  
   NOT ((SUBSTR(NLS_LOWER(ACCOUNTNUM),1,10)=NLS_LOWER('        00')))) 
ORDER BY SUBSTR(NLS_LOWER(A.DATAAREAID),1,3),
         SUBSTR(NLS_LOWER(A.ACCOUNTNUM),1,10)
Старый 31.07.2007, 19:21   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
У меня вопсроизводится с EmplTable на kr2 и Ax4 (см. блогпост)
SQL2k5
Старый 31.07.2007, 19:23   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
А почему NOT?

X++:
str name=(select name from EmplTable where EmplTable.emplID=='1').name;
Старый 31.07.2007, 19:30   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
для != действительно генерируется корректно
Старый 01.08.2007, 09:39   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от belugin Посмотреть сообщение
А почему NOT?
X++:
str name=(select name from EmplTable where EmplTable.emplID=='1').name;
С условием на равенство действительно выбирает все поля, по крайней мере на SP3 CU1 и KR2 (базы, соотв., Oracle и SQL 2005)
Старый 01.08.2007, 09:59   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
EmplTable - явно неудачный пример, потому, что там кеширование есть. Но я пробовал и на спеуиально созданной таблице с None
Старый 01.08.2007, 10:52   #12  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Можно попробовать даже на emplTable с уникальным ключом перед выборкой выплнить следующий метод emplTable.disableCache(true). Это во-первых однозначно отправит запрос на сервер, т.е. не будет смотреть в кэш и во-вторых предотвратит выборку всех полей, т.е. будут выбираться только поля, которые указаны в запросе. Т.е. запрос будет работать полностью аналогично тому который получается при выборке с указанием дополнительног условия, кроме range по уникальному индексу.
За это сообщение автора поблагодарили: belugin (5).
Старый 01.08.2007, 11:01   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Интересно, что это (disableCache) работает даже с CacheLookup==None.

X++:
Table1 Table1;
;
Table1.disableCache(true);
select field2 from Table1 where Table1.Field1=='';
Правда поле в условии все равно выбирается:
X++:
(Table1) SELECT A.FIELD2,A.FIELD1,101090 FROM TABLE1 A WHERE ((DATAAREAID=?) AND (FIELD1=?))
А вот так без индекса:
X++:
SELECT A.FIELD2,A.RECID FROM TABLE1 A WHERE ((DATAAREAID=?) AND (FIELD1=?))
Старый 01.08.2007, 11:08   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Причем при cacheLookup == None кеширования реально не происходит
Старый 01.08.2007, 11:17   #15  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Насчет того, почему Аксапта кэширует записи даже если cacheLookup=None я никакой информации пока не нашел. Возможно она считет, что если есть первичный индекс то кэширование в любом случае надо применять. Но это только предположение.

Как говориться, будем искать...
Старый 01.08.2007, 11:18   #16  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Тогда исправлю в предыдущем посте: не кэширует, а выбирает так как будто собирается кэшировать

Последний раз редактировалось petr; 01.08.2007 в 11:19. Причина: ошибка
Старый 01.08.2007, 11:20   #17  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Вот воспроизведение на стандартном ф-ле
X++:
(select ItemID from InventTrans where 
InventTrans.InventTransID=='s'
&&
InventTrans.InventDimID == '2'
&&
InventTrans.recID==100).ItemID
Старый 01.08.2007, 11:35   #18  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Свинство, конечно. Но мне кажется, это - одна из фичей, о которой лучше не знать. Либо надо сразу сообщить о ней в Microsoft. Как заметил мой коллега, если еще держать в уме, что Аксапта будет сопротивляться попыткам повысить ее производительность, жизнь программиста превращается в ад.
Старый 01.08.2007, 11:36   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Проверю на Ax5 и сообщу в MS через TAP - мне одинг мелкий ненужный баг уже поправили
Старый 01.08.2007, 11:38   #20  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Может быть алгоритм кэширования такой:

1. Если есть первичный индекс, в запросе в условиях равенства по всем полям индекса и нет других полей, и небыло на данной таблично переменной выполнено метода disableCache(true) - тогда "тут возможно кэширование", т.е. смотрим кэш, если в нем есть данная запись берем из кэша ,если нет то "готовимся к кэшированию" (не смотря какой установлен cacheLookup) и в запрос, если в нем выбираются не все поля, добавляем все поля и отправляем такой модифицированный запрос на SQL-сервер.

2. Когда результаты вернулить в зависимость от того, какое кэшироване настроено (например found или none), то либо записать выбранную запись в кэш, либо нет.
Теги
ax3.0, ax4.0, cache lookup, query, t-sql

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Upgrade с AX 3.0 SP2 до AX 3.0 SP5 KR2 vallys DAX: Администрирование 14 04.08.2008 11:31
оптимальное кол-во полей в таблице SHiSHok DAX: Программирование 9 30.04.2008 18:31
Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map? LRA DAX: База знаний и проекты 15 02.04.2007 13:37
Выборка полей из разных таблиц oleg_e DAX: Программирование 2 09.10.2006 12:11
очистка полей. простой вопрос Антон Солдатов DAX: Программирование 4 04.04.2003 10:28

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

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

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