Переключение на Главную Страницу Страницы: 1 ... 32 33 [34] 35 36 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 314096 )
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #495 - 01. Марта 2010 :: 11:21
Печать  
Обсуждал этот вопрос как то с разными людьми. Собственно вот какое мнение.
Поправьте меня если я буду не прав...
В момент создания класса можно обрабатывать метаданные и соответственно создавать ИТЗ и там искать, выигрыш будет я думаю, но время на создание класса увеличится в разы. Ведь все объекты в запросе используются редко, а кешировать какие на стадии создания неизвестно.
Далее про виртуальные таблицы, тут еще веселее обстоит положение дел. Ибо о парамерах вообще нихрена не известно, да и зачем их пытаться "оптимизировать" когда их использование в конкретном тексте конкретного запроса под вопросом?
Я если честно или в силу лени или других причин вообще почти не вижу возможности оптимизации работы с подготовкой кроме ввода понятия "параметризированный запрос". Но как мы все знаем он не сможет быть с виртуальными таблицами. Его необходимость есть (параметризации), но вот использование ограничено.
Ну и наконец, оптимизация возможна путем перевода из КОП на базе языка 1С во внешнюю ВК. Но это тоже не ко мне.
К сожалению пока я так вижу данный вопрос...
И вообще я либо обленился, либо отупел. А вероятно все вместе.
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #496 - 01. Марта 2010 :: 13:23
Печать  
Тут еще нужно прикинуть трудозатраты на оптимизацию и возможный выигрыш от нее. И учесть, что оптимизированный код как правило хуже читается и сложнее модифицируется.
Тратить человекомесяцы на выигрыш 1-10 мс, при этом получить класс, который через полгода сам автор не сможет исправлять/дорабатывать, не говоря уже о посторонних... Кому эти милисекунды важны - все равно первым делом от класса ПрямойЗапрос откажутся (или используют результаты его работы напрямую, без повторения парсинга).
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #497 - 01. Марта 2010 :: 17:48
Печать  
Цитата:
все равно первым делом от класса ПрямойЗапрос откажутся

Вот тут я не понял Улыбка...
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #498 - 01. Марта 2010 :: 18:46
Печать  
Если нужна максимальная скорость - то нужно в ODBDRecordSet давать уже готовый текст, чтобы не тратить время на парсинг. Когда мне были важна скорость - я вписал пару строк для повторного использования уже отпарсеных запросов. Это дало ускорение, которого никак не достичь никакой оптимизацией. Понадобится  еще быстрее - буду сам писать запросы, напрямую, чтобы экономить время на преобразование.
Т. е. нет смысла слишком уж бороться за 5-10 миллисекунд, теряя читабельность и вообще рабочее время. Оптимизация - это, конечно, хорошо - но без фанатизма.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #499 - 01. Марта 2010 :: 19:14
Печать  
Я в общем что думаю...
Может создать коллекцию для хранения подготовленных запросов. Типа чтобы можно было уже достучаться до него с первого раза.
Ну и соответственно хранимые тексты можно с минимальным изменением закидывать в работу. Например я разрешу использовать "&ИмяПараметра" в некоторых местах ВТ. Соответственно можно будет всегда модифицировать эту часть запроса даже уже в подготовленной ВТ.
Например во всех ВТ (регистры, БИ) можно последний параметр т.о. оставлять не отработанным.
Ну так мысли в слух...
А вот параметризированный запрос в том варианте как он реализован в ODBC к сожалению наврядли получиться. Проще тогда объект выставить наружу.
« Последняя редакция: 01. Марта 2010 :: 20:37 - vandalsvq »  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #500 - 01. Марта 2010 :: 20:41
Печать  
Например:
Код
Выбрать все
ВЫБРАТЬ $Жур.ТекущийДокумент
ИЗ ЖурналДокументов КАК Жур $nolock
ГДЕ $Жур.ДатаДокумента МЕЖДУ &НачПериода И &КонПериода 


превратиться и сохраниться как
Код
Выбрать все
SELECT Жур.IDDOC
FROM _1SJOURN AS Жур (nolock)
WHERE LEFT(Жур.DATE_TIME_IDDOC,8) BETWEEN :НачПериода AND :КонПериода 


А перед выполнением подставятся только значения НачПериода и КонПериода.
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #501 - 02. Марта 2010 :: 07:10
Печать  
Может быть это будет иметь смысл, если объект Запрос сделать глобальным... У меня, как правило, все объекты - локальные, глобальных стараюсь избегать - во избежание накладок. А для локальных объектов в кэше будет сохраняться, как правило, один запросУлыбка
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #502 - 02. Марта 2010 :: 07:51
Печать  
Ну и для локального объекта может иметь смысл.
Например если ты на кнопку вешает какой-то пересчет, у которого только параметры меняются.
Ну например у ВТ БИОстатки нельзя будет рулить параметрами <КонецПериода>, <Счет>, <Субконто>, <ВидОстатков>, но вот условиями по субконто можно будет, поскольку они подготавливаются 1 раз и не влияют на составление запроса. Соответственно подготовив запрос на получение остатков по 10-му счету, можно будет передавать значение условия по месту хранения например. Подготовка самого запроса более происходить не будет, и только подстановка параметров и выполнение.
Да и с такими "произвольными" параметрами у меня есть одна интересная идея Улыбка.

Пы.сы. а может ты меня отговорить хочешь, а я тут стою на своем  Очень довольный
  

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



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #503 - 02. Марта 2010 :: 07:57
Печать  
vandalsvq писал(а) 01. Марта 2010 :: 11:21:
...
В момент создания класса можно обрабатывать метаданные и соответственно создавать ИТЗ и там искать, выигрыш будет я думаю, но время на создание класса увеличится в разы. Ведь все объекты в запросе используются редко, а кешировать какие на стадии создания неизвестно.
...

Помнится, была какая-то компонента для прямых запросов - у нее был метод типа СоздатьТаблицуМетаданных(), который создавал на SQL навороченную таблицу с описанием всех метаданных. Джойны с этой таблицей очень удобно было пользовать для всяческих вещей типа определения вида документа по iddocdef, определения вида справочника в реквизитах типа "Справочник" и т.д.
Может, посмотреть в эту сторону? Таблицу можно было бы пересоздавать только при изменениях структуры метаданных, соответственно затрат при инициализации класса не будет никаких.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #504 - 02. Марта 2010 :: 08:09
Печать  
Очень не хочу, чтобы росло время инициализации класса. Как-то так сложилось, что объекты пересоздаются у меня постоянно.

Если бороться ради ускорения пересчета по кнопке - при интерактивной работе 5-100 мс роли не играют вообщеУлыбка Ради этого не стоит тратить рабочее время высококвалифицированного специалиста (* ку два раза *).

К чему веду - быстродействие класса вполне достаточно. Если малой кровью можно будет его ускорить - отлично. Но специально заводиться ради этого не стоит - все равно парсинг на языке 1С будет долгим, а когда скорость будет особенно критична - от парсинга нужно будет отказываться.
Запоминать результаты парсинга - хорошая идея, но коллекцию заводить не стоит, достаточно результатов одного запроса. Мне кажется, затраты на работу с коллекциями будут большими, а в 99 случаях из 100 там будет храниться 1 запрос.

Короче, по моему, не стоит овчинка выделки.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #505 - 02. Марта 2010 :: 09:13
Печать  
Кажется я нашел....  Подмигивание
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #506 - 02. Марта 2010 :: 09:56
Печать  
Собственно решение найдено вот какое:
1. Метод "ПодготовитьШаблонЗапроса". Возвращает подготовленный текст запроса. При этом в тексте не могут использоваться ВТ "ОстаткиОбороты" с периодичностью < Период. В остальных ВТ должны быть установлены все параметры кроме параметров в дополнительных условиях.
Установка текстовых обязательных параметров ВТ осуществляется до вызова метода. Шаблон подготовливается из текста установленного в параметре "Текст". Остальные параметры не учитываются и устанавливаются непосредственно перед выполнением.
2. Новый параметр ШаблонПодготовлен. Только чтение. Позволяет узнать подготовлен ли шаблон из текущего запроса. При установке нового текста запроса параметр обнуляется. И подготовка должна быть произведена повторно.
3. Метод "Выполнить" работает по следующей схеме:
- если ему передан текст запроса для выполнения то используется именно он и флаг "БезПодготовки" учитывается;
- если текст запроса не передан, но произведена подготовка шаблона, выполняется подстановка параметров и выполнение шаблона запроса. Флаг "БезПодготовки" не используется;
- если шаблон не подготовлен то в зависимости от значения флага БезПодготовки запрос обрабатывается или нет и после выполняется.

+ новый параметр РежимRPC.

У кого есть желание можете пробовать.
  

1Cv7_query_001.rar ( 266 KB | Загрузки )

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #507 - 03. Марта 2010 :: 13:06
Печать  
Небольшое объявление

Сподвигся я на реализацию секции ИТОГИ ... ПО ... . На текущий момент это выглядит так:
Код
Выбрать все
ИТОГИ
     <Функции агрегации данных>
ПО
     <Список псевдонимов полей> 



При этом добавлись два новых объекта "РезультатЗапроса" и "ВыборкаИзРезультатаЗапроса". При вызове метода "Выполнить" проверяется наличие секции "ИТОГИ" и запрос выгружается во временную таблицу на сервере. С данной временной таблицей и ведется работа в объекте РезультатЗапроса и ВыборкаИзРезультатаЗапроса.
Секция ИТОГИ требует от запроса выполнение следующих условий:
1. Все колонки запроса первого уровня должны быть указаны в квадратных скобках
2. Все колонки вложенных запросов должны быть указаны без квадратных скобок (в целях избежанния ошибок при составлении дополнительных запросов)
3. Секция ИТОГИ использует только псевдонимы полей.
4. Рассчет итогов по иерархии не поддерживается.

Обход результата запроса возможен только через методы объекта ВыборкаИзРезультатаЗапроса. При этом каждая выборка рождает выполнение запроса с группировкой и условиями по временной таблице, сформированной в результате выполнения запроса переданного пользователем.

Я не готов сказать дату выхода окончательного релиза. Причина банальна и проста. Данный функционал требует тщательного тестирования. Желающие прогнать его на себе, проверить и помочь в "доделке" приветствуются. Обсуждение beta версии будем вести тут...

В связи с чем ИТОГО:
Версия 1.05.013 является рекомендуемой к использованию. Исправление багов будет осуществляться только в ней, причем только если ошибка носит критический характер.
Новый функционал не планируется.

Сборка класса 1.06.001 от 03.03.10 г. beta версии прилагается. Не тестировалось на SQL. На текущий момент это крайне сырой функционал.
  

1Cv7_query_totals.rar ( 282 KB | Загрузки )

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #508 - 03. Марта 2010 :: 14:13
Печать  
Для SQL можно выгружать агрегированную vt_info_totals, с опцией with cube и колонками grouping(). Тогда выборка будет простым извлечением уже расчитанных итогов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #509 - 03. Марта 2010 :: 14:34
Печать  
Вкратце - по сути это вынос на сервер суммирования данных по группировкам, так?? А чем это лучше класса ИтогиПоГруппировкам? http://www.1cpp.ru/forum/YaBB.pl?num=1202201945
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 32 33 [34] 35 36 ... 60
ОтправитьПечать