Имя: Пароль:
1C
1С v8
Не могу понять. почему один запрос работает намного дольше схожего.
0 Капюшон
 
25.11.13
18:01
В первом случае (быстром) отчет работает вот так:

1)создаётся временная таблица выборкой табличных частей
2)создается запрос к регистру накопления и данные соединяются с ВТ из пункта (1)

Второй случай:
Создаётся запрос к регистру накопления и соединяется сразу же с табличной частью другого докумета без создания ВТ. Во втором случае в три раза дольше формируется отчет. в чем может быть дело.

Первый запрос:
ВЫБРАТЬ
    УчетТЗРОчередностьДоставки.Заказ,
    УчетТЗРОчередностьДоставки.ДатаДоставки
ПОМЕСТИТЬ УчетТЗРОчередностьДоставки
ИЗ
    Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки
ГДЕ
    УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя
    И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору,
    УчетТЗРОчередностьДоставки.ДатаДоставки
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(
            &ДатаАнализа {(&ДатаАнализа)},
            ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
                И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ УчетТЗРОчередностьДоставки КАК УчетТЗРОчередностьДоставки
        ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = УчетТЗРОчередностьДоставки.Заказ

Второй запрос:

ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору,
    УчетТЗРОчередностьДоставки.ДатаДоставки
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(
            &ДатаАнализа {(&ДатаАнализа)},
            ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
                И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки
        ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = УчетТЗРОчередностьДоставки.Заказ
ГДЕ
    УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ
    И УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя
1 samozvanec
 
25.11.13
18:11
в первом случае сначала отбор

ГДЕ
    УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя
    И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ

потом соединение, во втором наоборот.
2 Classic
 
25.11.13
18:13
Поменяй ГДЕ на И
3 samozvanec
 
25.11.13
18:15
(0) может ты еще и внутреннее хочешь вместо левого?
4 Капюшон
 
25.11.13
18:17
(3)ну внутреннее мне не нужно в данном случае.
(2)не понял. как это поменять "Где" на "И" ?
5 Classic
 
25.11.13
18:18
(4)
Да хоть автозаменой
6 Classic
 
25.11.13
18:19
Правда порядок условий в соединении будет неправильным.
7 samozvanec
 
25.11.13
18:21
(4) тогда ты наверняка хочешь дате isnull сделать?
8 Капюшон
 
25.11.13
18:22
но что меня до слёз расстроило, так третий вариант сработал значительно быстрее, чем первые два.

ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток,
    ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору,
    ВложенныйЗапрос.ДатаДоставки
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(
            &ДатаАнализа {(&ДатаАнализа)},
            ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)
                И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            УчетТЗРОчередностьДоставки.ДатаДоставки КАК ДатаДоставки,
            УчетТЗРОчередностьДоставки.Заказ КАК Заказ
        ИЗ
            Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки
        ГДЕ
            УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя
            И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ) КАК ВложенныйЗапрос
        ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = ВложенныйЗапрос.Заказ
9 Капюшон
 
25.11.13
18:23
(7)совершенно верно. просто Дата - это не самое последнее, что мне надо получить. Дальше это поле превратится в формулу где будет и проверка в том числе на null
10 samozvanec
 
25.11.13
18:24
(8) какой ты) опять так, потому что (1)
11 Armando
 
25.11.13
18:24
(8) не тратится время на создание ВТ
(6) какая разница?
12 Classic
 
25.11.13
18:24
(8)
Кстати первый и второй запрос дадут разные результаты.

И почему тебя расстроил третий вариант?
Нет затрат по времени на помещение в ВТ. Ппроигрыша по скорости нет, потому что по
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка
В индекс все равно не попадаешь
13 Капюшон
 
25.11.13
18:25
(12)вы прав. Оказались разные результаты. значит второй неправильный. только я еще не понял почему.
14 Classic
 
25.11.13
18:25
(9)
Во втором запросе у тебя нула не будет
15 Classic
 
25.11.13
18:25
(13)
Потому что во втором у тебя по факту внутреннее соединение :)
16 samozvanec
 
25.11.13
18:26
кстати, есть статейка на ИТС об оптимизации запросов, где сказано, что соединений с виртуальными таблицами делать не стоит, а стоит сачала их складывать во временные
17 H A D G E H O G s
 
25.11.13
18:27
Автора выгнать из профессии нафиг.
18 samozvanec
 
25.11.13
18:27
+(16) так что пробуй 4й вариант с записями из регистра в ВТ и табличными частями во вложенном запросе
19 Капюшон
 
25.11.13
18:27
(12)а третий расстроил, потому что я не думал, что он быстрее сработает.Значит я не так уж хорошо знал принцип работы языка запросов.

(16)сначала виртуальную таблицу регистра нужно во временную таблицу сложить а потом уже соединить её с другой?
20 Classic
 
25.11.13
18:28
(16)
Вроде не "не стоит", а "не рекомендовано"
21 Капюшон
 
25.11.13
18:28
(18)попробую сейчас же.
22 H A D G E H O G s
 
25.11.13
18:29
Все 3 запроса - кривые.
23 Капюшон
 
25.11.13
18:30
(22)чем же?
24 samozvanec
 
25.11.13
18:30
(20) большая разница?
(22) давай конкретнее. заодно можно будет прикинуть результаты оптимизации
25 Classic
 
25.11.13
18:32
(20)
Да. Большая :)
Что ТС кстати и продемонстрировал.
Например 1С не рекомендует использовать вложенные подзапросы, но в случае, когда в индекс по-любому не попадаешь, вложенные запрос будет чутка быстрее
26 H A D G E H O G s
 
25.11.13
18:34
виртуальную можно отфильтровать через параметры ВТ по полю
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом

предварительно найденному в 1-ом пакетном.
27 Armando
 
25.11.13
18:36
ДокументРасчетовСКонтрагентом - судя по всему составной тип.
Поэтому ДокументРасчетовСКонтрагентом.Сделка писать нельзя. Надо через "Выразить".
И ДокументРасчетовСКонтрагентом.Сделка надо в параметры виртуальной таблицы засунуть
28 Капюшон
 
25.11.13
18:36
Четвертый вариант работает медленнее третьего, но значительно быстрее первого и второго.

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВзаиморассчетыПоДокументамРассчетов.Контрагент,
    ВзаиморассчетыПоДокументамРассчетов.ДокументРасчетовСКонтрагентом,
    ВзаиморассчетыПоДокументамРассчетов.ДоговорКонтрагента,
    ВзаиморассчетыПоДокументамРассчетов.СуммаВзаиморасчетовОстаток,
    ВзаиморассчетыПоДокументамРассчетов.ЧислоДнейЗадолжностиПоДоговору,
    ВложенныйЗапрос.ДатаДоставки
ИЗ
    ВзаиморассчетыПоДокументамРассчетов КАК ВзаиморассчетыПоДокументамРассчетов
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            УчетТЗРОчередностьДоставки.ДатаДоставки КАК ДатаДоставки,
            УчетТЗРОчередностьДоставки.Заказ КАК Заказ
        ИЗ
            Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки
        ГДЕ
            УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя
            И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ) КАК ВложенныйЗапрос
        ПО ВзаиморассчетыПоДокументамРассчетов.ДокументРасчетовСКонтрагентом.Сделка = ВложенныйЗапрос.Заказ
29 MM
 
25.11.13
18:36
А почему я не вижу?
ВЫРАЗИТЬ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом КАК Документ.РеализацияТоваровУслуг)
ДокументРасчетовСКонтрагентом - ведь составной тип и на нём ограничение.
30 Oleg_ka
 
25.11.13
18:39
Вот ты ж ешкин кот ....
Павел (Чистов) киньте ему ссылку на ваш курс по запросам
31 Armando
 
25.11.13
18:42
(30) Книжка халявная есть http://its.1c.ru/db/pubqlang#content:999999:1
32 Капюшон
 
25.11.13
18:43
(31)как называется7
33 Капюшон
 
25.11.13
18:43
(30)знаете. пусть запросы не самые оптимальные, но они работают и теперь уже работают быстро. а теперь оптимизацией займусь
34 Мимохожий Однако
 
25.11.13
18:46
(32)Язык запросов «1С:Предприятия 8» Хрусталевой
35 Armando
 
25.11.13
18:53
Для всяких оптимизаций могу посоветовать использовать обработку для просмотра структуры хранения базы. В частности индексы там смотреть удобно. И в подсистеме разработчика есть консоль запросов из которой можно перейти в обработку анализа тех. журнала и посмотреть план запроса.
36 Капюшон
 
25.11.13
18:53
(26)вот же у меня фильтруется по виду документов

И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг
37 Капюшон
 
25.11.13
18:54
(35)благодарю. обязательно покапаю ИР
38 Armando
 
25.11.13
18:57
(36) Это ты на тип ограничиваешь. А есть предложение ограничить на значения. Все равно по этим полям связь. Но там левое соедиенние... ну будет внутреннее, подумаешь)))
39 H A D G E H O G s
 
26.11.13
00:40
(35) Автор даже не знает, что такое индексы, очнись!
40 Steel_Wheel
 
26.11.13
00:55
(0) Левое соединение с регистром остатков. Регистр остатков слева -- зачем тебе нужны данные регистра, которых нет в документе?
41 Armando
 
26.11.13
01:38
Кстати, буквально на прошлой неделе была задача получить последнюю дату амортизации по каждому ОС. Первоначальный запрос выполнялся более минуты. С помощью (35) запрос был переписан, и стал формироваться не более 2 секунд. Так то. В смысле это реально полезные инструменты.
43 DexterMorgan
 
26.11.13
10:00
(39) + 100

Сделай две ВТ, проиндексируй по полям соединения и в третьем пакете соедини
44 Cerera
 
26.11.13
10:13
(39)(43) индексы - зло. их не рекомендуется использовать в случае небольших таблиц.

Поэтому не нужно нагружать систему индексами на все случаи жизни. Во-первых, чем
больше индексов в таблице, тем больше тратится времени на запись данных в эту
таблицу. А во-вторых, когда индексы слишком сложные и их много, то СУБД не может
подобрать среди них подходящий индекс за ограниченное время и может выбрать
неоптимальный план запроса.
Также следует иметь в виду, что на маленьких таблицах (порядка нескольких тысяч
записей и меньше) СУБД практически всегда использует сканирование таблицы либо
сканирование кластерного (автоматически созданного системой) индекса, так как это
наиболее простое решение в данном случае. Так что нет смысла дополнительно
индексировать заведомо небольшие таблицы. С другой стороны, часто трудно заранее
предугадать размер таблицы.