Вход | Регистрация

  1  2  3  4  5   
1С:Предприятие ::

Метки: 

v7: Оптимизация запроса

Я
   bananan
 
25.12.12 - 11:35
Когда я задал обрботку 10 дней он работал 00:05:59, когда я ему задал тужу обработку но в функции ПересчетВЯщики(ТМЦ, Количество) в первой же строке вызвал Возврат - он работал 00:03:34 (на 2 минуты и 25 секунд меньше). Т.е. именно функция ПересчетВЯщики() сильно тормозит. К подчиненному справочнику Справочник.ЕдИз надо как-то иначе обращаться (не в функции, в функции опять же циклы). Т.е. е справочнику Справочник.ЕдИз надообращатьс через Запрос строго через запрос, может выполнять для этого второй Запрос. Подскажите как это сделать?
 
 
   bananan
 
201 - 26.12.12 - 12:56
(198) Я восхищет!
НО, выдает ошибку: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 4: Incorrect syntax near 'Жур'.
   Ёпрст
 
202 - 26.12.12 - 12:58
(201)зпт воткни тут:
,Жур.iddocdef
   bananan
 
203 - 26.12.12 - 13:04
(202) Спасибо
   sapphire
 
204 - 26.12.12 - 13:08
(202) :))))))))))
   bananan
 
205 - 26.12.12 - 13:12
+(202) Мне надо не только РасходнаяНакладная, но и РасходнаяНакладнаяН - если бы не было as просто через запятую указал...
Попробывал через запятую (from  $ДокументСтроки.РасходнаяНакладная, $ДокументСтроки.РасходнаяНакладнаяН as ДокС (nolock))
1С тупо ЗАВИСЛА.
Как здесь быть?
   Ёпрст
 
206 - 26.12.12 - 13:14
(205) п...ц
а в (198) по твоему что?!
   sapphire
 
207 - 26.12.12 - 13:14
ааа..... печалька
   sapphire
 
208 - 26.12.12 - 13:15
(206) Нужен мозг. Срочно.
   sapphire
 
209 - 26.12.12 - 13:15
(206) select * from * where *
   sapphire
 
210 - 26.12.12 - 13:16
(206) Он не знает SQL
 
 Рекламное место пустует
   bananan
 
211 - 26.12.12 - 13:16
(206) ОГРОМНОЕ СПАСИБО, извини за невнимательность
   bananan
 
212 - 26.12.12 - 13:22
+(211) А как в этом же запросе показать сколько ящиков ушло по каждой из накладных и вообще сколько ящиков товаров было продано за заданный период?
   Ёпрст
 
213 - 26.12.12 - 13:25
дык он тебе и так всё это покажет.
у тя на выходе табличка

документ товар количество количествоВЯщиках

сворачивай по документу - будет количество в разрезе 
документ количество ящики..
   bananan
 
214 - 26.12.12 - 13:27
(213) Извини, тут сказывается мой малый опыт работы в таком плане...
Мне нужно эти данные показать на екране в виде Таблицы, а не Таблицу значений показать..
Что тут делать и как?
   Ёпрст
 
215 - 26.12.12 - 13:28
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолчитьСтроку()=1 Цикл
  Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Показать("ёёё...");
   sapphire
 
216 - 26.12.12 - 13:34
|select         
|    Док as [Док $Документ]
|   ,Док_вид as [Док_вид $ВидДокумента]
|   ,Товар as [Товар $Справочник.ТМЦ]  
|   ,КоличествоВБазовойЕдиницеИзмерения
|   ,КоличествоВЯщиках
|   ,SUM(КоличествоВЯщиках) OVER (PARTITION BY Док,Док_вид) КоличествоВЯщикахПоДокументу
|   ,SUM(КоличествоВЯщиках) OVER () КоличествоВЯщикахВсегоПоВсемДокументам
|from
|(
|select         
|    Жур.iddoc as [Док]
|   ,Жур.iddocdef as [Док_вид]
|   ,Таб.Товар as [Товар] 
|   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
|   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
|from
|    (
|      select
|        $ДокС.ТМЦ as Товар
|        ,ДокС.iddoc as Документ
|        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
|      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
|     
|      union all
|
|      select
|        $ДокН.ТМЦ 
|        ,ДокН.iddoc
|        ,$ДокН.Кво*$ДокН.Коэффициент 
|      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
|    )as Таб
|
|inner join
|    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
|      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
|      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
|      and Жур.Closed&1 = 1
|left join (
|             select  
|                   max($Спр.Коэффициент) as Коэффициент
|                    ,Спр.parentext as Владелец
|             from $Справочник.Единицы as Спр (nolock)
|             where $Спр.Ед =:ВыбЕдиница
|                   and $Спр.Коэффициент>0
|                   and Спр.ismark=0
|             group by Спр.parentext
|           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
|
|group by
|    Жур.iddoc,Жур.iddocdef,Таб.Товар
|) Документы
|";
Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);


select         
|   Жур.iddoc as [Док $Документ]
|   Жур.iddocdef as [Док_вид $ВидДокумента]
|   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
|   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
|   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффицие
   sapphire
 
217 - 26.12.12 - 13:35
Ну в общем идея использовать предложение OVER
   bananan
 
218 - 26.12.12 - 13:36
(215) Спасибо - сейчас попробую
(216) А это что за код?
   Ёпрст
 
219 - 26.12.12 - 13:36
(216) погоди, ща скажет , что у него 2000 скуль..
:))
и болт с овером
   sapphire
 
220 - 26.12.12 - 13:39
(219) Запросто :)
   bananan
 
221 - 26.12.12 - 13:48
Запустил с периодом выборки один день, - просчитало все за секунду...
Запустил с периодом выборки - месяц (ноябрь) - зависла... :(
   bananan
 
222 - 26.12.12 - 13:50
+(221) Пардон. не зависла - просто ушла в себя
   bananan
 
223 - 26.12.12 - 13:51
+(222) Т.е. в результате таки выдала информацию по запросе (но писала что программа "не отвечает)"
   Ёпрст
 
224 - 26.12.12 - 13:53
(223) основное время занимает не запрос.выполнитьинструкцию, а ТЗ.Показать()
   bananan
 
225 - 26.12.12 - 13:59
(224) я тоже так думаю, сейчас буду переделывать это под таблицу (вместо таблицаЗначений)
   bananan
 
226 - 26.12.12 - 14:14
Что-то я таки туплю, как в таблице мне из даного  запроса показать товар
В запросе мы написали:
 $ДокС.ТМЦ as Товар
Пытаюсь вывести Запр.Товар
Выдает:
Поле агрегатного объекта не обнаружено (Товар)
   bananan
 
227 - 26.12.12 - 14:15
+(226) И номер документа как показать?
   bananan
 
228 - 26.12.12 - 14:15
++(226) Ну и количесвто ящиков по документу. и количество ящиков по всех документах вместе
   Ёпрст
 
229 - 26.12.12 - 14:17
(226)ознакомься с теорией, что ли
http://www.1cpp.ru/docum/icpp/html/ODBC.html

(227) жур.docno
   sapphire
 
230 - 26.12.12 - 14:17
а ну ясно-красно почему коматозит :))_))
   bananan
 
231 - 26.12.12 - 14:18
(229) С теорией я ознакомлюсь - тут читать на несколько часов...
А как мне показать Товар из запроса?
   sapphire
 
232 - 26.12.12 - 14:19
(229)

select
|        $ДокС.ТМЦ as Товар
|        ,ДокС.iddoc as Документ
|        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
|      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
|     
|      union all
|
|      select
|        $ДокН.ТМЦ 
|        ,ДокН.iddoc
|        ,$ДокН.Кво*$ДокН.Коэффициент 
|      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)

Ну тут ты погорячился, ИМХО :))))
Запрос по ВСЕМ ТЧ БД :)
Он же сначала выборку обработает и только потом будет вычислять inner join :)

 
Да и я не глядя OVER при-рисовал.
   sapphire
 
233 - 26.12.12 - 14:20
(231) Перепости код полностью
 
 
   chelentano
 
234 - 26.12.12 - 14:20
(231) а сам думать пробовал?
   sapphire
 
235 - 26.12.12 - 14:21
(234) Многие не приучены
   chelentano
 
236 - 26.12.12 - 14:21
(235) так вы бы хоть деньги с него брали, что ли...
   sapphire
 
237 - 26.12.12 - 14:22
(234) А есть экземпляры, коим нечем, вот пример

http://www.youtube.com/watch?v=Dsi55vRmLXU

это отсюда
 "Красный декабрь": студенты РГТЭУ строят баррикады в ожидании ОМОНа
 
http://top.rbc.ru/society/26/12/2012/838466.shtml
   sapphire
 
238 - 26.12.12 - 14:22
(236) Нам не жалко :)
   Ёпрст
 
239 - 26.12.12 - 14:22
(232) ну и что ?
думаешь, если в подзапросе соединять какждый вид с журналом будет быстрее ? Нет.
   Ёпрст
 
240 - 26.12.12 - 14:23
>>>Запрос по ВСЕМ ТЧ БД :) 

да и не по всем, а только по двум пока..
   sapphire
 
241 - 26.12.12 - 14:24
(240) План будет не оптимальным
   sapphire
 
242 - 26.12.12 - 14:25
(240) Просто интересно, а паренек в состоянии план запроса посмотреть?
   Ёпрст
 
243 - 26.12.12 - 14:25
(241) нормальный там план будет, можешь проверить..
куча соединений на фильтрацию документов в самом юнионе будет не быстрее.
   sapphire
 
244 - 26.12.12 - 14:25
(239) Кстати, думаю, что да.
   bananan
 
245 - 26.12.12 - 14:26
(232) Это я знаю, но как показать товар хотябы в окне сообщений?
   Ёпрст
 
246 - 26.12.12 - 14:30
(245)
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
  Сообщить(ТЗ.Товар);
КонецЦикла;
   bananan
 
247 - 26.12.12 - 14:30
(229) выдает поле агрегатного объекта не обнаружено
   sapphire
 
248 - 26.12.12 - 14:31
(243) Там не куча, там одно + однотипные 
и c индексами будет нормально, по 1sjourn пойдет по DOCTYPE, а 
ТЧ по IDDOC
   bananan
 
249 - 26.12.12 - 14:33
Вывести номер документа как?
ТЗ.Жур.docno     ошибка
Жур.docno    ошибка
Как вывести?
 
 Рекламное место пустует
   sapphire
 
250 - 26.12.12 - 14:41
(247) Полностью код покажи с начала запроса до низу
   sapphire
 
251 - 26.12.12 - 14:42
(249) Это не восьмерка, да и восьмерке за количество точек более одной в полях наказывать надо
   Sinus1984
 
252 - 26.12.12 - 14:45
Жур.docno это в запрос надо добавить
   sapphire
 
253 - 26.12.12 - 14:50
(252) Маленькое уточнение, КАК :)
   Sinus1984
 
254 - 26.12.12 - 14:50
(251)
типо так в 77 нельзя? да вроде и наказывать здесь не за что
ОКЕИ = Товар.ЕдиницаИзмерения.ОКЕИ
   Ёпрст
 
255 - 26.12.12 - 14:52
(248) да, твоя правда.. не оптимальный план.. в 2 раза
:)
   Ёпрст
 
256 - 26.12.12 - 14:53
время компиляции запроса отличается.
   sapphire
 
257 - 26.12.12 - 14:53
(254) Это прямой запрос, речь о прямом запросе к БД 77.
В восьмерке, конструкция вида Товар.ЕдиницаИзмерения.ОКЕИ приведет к неявному соединению
   bananan
 
258 - 26.12.12 - 14:54
(250) Полностью код запроса:
   bananan
 
259 - 26.12.12 - 14:55
ТекстЗапроса = "                             
        |select         
        |   Жур.iddoc as [Док $Документ]
        |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
        |   ,Таб.Товар as [Товар $Справочник.ТМЦ] 
        |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
        |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
        |from
        |    (
        |      select
        |        $ДокС.ТМЦ as Товар
        |        ,ДокС.iddoc as Документ
        |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
        |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
        |     
        |      union all
        |
        |      select
        |        $ДокН.ТМЦ 
        |        ,ДокН.iddoc
        |        ,$ДокН.Кво*$ДокН.Коэффициент 
        |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
        |    )as Таб
        |
        |inner join
        |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
        |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
        |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ 
        |      and Жур.Closed&1 = 1
        |left join (
        |             select  
        |                   max($Спр.Коэффициент) as Коэффициент
        |                    ,Спр.parentext as Владелец
        |             from $Справочник.ЕдИзм as Спр (nolock)
        |             where $Спр.Ед =:ВыбЕдиница
        |                   and $Спр.Коэффициент>0
        |                   and Спр.ismark=0
        |             group by Спр.parentext
        |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
        |
        |group by
        |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
   sapphire
 
260 - 26.12.12 - 14:57
(259) Этот кусок у меня есть. Что ниже этого чуда?
   bananan
 
261 - 26.12.12 - 15:00
(260)Запр=СоздатьОбъект("ODBCRecordset");
    Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
    Запр.УстановитьТекстовыйПараметр("НачДата", НачДата);
    Запр.УстановитьТекстовыйПараметр("КонДата", КонДата);
    ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
   //Таб.ВывестиСекцию("Шапка");
 
    ТЗ.ВыбратьСтроки();                           
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
        Таб.ВывестиСекцию("Строка");
    КонецЦикла;
    Кон=ТекущееВремя();
    
   //Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0);
 
    Таб.ТолькоПросмотр(1);
    Таб.Защита(0);
    Таб.Показать("Расход","");
    
    
    Сообщить("Обрабатывалось с "+Нач+" до "+Кон);
   Ёпрст
 
262 - 26.12.12 - 15:01
>> по 1sjourn пойдет по DOCTYPE
неа.. в плане тупо индекс скан всегда..
не хочет бегать по индексу..
   sapphire
 
263 - 26.12.12 - 15:02
(262) Странно-странно.
   sapphire
 
264 - 26.12.12 - 15:04
не знаю, может als у мну старый, но вот:
ВыполнитьИнструкцию(<?>,<?>,<?>)
Синтаксис:
ExecuteStatement(strTextSQL, obVT, bEraseVT)
Назначение:
Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Если запрос возвращает набор строк, метод возвращает объект с результатом запроса, если запрос не возвращает набор строк (не select, а DML или прочий), возвращается количество обработанных строк. Если запрос содержит несколько SQL инструкций (multistatement batch), результаты возвращаются только от первой инструкции. Однако, на драйвер уходит весь текст запроса (По спецификации ODBC, будут ли выполнены остальные инструкции в пакете зависит от драйвера. Для драйвера SQL Server они выполняются), остальные результаты игнорируются. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки, это не является ошибкой. Если запрос не параметризированный - метод гарантированно закрывает курсор.
Возвращает: объект с результатом запроса (ТаблицаЗначений или наследник), или число - количество обработанных строк.
Параметры:
- strTextSQL (Строка): текст запроса, если пустая строка запрос считается параметризированным. По умолчанию пустая строка.
- obVT (объект): ТаблицаЗначений или наследник от нее для приема результатов запроса, именно этот объект и будет возвращаемым значением. Это должен быть именно ТаблицаЗначений или наследник, а не объект реализующий ее интерфейс. Если тип объекта - пустое значение, создается объект типа ТаблицаЗначений. По умолчанию: пустое значение.
- bEraseVT (Число): 1 - очистить таблицу и создать колонки. 0 - не создавать. По умолчанию - 1.
   sapphire
 
265 - 26.12.12 - 15:05
(261) Версия 1с++ какая?
   bananan
 
266 - 26.12.12 - 15:05
(265) а как узнать?
   bananan
 
267 - 26.12.12 - 15:06
+(266) програмно
   Axel2009
 
268 - 26.12.12 - 15:07
так какой запрос то оптимизируем в итоге?
   sapphire
 
269 - 26.12.12 - 15:08
//Т.е. у мну выглядело бы так:
 
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запр.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ);

 //-- далее итератор вывода  и прочее --
   sapphire
 
270 - 26.12.12 - 15:08
(268) см (259)
   Ёпрст
 
271 - 26.12.12 - 15:08
(268) да пофик какой, атор один хрен результат работы любого запроса не в состоянии в моксель вывести
   bananan
 
272 - 26.12.12 - 15:09
Вообще, я честно говоря, не понимаю.
Раз выражение ТЗ.Товар работает, то, по-идее, должно и работать выражение ТЗ.Жур.docno тоже бы должно было бы работать. Ан нет
   Ёпрст
 
273 - 26.12.12 - 15:09
(269) та нафига так явно то ?
:)
он и так ТЗ возвращает всегда. хотя для вывода, лучше ИТЗ..
   Ёпрст
 
274 - 26.12.12 - 15:10
(272) :)))))

ёёё..
   bananan
 
275 - 26.12.12 - 15:10
(273) А что такое ИТЗ?
   sapphire
 
276 - 26.12.12 - 15:10
(271) Ты слишком к нему суров, может он РГТЭУ закончил и ему лечится от такого образования надо...
   bananan
 
277 - 26.12.12 - 15:10
И как, в конце-концов из даного запроса показать чилсо ящиков и т.д?
   sapphire
 
278 - 26.12.12 - 15:10
(275) Объект из 1С++ Индексированная ТЗ
   Sinus1984
 
279 - 26.12.12 - 15:11
ну в принципе и у него отработает и у тебя правильно
(269)
Если тип объекта - пустое значение, создается объект типа ТаблицаЗначений. По умолчанию: пустое значение.
   sapphire
 
280 - 26.12.12 - 15:12
(273) Я последний раз 1С плюс-плюсил 6 лет назад, ты думаешь я следил за развитием проекта?
   sapphire
 
281 - 26.12.12 - 15:13
у мну ALS от 1C++ 1.8.1.6 :))))))))))
   Sinus1984
 
282 - 26.12.12 - 15:13
(272)
ну аналогия с товаром кривая какая то мож ТЗ.Док попробовать
   Ёпрст
 
283 - 26.12.12 - 15:13
(280) аа..
   sapphire
 
284 - 26.12.12 - 15:14
(282) Да, да, насоветуй, пусть еще по-тормознее будет.
   bananan
 
285 - 26.12.12 - 15:15
(282) Работает
   sapphire
 
286 - 26.12.12 - 15:15
(283) кста, ТС стоило бы Толи-абсента статейку в кз почитать, да?
   Ёпрст
 
287 - 26.12.12 - 15:16
(286) не помогает, ему еще в начале дали
   sapphire
 
288 - 26.12.12 - 15:16
(285) А ТЗ.Док.НомерДок? :))))
   Ёпрст
 
289 - 26.12.12 - 15:16
:)
   sapphire
 
290 - 26.12.12 - 15:16
(287) Да, это уже патология. Ладно, не будем нервировать больного.
   sapphire
 
291 - 26.12.12 - 15:17
(289) как пить дать он щас так и сделает как в (288) :)))
   Sinus1984
 
292 - 26.12.12 - 15:17
(284) я так понял тут давно уже оптимизацией и не пахнет)) тут надо тупо чтоб взлетело)
   sapphire
 
293 - 26.12.12 - 15:18
(292) Ну если ты всю оптимизацию агитируешь убить на корню используя разыменвание полей... То можно в этой ветке по-обсуждать... Да что угодно
   bananan
 
294 - 26.12.12 - 15:19
Ребята, я всем благодарен за дельные советы!
С 1С++ работаю - второй день
   Sinus1984
 
295 - 26.12.12 - 15:20
(294) да и с 1С 7.7 день пятый походу
   sapphire
 
296 - 26.12.12 - 15:21
(294) Если нужны прямые запросы... То надо хоть чуть-чуть почитать про SQL
   sapphire
 
297 - 26.12.12 - 15:21
+(296) Рекомендую Ицик Бен-Ган Основы t-SQL.
Достаточно грамотно и просто.
   bananan
 
298 - 26.12.12 - 15:24
(297) Обязательно прочитаю (уже скачиваю)
   bananan
 
299 - 26.12.12 - 15:26
Но, в каонце концов, как мне это сгрупировать по документах, чтобы я в каждой строке не писал номер документа товар количесвто
ачтобы выдал строка - номер документа
след строка - товар и его количесвто в ящиках
след строка - товар и его количесвто в ящиках
....
Всего ящиков в документе
   Ёпрст
 
300 - 26.12.12 - 15:27
(299) это тебе еще поучиться надо..

  1  2  3  4  5   

Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует