|
16.05.2007, 11:51 | #1 |
Участник
|
Что лучше select RecId или select TableId
PHP код:
\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 |
Модератор
|
Осторожно: в 4ке RecId уникальный по каждой таблице. Будет работать только связка TableId - RecId.
И, вообще, вязаться по RecId - порочная практика... но от кода не уйдешь С Уважением, Георгий |
|
16.05.2007, 12:22 | #3 |
Участник
|
Цитата:
я имел в виду другое. Судя по всему автор кода хотел снизить объем выборки из базы поэтому поставил выборку поля RecID - потому как таблицы factureTrans markupTrans custVendInvoiceTrans джойнятся здесь не для выборки из них данных а для фильтрации. Они играют роль фильтра. Непонятно только почему указано select recId когда можно вообще никакие поля не выбирать из базы. Так должно работать быстрее. Вот хочу понять это просто недочет разработчиков или специально так написано и select TableID нельзя было писать. |
|
16.05.2007, 12:36 | #4 |
Участник
|
Думаю, самый простой способ - попробовать проверить
Если смотреть только тот код, который приведен здесь - вроде как да, TableId подойдет и теоретически ускорит. |
|
21.05.2007, 10:30 | #5 |
Участник
|
Цитата:
Сообщение от Logger
Встретил такой код в
\Data Dictionary\Maps\CustVendInvoiceJour\Methods\factureJourSortedList_RU Из таблиц factureTrans, markupTrans, custVendInvoiceTrans выбирается поле recId но нигде не используется. Можно было бы просто написать join TableId from factureTrans join TableId from markupTrans join TableId from custVendInvoiceTrans Запрос должен получиться легче. У кого какие мысли ? X++: select firstonly markupTrans join markupTable where markupTable.markupCode == markupTrans.markupCode; X++: select firstonly markupTrans join recId from markupTable where markupTable.markupCode == markupTrans.markupCode; Цитата:
Последний раз редактировалось gl00mie; 21.05.2007 в 10:34. |
|
21.05.2007, 10:54 | #6 |
Участник
|
Цитата:
tableId - псевдополе, которое никогда не хранится в таблице (его подставляет ядро). dataAreaId - может хранится в таблице, а может не хранится (для общих таблиц). recid - хранится всегда (даже для временных таблиц). Если поле не хранится в таблице, то ядро может и не отправить запрос на SQL сервер. Сравните с поведением выключенных лицензионными/конфигурационными ключами таблиц. Возвращаясь к первоначальному вопросу Цитата:
join TableId from factureTrans
join TableId from markupTrans join TableId from custVendInvoiceTrans Запрос должен получиться легче. Строка с запросом просто может не содержать join'ов В общем, в запросе должно участвовать хотя бы одно хранимое и включенное поле. |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
02.06.2007, 00:25 | #7 |
Участник
|
Просто при использовании join TableId необходимо, чтобы на таблицу, которая так присоединяется, накладывались фильтры. Тогда по идее отработает как положено
А вот если ни одного фильтра нет, то вместо выбора всех значений, для которых есть соответствие во второй таблице (exists join, по сути), см. пост ниже(можем получить все данные, потому что таблица не будет включена в запрос) Это мне так кажется только, на самом деле. Надо это еще проверить, чтобы утверждать наверняка. Попробую сделать это на след. неделе Последний раз редактировалось kashperuk; 02.06.2007 в 12:07. |
|
02.06.2007, 09:54 | #8 |
Участник
|
Э...
А на основании чего родилась уверенность, что использование 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 | #9 |
Участник
|
Цитата:
Когда-то в какой-то версии и в каком-то сервис-паке было такое поведение. С тех пор сформулировал для себя такое правило. В последних версиях и сервис-паках не проверял. |
|
16.05.2007, 13:03 | #10 |
Злыдни
|
|
|