27.07.2007, 17:26 | #1 |
Участник
|
Выборка лишних полей ( kr2 )
Почему из
X++: ret = (select firstOnly startDate from UKS_VillageTask where UKS_VillageTask.VillageID == this.VillageID && UKS_VillageTask.TaskType == _type ).startDate; Код: 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) |
|
|
За это сообщение автора поблагодарили: petr (1). |
27.07.2007, 18:04 | #2 |
MCT
|
В inside Dax читал что то про то что среда исполнения работает с record и поэтому ей трудно определять какие поля выбираются, из за этого шарашит по всем
Хотя конечно не красиво получается. |
|
27.07.2007, 19:06 | #3 |
Модератор
|
нет под рукой приложения с 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 |
Участник
|
Странно, но н других таблицах у меня тоже не воспроизводится.
|
|
30.07.2007, 14:46 | #5 |
Участник
|
Путем экспериментов и с помощью других людей выяснилось:
*если в условии только одно поле, которое проиндексированно уникальным индексом - в выборку попадают все поля *если добавить еще условий то количество полей в выборке снижается, но индексированное поле остается |
|
|
За это сообщение автора поблагодарили: gl00mie (9). |
31.07.2007, 19:19 | #6 |
Участник
|
У меня тоже не воспроизвелось, тестировал на 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) 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) 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 |
Участник
|
У меня вопсроизводится с EmplTable на kr2 и Ax4 (см. блогпост)
SQL2k5 |
|
31.07.2007, 19:23 | #8 |
Участник
|
А почему NOT?
X++: str name=(select name from EmplTable where EmplTable.emplID=='1').name; |
|
31.07.2007, 19:30 | #9 |
Участник
|
для != действительно генерируется корректно
|
|
01.08.2007, 09:39 | #10 |
Участник
|
|
|
01.08.2007, 09:59 | #11 |
Участник
|
EmplTable - явно неудачный пример, потому, что там кеширование есть. Но я пробовал и на спеуиально созданной таблице с None
|
|
01.08.2007, 10:52 | #12 |
Участник
|
Можно попробовать даже на emplTable с уникальным ключом перед выборкой выплнить следующий метод emplTable.disableCache(true). Это во-первых однозначно отправит запрос на сервер, т.е. не будет смотреть в кэш и во-вторых предотвратит выборку всех полей, т.е. будут выбираться только поля, которые указаны в запросе. Т.е. запрос будет работать полностью аналогично тому который получается при выборке с указанием дополнительног условия, кроме range по уникальному индексу.
|
|
|
За это сообщение автора поблагодарили: belugin (5). |
01.08.2007, 11:01 | #13 |
Участник
|
Интересно, что это (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 |
Участник
|
Причем при cacheLookup == None кеширования реально не происходит
|
|
01.08.2007, 11:17 | #15 |
Участник
|
Насчет того, почему Аксапта кэширует записи даже если cacheLookup=None я никакой информации пока не нашел. Возможно она считет, что если есть первичный индекс то кэширование в любом случае надо применять. Но это только предположение.
Как говориться, будем искать... |
|
01.08.2007, 11:18 | #16 |
Участник
|
Тогда исправлю в предыдущем посте: не кэширует, а выбирает так как будто собирается кэшировать
Последний раз редактировалось petr; 01.08.2007 в 11:19. Причина: ошибка |
|
01.08.2007, 11:20 | #17 |
Участник
|
Вот воспроизведение на стандартном ф-ле
X++: (select ItemID from InventTrans where InventTrans.InventTransID=='s' && InventTrans.InventDimID == '2' && InventTrans.recID==100).ItemID |
|
01.08.2007, 11:35 | #18 |
Banned
|
Свинство, конечно. Но мне кажется, это - одна из фичей, о которой лучше не знать. Либо надо сразу сообщить о ней в Microsoft. Как заметил мой коллега, если еще держать в уме, что Аксапта будет сопротивляться попыткам повысить ее производительность, жизнь программиста превращается в ад.
|
|
01.08.2007, 11:36 | #19 |
Участник
|
Проверю на Ax5 и сообщу в MS через TAP - мне одинг мелкий ненужный баг уже поправили
|
|
01.08.2007, 11:38 | #20 |
Участник
|
Может быть алгоритм кэширования такой:
1. Если есть первичный индекс, в запросе в условиях равенства по всем полям индекса и нет других полей, и небыло на данной таблично переменной выполнено метода disableCache(true) - тогда "тут возможно кэширование", т.е. смотрим кэш, если в нем есть данная запись берем из кэша ,если нет то "готовимся к кэшированию" (не смотря какой установлен cacheLookup) и в запрос, если в нем выбираются не все поля, добавляем все поля и отправляем такой модифицированный запрос на SQL-сервер. 2. Когда результаты вернулить в зависимость от того, какое кэшироване настроено (например found или none), то либо записать выбранную запись в кэш, либо нет. |
|
Теги |
ax3.0, ax4.0, cache lookup, query, t-sql |
|
|