Имя: Пароль:
1C
1С v8
ВЫБОР КОГДА в параметрах виртуальной таблицы.
0 SeiOkami
 
13.05.13
15:40
Имею два запроса. Не могу понять почему вариант 1 выполняется более чем в два раза быстрее второго. Неужели во втором запросе проблема в сравнении с параметром (он передается "Организация")?

Первый запрос:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   БухгалтерскийОбороты.Регистратор Документ,
   БухгалтерскийОбороты.Организация ОрганизацияВДокументе,
   БухгалтерскийОбороты.Субконто1 Подразделение,
   БухгалтерскийОбороты.Субконто1.Владелец КАК ОрганизацияПодразделения
ИЗ
   РегистрБухгалтерии.Бухгалтерский.Обороты(&НачПериод,&КонПериода, Регистратор, Счет В ИЕРАРХИИ (&Cчет44,&Счет91_02), , ) КАК БухгалтерскийОбороты
ГДЕ
   БухгалтерскийОбороты.Организация <> БухгалтерскийОбороты.Субконто1.Владелец
   И (БухгалтерскийОбороты.Субконто1 Ссылка Справочник.ПодразделенияОрганизаций)


Второй запрос (параметр = "Организация"):

ВЫБРАТЬ
   БухгалтерскийОбороты.Регистратор Документ,
   БухгалтерскийОбороты.Организация ОрганизацияВДокументе,
   БухгалтерскийОбороты.Субконто1 Подразделение,
   БухгалтерскийОбороты.Субконто1.Владелец КАК ОрганизацияПодразделения
ИЗ
   РегистрБухгалтерии.Бухгалтерский.Обороты(
           &НачалоПериода,
           &КонецПериода,
           Регистратор,
           Счет В ИЕРАРХИИ (&Cчет44, &Счет91_02),
           ,
           ВЫБОР
               КОГДА &ОбъектСравнения = "Организации"
                   ТОГДА ВЫБОР
                           КОГДА Субконто1 ССЫЛКА Справочник.ПодразделенияОрганизаций
                               ТОГДА Организация <> Субконто1.Владелец
                       КОНЕЦ
               ИНАЧЕ Субконто3.Владелец <> Субконто2
           КОНЕЦ,
           ,
           ) КАК БухгалтерскийОбороты
1 SeiOkami
 
13.05.13
15:42
пардон, &ОбъектСравнения передается "Организации"
2 1Сергей
 
13.05.13
15:43
Владелец субконто? не удивительно
3 SeiOkami
 
13.05.13
15:44
(2)
и в первом и во втором запросе одни и те же условия. но скорость первого в два раза быстрее
4 SeiOkami
 
13.05.13
15:45
когда избавляюсь от ВЫБОР КОГДА (оставляю только условия первого ТОГДА), то скорость сокращается в двое. В чем фишка?
5 Maxus43
 
13.05.13
15:45
используй параметр ВидыСубконто в вирт таблице лучше.
(3) разные, субконто3 вобще не задействовано в 1-м
6 Maxus43
 
13.05.13
15:46
(4) план запроса смотри, видимо превращает в кашу его твой выбор когда
7 SeiOkami
 
13.05.13
15:47
(5), но ведь по логике запроса сравнение "Субконто3.Владелец <> Субконто2" вообще не должно выполнятся
8 1Сергей
 
13.05.13
15:47
(4) или джойнить каждую строчку оборота регистра, или выбрать все строки регистра, а потом фильтрануть по джойну. Есть разница?
9 Широкий
 
13.05.13
15:48
(4) При конструкции "Выбор" скуль вроде как построчный перебор включает.
Я давно эту тему копал. Вроде как даже это индекс юзать не будет:
"Выбор Когда ИСТИНА Тогда Организация=&Организация Конец"
10 SeiOkami
 
13.05.13
15:49
(8), то бишь предпочтительнее поместить мое условие в ГДЕ?
я пробовал. так действительно быстрее. но почему?
11 Maxus43
 
13.05.13
15:51
(10) да условия у тебя разные совершенно, перенеси то что в ГДЕ в условия один в один и посмотри разницу, без всяких выбор когда
12 SeiOkami
 
13.05.13
15:52
(11), в первом запросе?
13 SeiOkami
 
13.05.13
15:53
Я не пойму в чем разница условий. если параметр будет равен "Организации", то и заходить в "отличающееся" условие не должно
14 Maxus43
 
13.05.13
15:53
твоё условие лучше переделать впринципе, о чем уже говорил...

ИЗ
   РегистрБухгалтерии.Хозрасчетный.Обороты(, , , , &ВидСубконтоПодразделенияОрганизации, Субконто1.Владелец = &Организация, , ) КАК ХозрасчетныйОбороты
15 SeiOkami
 
13.05.13
15:54
(9), то бишь выбор когда тормозит выборку из виртуальных?
16 Maxus43
 
13.05.13
15:54
(13) должно не должно - этого платформа не знает, а план запроса делает так, как будто зайдёт вовсюда, тоесть в запросе другие таблицы присутсвуют
17 Maxus43
 
13.05.13
15:55
(15) нельзя так категорично утверждать, но возможно.
например ИЛИ тоже тормозит работу, с ним индексы перестают использоваться
18 Ksandr
 
13.05.13
15:55
ВЫРАЗИТЬ(Субконто1 КАК нибудь).Владелец
19 SeiOkami
 
13.05.13
15:56
дело в том, что запросом номер 2 я пытаюсь объединить два запроса, разница в которых лишь условие, чтобы поместить в СКД

один запрос имеет условие:
Организация <> Субконто1.Владелец

второй условие:
Субконто3.Владелец <> Субконто2

Не могу понять как реализовать это иначе =(
20 SeiOkami
 
13.05.13
15:57
(14), то бишь передавать вид субконто? сейчас сделаю. но как быть с (19)
21 Maxus43
 
13.05.13
15:58
(20) если передашь вид субконто, то у тебя будет только Субконто1, причем правильного типа
22 SeiOkami
 
13.05.13
16:01
(21), но ведь таким макаром я вырублю условие Субконто3.Владелец <> Субконто2, которое использует два субконто.

И все равно мне придется делать ВЫБОР КОГДА
23 viktor_vv
 
13.05.13
16:05
(22) А субконто3 какого типа ? Поди тоже подразделение ?
24 SeiOkami
 
13.05.13
16:07
(23), неа - другой справочник
25 SeiOkami
 
13.05.13
16:08
просто такая простая задачка, а какой-то пресловутый ВЫБОР КОГДА все портит
26 viktor_vv
 
13.05.13
16:11
(25) Присоединюсь к (9), из-за Выбор индексы не используются.
27 Maxus43
 
13.05.13
16:15
(25) передай 2 вида субконто
28 SeiOkami
 
13.05.13
16:30
Спасибо, задачу решил просто передавая три вида субконто, которые используются в запросе.

хотя до сих пор меня смущает странная логика наложения условия при ВЫБОР КОГДА...