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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.05.2007, 11:51   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Что лучше select RecId или select TableId
PHP код:
        while select factureJour
            join RecId from factureTrans
            join RecId from markupTrans
            join RecId from custVendInvoiceTrans
            where factureJour
.Module                 == module                       &&
                  
factureJour.CustVendInvoiceAccount == this.InvoiceAccount          &&
                  
factureTrans.FactureId             == factureJour.FactureId        &&
                  
factureTrans.Module                == module                       &&
                  
factureTrans.FactureLineType       == FactureLineType_RU::Markup   &&
                  
markupTrans.RecId                  == factureTrans.MarkupRefRecId  &&
                  
markupTrans.TransTableId           == custVendInvoiceTrans.TableId &&
                  
custVendInvoiceTrans.RecId         == markupTrans.TransRecId       &&
                  
custVendInvoiceTrans.SalesPurchId  == this.Num                     &&
                  
custVendInvoiceTrans.InvoiceNum    == this.InvoiceId               &&
                  (
module == FactureModule_RU::Cust  ||
                   (
module == FactureModule_RU::Vend  &&
                    
custVendInvoiceTrans.PurchInternalInvoiceId == this.PurchInternalInvoiceId)) &&
                  
custVendInvoiceTrans.InvoiceDate  == this.InvoiceDate             &&
                  
custVendInvoiceTrans.NumberSequenceGroupId
                                                    
== this.NumberSequenceGroupId
        
{
            if ( ! 
ret.find(factureJour))
            {
                
ret.ins(factureJour);
            }
        } 
Встретил такой код в
\Data Dictionary\Maps\CustVendInvoiceJour\Methods\factureJourSortedList_RU

Из таблиц
factureTrans
markupTrans
custVendInvoiceTrans

выбирается поле recId но нигде не используется.
Можно было бы просто написать
join TableId from factureTrans
join TableId from markupTrans
join TableId from custVendInvoiceTrans
Запрос должен получиться легче.

У кого какие мысли ?
Старый 16.05.2007, 11:54   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Осторожно: в 4ке RecId уникальный по каждой таблице. Будет работать только связка TableId - RecId.

И, вообще, вязаться по RecId - порочная практика... но от кода не уйдешь

С Уважением,
Георгий
Старый 16.05.2007, 12:22   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от George Nordic Посмотреть сообщение
Осторожно: в 4ке RecId уникальный по каждой таблице. Будет работать только связка TableId - RecId.
неее...
я имел в виду другое.
Судя по всему автор кода хотел снизить объем выборки из базы поэтому поставил выборку поля RecID - потому как таблицы
factureTrans
markupTrans
custVendInvoiceTrans
джойнятся здесь не для выборки из них данных а для фильтрации. Они играют роль фильтра.

Непонятно только почему указано select recId
когда можно вообще никакие поля не выбирать из базы.

Так должно работать быстрее.

Вот хочу понять это просто недочет разработчиков или специально так написано и select TableID нельзя было писать.
Старый 16.05.2007, 12:36   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Думаю, самый простой способ - попробовать проверить

Если смотреть только тот код, который приведен здесь - вроде как да, TableId подойдет и теоретически ускорит.
Старый 16.05.2007, 13:03   #5  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от otkudao Посмотреть сообщение
a exists join не ускорит?
exists join в общем случае замедляет по моим наблюдениям, поскольку на сервер уходит подзапрос
Старый 21.05.2007, 10:30   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Встретил такой код в
\Data Dictionary\Maps\CustVendInvoiceJour\Methods\factureJourSortedList_RU

Из таблиц factureTrans, markupTrans, custVendInvoiceTrans выбирается поле recId но нигде не используется. Можно было бы просто написать
join TableId from factureTrans
join TableId from markupTrans
join TableId from custVendInvoiceTrans
Запрос должен получиться легче. У кого какие мысли ?
В Аксапте все немного не так, как в обычном SQL Если просто написать, скажем, такое
X++:
select      firstonly markupTrans
    join    markupTable
    where   markupTable.markupCode == markupTrans.markupCode;
то будут выбираться все поля как из MarkupTrans, так и из MarkupTable. Поэтому запрос вида
X++:
select      firstonly  markupTrans
    join    recId from markupTable
    where   markupTable.markupCode == markupTrans.markupCode;
будет "легче" с той точки зрения, что из MarkupTable будет явно выбираться только поле recId (которое и так выбирается, если в запросе нет агрегирующих фукнций), а не все поля подряд.
Цитата:
Сообщение от Logger Посмотреть сообщение
Вот хочу понять это просто недочет разработчиков или специально так написано и select TableID нельзя было писать.
Можно было написать и select tableId, и даже select dataAreaId - разницы не будет никакой


Последний раз редактировалось gl00mie; 21.05.2007 в 10:34.
Старый 21.05.2007, 10:54   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Можно было написать и select tableId, и даже select dataAreaId - разницы не будет никакой
Не так малешко. Разница будет.

tableId - псевдополе, которое никогда не хранится в таблице (его подставляет ядро).
dataAreaId - может хранится в таблице, а может не хранится (для общих таблиц).
recid - хранится всегда (даже для временных таблиц).

Если поле не хранится в таблице, то ядро может и не отправить запрос на SQL сервер.
Сравните с поведением выключенных лицензионными/конфигурационными ключами таблиц.

Возвращаясь к первоначальному вопросу
Цитата:
join TableId from factureTrans
join TableId from markupTrans
join TableId from custVendInvoiceTrans
Запрос должен получиться легче.
запрос действительно может получится легче.
Строка с запросом просто может не содержать join'ов

В общем, в запросе должно участвовать хотя бы одно хранимое и включенное поле.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: gl00mie (3).
Старый 02.06.2007, 00:25   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Просто при использовании join TableId необходимо, чтобы на таблицу, которая так присоединяется, накладывались фильтры. Тогда по идее отработает как положено

А вот если ни одного фильтра нет, то вместо выбора всех значений, для которых есть соответствие во второй таблице (exists join, по сути), см. пост ниже(можем получить все данные, потому что таблица не будет включена в запрос)

Это мне так кажется только, на самом деле. Надо это еще проверить, чтобы утверждать наверняка. Попробую сделать это на след. неделе

Последний раз редактировалось kashperuk; 02.06.2007 в 12:07.
Старый 02.06.2007, 09:54   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Э...
А на основании чего родилась уверенность, что использование tableId приведет к отбрасыванию таблицы в запросе?
Кстати, даже отбрасывание where приведет к декартовому соединению, но в запросе будут участвовать все таблицы.

PS Еще. В исходном запросе для таблицы FactureTrans_RU (factureTrans) помимо recId так же выбираются поля, входящие в индекс FactureIdx (FACTUREID, LINENUM, MODULE)
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 02.06.2007 в 10:12.
Старый 02.06.2007, 15:13   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
А на основании чего родилась уверенность, что использование tableId приведет к отбрасыванию таблицы в запросе?
Это не уверенность, а скорее "суеверие".

Когда-то в какой-то версии и в каком-то сервис-паке было такое поведение.
С тех пор сформулировал для себя такое правило.
В последних версиях и сервис-паках не проверял.
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Select count(RecId) Упорядочить по возрастанию AxTimur DAX: Программирование 7 10.10.2008 15:22
Очередные грабли while select CasperSKY DAX: Программирование 14 23.03.2008 12:30
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Fred Shen: Always use recId to know if a select statement returns a record Blog bot DAX Blogs 0 28.10.2006 16:40
select count(RecId) DreamCreator DAX: Программирование 10 02.08.2005 12:50

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

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

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