Имя: Пароль:
1C
 
Оптимизирует ли платформа запрос в цикле?
0 stopa85
 
27.02.18
13:31
Делаем запрос к основной таблице документа и к табчати документа через поле таблицы:

ВЫБРАТЬ
Дата,
Номер,
Ссылка,
Товары как ТабЧастьТовары
ИЗ
Документ.ЗаказКлиента

Ну а далее обходим выборку запроса:

Пока Выборка.Следующий() Цикл
  
  Сообщить(""+ Выборка.Номер + Выборка.Дата );
  ВыборкаТовары = Выборка.Товары.Выбрать();
  
  Пока ВыборкаТовары.Слудющий() Цикл
    
    Сообщить("" + ВыборкаТовары.Товар );

  КонецЦикла;

КонецЦикла;

Это классический запрос в цикле или его платформа волшебным образом оптимизирует?
1 BeerHelpsMeWin
 
27.02.18
13:34
Что мешает сделать нормальный запрос и обход запроса по группировкам?
2 asady
 
27.02.18
13:34
(0) где запрос в цикле?
3 ejikbeznojek
 
27.02.18
13:35
Тут вроде бы нет запроса в цикле.
Хотя может я слепой просто)
4 Волшебник
 
27.02.18
13:35
У профессионалов запросы в цикле не тормозят.
5 stopa85
 
27.02.18
13:36
(1) То что нужно обратиться к нескольким табчастям и документов по сотню.
6 ejikbeznojek
 
27.02.18
13:38
(5)  ни как не связано с (1)
7 stopa85
 
27.02.18
13:40
(6) Тогда как?
8 stopa85
 
27.02.18
13:42
Если в документе ЗаказКлиента две-три ТабЧасти.

Например, Товары,Скидки,ОборотнаяТара.

Как потом группировать и обходить по этому всему?
9 asady
 
27.02.18
13:44
(8) посмотри в типовых - выборку табчастей
подскажу
там используется union и доп.переменная запроса типа "имяТЧ"
10 novichok79
 
27.02.18
13:45
сделай 3 запроса в пакете, по запросу на каждую табличную часть. а потом обходи эти данные.
данные табличной части где-то потом меняются? если нет, то что мешает выбрать сразу все табличные части разом?
11 dubraver
 
27.02.18
13:46
Если используете sql server, то он кэширует планы выполнения запроса и при повторном вызове достает их из пула, тем самым затраты на компиляцию плана запроса исключаются.
12 stopa85
 
27.02.18
13:54
(10) Ну вот так и хочу)
13 xaozai
 
27.02.18
13:57
(0) А почему вы решили, что это запрос в цикле?
14 Cool_Profi
 
27.02.18
14:03
(13) а почему ты решил, что тч.Выбрать() - это не запрос?
15 stopa85
 
27.02.18
14:04
(13) Очень похоже, но я не решил) Платформа, в теории, может оптимизировать мой код выполнив нужное количество запросов и посунув их результаты мне (где нужно). Но, это не означает, что она это делает.

У меня сейчас нет под рукой SQL чтобы посмотреть чем он занят, пока 1С переваривает этот код. Только файловая версия, а в техжурнале я пока не силен. Увы.
16 xaozai
 
27.02.18
14:04
(14) Так там выборка из результата запроса, а не из ТЧ.
17 1Сергей
 
27.02.18
14:05
(15) у тебя Запрос.Выполнить() внутри цикла?
18 stopa85
 
27.02.18
14:10
(17) у меня Выборка.Товары имеет тип значения РезультатЗапроса
Я вызываю его метод Выбрать()
19 1Сергей
 
27.02.18
14:12
20 stopa85
 
27.02.18
14:13
(19) Что конкретно тебя смущает? То что я сделал код, проверил что он работает, занялся его оптимизацией?

Или то что я глупые вопросы задаю?
21 asady
 
27.02.18
14:16
(20) оптимизировать можно только то что понимаешь.
Судя по вопросу нужно еще немного подучить матчасть - оптимизировать еще рано.
22 1Сергей
 
27.02.18
14:16
(20) у тебя нет запроса в цикле. Оптимизируй запрос, а не его обход
23 Cool_Profi
 
27.02.18
14:32
(16) нет. Там выборка из тч. Внимательно на запрос посмотри
24 HardBall
 
27.02.18
14:39
Сообщить("" + ВыборкаТовары.Товар );
Будет доп запрос, чтобы получить представление ссылки.
25 stopa85
 
27.02.18
14:40
(24) Да но не проэтот доп запрос речь идет. Можешь прочитать так: Сообщить("" + ВыборкаТовары.Количество );
26 lodger
 
27.02.18
14:41
(18) в этом случае, результат запроса уже помещен в память\вт и доступен для обхода через выборку. запрос к бд уже выполнен.
27 stopa85
 
27.02.18
14:42
Будет ли доп запрос в
ВыборкаТовары = Выборка.Товары.Выбрать();

Если в ИБ 100 документов ЗаказКлиента, в моем коде будет 101 запрос или только 2?
28 1Сергей
 
27.02.18
14:44
(27) один
29 H A D G E H O G s
 
27.02.18
14:50
INSERT INTO #tt1 WITH(TABLOCK) (_C_1RRef, _C_2, _C_3, _TTC_1) SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time,
T1._IDRRef
FROM dbo._Document34 T1

SELECT
T3._LineNo344,
T3._Fld345RRef,
T3._Fld348,
T4.SDBL_IDENTITY AS SDBL_IDENTITY
FROM dbo._Document34_VT343 T3
INNER JOIN #tt1 T4 WITH(NOLOCK)
ON T4._TTC_1 = T3._Document34_IDRRef
ORDER BY 4 ASC

    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    РеализацияТоваровУслуг.Ссылка КАК Ссылка,
    |    РеализацияТоваровУслуг.Номер КАК Номер,
    |    РеализацияТоваровУслуг.Дата КАК Дата,
    |    РеализацияТоваровУслуг.Товары.(
    |        НомерСтроки КАК НомерСтроки,
    |        Номенклатура КАК Номенклатура,
    |        Количество КАК Количество
    |    ) КАК Товары
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг";
    Выборка=Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        подВыборка=Выборка.Товары.Выбрать();
        Пока подВыборка.Следующий() Цикл
        КонецЦикла;
    КонецЦикла;
30 H A D G E H O G s
 
27.02.18
14:51
ORDER BY 4 ASC

какие странные мысли рождаются у конструктора SQL запросов 1С
31 stopa85
 
27.02.18
14:53
(29) Спасибо тебе, добрый человек
(28) Вот видишь! Два!
32 H A D G E H O G s
 
27.02.18
14:57
(31) Вообще-то - три, там был промежуточный запрос из временной таблицы, платформа выбирает для своих нужд зачем-то, скорее всего для построения основной выборки.

Но по факту, Сергей прав, "1 запрос"
33 Мимохожий Однако
 
27.02.18
14:59
ОФФ: Сколько энтузиазама у ТС...)
34 stopa85
 
27.02.18
14:59
(32) ОК. Я теперь так понимаю: код из (0) имеет право на жизнь.
35 Митяйский
 
27.02.18
15:07
(34) Только не забудь про (24)
36 xXeNoNx
 
27.02.18
15:15
(34) Неа, руки бы отбил... Зачем делать за конструктор SQL то, что можешь делать сам?
37 xXeNoNx
 
27.02.18
15:16
В (29) это скорее всего формирование печатной формы...
38 Йохохо
 
27.02.18
15:27
(36) "Зачем делать за конструктор SQL то, что можешь делать сам?" что? и эти люди ругают примеры из радченко
39 xXeNoNx
 
27.02.18
15:39
(38) Больше скажу.., некоторые из этих людей ругают и Белоусова!
40 xXeNoNx
 
27.02.18
15:40
+(39)  Как пример: поголовная индексация временных таблиц.
41 DmitriyDI
 
27.02.18
15:52
(34) Хотелось бы посмотреть данные замеров такого обхода  и обхода к примеру, когда выбираются данные из запроса, допустим если надо обратиться не к ВыборкаТовары.Товар, а к ВыборкаТовары.Товар.Код, то в плане производительности будет ведь в разы хуже работать такой перебор.
42 xXeNoNx
 
27.02.18
15:55
(41) Хуже, особенно если в номенклатуре какая-то картинка.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший