|
Вопрос знатокам запросов | ☑ | ||
---|---|---|---|---|
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |