Имя: Пароль:
1C
1С v8
Вопрос по быстродействию двух запросов
0 vermouth
 
09.08.13
14:50
Есть два варианта запроса, объясните почему первый работает быстрее второго. При тестировании вообще заметил, что второй работает то с приемлемым быстродействием, но с жуткой задержкой. Буду благодарен за ссылки? где можно почитать про оптимизацию.

"ВЫБРАТЬ
|    ВзаиморасчетыОстатки.Контрагент,
|    ВзаиморасчетыОстатки.ДокументРасчетов КАК ДокументРасчетов,
|    ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток,
|    ВЫБОР
|        КОГДА ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток < 0
|            ТОГДА ИСТИНА
|        ИНАЧЕ ЛОЖЬ
|    КОНЕЦ КАК Флаг
|ИЗ
|    РегистрНакопления.Взаиморасчеты.Остатки(&МомВрем, Контрагент В (&Контрагенты)) КАК ВзаиморасчетыОстатки
|
|УПОРЯДОЧИТЬ ПО
|    ДокументРасчетов
|АВТОУПОРЯДОЧИВАНИЕ";

    
            
            
Запрос.Текст =
"ВЫБРАТЬ
|    ВзаиморасчетыОстатки.Контрагент,
|    ВзаиморасчетыОстатки.ДокументРасчетов,
|    ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток,
|    ВЫБОР
|        КОГДА ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток < 0
|            ТОГДА ИСТИНА
|        ИНАЧЕ ЛОЖЬ
|    КОНЕЦ КАК Флаг
|ИЗ
|    РегистрНакопления.Взаиморасчеты.Остатки(&МомВрем, Контрагент В (&Контрагенты)) КАК ВзаиморасчетыОстатки
|
|УПОРЯДОЧИТЬ ПО
|    ВзаиморасчетыОстатки.ДокументРасчетов.МоментВремени";
1 Maxus43
 
09.08.13
14:53
момент времени слишком специфичен, это 2 поля на самом деле, дата + ссылка
2 Maxus43
 
09.08.13
14:54
ну и ДокументРасчетов - составное поле, он соединяется со всеми документами, в него входящими. Через точку надо очень осторожно
3 Fragster
 
модератор
09.08.13
14:55
тут надо курить планы запросов скуля... у меня одинаково работают
4 palpetrovich
 
09.08.13
14:55
1+1  попробуй
УПОРЯДОЧИТЬ ПО
|    ВзаиморасчетыОстатки.Дата
5 palpetrovich
 
09.08.13
14:55
*
ВзаиморасчетыОстатки.ДокументРасчетов.Дата
6 vermouth
 
09.08.13
14:56
(3) Одинаково работает именно мой пример или просто схожие запросы?
7 Fragster
 
модератор
09.08.13
14:57
(6)ВЫБРАТЬ
    ТоварыВПутиОстатки.ДокументОтправки КАК ДокументОтправки,
    ТоварыВПутиОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыВПути.Остатки КАК ТоварыВПутиОстатки

УПОРЯДОЧИТЬ ПО
    ДокументОтправки
АВТОУПОРЯДОЧИВАНИЕ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыВПутиОстатки.ДокументОтправки КАК ДокументОтправки,
    ТоварыВПутиОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыВПути.Остатки КАК ТоварыВПутиОстатки

УПОРЯДОЧИТЬ ПО
    ТоварыВПутиОстатки.ДокументОтправки.МоментВремени
;
8 vermouth
 
09.08.13
15:02
(7) да... думаю регистры наши идентичны по структуре... вот и смущает меня то, что результат запроса - это  как-правило 1- 3 строки... а время выполнения второго запроса непредсказуемое...
9 Xatori
 
09.08.13
15:17
Надо глянуть во что превращается УПОРЯДОЧИТЬ ПО
|    ВзаиморасчетыОстатки.ДокументРасчетов.МоментВремени, а то мб там такая шляпа получается что Лев Толстой позавидует.
10 Fragster
 
модератор
09.08.13
15:32
покурил профайлер. запросы одинаковые

если выбирать из таблицы документов, то вот так:

SELECT
T1._IDRRef,
T2._Date_Time,
T2._IDRRef
FROM _Document6863 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Document6863 T2 WITH(NOLOCK)
ON T1._IDRRef = T2._IDRRef
ORDER BY (T2._Date_Time), (T2._IDRRef)


вот по регистру (основной таблице, чтобы было проще):
ORDER BY (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN CASE WHEN T3._Date_Time IS NOT NULL THEN 0x04 END WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN CASE WHEN T4._Date_Time IS NOT NULL THEN 0x04 END ELSE T1.Fld4664_TYPE END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN T3._Date_Time WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN T4._Date_Time ELSE {ts ''1753-01-01 00:00:00''} END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN CASE WHEN T3._Date_Time IS NOT NULL THEN 0x00000000 END WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN CASE WHEN T4._Date_Time IS NOT NULL THEN 0x00000000 END ELSE T1.Fld4664_RTRef END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN CASE WHEN T3._Date_Time IS NOT NULL THEN 0x00000000000000000000000000000000 END WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN CASE WHEN T4._Date_Time IS NOT NULL THEN 0x00000000000000000000000000000000 END ELSE T1.Fld4664_RRRef END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN CASE WHEN T3._IDRRef IS NOT NULL THEN 0x08 END WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN CASE WHEN T4._IDRRef IS NOT NULL THEN 0x08 END ELSE T1.Fld4664_TYPE END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN CASE WHEN T3._IDRRef IS NOT NULL THEN 0x0000009E END WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN CASE WHEN T4._IDRRef IS NOT NULL THEN 0x000000A4 END ELSE T1.Fld4664_RTRef END), (CASE WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x0000009E THEN T3._IDRRef WHEN T1.Fld4664_TYPE = 0x08 AND T1.Fld4664_RTRef = 0x000000A4 THEN T4._IDRRef ELSE T1.Fld4664_RRRef END)

а если выбирать из временной таблицы - то при автоупорядочивании сортировки НЕТ о_О
(при .момент времени - есть)
11 ptiz
 
09.08.13
15:32
(8) Два разных запроса. В одном - есть соединение, в другом - нет. Что непонятно?
Упорядочивание они дадут разное. Если совпадет - это случайность.
12 Fragster
 
модератор
09.08.13
15:33
в общем - сортировка по моменту времени - зло...
13 Fragster
 
модератор
09.08.13
15:33
(11) соединение есть в обоих случаях
14 ptiz
 
09.08.13
15:35
(13) Да, наверное ступил. Просто стараюсь не пользоваться Автоупорядочиванием, т.к. черт знает, как оно сработает :)
15 vermouth
 
09.08.13
16:50
то есть АВТОУПОРЯДОЧИВАНИЕ это будет как СОРТИРОВАТЬ ПО Дате без анализа положения документа по оси времени??? И при наличии документов с точной датой до секунды я могу получать разные выборки? Если так - то это грустно....
16 Fragster
 
модератор
09.08.13
16:58
(15) нет, автоупорядочивание это как упорядочить по моменту времени
17 vermouth
 
09.08.13
17:04
то есть по результату запросы идентичны при любом варианте... ну а если меня беспокоит скорость  - это просто вопрос конвертации с языка запросов 1С в SQL так?
18 vermouth
 
09.08.13
17:53
Спасибо всем участникам
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан