Вход | Регистрация
    1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Замер двух запросов. Неожиданный результат

Замер двух запросов. Неожиданный результат
Я
   чувак
 
07.10.20 - 14:19
Доброго дня!

Есть два запроса. Формируют одну и ту же таблицу.
Но запрос2 в 3-4 раза быстрее формирует чем запрос1. По логике запрос1 быстрее должен формироваться.
В чем подвох?

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

ИНДЕКСИРОВАТЬ ПО
    СчетФактура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.СФ,
    МАКСИМУМ(втЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер
ИЗ
    (ВЫБРАТЬ
        ВТ_Документы.НомерСтроки КАК НомерСтроки,
        ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
        МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
    ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
    ГДЕ
        СчетФактураВыданныйДокументыОснования.Ссылка В
                (ВЫБРАТЬ
                    втЭСФ.СчетФактура
                ИЗ
                    втЭСФ КАК втЭСФ)
    
    СГРУППИРОВАТЬ ПО
        ВТ_Документы.НомерСтроки,
        ВТ_Документы.ГТДДокумент) КАК ДокументыСФ
        ЛЕВОЕ СОЕДИНЕНИЕ втЭСФ КАК втЭСФ
        ПО ДокументыСФ.СФ = втЭСФ.СчетФактура
            И (НЕ втЭСФ.ПометкаУдаления)

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ"



Запрос2 = Новый Запрос;
Запрос2.Текст = "ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

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

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ"
   trad
 
101 - 08.10.20 - 15:12
(100) + и если И2 - это наша ВТ, то вполне оправдано ее проиндексировать, и не утверждать что "Индексы в ВТ не нужны."
   H A D G E H O G s
 
102 - 08.10.20 - 15:12
(100) А индексирование - это выстраивание идентификаторов записей источник в нужном порядке и построение по ним b+ дерева.
   H A D G E H O G s
 
103 - 08.10.20 - 15:13
(101) Это если не нарвешься на hashjoin. В вашем, синтетическом, не нарвешься.
   trad
 
104 - 08.10.20 - 15:14
(102) только двоичное дерево строится по ключу индекса, а идентификаторы записей в листьях
   trad
 
105 - 08.10.20 - 15:16
(103) ну так все таки, индексы в ВТ бывают нужны?
   H A D G E H O G s
 
106 - 08.10.20 - 15:17
(104) Чтобы построить дерево поиска, данные нужно отсортировать
Не находишь никакой закономерности?
http://cburch.com/cs/340/reading/btree/btree-6.png
   H A D G E H O G s
 
107 - 08.10.20 - 15:19
(105) Нужно соединять 2 таблицы, временная таблица должна быть мала (но это очевидно и так) при этом физическая таблица не должна содержать индексов по полям соединения и условие соединения должно быть больше или меньше. Да, в таком охренено распространном случае нужно индексировать.
   H A D G E H O G s
 
108 - 08.10.20 - 15:54
На как и прогнозировалось.

Выполнил твой пример без индексов и без больше-меньше

        ПО т1.А = т2.А
            И т1.Дата = т2.Дата

Прекрасный hashjoin за 0.03 секунды.

http://prntscr.com/uvgw7i
   trad
 
109 - 08.10.20 - 16:34
(108) "без индексов и без больше-меньше" - это не мой пример
Я привел пример, когда индекс оправдан
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.