Имя: Пароль:
1C
1С v8
Оптимизация Партионного запроса УПП 1.3.18
,
0 H A D G E H O G s
 
30.11.11
00:11
Памяти v8: Влияет ли Индексация на скорость выполнения запроса и многих предыдущих веток посвящается.
Вон моя переделка, пожалуйста критикуем.

//Оптимизированные запросы
Процедура оптЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ, ОсновнойДокументЯвляетсяРегистратором) Экспорт
   ПараметрыЗапроса_ДатаОприходования = УправлениеЗапасамиПартионныйУчет.ПолучитьДанныеДляЗапроса_ДокументОприходованияДата(СпособОценкиМПЗ,"ПартииТоваровНаСкладах");
   Если ОсновнойДокументЯвляетсяРегистратором=Истина Тогда
       ТекстОсобоСписанныхТоваров="";
       ТекстСписанныхТоваров=
       "ВЫБРАТЬ
       |    СписанныеТовары.НомерСтрокиДокумента,
       |    СписанныеТовары.Номенклатура,
       |    СписанныеТовары.ХарактеристикаНоменклатуры,
       |    СписанныеТовары.СерияНоменклатуры,
       |    СписанныеТовары.Склад,
       |    СписанныеТовары.ДокументПартии,
       |    СписанныеТовары.ЗаказПартии,
       |    СписанныеТовары.КодОперацииПартииТоваров,
       |    СписанныеТовары.Качество,
       |    СписанныеТовары.ДопустимыйСтатус1,
       |    СписанныеТовары.ДопустимыйСтатус2,
       |    СписанныеТовары.ДопустимыйСтатус3,
       |    СписанныеТовары.ДопустимыйСтатус4,
       |    СписанныеТовары.СписыватьТолькоПоЗаказу
       |ПОМЕСТИТЬ СписанныеТовары
       |ИЗ
       |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
       |ГДЕ
       |    СписанныеТовары.Регистратор = &Ссылка
       |;
       |";
   Иначе
       ТекстОсобоСписанныхТоваров=
       "ВЫБРАТЬ
       |    СписанныеТовары.НомерСтрокиДокумента,
       |    СписанныеТовары.Номенклатура,
       |    СписанныеТовары.ХарактеристикаНоменклатуры,
       |    СписанныеТовары.СерияНоменклатуры,
       |    СписанныеТовары.Склад,
       |    СписанныеТовары.ДокументПартии,
       |    СписанныеТовары.ЗаказПартии,
       |    СписанныеТовары.КодОперацииПартииТоваров,
       |    СписанныеТовары.Качество,
       |    СписанныеТовары.ДопустимыйСтатус1,
       |    СписанныеТовары.ДопустимыйСтатус2,
       |    СписанныеТовары.ДопустимыйСтатус3,
       |    СписанныеТовары.ДопустимыйСтатус4,
       |    СписанныеТовары.СписыватьТолькоПоЗаказу
       |ПОМЕСТИТЬ ОсобоСписанныеТовары
       |ИЗ
       |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
       |ГДЕ
       |    СписанныеТовары.Регистратор = &ОсновнойДокумент
       |;
       |";
       ТекстСписанныхТоваров=
       "ВЫБРАТЬ
       |    СписанныеТовары.Номенклатура,
       |    СписанныеТовары.Склад
       |ПОМЕСТИТЬ СписанныеТовары
       |ИЗ
       |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
       |ГДЕ
       |    СписанныеТовары.Регистратор = &Ссылка
       |;
       |";
   КонецЕсли;

   Запрос.Текст=ТекстОсобоСписанныхТоваров+ТекстСписанныхТоваров+
   "ВЫБРАТЬ
   |    СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
   |    ПартииТоваровНаСкладах.Номенклатура,
   |    ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
   |    "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Выбор+"
   |    ПартииТоваровНаСкладах.Склад,
   |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
   |    ПартииТоваровНаСкладах.СерияНоменклатуры,
   |    ПартииТоваровНаСкладах.Качество,
   |    ПартииТоваровНаСкладах.Заказ,
   |    ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
   |    ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
   |    ПартииТоваровНаСкладах.СтатусПартии,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
   |            ТОГДА 0
   |        ИНАЧЕ 1
   |    КОНЕЦ КАК ЧислоСерияНоменклатуры,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
   |            ТОГДА 0
   |        ИНАЧЕ ВЫБОР
   |                КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
   |                    ТОГДА 0
   |                ИНАЧЕ 1
   |            КОНЕЦ
   |    КОНЕЦ КАК ЧислоДокументОприходования,
   |    ВЫБОР
   |        КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
   |            ТОГДА 0
   |        ИНАЧЕ ВЫБОР
   |                КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                    ТОГДА 1
   |                ИНАЧЕ 0
   |            КОНЕЦ
   |    КОНЕЦ КАК ЧислоЗаказ,
   |    ВЫБОР
   |        КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
   |            ТОГДА 1
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК ЧислоСтатусПартии
   |ИЗ
   |    "+?(ОсновнойДокументЯвляетсяРегистратором,"СписанныеТовары","ОсобоСписанныеТовары")+" КАК СписанныеТовары
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
   |                &Дат,
   |                Организация = &Организация
   |                    И ВЫБОР
   |                        КОГДА &ВестиПартионныйУчетПоСкладам = ЛОЖЬ
   |                                ИЛИ Склад = &ПустойСклад
   |                            ТОГДА Номенклатура В
   |                                    (ВЫБРАТЬ
   |                                        СписанныеТовары.Номенклатура
   |                                    ИЗ
   |                                        СписанныеТовары КАК СписанныеТовары)
   |                        ИНАЧЕ (Номенклатура, Склад) В
   |                                (ВЫБРАТЬ
   |                                    СписанныеТовары.Номенклатура,
   |                                    СписанныеТовары.Склад
   |                                ИЗ
   |                                    СписанныеТовары КАК СписанныеТовары)
   |                    КОНЕЦ) КАК ПартииТоваровНаСкладах
   |        ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
   |            И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
   |            И (ВЫБОР
   |                КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ВЫБОР
   |                        КОГДА СписанныеТовары.Качество = &ПустоеКачество
   |                            ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
   |                        ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
   |                    КОНЕЦ
   |            КОНЕЦ)
   |            И (ВЫБОР
   |                КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
   |                        ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
   |                    ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
   |                            ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
   |                ИНАЧЕ ИСТИНА
   |            КОНЕЦ)
   |            И (ВЫБОР
   |                КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
   |                    ТОГДА ВЫБОР
   |                            КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
   |                                ТОГДА ВЫБОР
   |                                        КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
   |                                            ТОГДА ЛОЖЬ
   |                                        ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                                    КОНЕЦ
   |                            ИНАЧЕ ИСТИНА
   |                        КОНЕЦ
   |                ИНАЧЕ ВЫБОР
   |                        КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
   |                            ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
   |                        ИНАЧЕ ИСТИНА
   |                    КОНЕЦ
   |            КОНЕЦ)
   |            И (ЛОЖЬ ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
   |                ИЛИ СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры)
   |            И (ВЫБОР
   |                КОГДА &ВестиПартионныйУчетПоСкладам = ЛОЖЬ
   |                    ТОГДА ИСТИНА
   |                ИНАЧЕ ПартииТоваровНаСкладах.Склад = &ПустойСклад
   |                        ИЛИ ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад
   |            КОНЕЦ)
   |
   |УПОРЯДОЧИТЬ ПО
   |    ЧислоСерияНоменклатуры,
   |    ЧислоДокументОприходования,
   |    ЧислоЗаказ,
   |    ЧислоСтатусПартии" + ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобственные, " Убыв", "") + ",
   |    "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Сортировка+"
   |    ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
   |    ПартииТоваровНаСкладах.Склад
   |ИТОГИ ПО
   |    НомерСтрокиДокумента";
   Запрос.УстановитьПараметр("ВестиПартионныйУчетПоСкладам",ВестиПартионныйУчетПоСкладам);
КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()
1 H A D G E H O G s
 
30.11.11
00:54
ап
2 MikleV
 
30.11.11
00:57
где замеры, тестовые данные, обоснование за счет чего планируется повышение скорости выполнения запроса?
или мы сферического коня в вакууме обсуждаем?
3 МихаилМ
 
30.11.11
01:01
учитывая

 И ВЫБОР
   |                        КОГДА &ВестиПартионныйУчетПоСкладам = ЛОЖЬ
   |                                ИЛИ Склад = &ПустойСклад
   |                            ТОГДА Номенклатура В
   |                                    (ВЫБРАТЬ
   |                                        СписанныеТовары.Номенклатура
   |                                    ИЗ
   |                                        СписанныеТовары КАК СписанныеТовары)
   |                        ИНАЧЕ (Номенклатура, Склад) В
   |                                (ВЫБРАТЬ
   |                                    СписанныеТовары.Номенклатура,
   |                                    СписанныеТовары.Склад
   |                                ИЗ
   |                                    СписанныеТовары КАК СписанныеТовары)




скл сервер не сможет закешировать пран запроса

и будет его строить каждый раз заново ( это может сильно влиять на призводительность)

лучше разбить на отдельные запросы.


пактически весь текст - бред .
налицо болезнь одинесника: перепутали получение и представление данных.

допускаю, что родоначалтники бреда разрабы 1с.
4 MikleV
 
30.11.11
01:03
(3)напиши лучше - чего то тебя не видно в списке разработчиков 1С
5 H A D G E H O G s
 
30.11.11
01:08
(2) Обсуждение в (0)
6 H A D G E H O G s
 
30.11.11
01:09
скл сервер не сможет закешировать пран запроса


А мы это проверим, но чуть позже.
7 H A D G E H O G s
 
30.11.11
01:10
Но мысли пошли, это радует.
8 H A D G E H O G s
 
30.11.11
10:34
гхммм, как в профайлере отловить событие компиляции плана запроса?
9 H A D G E H O G s
 
30.11.11
12:13
Вот мой запрос в sql


SELECT TOP 0 CAST(NULL AS NUMERIC(10,0)) _Q_000_F_000,
CAST(NULL AS BINARY(16)) _Q_000_F_001RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_002RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_003RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_004RRef,
CAST(NULL AS BINARY(1)) _Q_000_F_005_TYPE,
CAST(NULL AS BINARY(4)) _Q_000_F_005_RTRef,
CAST(NULL AS BINARY(16)) _Q_000_F_005_RRRef,
CAST(NULL AS BINARY(1)) _Q_000_F_006_TYPE,
CAST(NULL AS BINARY(4)) _Q_000_F_006_RTRef,
CAST(NULL AS BINARY(16)) _Q_000_F_006_RRRef,
CAST(NULL AS BINARY(16)) _Q_000_F_007RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_008RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_009RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_010RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_011RRef,
CAST(NULL AS BINARY(16)) _Q_000_F_012RRef,
CAST(NULL AS BINARY(1)) _Q_000_F_013
INTO #tt11


declare P1 varbinary(4);
SET P1=0x000001D0
declare @P2 varbinary(16);
SET @P2=0xB3330007E92E622811E0DD2667DB3A95
INSERT INTO #tt11 (_Q_000_F_000, _Q_000_F_001RRef, _Q_000_F_002RRef, _Q_000_F_003RRef, _Q_000_F_004RRef, _Q_000_F_005_TYPE, _Q_000_F_005_RTRef, _Q_000_F_005_RRRef, _Q_000_F_006_TYPE, _Q_000_F_006_RTRef, _Q_000_F_006_RRRef, _Q_000_F_007RRef, _Q_000_F_008RRef, _Q_000_F_009RRef, _Q_000_F_010RRef, _Q_000_F_011RRef, _Q_000_F_012RRef, _Q_000_F_013) SELECT
T1._Fld16199,
T1._Fld16245RRef,
T1._Fld16297RRef,
T1._Fld16266RRef,
T1._Fld16268RRef,
T1._Fld16205_TYPE,
T1._Fld16205_RTRef,
T1._Fld16205_RRRef,
T1._Fld16211_TYPE,
T1._Fld16211_RTRef,
T1._Fld16211_RRRef,
T1._Fld16218RRef,
T1._Fld16216RRef,
T1._Fld16207RRef,
T1._Fld16208RRef,
T1._Fld16209RRef,
T1._Fld16210RRef,
T1._Fld16270
FROM _InfoRg16198 T1
WHERE (T1._RecorderTRef = P1 AND T1._RecorderRRef = @P2)

declare
@f1 datetime, @f2 varbinary(16), @f3 varbinary(4),@f4 varbinary(16),@f5 numeric(1,0),@f6 datetime,@f7 varbinary(1),@f8 varbinary(16);
set @f1= {ts '5999-11-01 00:00:00'}
set @f2= 0x00000000000000000000000000000000
set @f3= 0x000001D0
set @f4= 0xB3330007E92E622811E0DD2667DB3A95
set @f5= 0
set @f6= {ts '4011-09-12 16:35:33'}
set @f7= 0x01
set @f8= 0xAF5195FDB5507EE94CEA7B7AFC2234B3
SELECT
T1._Fld16199,
T2.Fld18611RRef,
T2.Fld18615_TYPE,
T2.Fld18615_RTRef,
T2.Fld18615_RRRef,
T2.Fld18612RRef,
T2.Fld18613RRef,
T2.Fld18614RRef,
T2.Fld18618RRef,
T2.Fld18617RRef,
T2.Fld18619Balance_,
T2.Fld18620Balance_,
T2.Fld18616RRef,
CASE WHEN (T1._Fld16266RRef = T2.Fld18614RRef) THEN 0.0 ELSE 1.0 END,
CASE WHEN (T1._Fld16205_TYPE = 0x01) THEN 0.0 ELSE CASE WHEN (T1._Fld16205_TYPE = T2.Fld18615_TYPE AND T1._Fld16205_RTRef = T2.Fld18615_RTRef AND T1._Fld16205_RRRef = T2.Fld18615_RRRef) THEN 0.0 ELSE 1.0 END END,
CASE WHEN (T1._Fld16211_TYPE = 0x01) THEN 0.0 ELSE CASE WHEN (T2.Fld18617RRef = 0x00000000000000000000000000000000) THEN 1.0 ELSE 0.0 END END,
CASE WHEN (T2.Fld18616RRef = 0x8F5D1CF731244BA34E920A7391397751) THEN 1.0 ELSE 0.0 END
FROM _InfoRg16198 T1
INNER JOIN (SELECT
T3.Fld18611RRef AS Fld18611RRef,
T3.Fld18612RRef AS Fld18612RRef,
T3.Fld18613RRef AS Fld18613RRef,
T3.Fld18614RRef AS Fld18614RRef,
T3.Fld18615_TYPE AS Fld18615_TYPE,
T3.Fld18615_RTRef AS Fld18615_RTRef,
T3.Fld18615_RRRef AS Fld18615_RRRef,
T3.Fld18616RRef AS Fld18616RRef,
T3.Fld18617RRef AS Fld18617RRef,
T3.Fld18618RRef AS Fld18618RRef,
CAST(SUM(T3.Fld18620Balance_) AS NUMERIC(38, 8)) AS Fld18620Balance_,
CAST(SUM(T3.Fld18619Balance_) AS NUMERIC(38, 8)) AS Fld18619Balance_
FROM (SELECT
T4._Fld18611RRef AS Fld18611RRef,
T4._Fld18612RRef AS Fld18612RRef,
T4._Fld18613RRef AS Fld18613RRef,
T4._Fld18614RRef AS Fld18614RRef,
T4._Fld18615_TYPE AS Fld18615_TYPE,
T4._Fld18615_RTRef AS Fld18615_RTRef,
T4._Fld18615_RRRef AS Fld18615_RRRef,
T4._Fld18616RRef AS Fld18616RRef,
T4._Fld18617RRef AS Fld18617RRef,
T4._Fld18618RRef AS Fld18618RRef,
CAST(SUM(T4._Fld18620) AS NUMERIC(33, 8)) AS Fld18620Balance_,
CAST(SUM(T4._Fld18619) AS NUMERIC(32, 8)) AS Fld18619Balance_
FROM _AccumRgT18637 T4
WHERE T4._Period = @f1 AND ((((T4._Fld23908RRef = @f2) AND T4._Fld18611RRef IN
(SELECT
T5._Fld16245RRef AS Q_001_F_000RRef
FROM _InfoRg16198 T5
WHERE (T5._RecorderTRef = @f3 AND T5._RecorderRRef = @f4))) AND (T4._Fld18612RRef IN
(SELECT
T6._Fld16268RRef AS Q_002_F_000RRef
FROM _InfoRg16198 T6
WHERE (T6._RecorderTRef = @f3 AND T6._RecorderRRef = @f4)) OR (T4._Fld18612RRef = @f2))))
GROUP BY T4._Fld18611RRef,
T4._Fld18612RRef,
T4._Fld18613RRef,
T4._Fld18614RRef,
T4._Fld18615_TYPE,
T4._Fld18615_RTRef,
T4._Fld18615_RRRef,
T4._Fld18616RRef,
T4._Fld18617RRef,
T4._Fld18618RRef
HAVING (CAST(SUM(T4._Fld18620) AS NUMERIC(33, 8))) <> @f5 OR (CAST(SUM(T4._Fld18619) AS NUMERIC(32, 8))) <> @f5
UNION ALL SELECT
T7._Fld18611RRef AS Fld18611RRef,
T7._Fld18612RRef AS Fld18612RRef,
T7._Fld18613RRef AS Fld18613RRef,
T7._Fld18614RRef AS Fld18614RRef,
T7._Fld18615_TYPE AS Fld18615_TYPE,
T7._Fld18615_RTRef AS Fld18615_RTRef,
T7._Fld18615_RRRef AS Fld18615_RRRef,
T7._Fld18616RRef AS Fld18616RRef,
T7._Fld18617RRef AS Fld18617RRef,
T7._Fld18618RRef AS Fld18618RRef,
CAST(CAST(SUM(CASE WHEN T7._RecordKind = 0.0 THEN -T7._Fld18620 ELSE T7._Fld18620 END) AS NUMERIC(27, 8)) AS NUMERIC(27, 2)) AS Fld18620Balance_,
CAST(CAST(SUM(CASE WHEN T7._RecordKind = 0.0 THEN -T7._Fld18619 ELSE T7._Fld18619 END) AS NUMERIC(26, 8)) AS NUMERIC(27, 3)) AS Fld18619Balance_
FROM _AccumRg18610 T7
WHERE (T7._Period > @f6 OR T7._Period = @f6 AND (T7._RecorderTRef > @f3 OR T7._RecorderTRef = @f3 AND T7._RecorderRRef >= @f4)) AND T7._Period < @f1 AND T7._Active = @f7 AND ((((T7._Fld23908RRef = @f2) AND T7._Fld18611RRef IN
(SELECT
T8._Fld16245RRef AS Q_001_F_000RRef
FROM _InfoRg16198 T8
WHERE (T8._RecorderTRef = @f3 AND T8._RecorderRRef = @f4))) AND (T7._Fld18612RRef IN
(SELECT
T9._Fld16268RRef AS Q_002_F_000RRef
FROM _InfoRg16198 T9
WHERE (T9._RecorderTRef = @f3 AND T9._RecorderRRef = @f4)) OR (T7._Fld18612RRef = @f2))))
GROUP BY T7._Fld18611RRef,
T7._Fld18612RRef,
T7._Fld18613RRef,
T7._Fld18614RRef,
T7._Fld18615_TYPE,
T7._Fld18615_RTRef,
T7._Fld18615_RRRef,
T7._Fld18616RRef,
T7._Fld18617RRef,
T7._Fld18618RRef
HAVING (CAST(CAST(SUM(CASE WHEN T7._RecordKind = 0.0 THEN -T7._Fld18620 ELSE T7._Fld18620 END) AS NUMERIC(27, 8)) AS NUMERIC(27, 2))) <> @f5 OR (CAST(CAST(SUM(CASE WHEN T7._RecordKind = 0.0 THEN -T7._Fld18619 ELSE T7._Fld18619 END) AS NUMERIC(26, 8)) AS NUMERIC(27, 3))) <> @f5) T3
GROUP BY T3.Fld18611RRef,
T3.Fld18612RRef,
T3.Fld18613RRef,
T3.Fld18614RRef,
T3.Fld18615_TYPE,
T3.Fld18615_RTRef,
T3.Fld18615_RRRef,
T3.Fld18616RRef,
T3.Fld18617RRef,
T3.Fld18618RRef
HAVING (CAST(SUM(T3.Fld18620Balance_) AS NUMERIC(38, 8))) <> @f5 OR (CAST(SUM(T3.Fld18619Balance_) AS NUMERIC(38, 8))) <> @f5) T2
ON (((((((T1._Fld16245RRef = T2.Fld18611RRef) AND (T1._Fld16297RRef = T2.Fld18613RRef)) AND CASE WHEN (T2.Fld18618RRef = 0x00000000000000000000000000000000) THEN 0x01 ELSE CASE WHEN (T1._Fld16216RRef = 0x00000000000000000000000000000000) THEN CASE WHEN (T2.Fld18618RRef = 0xA79841EBE5E5B977449B6BCED05404A0) THEN 0x01 ELSE 0x00 END ELSE CASE WHEN (T2.Fld18618RRef = T1._Fld16216RRef) THEN 0x01 ELSE 0x00 END END END = @f7) AND ((T2.Fld18612RRef = T1._Fld16268RRef) OR (T2.Fld18612RRef = @f2))) AND CASE WHEN ((((T1._Fld16207RRef <> 0x00000000000000000000000000000000) OR (T1._Fld16208RRef <> 0x00000000000000000000000000000000)) OR (T1._Fld16209RRef <> 0x00000000000000000000000000000000)) OR (T1._Fld16210RRef <> 0x00000000000000000000000000000000)) THEN CASE WHEN ((((((T2.Fld18616RRef = 0x00000000000000000000000000000000) OR (T2.Fld18616RRef = 0x9CB60656AEC9EC8A4A11A71D683EBEAE)) OR (T2.Fld18616RRef = T1._Fld16207RRef)) OR (T2.Fld18616RRef = T1._Fld16208RRef)) OR (T2.Fld18616RRef = T1._Fld16209RRef)) OR (T2.Fld18616RRef = T1._Fld16210RRef)) THEN 0x01 ELSE 0x00 END ELSE 0x01 END = @f7) AND CASE WHEN (T1._Fld16270 = 0x01) THEN CASE WHEN (((0x08 <> T1._Fld16211_TYPE OR 0x00000120 <> T1._Fld16211_RTRef OR T2.Fld18617RRef <> T1._Fld16211_RRRef))) THEN CASE WHEN (NOT (((T1._Fld16211_TYPE = 0x01)))) THEN 0x00 ELSE CASE WHEN (T2.Fld18617RRef = 0x00000000000000000000000000000000) THEN 0x01 ELSE 0x00 END END ELSE 0x01 END ELSE CASE WHEN (((0x08 <> T1._Fld16211_TYPE OR 0x00000120 <> T1._Fld16211_RTRef OR T2.Fld18617RRef <> T1._Fld16211_RRRef))) THEN CASE WHEN (T2.Fld18617RRef = 0x00000000000000000000000000000000) THEN 0x01 ELSE 0x00 END ELSE 0x01 END END = @f7) AND (((T1._Fld16266RRef = T2.Fld18614RRef) OR (T2.Fld18614RRef = @f2)) OR (T1._Fld16218RRef = @f8)))
WHERE (T1._RecorderTRef = @f3 AND T1._RecorderRRef = @f4)
ORDER BY (CASE WHEN (T1._Fld16266RRef = T2.Fld18614RRef) THEN 0.0 ELSE 1.0 END), (CASE WHEN (T1._Fld16205_TYPE = 0x01) THEN 0.0 ELSE CASE WHEN (T1._Fld16205_TYPE = T2.Fld18615_TYPE AND T1._Fld16205_RTRef = T2.Fld18615_RTRef AND T1._Fld16205_RRRef = T2.Fld18615_RRRef) THEN 0.0 ELSE 1.0 END END), (CASE WHEN (T1._Fld16211_TYPE = 0x01) THEN 0.0 ELSE CASE WHEN (T2.Fld18617RRef = 0x00000000000000000000000000000000) THEN 1.0 ELSE 0.0 END END), (CASE WHEN (T2.Fld18616RRef = 0x8F5D1CF731244BA34E920A7391397751) THEN 1.0 ELSE 0.0 END), (T2.Fld18615_TYPE), (T2.Fld18615_RTRef), (T2.Fld18615_RRRef), (T2.Fld18612RRef)

TRUNCATE TABLE #tt11
Drop table #tt11

При попытке построить план запроса:

Msg 208, Level 16, State 0, Line 27
Invalid object name '#tt11'.
10 МихаилМ
 
30.11.11
12:17
я думал , Вы умнее.
11 H A D G E H O G s
 
30.11.11
12:17
p.s.

По производительности
старый запрос
duration - 110
новый
duration - 130

база 11 гиговая доработанная УПП шка, но 1 пользователь.
12 H A D G E H O G s
 
30.11.11
12:18
(10) Я думал, что вы - умнее, и догадаетесь, что я не так умен.
13 МихаилМ
 
30.11.11
12:54
выкените все case

или вынесите в запрос обертку

видно же , какие бредовые having и order by 1c генерит : надо ей помочь

также
смущает отсутствие NOLOCK
14 5 Элемент
 
30.11.11
12:54
Надо же еще есть такие которые используют ПУ
15 Reaper_1c
 
30.11.11
12:58
(14) +1 Разработчики типовых постоянно эту шляпу оптимизируют - регулярно РАУЗ обновляют...
16 Fragster
 
гуру
30.11.11
17:35
(0) переделай на построитель, рваные запросы - зло
17 Fragster
 
гуру
30.11.11
17:36
виртуальные таблицы отдельно надо во временную таблицу выносить
18 Fragster
 
гуру
30.11.11
17:38
Ну и "выборы" нафиг. кстати, откуда в результирующем запросе HAVING - непонятно
19 Fragster
 
гуру
30.11.11
17:38
а, это виртуальная таблица...
20 GoldenDawn
 
30.11.11
17:40
(0)не знаю насколько в тему, но не смотря на все глупости в реализации партионного учета на тех базах которые встречались мне замер производительности показывал что запись в базу движений документов занимает в несколько раз больше времени чем собтсвенно исполнение процедуры расчета списания партий
21 Fragster
 
гуру
30.11.11
17:46
кстати, порядок следования измерений в комплексных условиях имеет значение, и лучше бы ему совпадать с порядком измерений регистра, т.е. (Склад,Номенклатура) и с индексами индексированной ВТ
22 Fragster
 
гуру
30.11.11
17:48
Вот например:


////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ Р1
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
           ,
           (Номенклатура, Склад) В
               (ВЫБРАТЬ
                   Кусок.Номенклатура,
                   Кусок.Склад
               ИЗ
                   Кусок)) КАК ТоварыНаСкладахОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ Р2
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
           ,
           (Склад, Номенклатура) В
               (ВЫБРАТЬ
                   Кусок.Склад,
                   Кусок.Номенклатура
               ИЗ
                   Кусок)) КАК ТоварыНаСкладахОстатки
                   ;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ПОМЕСТИТЬ Р3
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
           ,
           (Номенклатура, Склад) В
               (ВЫБРАТЬ
                   Кусок.Номенклатура,
                   Кусок.Склад
               ИЗ
                   Кусок)) КАК ТоварыНаСкладахОстатки


Дает результат


РезультатЗапроса    Название таблицы    Время подзапроса    Количество строк
ТаблицаЗначений    СКЛАДЫ    0,015    50
ТаблицаЗначений    НОМЕНКЛАТУРЫ    0,016    500
ТаблицаЗначений    КУСОК    0,234    25 000
ТаблицаЗначений    Р1    0,235    848
ТаблицаЗначений    Р2    0,171    848
ТаблицаЗначений    Р3    0,25    848
23 H A D G E H O G s
 
30.11.11
18:56
(17) О! Счаст попробуем!
24 H A D G E H O G s
 
30.11.11
19:12
(21) ВТ не индексированна.
Зачем????
25 Reaper_1c
 
30.11.11
21:51
(24) Он про условие виртуальной таблицы. Только совпадения порядка мало - нужно чтобы пропусков не было. Цель - попасть в индекс.
26 acsent
 
30.11.11
21:55
(21) Не порядок, а условие по первым измерениям без разрывов
27 acsent
 
30.11.11
21:56
Собственно вопрос из (2) не раскрыт.
28 Fragster
 
гуру
01.12.11
09:46
(25)  ну да
Независимо от того, куда вы едете — это в гору и против ветра!