Имя: Пароль:
1C
1С v8
Вопрос знатокам запросов
0 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"

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

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

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

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

1-я 399
2-я 495
3-я 406
Закон Брукера: Даже маленькая практика стоит большой теории.