Переключение на Главную Страницу Страницы: 1 ... 12 13 [14] 15 16 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 304998 )
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #195 - 10. Сентября 2009 :: 18:08
Печать  
classic писал(а) 10. Сентября 2009 :: 18:02:
vandalsvq писал(а) 10. Сентября 2009 :: 14:34:
Ведь ВТ строится исходя из параметров, и если они меняются то бесполезно это - заранее подготавливать.
Твою реализацию оптимизации я посмотрю Подмигивание

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


Тогда давай попробуем разобраться в чем дело. Все таки мне хочется чтобы реализация ВТ (как минимум для SQL) была оптимальнее чем стандартные методы. Не зря же я ночами не спал.

Мне надо чтобы ты попробовал на КОП AccountsRecordset и дал мне посмотреть результат отладки в сравнении с моим КОП. Соответственно замеры, типовые запросы, их результаты ну и небольшую статистику по тем таблицам которые есть (1sbkttl,1sentry)  Подмигивание
Могу рассчитывать?
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #196 - 10. Сентября 2009 :: 18:22
Печать  
Вот рабочая, на этот раз более внимательно проверенная версия использования результатов парсера (только для SQL, на ДБФ не проверял). По сути - отключил подстановку параметров - их все равно подставит RecordSet при выполнении, и сохраняю текст запроса для следующего использования. Да там три строки изменено, все очевидно.

Про скорость запросов к бухитогам - сегодня днем я тестировал их на "молодой базе" - там всего-то документов пару тысяч. Завтра буду проверять на настоящей базе, где уже несколько лет ведется учет по полтысячи документов в день. Вот там будут настоящие результатыУлыбка Если на больших объемах соотношение скоростей не изменится - будем копать глубже.
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #197 - 10. Сентября 2009 :: 18:36
Печать  
classic писал(а) 10. Сентября 2009 :: 18:22:
Вот рабочая, на этот раз более внимательно проверенная версия использования результатов парсера (только для SQL, на ДБФ не проверял). По сути - отключил подстановку параметров - их все равно подставит RecordSet при выполнении, и сохраняю текст запроса для следующего использования. Да там три строки изменено, все очевидно.

Про скорость запросов к бухитогам - сегодня днем я тестировал их на "молодой базе" - там всего-то документов пару тысяч. Завтра буду проверять на настоящей базе, где уже несколько лет ведется учет по полтысячи документов в день. Вот там будут настоящие результатыУлыбка Если на больших объемах соотношение скоростей не изменится - будем копать глубже.


Про подстановку параметров... хм... конечно можно отдать ето Recordset-у или SQLite, но тогда есть возможность некоторого несоответствия параметров (что для меня критично). Также я хотел добиться от класса чтобы после обработки все параметры были уже подставлены по возможности по максимуму. Зачем?
А потому что: (см. тут) http://www.1cpp.ru/forum/YaBB.pl?num=1248941896/148#148

Ну собственно вот Улыбка
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #198 - 10. Сентября 2009 :: 18:47
Печать  
Я догадывался, что написано так, как написано не просто от нечего делать, потому и вписал переключатель - "РазрешитьОптимизациюПовторныхЗапросов". Чтобы оптимизацию можно было включать под полную ответственность разработчика. И параметры оставил только для SQL, потому что как-то пытался напрямую sqlite поработать - убил пол-дня на запрос из трех строк - он у меня параметры вообще принимать не хотел.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #199 - 10. Сентября 2009 :: 18:50
Печать  
classic писал(а) 10. Сентября 2009 :: 18:47:
Я догадывался, что написано так, как написано не просто от нечего делать, потому и вписал переключатель - "РазрешитьОптимизациюПовторныхЗапросов". Чтобы оптимизацию можно было включать под полную ответственность разработчика. И параметры оставил только для SQL, потому что как-то пытался напрямую sqlite поработать - убил пол-дня на запрос из трех строк - он у меня параметры вообще принимать не хотел.


Кстати есть такой вариант реализации, просто, дешево и вполне универсально.
В метод Выполнить добавляется третий параметр БезПодготовки (по аналогии с ВыполнитьЗапрос), в таком случае этап подготовки начисто игнорируется. Т.е. ты можешь поступать таким образом:
1. ТекстЗапроса = "ВЫБРАТЬ ... ИЗ $БИОстатки.Основной()";
2. ПодготовленныйТекст = ПрямойЗапрос.ПодготовитьТекстЗапроса(ТекстЗапроса);
(только параметры не забудь установить)
3. ПрямойЗапрос.Текст = ПодготовленныйТекст;
ПрямойЗапрос.Выполнить(,,1);
Т.о. подготовка будет = 0 мс. И только время на выполнение чистого запроса без подстановки параметров и т.д.  Подмигивание

Такой вариант реализации я готов дать хоть счас  Улыбка
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #200 - 10. Сентября 2009 :: 19:06
Печать  
classic писал(а) 10. Сентября 2009 :: 08:54:
В бух базе, если в конфигурации разделитель учета выключен, а в условиях к виртуальной таблицы БИОстатки написать что нибудь типа: РазделительУчета = :Фирма, то парсер превращает его в bkttl.SP = '     1   '.
Хорошо бы ругнуться, что мол, разделитель учета не включен, или (высший пилотаж) проигнорировать условие.


Кстати на счет вот этого... я мог бы в режим отладки отдать это сообщение, но тогда он будет ругаться. А "высшего пилотажа" пока не придвидится.
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #201 - 10. Сентября 2009 :: 19:13
Печать  
vandalsvq писал(а) 10. Сентября 2009 :: 18:50:
Кстати есть такой вариант реализации, просто, дешево и вполне универсально.
В метод Выполнить добавляется третий параметр БезПодготовки (по аналогии с ВыполнитьЗапрос), в таком случае этап подготовки начисто игнорируется. Т.е. ты можешь поступать таким образом:
1. ТекстЗапроса = "ВЫБРАТЬ ... ИЗ $БИОстатки.Основной()";
2. ПодготовленныйТекст = ПрямойЗапрос.ПодготовитьТекстЗапроса(ТекстЗапроса);
(только параметры не забудь установить)
3. ПрямойЗапрос.Текст = ПодготовленныйТекст;
ПрямойЗапрос.Выполнить(,,1);
Т.о. подготовка будет = 0 мс. И только время на выполнение чистого запроса без подстановки параметров и т.д.  Подмигивание

Такой вариант реализации я готов дать хоть счас  Улыбка

А смысл? Параметры-то каждый раз разные, а получится что все равно в цикле придется выполнять п2 (долгий) и п. 3. А если оставить, как я написал - то подготовка нужна будет только один раз, перед циклом.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #202 - 10. Сентября 2009 :: 19:30
Печать  
classic писал(а) 10. Сентября 2009 :: 19:13:
Параметры-то каждый раз разные


ВОТ... вот оно че, Михалыч (с)  Смех
Какие параметры? В общем объясню чтобы вопросов не было больше, если в тексте различаются параметры: Границы запросов, Условия по счетам, Условия по субконто или Период (сворачивания), то такой запрос НЕОБХОДИМО каждый раз перестраивать. Ибо от этого зависит сам ПОДГОТОВЛЕННЫЙ запрос.
Меняться же безболезненно для запроса может только параметр ДополнительныеУсловия. Таким образом, если у тебя там ДополнительныеУсловия меняются то тогда в моем случае можно делать так
Код
Выбрать все
$БИОстатки.Основной(:Граница,,БЕЗСУБКОНТО,(Сумма),(РазделительУчета = [МойРазделительУчета])) 


После чего ты можешь делать
Код
Выбрать все
ПодготовленныйТекст = СтрЗаменить(ПодготовленныйТекст,"[МойРазделительУчета]","'"+ТвоеЗначение+"'"); 


Только учти что значение необходимо будет в 1С-вское преобразовать. Вот собственно и все.
Так что пока я не вижу проблем в реализации по моему предложению.
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #203 - 10. Сентября 2009 :: 19:38
Печать  
Ну вот зачем такие сложности? Заводить отдельные переменные, новые параметры методов, преобразовывать значения... В результате читабельность такого оптимизированного кода будет намного ниже. Класс должен выполнять все, что можно выполнить внутри, скрыто от пользователя.
Работы и так невпроворот, а тут еще вспоминать, что текст нужно получить, потом параметры подставить, передать... И это все вместо того, чтобы поставить флаг Оптимизация = 1. Заработает - отлично, на самом деле подойдет для более чем половины запросов. Нет - значит, не судьба.

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #204 - 10. Сентября 2009 :: 20:02
Печать  
classic писал(а) 10. Сентября 2009 :: 19:38:
Ну вот зачем такие сложности? Заводить отдельные переменные, новые параметры методов, преобразовывать значения... В результате читабельность такого оптимизированного кода будет намного ниже. Класс должен выполнять все, что можно выполнить внутри, скрыто от пользователя.
Работы и так невпроворот, а тут еще вспоминать, что текст нужно получить, потом параметры подставить, передать... И это все вместо того, чтобы поставить флаг Оптимизация = 1. Заработает - отлично, на самом деле подойдет для более чем половины запросов. Нет - значит, не судьба.

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

Покажи мне текст запроса и как он меняется в твоем цикле.

И...
Я хочу сказать, что понимаю зачем нужна эта самая оптимизация, но она не очень подходит именно для виртуальных таблиц, поскольку они составляются на лету, в отличии от текста запроса. И твоя проверка ТекстЗапроса = ПодготовленныйТекстЗапроса, на самом деле может пройтись на ура, а на деле ничего не изменится. Ведь на этой проверке, что запрос БИОстатки(:КонПериода), где КонПериода = РабочаяДата(); что тот же самый запрос где КонПериода = НачалоМесяца(РабочаяДата()) отличаться никоим образом не будут. А вот подготовленные запросы еще как будут.
Впрочем мы с тобой о разных вещах говорим, я говорю про ВТ, а ты про параметры которые меняются ВНЕ ВТ (ну или в доп. условиях ВТ).
Можно сделать подготовку запроса без автоподстановки параметров, и производить их подстановку только в момент Выполнения, причем если ты заранее подготовил запрос без параметров то КОП уже запомнит это. Вот этот вариант мне нравится. И я думаю он устроит тебя. Не прийдется думать над реализацией дополнительных СтрЗаменить и т.п. А просто нужно будет вызвать что-то вроде метода ОбработатьТекстЗапроса(). А далее просто Выполнить() и там затраты на установку параметров будут оч. маленькими. И даже не обязательно их отдавать ВК-шкам.

А что касается именно твоего предложения есть ряд веских аргументов почему я его не могу принять. И моего "не нравится" или "имхо" там нет  Подмигивание
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #205 - 10. Сентября 2009 :: 20:14
Печать  
Я ушел спать, пора бы уже. Предлагаю дискуссию закончить, и я сделаю так как я вижу решение проблемы (дополнительным методом в классе для оптимизации).
Если оно тебя не устроит поговорим дальше, обсудим и продолжим работу над ошибками.

А счас я спать, а завтра я пить, а в субботу я тоже пить. Но тут я буду, периодически, эпизодами, так что пишите коли что  Подмигивание
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #206 - 11. Сентября 2009 :: 05:03
Печать  
vandalsvq писал(а) 10. Сентября 2009 :: 19:06:
Цитата:
... bkttl.SP = '     1   ' ...

Кстати на счет вот этого... я мог бы в режим отладки отдать это сообщение, но тогда он будет ругаться. А "высшего пилотажа" пока не придвидится.

Ну и пускай ругается. Тогда разработчику не придется догадываться в чем дело, искать по форуму. Всего-лишь убрать условие, секундное дело.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #207 - 11. Сентября 2009 :: 05:13
Печать  
vandalsvq писал(а) 10. Сентября 2009 :: 20:14:
Я ушел спать, пора бы уже. Предлагаю дискуссию закончить, и я сделаю так как я вижу решение проблемы (дополнительным методом в классе для оптимизации).
Если оно тебя не устроит поговорим дальше, обсудим и продолжим работу над ошибками.

А счас я спать, а завтра я пить, а в субботу я тоже пить. Но тут я буду, периодически, эпизодами, так что пишите коли что  Подмигивание

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

Запросы с виртуальными таблицами составляют чуть менее чем приблизительно 48.44% от всех запросов Смех. Я вот полез в класс именно с таким вот запрсом:
Код
Выбрать все
ТекстЗапроса = "
|ВЫБРАТЬ
|$КатегорииЦен.Наименование КАК Категория,
|$ПоследнееЗначение.Цены.Цена($Цены.ТекущийЭлемент, :РабочаяДата) КАК [Цена $Число]
|ИЗ Справочник.КатегорииЦен КАК КатегорииЦен $nolock
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Цены Цены $nolock По $Цены.Категория = $КатегорииЦен.ТекущийЭлемент
|ГДЕ
|$Цены.Владелец = :ТекущийЭлемент
|И $КатегорииЦен.ПометкаУдаления = 0
|И $Цены.ПометкаУдаления = 0
|УПОРЯДОЧИТЬ $КатегорииЦен.Наименование
|";
 


Дважды его парсить - смысла нет, вреда от "неподстановки" параметров в SQL версии - тоже. А вызывается он часто, очень часто - из функции к УстДоступность.

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

Оставь переключатель на парсинг доп. условий и переменных, не документируй. Несколько дополнительных строк погоды не сделают, на общей скорости класса это не скажется никак, на надежности - тоже. Кому нужно, тот будет пользовать под свою ответственность, кому не нужно - не будет. Делов-то.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #208 - 11. Сентября 2009 :: 06:35
Печать  
Ага, вот теперь я точно понял как реализовать. В общем как только так сразу отдам.
Постараюсь чтобы и волки целы и овцы сыты были  Очень довольный
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #209 - 11. Сентября 2009 :: 06:36
Печать  
Кстати а почему бы не попробовать ВТ СрезПоследних? Или с ним совсем труба?

Да уж... реализация среза не самая оптимальная. Будем думать.
« Последняя редакция: 11. Сентября 2009 :: 12:01 - vandalsvq »  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 12 13 [14] 15 16 ... 60
ОтправитьПечать