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

Вопрос знатокам запросов

Вопрос знатокам запросов
Я
   tciban
 
31.05.19 - 08:56
Коллеги! Есть 2 запроса, второй выполняется чуть медленне, стало интересно почему? Ну и конечно может есть еще более простое решение?Суть вопроса - надо найти по значению в ТЧ элемент справочника, а потом из его ТЦ получить другое значение

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втСсылка.Ссылка,
    КонтурEDI_ДополнительныеСправочникиДополнительныеРеквизиты.Значение
ИЗ
    втСсылка КАК втСсылка
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК КонтурEDI_ДополнительныеСправочникиДополнительныеРеквизиты
        ПО втСсылка.Ссылка = КонтурEDI_ДополнительныеСправочникиДополнительныеРеквизиты.Ссылка
ГДЕ
    КонтурEDI_ДополнительныеСправочникиДополнительныеРеквизиты.ИмяРеквизита = "GUID"

ВЫБРАТЬ
    ДопрСправочникСсылка.Ссылка,
    ДП2.Значение
ИЗ
    Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК ДопрСправочникСсылка
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК ДП2
        ПО ДопрСправочникСсылка.Ссылка = ДП2.Ссылка
ГДЕ
    ДопрСправочникСсылка.ИмяРеквизита = "Объект"
    И ДопрСправочникСсылка.Значение = &Объект
    И НЕ ДопрСправочникСсылка.Ссылка.ПометкаУдаления
    И ДопрСправочникСсылка.Ссылка.ИмяСправочника = "МеркурийПлощадка"
    И ДП2.ИмяРеквизита = "GUID"

Заранее всем благодарен за ценные советы!
 
 
   dka80
 
1 - 31.05.19 - 09:02
Вместо внутреннего попробуй левое соединение с отбором в условии ГДЕ по  "Не КонтурEDI_ДополнительныеСправочникиДополнительныеРеквизиты.Значение Есть Null"
   СвинТуз
 
2 - 31.05.19 - 09:07
Внутреннее соединение отрабатывает быстрее
   Beduin
 
3 - 31.05.19 - 09:07
(0) А так не проще. Не понял зачем там соединения
ВЫБРАТЬ
    ДопрСправочникСсылка.Ссылка, 
    ДопрСправочникСсылка.Значение
ИЗ 
    Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК ДопрСправочникСсылка 
   ГДЕ 
    ДопрСправочникСсылка.ИмяРеквизита = "Объект" 
    И ДопрСправочникСсылка.Значение = &Объект 
    И НЕ ДопрСправочникСсылка.Ссылка.ПометкаУдаления 
    И ДопрСправочникСсылка.Ссылка.ИмяСправочника = "МеркурийПлощадка" 
    И ДопрСправочникСсылка.ИмяРеквизита = "GUID"
   СвинТуз
 
4 - 31.05.19 - 09:10
и есть еще моменты кое-какие )
в ньюансах соединения таблицы.
Со скоростью так как вы написали так и должно быть все логично.
Так у вас запросы построены.
   СвинТуз
 
5 - 31.05.19 - 09:11
Книга называется вроде "Настольная книга эксперта по технологическим вопросам"
Почитайте. С названием могу обмануть.
   mikecool
 
6 - 31.05.19 - 09:15
(2) вот как раз на мисте такой миф и развеивали
то ли всегда, то ли в определенных случаях левое с условием на не нул быстрее
   Cyberhawk
 
7 - 31.05.19 - 09:17
Левое _при прочих равных_ быстрее внутреннего. Но в случае с ТС замедление даже не из-за этого.
   tciban
 
8 - 31.05.19 - 09:18
так первый то запрос всяко быстрее, я понять не могу почему запрос второй, где без виртуальных таблиц, медленнее?
   Cyberhawk
 
9 - 31.05.19 - 09:18
Автору во втором случае надо условия из ГДЕ на вторую таблицу перенести в условия соединения, т.к. по факту он этими ГДЕ превратил левое во внутреннее
   Cyberhawk
 
10 - 31.05.19 - 09:19
(8) Каких виртуальных? Временных наверное.
   tciban
 
11 - 31.05.19 - 09:24
(10) Да, временных, описка вышла :(
   tciban
 
12 - 31.05.19 - 09:26
(3) Не может быть им реквизита одновременно и "GUID" и "Объект"
   tciban
 
13 - 31.05.19 - 09:28
(9) Я как то на большом запросе экспериментировал с этим. У меня получилось если условия в где - чуть быстрее. чем в условиях соединения...
   Cyberhawk
 
14 - 31.05.19 - 09:41
(13) Все от индексов и плана зависит. Может ты в условия соединения когда добавлял, индекса покрывающего не было и поэтому медленнее было.
   tciban
 
15 - 31.05.19 - 09:59
(14) Да, такие вещи учитывать надо. И конечно индексы на временные таблицы использовать при их использовании на больших массивах данных.
   tciban
 
16 - 31.05.19 - 09:59
в общем оставили первый вариант запроса, хоть он и больше по размеру кода :)
   Cyberhawk
 
17 - 31.05.19 - 10:00
"конечно индексы на временные таблицы использовать при их использовании на больших массивах данных" // А вот это как раз спорно. 10-15 лет назад было актуально, сейчас выхлоп от индексации не такой очевидный уже может быть.
   serg-lom89
 
18 - 31.05.19 - 10:05
(0) я бы еше первый запрос
Вынес бы в виртуальную таблицу, и потом ее бы соеденил бы с табличной частью
   serg-lom89
 
19 - 31.05.19 - 10:06
(18) потом уже после соединения с ТЧ твоей соеденял бы с таблицей нужной тебе
   DrWatson
 
20 - 31.05.19 - 10:17
(0) Первый быстрее, скорее всего, потому что временная таблица получается маленькая и оптимизатор, видя это, эффективно выполняет внутреннее соединение.
Выполняя же второй запрос, ему приходится делать соединение по всем объектам, попутно проверяя условие. Но перебирать ему приходится всю таблицу.
   VS-1976
 
21 - 31.05.19 - 10:21
Проверь скорость этого запроса:

ВЫБРАТЬ
    ДП2.Ссылка,
    ДП2.Значение
ИЗ
    Справочник.КонтурEDI_ДополнительныеСправочники КАК КонтурEDI_ДС

    СОЕДИНЕНИЕ Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК КонтурEDI_ДР
        ПО КонтурEDI_ДР.Ссылка = КонтурEDI_ДС.Ссылка
         И КонтурEDI_ДР.ИмяРеквизита = "Объект"
         И КонтурEDI_ДР.Значение = &Объект

        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтурEDI_ДополнительныеСправочники.ДополнительныеРеквизиты КАК ДП2
            ПО ДП2.Ссылка = КонтурEDI_ДР.Ссылка
         И ДП2.ИмяРеквизита = "GUID"
ГДЕ
    КонтурEDI_ДС.ПометкаУдаления = Ложь
    И КонтурEDI_ДС.ИмяСправочника = "МеркурийПлощадка"
   tciban
 
22 - 31.05.19 - 11:09
(21) быстрее второй, медленне 11399
2495
3406


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