Переключение на Главную Страницу Страницы: 1 ... 30 31 [32] 33 34 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 314057 )
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос"
Ответ #465 - 23. Февраля 2010 :: 08:20
Печать  
Задача: выбрать все поступления товаров за определенный период, запрос написал, но скорость не удовлетворяет, по сравнению со стандартным 1С-ным, ускорение в два раза, но хотелось бы быстрее, может можно как-то по другому.
Чувствую что написал как-то криво, время подготовки запроса 176845мс, а время выполнения 16мс.
|SELECT
|      Рег.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
|      Рег.ТекущийДокумент КАК [Документ $Документ],
|      Рег.ВидДокумента КАК [Документ_Вид $ВидДокумента],
|      Рег.КоличествоПриход КАК [ПрихКол]
|FROM
|      $РегистрОстаткиОбороты.ОстаткиТМЦ(
|                                          :ДатаНач,
|                                          :ДатаКон~,
|                                          Документ,
|                                          ДвиженияИГраницыПериода,
|                          (Номенклатура in (SELECT Val FROM #спТоваров)),
|                                          (Номенклатура),
|                                          (Количество)
|                                          ) КАК Рег
|ГДЕ
|      (Рег.ВидДокумента=:ВидДокумента.ПоступлениеТМЦ)
|";
« Последняя редакция: 24. Февраля 2010 :: 05:42 - ssamm »  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #466 - 23. Февраля 2010 :: 10:06
Печать  
Если задача выбрать ТОЛЬКО поступления - то виртуальная таблица для этого не нужна. Тут есть несколько варианто:
можно выбирать напрямую из документов ПоступлениеТМЦ, соединяя с журналом документов для фильтра по времени,
а можно вытягивать данные из регистра напрямую:
Код
Выбрать все
|SELECT
				 |	Рег.Номенклатура КАК [Номенклатура $Справочник.Номенклатура],
				 |	Рег.ТекущийДокумент КАК [Документ $Документ],
				 |	Рег.ВидДокумента КАК [Документ_Вид $ВидДокумента],
				 |	Рег.Количество КАК [ПрихКол]
				 |FROM
				 |	$Регистр.ОстаткиТМЦ  Рег
				 |ГДЕ
				 |	(Рег.ВидДокумента = :ВидДокумента.ПоступлениеТМЦ)
				 |И Рег.Дата BETWEEN :НачДата AND :КонДата~
				 |И Рег.Номенклатура in (SELECT Val FROM #спТоваров)
				 |И Рег.ВидДвижения = 1
				 |"; 


Что-то вроде этого.
  
Наверх
 
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос"
Ответ #467 - 23. Февраля 2010 :: 13:38
Печать  
classic писал(а) 23. Февраля 2010 :: 10:06:
Если задача выбрать ТОЛЬКО поступления - то виртуальная таблица для этого не нужна. Тут есть несколько варианто:
можно выбирать напрямую из документов ПоступлениеТМЦ, соединяя с журналом документов для фильтра по времени,
а можно вытягивать данные из регистра напрямую: .


не получается Печаль, ругается на отсутсткие поля Рег.IDDOCDEF, т.е. на ВидДокумента, видать из-за отсутствия флага Быстрая обработка движений у регистра

Ну вот, победил таки, сделал JOIN к журналу, теперь скорость впечатляет
« Последняя редакция: 24. Февраля 2010 :: 05:39 - ssamm »  

Zapr.txt ( 0 KB | Загрузки )
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #468 - 23. Февраля 2010 :: 22:48
Печать  
Не видать, а точно. Флаг полезный, но не всегда. Можно в принципе поставить, лишним не будет.

Пы.сы. я тут заметил что если ставить только Сортировка у реквизитов справочников, без Отбор, то этого достаточно для отборов (прямым запросом или в поставщике) с попаданием в индекс, и он не так много места занимает за счет того, что не добавляет колонки CODE или DESCR. У меня и-за этого в одном справочнике на 50 метров информации, индексов было на 80 метров. Ужас...  Круглые глаза
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос"
Ответ #469 - 24. Февраля 2010 :: 13:54
Печать  
Добрался до следующего "узкого" места в базе:
Поставщики.ВыгрузитьИтоги(ТзИтоги,1,1);
...
Покупатели.ВыгрузитьИтоги(ТзИтоги,1,1);

Написал прямой запрос к регистру покупателей:
|SELECT
|Рег.Фирма КАК [Фирма $Справочник.Фирмы],
|Рег.Договор КАК [Договор $Справочник.Договоры],
|  Рег.КредДокумент КАК [КредДокумент $Документ],
|Рег.СуммаВалОстаток КАК [СуммаВал]
|FROM
|$РегистрОстатки.Покупатели(:КонПериода~,
| ((Фирма in (SELECT Val FROM #спФирмы)) AND (Договор in (SELECT Val FROM #спДоговоры))),
|(Фирма,Договор,КредДокумент),
|(СуммаВал)) КАК Рег ";

Выполняется не значительно быстрее чем ВыгрузитьИтоги, притом это только к одному регистру, как можно оптимизировать?
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #470 - 24. Февраля 2010 :: 14:01
Печать  
Общее правило оптимизатора - все, что только можно нужно тянуть ОДНИМ запросом. Скорее всего тебе подойдет конструкция вида
SELECT
.. as ,
SUM () as
from
(
select
from

UNION ALL

select
from
) as Запрос
group by
  
Наверх
 
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос"
Ответ #471 - 24. Февраля 2010 :: 14:15
Печать  
classic писал(а) 24. Февраля 2010 :: 14:01:
Общее правило оптимизатора - все, что только можно нужно тянуть ОДНИМ запросом.


Это в целом понятно, просто сейчас даже этот запрос не намного выигрывает у штатного метода ВыгрузитьИтоги, может можно каким другим путем вытащить эти остатки?
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #472 - 24. Февраля 2010 :: 14:17
Печать  
А ты попробуй выгрузить итоги не на точку актуальности Подмигивание. И время штатного метода считай с учетом всех подготовительных операций, точно не помню - рассчитать, там, еще что-то.
Да и нифига себе - ускорение в 2 (ДВА!!!) раза на ровном месте уже некруто считается...
  
Наверх
 
IP записан
 
ssamm
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 19
Зарегистрирован: 24. Декабря 2009
Re: Класс "ПрямойЗапрос"
Ответ #473 - 24. Февраля 2010 :: 14:28
Печать  
classic писал(а) 24. Февраля 2010 :: 14:17:
А ты попробуй выгрузить итоги не на точку актуальности Подмигивание.


В том то и дело  что выгружаются в данном случае всегда на ТА, а насчет того что в Два раза, переборшил, прогнал запрос несколько раз, когда в два раза, а когда и практически также, иногда даже медленнее Улыбка
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #474 - 24. Февраля 2010 :: 18:07
Печать  
Если всегда выгружается на ТА и точно уверен что не понадобится на другую дату можно рассмотреть под лупой (РежимОтладки) запрос который получается и написать его самостоятельно. При этом поиграть с условиями или соединениями, тогда вполне возможно все будет выглядеть несколько иначе.
Хотя конечно всегда проще всего разбираться на живой базе с живым примером Подмигивание.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
novichek
Экс-Участник


Re: Класс "ПрямойЗапрос"
Ответ #475 - 25. Февраля 2010 :: 03:13
Печать  
classic писал(а) 24. Февраля 2010 :: 14:01:
Общее правило оптимизатора - все, что только можно нужно тянуть ОДНИМ запросом.

вот как раз в случае с SQLite не соглашусь. Здесь, как практика показывает, преимущество имеет метод "насоздавай временных таблиц, наполучай в них данные, создай индексы, и только потом делай разные соединения" Озадачен
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #476 - 25. Февраля 2010 :: 04:10
Печать  
На счет SQLite соглашусь. С собственными таблицами работает очень хорошо. А из 1С-ки лучше брать данные и обрабатывать их в виде таблиц SQLite.

Пы.сы. тут под общее завывание о пролете нашей сборной по хоккею, я решил на выпуск небольшого "дополнения" Улыбка

1.05.010 от 25.02.10 г.
- Добавлен предопределенный параметр ПустаяДата. Для SQL это дата 01.01.1753, для DBF это пустая строка длиною 8 символов.
- Незначительные изменения в ВТ БИОбороты с поддержкой корреспонденции.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #477 - 25. Февраля 2010 :: 04:13
Печать  
Забыл сказать, для всех функций скобка начала должна быть сразу после имени функции. Эт я так... вспомнил блин.

Пы.сы. если ни у кого новых багов или проблем не обнаружено я накачу данный релиз в ПоставщикДанных. Просто опасно туда вносить изменения, конечно сразу видны большинство косяков, но при этом стабильность текущего функционала важнее Улыбка.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #478 - 25. Февраля 2010 :: 05:41
Печать  
Выложил обновление. Версию не менял. Изменения коснулись небольшого потенциального багофикса.
В общем перед именем функции не должно быть букв или иных символов, только пробелы, переносы и другие небуквенные символы. Т.е. защита от наличия что-то вроде <Дополнение>ИмяФункции(...). В противном случае данное выражение не будет обработано.


А забавно получается, пишешь СуперДень(), а на выходе СуперDAY() Смех Вот только набор функций - это дело класса, а не пользователя. Пользовательское дело - ошибаться

НИХРЕНА !!!!!!!!!!!
« Последняя редакция: 26. Февраля 2010 :: 08:41 - vandalsvq »  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #479 - 25. Февраля 2010 :: 07:57
Печать  
Обнаружены ошибки.... какой-то день сегодня неправильный.... незаладился с 5:30 по Уфе...  Нерешительный
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 30 31 [32] 33 34 ... 60
ОтправитьПечать