Имя: Пароль:
1C
1С v8
Имеет ли права на жизнь такой запрос?
,
0 H A D G E H O G s
 
21.02.13
14:53
День добрый.

Вот есть у нас запрос вида:

ВЫБРАТЬ ПЕРВЫЕ 1
   ТоварыОрганизаций.Регистратор,
   ТоварыОрганизаций.Количество
ПОМЕСТИТЬ Движения
ИЗ
   РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
ГДЕ
   (ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
           ИЛИ ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Движения.Регистратор,
   Движения.Регистратор.Дата,
   Движения.Количество
ИЗ
   Движения КАК Движения


посмотрел я на него в профайлере и ужаснулся. И преобразовал к виду:

ВЫБРАТЬ ПЕРВЫЕ 1
   ВЫБОР
       КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
           ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ПоступлениеТоваровУслуг)
       КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
           ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ВозвратТоваровОтПокупателя)
   КОНЕЦ КАК Регистратор,
   ТоварыОрганизаций.Количество
ПОМЕСТИТЬ Движения
ИЗ
   РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
ГДЕ
   (ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
           ИЛИ ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Движения.Количество,
   Движения.Регистратор,
   Движения.Регистратор.Дата
ИЗ
   Движения КАК Движения


В профайлере все стало красиво, но стоит ли так делать?
1 ДенисЧ
 
21.02.13
14:53
ЗАпрос - имеет право.
А вот писатель такого - не имеет :-)
2 H A D G E H O G s
 
21.02.13
14:53
Собственно, вот сама суть, а то форум форматит текст ужасно:

ВЫБОР
       КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

          ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ПоступлениеТоваровУслуг)
      КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

           ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ВозвратТоваровОтПокупателя)
   КОНЕЦ
3 rs_trade
 
21.02.13
14:54
(0) Дык вроде так и надо
4 Defender aka LINN
 
21.02.13
14:54
И что ж в профайлере такого жуткого было?
5 H A D G E H O G s
 
21.02.13
14:54
(3) Ни разу такого изврата не встречал.
6 H A D G E H O G s
 
21.02.13
14:54
Было:

exec sp_executesql N'SELECT
T1._Q_000_F_000TRef,
T1._Q_000_F_000RRef,
CASE WHEN T1._Q_000_F_000TRef = 0x0000018B THEN T2._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000010C THEN T3._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000012C THEN T4._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001FF THEN T5._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000199 THEN T6._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000127 THEN T7._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001A1 THEN T8._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000012B THEN T9._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001DC THEN T10._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001C2 THEN T11._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001CA THEN T12._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000129 THEN T13._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000019C THEN T14._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001C1 THEN T15._Date_Time WHEN T1._Q_000_F_000TRef = 0x00005402 THEN T16._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000019E THEN T17._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000016E THEN T18._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001DB THEN T19._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000012A THEN T20._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001A4 THEN T21._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001D2 THEN T22._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000132 THEN T23._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000196 THEN T24._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001C8 THEN T25._Date_Time WHEN T1._Q_000_F_000TRef = 0x00005403 THEN T26._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000018A THEN T27._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000167 THEN T28._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000016F THEN T29._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000171 THEN T30._Date_Time WHEN T1._Q_000_F_000TRef = 0x00000106 THEN T31._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001F7 THEN T32._Date_Time WHEN T1._Q_000_F_000TRef = 0x000001BD THEN T33._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000010D THEN T34._Date_Time ELSE CAST(NULL AS DATETIME) END,
T1._Q_000_F_001
FROM #tt1 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Document395 T2 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P1 AND T1._Q_000_F_000RRef = T2._IDRRef
LEFT OUTER JOIN _Document268 T3 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P2 AND T1._Q_000_F_000RRef = T3._IDRRef
LEFT OUTER JOIN _Document300 T4 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P3 AND T1._Q_000_F_000RRef = T4._IDRRef
LEFT OUTER JOIN _Document511 T5 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P4 AND T1._Q_000_F_000RRef = T5._IDRRef
LEFT OUTER JOIN _Document409 T6 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P5 AND T1._Q_000_F_000RRef = T6._IDRRef
LEFT OUTER JOIN _Document295 T7 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P6 AND T1._Q_000_F_000RRef = T7._IDRRef
LEFT OUTER JOIN _Document417 T8 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P7 AND T1._Q_000_F_000RRef = T8._IDRRef
LEFT OUTER JOIN _Document299 T9 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P8 AND T1._Q_000_F_000RRef = T9._IDRRef
LEFT OUTER JOIN _Document476 T10 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P9 AND T1._Q_000_F_000RRef = T10._IDRRef
LEFT OUTER JOIN _Document450 T11 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P10 AND T1._Q_000_F_000RRef = T11._IDRRef
LEFT OUTER JOIN _Document458 T12 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P11 AND T1._Q_000_F_000RRef = T12._IDRRef
LEFT OUTER JOIN _Document297 T13 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P12 AND T1._Q_000_F_000RRef = T13._IDRRef
LEFT OUTER JOIN _Document412 T14 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P13 AND T1._Q_000_F_000RRef = T14._IDRRef
LEFT OUTER JOIN _Document449 T15 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P14 AND T1._Q_000_F_000RRef = T15._IDRRef
LEFT OUTER JOIN _Document21506 T16 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P15 AND T1._Q_000_F_000RRef = T16._IDRRef
LEFT OUTER JOIN _Document414 T17 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P16 AND T1._Q_000_F_000RRef = T17._IDRRef
LEFT OUTER JOIN _Document366 T18 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P17 AND T1._Q_000_F_000RRef = T18._IDRRef
LEFT OUTER JOIN _Document475 T19 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P18 AND T1._Q_000_F_000RRef = T19._IDRRef
LEFT OUTER JOIN _Document298 T20 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P19 AND T1._Q_000_F_000RRef = T20._IDRRef
LEFT OUTER JOIN _Document420 T21 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P20 AND T1._Q_000_F_000RRef = T21._IDRRef
LEFT OUTER JOIN _Document466 T22 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P21 AND T1._Q_000_F_000RRef = T22._IDRRef
LEFT OUTER JOIN _Document306 T23 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P22 AND T1._Q_000_F_000RRef = T23._IDRRef
LEFT OUTER JOIN _Document406 T24 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P23 AND T1._Q_000_F_000RRef = T24._IDRRef
LEFT OUTER JOIN _Document456 T25 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P24 AND T1._Q_000_F_000RRef = T25._IDRRef
LEFT OUTER JOIN _Document21507 T26 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P25 AND T1._Q_000_F_000RRef = T26._IDRRef
LEFT OUTER JOIN _Document394 T27 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P26 AND T1._Q_000_F_000RRef = T27._IDRRef
LEFT OUTER JOIN _Document359 T28 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P27 AND T1._Q_000_F_000RRef = T28._IDRRef
LEFT OUTER JOIN _Document367 T29 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P28 AND T1._Q_000_F_000RRef = T29._IDRRef
LEFT OUTER JOIN _Document369 T30 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P29 AND T1._Q_000_F_000RRef = T30._IDRRef
LEFT OUTER JOIN _Document262 T31 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P30 AND T1._Q_000_F_000RRef = T31._IDRRef
LEFT OUTER JOIN _Document503 T32 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P31 AND T1._Q_000_F_000RRef = T32._IDRRef
LEFT OUTER JOIN _Document445 T33 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P32 AND T1._Q_000_F_000RRef = T33._IDRRef
LEFT OUTER JOIN _Document269 T34 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P33 AND T1._Q_000_F_000RRef = T34._IDRRef',N'P1 varbinary(4),@P2 varbinary(4),@P3 varbinary(4),@P4 varbinary(4),@P5 varbinary(4),@P6 varbinary(4),@P7 varbinary(4),@P8 varbinary(4),@P9 varbinary(4),P10 varbinary(4),P11 varbinary(4),P12 varbinary(4),P13 varbinary(4),P14 varbinary(4),P15 varbinary(4),P16 varbinary(4),P17 varbinary(4),P18 varbinary(4),P19 varbinary(4),@P20 varbinary(4),@P21 varbinary(4),@P22 varbinary(4),@P23 varbinary(4),@P24 varbinary(4),@P25 varbinary(4),@P26 varbinary(4),@P27 varbinary(4),@P28 varbinary(4),@P29 varbinary(4),@P30 varbinary(4),@P31 varbinary(4),@P32 varbinary(4),@P33 varbinary(4)',0x0000018B,0x0000010C,0x0000012C,0x000001FF,0x00000199,0x00000127,0x000001A1,0x0000012B,0x000001DC,0x000001C2,0x000001CA,0x00000129,0x0000019C,0x000001C1,0x00005402,0x0000019E,0x0000016E,0x000001DB,0x0000012A,0x000001A4,0x000001D2,0x00000132,0x00000196,0x000001C8,0x00005403,0x0000018A,0x00000167,0x0000016F,0x00000171,0x00000106,0x000001F7,0x000001BD,0x0000010D
7 H A D G E H O G s
 
21.02.13
14:55
Стало:

exec sp_executesql N'SELECT
T1._Q_000_F_001,
T1._Q_000_F_000TRef,
T1._Q_000_F_000RRef,
CASE WHEN T1._Q_000_F_000TRef = 0x000001C1 THEN T2._Date_Time WHEN T1._Q_000_F_000TRef = 0x0000012A THEN T3._Date_Time ELSE CAST(NULL AS DATETIME) END
FROM #tt1 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Document449 T2 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = P1 AND T1._Q_000_F_000RRef = T2._IDRRef
LEFT OUTER JOIN _Document298 T3 WITH(NOLOCK)
ON T1._Q_000_F_000TRef = @P2 AND T1._Q_000_F_000RRef = T3._IDRRef',N'P1 varbinary(4),@P2 varbinary(4)',0x000001C1,0x0000012A
8 Defender aka LINN
 
21.02.13
14:55
(2) Какие-то у тебя условия в "КОГДА" очень похожие. Я бы сказал - пипец как похожие
9 Maxus43
 
21.02.13
14:56
ну логично, неявные соединения без Выразить идут, но я пишу всегда как в варианте 1
10 rs_trade
 
21.02.13
14:56
(5) Когда тип составной, платформа не делает не нужных джойнов. Ибо ты сразу таблицу нужную указываешь.
11 H A D G E H O G s
 
21.02.13
14:56
(8) Пардон, исправлю
12 Defender aka LINN
 
21.02.13
14:56
(6) Подозреваю, пакет тут не при чем, фокус в "ВЫРАЗИТЬ", не?
13 samozvanec
 
21.02.13
14:57
(2) может так?

ВЫБОР
      КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

         ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ПоступлениеТоваровУслуг)
     КОГДА ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя

          ТОГДА ВЫРАЗИТЬ(ТоварыОрганизаций.Регистратор КАК Документ.ВозвратТоваровОтПокупателя)
  КОНЕЦ
14 H A D G E H O G s
 
21.02.13
14:58
(12) Да, в ВЫРАЗИТЬ и в том, что у меня в выборке только 2 жестко заданых типа регистраторов и только их даты и нужны, поэтому возможные типы значений составного реквизита ограничиваю в первом пакетном. Как то извращенно ограничиваю.
15 Reset
 
21.02.13
14:58
А если явные левые соединения указать для получения даты?
16 H A D G E H O G s
 
21.02.13
14:59
(15) Можно, но это то же самое и текст запроса еще распухнет.
17 samozvanec
 
21.02.13
15:00
(7) какой интересный эффект... а где про это по-подробней почитать можно?
18 H A D G E H O G s
 
21.02.13
15:00
Короче, кто-нибудь так делал?
19 samozvanec
 
21.02.13
15:00
(18) прирост в скорости дает?
20 Reset
 
21.02.13
15:01
Я делал. Имхо, это совершенно нормально (и правильно)
21 H A D G E H O G s
 
21.02.13
15:01
(19) Не проверял пока.
22 Defender aka LINN
 
21.02.13
15:02
(18) Ну, почему бы и нет. Соединений всяко меньше, через это много профита.
23 rs_trade
 
21.02.13
15:03
24 H A D G E H O G s
 
21.02.13
15:04
(23) access denied
25 rs_trade
 
21.02.13
15:04
При необходимости жертвуйте компактностью и универсальностью кода ради производительности. Как правило, для выполнения конкретного запроса в данных условиях не нужны все возможные типы данной ссылки. В этом случае следует ограничить количество возможных типов при помощи функции ВЫРАЗИТЬ. Если данный запрос является универсальным и используется в нескольких разных ситуациях (где типы ссылки могут быть разными), то можно формировать запрос динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при данных условиях. Это увеличит объем исходного кода и, возможно, сделает его менее универсальным, но может существенно повысить производительность и стабильность работы запроса
26 rs_trade
 
21.02.13
15:04
(24) веб-итс нету что ли?
27 Maxus43
 
21.02.13
15:06
прикол в том что эти же людили советовали немного другое год назад)
например v8: развейте сомнения
28 rs_trade
 
21.02.13
15:06
(24) Ссылка на баянистую статью с ИТСа,  Типичные причины неоптимальной работы запросов и методы оптимизации. Там написано и про ВЫРАЗИТЬ.
29 H A D G E H O G s
 
21.02.13
15:06
(25) Ясно.
30 Defender aka LINN
 
21.02.13
15:19
Тьфу. Я че-то не заметил, что дата из регистратора берется.
(29) Ну ты даешь. Я аж повелся, думал, что-то новое :)
31 Лефмихалыч
 
21.02.13
15:37
(0) а если попробовать в условии самого исходного запроса использовать сравнение ТипЗначения() с Тип()?
Чует мое сердце, что тогда сервер сконвертит это в что-то типа
Recorder_TYPE = 0x000666 и на этом успокоится, не добавляя лишних соединений
32 Лефмихалыч
 
21.02.13
15:38
а, ёманарот... дата из регистратора...
но с типом сиравно попробовать стоит
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший