Имя: Пароль:
1C
1С v8
запрос медленно работает
0 novichok79
 
26.03.13
06:05
доброго утра всем!
имеется след. запрос:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    СвойстваОбъектов.Ссылка КАК Свойство,
|    СвойстваОбъектов.Наименование КАК СвойствоНаименование
|ПОМЕСТИТЬ ВТСписокСвойств
|ИЗ
|    ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
|ГДЕ
|    СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура)
|
|ИНДЕКСИРОВАТЬ ПО
|    Свойство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ЗначенияСвойствОбъектов.Свойство КАК Свойство,
|    ЗначенияСвойствОбъектов.Значение КАК ЗначениеСвойства
|ПОМЕСТИТЬ ВТЗначенияСвойств
|ИЗ
|    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
|    (ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.Номенклатура)) = &Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
|    Свойство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    СписокСвойств.Свойство КАК Свойство,
|    СписокСвойств.СвойствоНаименование КАК СвойствоНаименование,
|    ""ПВХ_"" + СписокСвойств.СвойствоНаименование КАК СвойствоПредставление,
|    ЕСТЬNULL(ЗначенияСвойств.ЗначениеСвойства, ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК ЗначениеСвойства,
|    ВЫБОР
|        КОГДА НЕ ЗначенияСвойств.Свойство ЕСТЬ NULL
|            ТОГДА ИСТИНА
|        ИНАЧЕ ЛОЖЬ
|    КОНЕЦ КАК ЗначениеНайдено
|ИЗ
|    ВТСписокСвойств КАК СписокСвойств
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЗначенияСвойств КАК ЗначенияСвойств
|        ПО СписокСвойств.Свойство = ЗначенияСвойств.Свойство";

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
на 1 позицию ТМЦ уходит 1 секунда - пожалуйста подскажите, в чем может быть причина медленной работы этого простого запроса?
база файловая УТ 10.3, в справочнике Номенклатура 19380 позиций, в регистре ЗначенияСвойствОбъектов 197230 записей.
заранее благодарю за помощь.
1 Андрюха
 
26.03.13
06:10
(0) убирай из запроса по кусочку, постепенно наткнёшься на тот блок, который тормозит
2 novichok79
 
26.03.13
06:13
как я и думал - это таблица ВТЗначенияСвойств
3 novichok79
 
26.03.13
06:18
убрал ВТ, вместо 1,6 сек запрос выполняется 3,2 сек... весело однако
4 Михаил 1С
 
26.03.13
06:18
Слушай, может быть попробуй убрать "Выразить" из
(ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.Номенклатура)) = &Номенклатура

Напиши просто ЗначенияСвойствОбъектов.Объект = &Номенклатура
5 novichok79
 
26.03.13
06:20
(4) браво! 0,005 сек вместо 1,6 сек
6 Михаил 1С
 
26.03.13
06:23
Хорошо. Я тебя поздравляю. Значит, в остальном запрос был написан верно.
7 novichok79
 
26.03.13
06:26
(6) спасибо за помощь...
8 Михаил 1С
 
26.03.13
06:33
(7) Приятно было помочь, моя гордость и самомнение от этого выросли! :)
Я уже не только в мелочи могу помочь, я уже могу разобрать Запрос! :)
Хотяа, это был не сложный случай.
9 H A D G E H O G s
 
26.03.13
08:48
(5) Следующий раз он отработает с теми жа 1.5 секундами.
10 H A D G E H O G s
 
26.03.13
08:49
ГДЕ (ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.Номенклатура)) = &Номенклатура

здесь ни на что не влияет.
11 kotletka
 
26.03.13
09:02
(10)Влияет
12 ДенисЧ
 
26.03.13
09:03
(10) (11) каккие фаши доказзаттельстааа? (с)
13 1Сергей
 
26.03.13
09:03
(11) в данном случае

|    (ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.Номенклатура)) = &Номенклатура

и

|    ЗначенияСвойствОбъектов.Объект = &Номенклатура

разница только в производительности
14 Domanoff26
 
26.03.13
09:05
я раньше думал что через выразить наоборот быстрее работает
15 Fragster
 
гуру
26.03.13
09:07
(14) а ты думал, во что твой запрос превращается? и почему "от выразить быстрее" в некоторых случаях, а в твоем - нет?
16 Fragster
 
гуру
26.03.13
09:08
зачем нужны индексы?
17 Fragster
 
гуру
26.03.13
09:08
какие индексы создает 1с
18 Fragster
 
гуру
26.03.13
09:08
про планы выполнения
19 Fragster
 
гуру
26.03.13
09:08
а еще - в (0) запрос в цикле, наверняка
20 H A D G E H O G s
 
26.03.13
09:11
(14) Не в этом случае.
(17) Почти уверен, что и с выразить будет использоваться индекс.
21 kotletka
 
26.03.13
09:13
(13)про производительность и говорми
22 ЧеловекДуши
 
26.03.13
09:14
Может характеристики получать вот по подобию?

ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагенты
ИЗ
   Справочник.Контрагенты КАК Контрагенты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Всего"
{ХАРАКТЕРИСТИКИ
   ТИП(Справочник.Контрагенты)
   СПИСОК (ВЫБРАТЬ
           СвойстваОбъектов.Ссылка,
           СвойстваОбъектов.Наименование,
           СвойстваОбъектов.ТипЗначения
       ИЗ
           ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
       ГДЕ
           СвойстваОбъектов.НазначениеСвойства.Код = "00000000101")
   ИДЕНТИФИКАТОР Ссылка
   ИМЯ Наименование
   ТИПЗНАЧЕНИЯ ТипЗначения
   ЗНАЧЕНИЯ РегистрСведений.ЗначенияСвойствОбъектов
   ОБЪЕКТ Объект
   ХАРАКТЕРИСТИКА Свойство
   ЗНАЧЕНИЕ Значение }
23 Domanoff26
 
26.03.13
09:16
(15) это не мой запрос - просто интересуюсь, а в каких выразить быстрее , а в каких медленнее ?насколько я понимаю здесь составной тип, вот он и выражает нет...я именно так понимал оптимизацию запроса в данном контексте
24 Fragster
 
гуру
26.03.13
09:17
(20) не, там индекс начинается с TREF :)
25 H A D G E H O G s
 
26.03.13
09:22
(24) Индекс!

StmtText                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
--------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
Nested Loops(Inner Join, OUTER REFERENCES:([T1].[_Fld16423_TYPE], [T1].[_Fld16423_RTRef], [T1].[_Fld16423_RRRef], [T1].[_Fld16424RRef]))                                                                                                                                                                                                                                                                                                                                                                                          
 |--Index Scan(OBJECT:([KATAP].[dbo].[_InfoRg16422].[_InfoR16422_ByDims16426_RR] AS [T1]),  WHERE:(CASE WHEN [KATAP].[dbo].[_InfoRg16422].[_Fld16423_TYPE] as [T1].[_Fld16423_TYPE]=[@P1] AND [KATAP].[dbo].[_InfoRg16422].[_Fld16423_RTRef] as [T1].[_Fld16423_RTRef]=[@P2] THEN [KATAP].[dbo].[_InfoRg16422].[_Fld16423_RRRef] as [T1].[_Fld16423_RRRef] ELSE NULL END=[@P3]))                                                                                                                                                  
 |--Clustered Index Seek(OBJECT:([KATAP].[dbo].[_InfoRg16422].[_InfoR16422_ByDims_RR] AS [T1]), SEEK:([T1].[_Fld16423_TYPE]=[KATAP].[dbo].[_InfoRg16422].[_Fld16423_TYPE] as [T1].[_Fld16423_TYPE] AND [T1].[_Fld16423_RTRef]=[KATAP].[dbo].[_InfoRg16422].[_Fld16423_RTRef] as [T1].[_Fld16423_RTRef] AND [T1].[_Fld16423_RRRef]=[KATAP].[dbo].[_InfoRg16422].[_Fld16423_RRRef] as [T1].[_Fld16423_RRRef] AND [T1].[_Fld16424RRef]=[KATAP].[dbo].[_InfoRg16422].[_Fld16424RRef] as [T1].[_Fld16424RRef]) LOOKUP ORDERED FORWARD)
26 H A D G E H O G s
 
26.03.13
09:26
(24) Другой вопрос, что без Выразить будет просто

StmtText                                                    --------                                                                              
Clustered Index Seek(OBJECT:([KATAP].[dbo].[_InfoRg16422].[_InfoR16422_ByDims_RR] AS [T1]), SEEK:([T1].[_Fld16423_TYPE]=[@P1] AND [T1].[_Fld16423_RTRef]=[@P2] AND [T1].[_Fld16423_RRRef]=[@P3]) ORDERED FORWARD)
27 H A D G E H O G s
 
26.03.13
09:32
Без Выразить даже за данными ходить не надо, все в индексе, поэтому да - без Выразить шустрее, просто под SQL это не чувствуется :-)
28 AndOne
 
26.03.13
09:39
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   СвойстваОбъектов.Ссылка КАК Свойство
ПОМЕСТИТЬ СвойстваОбъектов
ИЗ
   ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
ГДЕ
   СвойстваОбъектов.НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
   СвойстваОбъектов.Свойство КАК Свойство,
   СвойстваОбъектов.Свойство.Представление КАК СвойствоНаименование,
   "ПВХ_" + СвойстваОбъектов.Свойство.Наименование КАК СвойствоПредставление,
   ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК ЗначениеСвойства,
   ВЫБОР
       КОГДА ЗначенияСвойствОбъектов.Значение ЕСТЬ NULL
           ТОГДА ЛОЖЬ
       ИНАЧЕ ИСТИНА
   КОНЕЦ КАК ЗначениеНайдено
ИЗ
   СвойстваОбъектов КАК СвойстваОбъектов
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
       ПО (&Номенклатура = (ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.ДоговорыКонтрагентов)))
           И СвойстваОбъектов.Свойство = ЗначенияСвойствОбъектов.Свойство
29 AndOne
 
26.03.13
09:42
(27) Индексировать временные таблицы в первых 2 запросах нет необходимости, индекс все равно не будет использоваться СУБД. Оптимизатор СУБД вероятно всего будет использовать SKAN, чем INDEX SEEK.
30 Domanoff26
 
26.03.13
09:45
(29) почему не будет? а в каких случаях все таки будет?
31 Domanoff26
 
26.03.13
09:46
(25) т е получается когд а индекс есть "выразить" не нужно, более того работает дольше?
32 AndOne
 
26.03.13
09:53
(31) Напрямую к "выразить" ни имеет ни кого отношения.  

http://habrahabr.ru/post/164717/
33 dauster
 
26.03.13
10:03
(0) а обязательно запрос делать по 1 номенклатурной позиции? Может сразу все скопом обработать или логика решения требует обработку попозиционно?
34 Fragster
 
гуру
26.03.13
10:56
(25) А мне вот западло в профайлер лезть, я просто для себя решил, что любая функция на индексированное поле не дает этот самый индекс использовать
35 Fragster
 
гуру
26.03.13
10:56
(34) и выразить не проверял, по этому