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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #525 - 04. Марта 2010 :: 09:07
Печать  
2 berezdetsky, поделись своей моделькой Подмигивание думаю многим может пригодиться.
А про "сахар"... хм, да вообще весь КОП "ПрямойЗапрос" по сути сладкая примочка вокруг SQL и 1sqlite. Обертка позволяющая с некоторой долей вероятности писать универсальные запросы. Хотя эта универсальность рождает дополнительные вопросы и проблемы.
Что же касается ИТОГИ с поддержкой иерархии, над этим надо думать. Я еще не знаю каким путем пойти, если можно так выразиться. Тем более в мыслях есть еще дополнительные "опции" вроде периодичности (чтобы не плодить дополнительные колонки).

2 leshik, дык тогда "РезультатЗапроса" и "ВыборкаИзРезультатаЗапроса" может быть простой оберткой вокруг метода "Группировать" в целях обхода результата.
Кстати интересно было бы сравнить что получится если группировать и перебирать через КОП и через ИТЗ. Я думаю коп проиграет.  Печаль

2 JohnyDeath, кстати по похожим причинам нормального быстрого поиска в поставщике так и не реализовано  Круглые глаза
  

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


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

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

1.05.014 от 10.03.10 г.
- Новый публичный метод «ПодготовитьШаблонЗапроса».
- Добавлена типизация "ВидДокумента" для метода "СоздатьТаблицу".
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #527 - 17. Марта 2010 :: 07:37
Печать  
Тут некоторый баг обнаружился в DBF работе. Связано с расчетом номера квартала. В итоге повлекло за собой функцию НачалоПериода и виртуальные таблицы Обороты с периодичностью квартал. Собственно не особо страшно просто 4,7,10 месяца попадали в предыдущие кварталы.
Ну и немного добавлено функционала.

1.05.015 от 14.03.10 г.
- Новая функция «КВАРТАЛ» и «МЕСЯЦСТРОКОЙ».
- Исправлена ошибка подготовки ВТ по оборотам (РегистрОбороты и РегистрОстаткиОбороты по регистру с типом остатки, БИОборотыДтКт, БИОбороты, БИОстаткиОбороты) с периодичностью КВАРТАЛ для DBF формата БД.
- Исправлена ошибка в функции НАЧАЛОПЕРИОДА(,КВАРТАЛ).
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #528 - 24. Марта 2010 :: 22:13
Печать  
Выложена новая версия.
Всем кто пользуется must have.

1.05.016 от 25.03.10 г.
- Исправлена работа ВТ РегистрОстатки в части сбора данных по регистрам с типом Остатки с периодичностью хранения остатков отличной от Месяц.
  

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



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #529 - 26. Марта 2010 :: 10:43
Печать  
Я хотел бы высказать пару мыслей по оптимизации класса ПрямойЗапрос.
Я предлагаю в классе вызовы вида:
Код
Выбрать все
Для НомерЗначения = 0 По Вектор.Количество()-1 Цикл 


Заменить на
Код
Выбрать все
КолВоЗначенийВектора = Вектор.Количество()-1;
Для НомерЗначения = 0 По КолВоЗначенийВектора Цикл 


Также предлагаю вызовы вида:
Код
Выбрать все
Для НомерРесурса = 1 По МетаРегистр.Ресурс() Цикл 


Заменить на
Вариант 1.:
Код
Выбрать все
КолВоРесурсов = МетаРегистр.Ресурс();
Для НомерРесурса = 1 По  Цикл 


Вариант 2.: (это просто так фантазии).
получение данных о структуре метаданных регистров по индексированной таблице.
Вида:
НазваниеРегистра,ВидРеквизита(Измерение,Реквизит,Ресурс),Идентификатор
с индексом НазваниеРегистра+ВидРеквизита - я думаю ускорит построение запроса.
Все эти изменения связаны с вызовом инструкции определяющий конечный показатель счетчика при каждом проходе цикла.
Да и конечно же я готов произвести эти изменения в классе и выслать автору.
Можно для начала попробовать провести тестирование - только расскажите правильно методологию - как сравнить скорость построения запросов в том варианте что есть и в том варианте что я предлагаю.
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #530 - 26. Марта 2010 :: 17:24
Печать  
С выносом Количество() и т.п. из цикла я постепенно борюсь. Улыбка В принципе может соберусь в выходные и поборю полностью.
Что касается остального (вариант 2) я если честно не понял о чем речь Улыбка
  

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



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #531 - 26. Марта 2010 :: 17:39
Печать  
Ну я честно говоря не замерял.
Вот смотри - при парсинге запроса (в основном ВТ в регистрах) каждый раз вызывается объект Метаданные и его методы Регистр(), Измерение(), Реквизит() - которые возвращают КОЛИЧЕСТВО объектов указанного вида в метаданных. А я предлагаю инициализировать эту структуру в индексированной таблице и реализовать получение данных не через объект Метаданные а через Индексированную таблицу.
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

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

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



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #533 - 27. Марта 2010 :: 01:25
Печать  
vandalsvq писал(а) 26. Марта 2010 :: 19:11:
А в ИТЗ загонять в какой момент?

Я считаю что при инициализации класса. Я не думаю что это будет длительный процесс. Просто его не стоит делать при каждом парсинге запроса.
Цитата:
Но боюсь что в ближайшее время я не найду возможности реализации данного механизма. Месяц не ранее.

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


Re: Класс "ПрямойЗапрос"
Ответ #534 - 27. Марта 2010 :: 04:11
Печать  
leshik писал(а) 27. Марта 2010 :: 01:25:
Я считаю что при инициализации класса. Я не думаю что это будет длительный процесс. Просто его не стоит делать при каждом парсинге запроса.

При инициализации - не всегда "гуд". Н.р. кто-то предпочитает не хранить постоянно экземпляр класса, а создавать его по месту в случае необходимости.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #535 - 27. Марта 2010 :: 05:26
Печать  
Цитата:
leshik писал(а) 27. Марта 2010 :: 01:25:
Я считаю что при инициализации класса. Я не думаю что это будет длительный процесс. Просто его не стоит делать при каждом парсинге запроса.

При инициализации - не всегда "гуд". Н.р. кто-то предпочитает не хранить постоянно экземпляр класса, а создавать его по месту в случае необходимости.

Согласен.
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

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

Давайте разделим работу с метаданными класса от кэша. Тогда получаем две ипостаси объекта:
1. ПрямойЗапрос.Метаданные как КОП для создания, обновления и работы с кэшем (тут мало ли что понадобится, переиндексация или еще что)
2. ПрямойЗапрос.Метаданные как КОП у которого сам ПрямойЗапрос запрашивает все коллекции и получает их в "сходное" для нас время.

Далее как происходит работа по моему представлению, в глобальном модуле программист пишет создание объекта и что-то вроде метода "СоздатьКэшМетаданных", соответственно при завершении работы пользователя "УдалитьКэшМетаданных". Собственно в этот момент и будет создаваться файл в котором будет полностью все метаданные (а возможно и какие-то шаблоны для прямых запросов и т.д.).
Объект который создает класс ПрямойЗапрос, проверяет наличие этого самого кэша и пытается его подгрузить, нет, значит работает с Метаданные и все как было. Есть, значит работает с ИТЗ (или что там будет использоваться для коллекции).

Но это все только после того как я найду что действительно самое узкое место - это работа с метаданными.
  

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



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #537 - 27. Марта 2010 :: 20:20
Печать  
vandalsvq писал(а) 27. Марта 2010 :: 20:03:
Но это все только после того как я найду что действительно самое узкое место - это работа с метаданными.

Золотые слова.
  
Наверх
IP записан
 
Donat
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 152
Зарегистрирован: 29. Мая 2006
Re: Класс "ПрямойЗапрос"
Ответ #538 - 28. Марта 2010 :: 07:09
Печать  
vandalsvq писал(а) 26. Марта 2010 :: 19:11:
В принципе идея у меня почти родилась. Что-то вроде "ПрямойЗапрос.Метаданные". Суть класса в том что он может вызываться как самим КОП ПрямойЗапрос так и самостоятельно.
При этом обход и работа с метаданными в ПрямойЗапрос будет организована через него. А самостоятельный объект будет нужен для создания и хранения кэша метаданных. Обновление кэша, как часто это делать и прочее оставить на программисте, а КОП будет реализовывать необходимый для обхода интерфейс.
Сам кэш - это ИТЗ. Которая сохраняется в файл и восстанавливается из него. Повесить необходимые индексы, заполнение можно оставить опциональным (например если БУ вообще отсутствует то реализовать интерфейс для перезаполнения кэша). Собственно если ПрямойЗапрос попросит обход коллекции при наличии кэша это будет обход по нему, при отсутствии - работа с метаданными.


Я делал такой механизм, когда погонял в отладчике проведение документов в типовой ТиС 9.2 и увидел, что обход метаданных занимает где-то 20% времени. Но экономия получается не очень большая. Пробовал через ИТЗ и через АссоциативныйВектор, через него кстати быстрее. У меня правда было реализовано только определение наличия у документов реквизитов шапки и табличной части. Другое, просто было не нужно.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #539 - 29. Марта 2010 :: 04:17
Печать  
Потратил таки немного времени на класс и могу вполне ответственно заявить, в построении запроса больше всего времени занимает не построение ВТ (причем какой бы сложности оно не было), соответственно работа с метаданными (вопреки моим мыслям) далеко не самое узкое место. Совсем я бы сказал не узкое.
Самые узкие места это:
1. Разбор и замена ключевых слов. Причем если их не много все равно их разбор и замена съедает как правило около 50% всего времени подготовки.
2. Разбор и замена функций запроса. Соответственно особенность такая же как и в п.1. Только доля около 20%.
3. Разбор и замена источников данных. Соответственно особенность такая же как в п.1. Только доля около 30-40%.
Не удивляйтесь что в сумме более 100%. Улыбка) это погрешности расчетов  Смех.
Причем есть еще одна особенность, и связана она с тем как происходит подготовка запросов. Собственно говоря все что я напишу ниже является следствием моего неправильного подхода к построению класса.

Немного мыслей:
Изначально я считаю что самой глупой идеей было использование ключевых слов в русскоязычном написании. Ведь ничего сложного в том чтобы оставить селекты, фромы и прочее не было, а замене подлежал только синтаксис отличный от SQL. В таком случае все что надо было делать это привести один язык в соответствие с другим. И вот тут я жестко просчитался с самого начала. Собственно счас уже все является следствием этого просчета.
Разбор ключевых слов, функций и источников занимает как вы поняли около 70-80% времени. Причем если время растет это значение изменяется совершенно незначительно. Т.е. большой запрос = много времени, маленький = мало времени. Но доля всегда приблизительно равна.
И заключение: разбор текста происходит следующим образом:
- разбор всех ВТ (соответственно рост текста запроса очень большой)
- разбор всех особенных конструкций (первые, top/limit и пр.)
- разбор ключевых слов
- разбор функций
- разбор реквизитов и таблиц

Как это побороть? Я знаю, но время надо много.
Путь таков:
- перелопатить все ВТ чтобы там не было синтаксиса КОП-а
- изменить порядок обработки текста запроса, ВТ оставить на самый конец
- если не изменять порядок подготовки текста, тогда необходимо чтобы ВТ возвращались не готовым текстом а идентификаторами, и заменялись уже после реализации всей "пост"-обработки.

Вот так вот. Все эти записи - чтобы не забыть. А сделаю я это видимо к концу апреля.
  

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