Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос SQLlite совсем не хочет быстро работать на локальной машине. (число прочтений - 3395 )
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Запрос SQLlite совсем не хочет быстро работать на локальной машине.
02. Сентября 2010 :: 05:44
Печать  
День добрый!
создал в каталоге базы папку Классы.
в ней создал обработку с вот таким кодом
Перем Дата1; 
Перем Дата2; 
Перем ВыбСмета; 

Процедура Проводки(Дата1,Дата2,ВыбСмета) экспорт
     Попытка
           ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
           Сообщить("Подключил компоненту");
     Исключение
     КонецПопытки;
     
     База=СоздатьОбъект("SQLiteBase");
     имяФайла = ":memory:";
     База.Открыть(имяФайла);
     Запрос=База.НовыйЗапрос();
     Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
     Запрос.ВыполнитьЗапрос("create virtual table _1SENTRY using dbeng(_1S.ENTRY)");
     Запрос.Подставлять("Смета",ВыбСмета);
     Запрос.Подставлять("Счет",СчетПоКоду("УПС"));
     Запрос.Подставлять("ДатаНачала",Формат(Дата1,"Д YYYYMMDD"));
     Запрос.Подставлять("ДатаКонца",Формат(Дата2,"Д YYYYMMDD"));
     Запрос.Отладка(1);

     
                                         
     ТекстЗапроса="
     |SELECT
     |      substr(Проводки.DTSC0,1,9) [Исполнитель $Справочник.ИсполнительПоОтделам],
     |      substr(Проводки.DTSC1,1,9) [Док $Документ.РегСметы],
     |      Проводки.SUM СуммаДт,
     |      0 СуммаКт
     |FROM _1SENTRY AS Проводки
     |WHERE                  
     |      ((Проводки.DATE||Проводки.TIME) BETWEEN :ДатаНачала AND :ДатаКонца)
     |      AND (Проводки.ACCDTID = :Счет)
     |      AND (Проводки.DTSC1 = :Смета)
     |";

     ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса);         
     
     ТЗ.ВыбратьСтроку();

КонецПроцедуры

в этой же папке классы создал файл - provodki.prm
с текстом внутри:
класс Хренатень=Проводки.ert
{

};
с самом каталоге базы создал файл - DefCls.prm
в нем прописал:
//#include "Классы\provodki.prm"


создал обработку с вот таким вот кодом:
Процедура Сформировать()
    Взлететь = СоздатьОбъект("Хренатень");
     Взлететь.Проводки(Дата1,Дата2,ВыбСмета);
КонецПроцедуры

ИТОГ: на серваке работает быстро! на локальной машине даж не собирается работать. Злой по 10 - 20 мин работает если строить за 5 дней.

Что делаю не так??? подскажите!
  
Наверх
 
IP записан
 
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #1 - 02. Сентября 2010 :: 05:45
Печать  
база ДБФ  Печаль
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #2 - 02. Сентября 2010 :: 06:11
Печать  
Используй класс ПрямойЗапрос и ВТ данного класса - в частности ВТ БИОбороты с нужной детализацией. В твоем запросе не задействована таблица ОтборПроводокПоСубконто - _1ssbsel.
  
Наверх
IP записан
 
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #3 - 02. Сентября 2010 :: 06:16
Печать  
у вас случайно нет какого нибудь простенького примера?
  
Наверх
 
IP записан
 
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #4 - 02. Сентября 2010 :: 06:50
Печать  
подключил класс прямой запрос
написал:

ТекстЗапроса = "ВЫБРАТЬ ОборотыОсновной.*
|ИЗ $БИОбороты.Основной(:НачПериода
|,:КонПериода
|,Документ
|,:Счет
|,
|,
|,
|,
|,) КАК ОборотыОсновной";

Запрос = СоздатьОбъект("ПрямойЗапрос");
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьТекстовыйПараметр("НачПериода",Дата1);
Запрос.УстановитьТекстовыйПараметр("КонПериода",Дата2);
Запрос.УстановитьТекстовыйПараметр("Счет",СчетПоКоду("УПС"));

Запрос.РежимОтладки = 1;
ИТЗРезультат = Запрос.Выполнить();
ИТЗРезультат.ВыбратьСтроку();

выдает ошибку:

ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such table:     9D   
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{D:\1С базы\Земля\ГородЗемля\pobnaj\ПрямойЗапрос.ert(12639) }

можете пояснить что это?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #5 - 02. Сентября 2010 :: 07:35
Печать  
Нельзя юзать параметр Счет напрямую в ВТ.
Нужен код типа
     спСчетов = СоздатьОбъект("СписокЗначений");
     спСчетов.ДобавитьЗначение(СчетПоКоду("70"));

     ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
     ПрямойЗапрос.УложитьСписокЗначений(спСчетов,"#Счета70", "Основной");

и далее в запросе
|ИЗ $БИОбороты.Основной(:НачДата
     |,:КонДата
     |,Документ
     |,#Счета70
     |,
     |,
     |,
     |,
     |,) КАК ОборотыОсновной
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #6 - 02. Сентября 2010 :: 07:43
Печать  
artbear писал(а) 02. Сентября 2010 :: 07:35:
Нельзя юзать параметр Счет напрямую в ВТ.

Точнее, код укладки такой
ПрямойЗапрос.УложитьСписокЗначений(спСчетов,"#Счета70", "Основной");
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #7 - 02. Сентября 2010 :: 08:30
Печать  
Написал вот такой запрос:
Если ЗагрузитьВнешнююКомпоненту("1sqlite.dll") = 0 Тогда
     Сообщить("Не удалось загразить компоненту 1sqlite.dll");
КонецЕсли;
спСчетов = СоздатьОбъект("СписокЗначений");
спСчетов.ДобавитьЗначение(СчетПоКоду("УПС"));
     
ТекстЗапроса = "ВЫБРАТЬ
|СРЕД(ОборотыОсновной.Субконто1,1,9) as [Исполнитель $Справочник.ИсполнительПоОтделам]
|,СРЕД(ОборотыОсновной.Субконто2,1,9) as [Док $Документ.РегСметы]
|,ОборотыОсновной.СуммаОборотДТ
|,ОборотыОсновной.СуммаОборотКТ
|ИЗ $БИОбороты.Основной(:НачПериода
|,:КонПериода
|,Документ
|,#СчетУПС
|,(Субконто1,Субконто2)
|,БЕЗКОРСЧЕТОВ
|,БЕЗСУБКОНТО
|,(Сумма)
|,(Субконто2 = :Смета)) КАК ОборотыОсновной";

Запрос = СоздатьОбъект("ПрямойЗапрос");
Запрос.Текст = ТекстЗапроса;
Запрос.УложитьСписокЗначений(спСчетов,"#СчетУПС");
Запрос.УстановитьТекстовыйПараметр("НачПериода",Дата1);
Запрос.УстановитьТекстовыйПараметр("КонПериода",Дата2);
Запрос.УстановитьТекстовыйПараметр("Смета",ВыбСмета);

Запрос.РежимОтладки = 1;
ИТЗРезультат = Запрос.Выполнить();
ИТЗРезультат.ВыбратьСтроку();

на сервере -
Время подготовки запроса: 36 мс, время выполнения запроса: 783 мс.

на локальной машине -
Время подготовки запроса: 129 мс, время выполнения запроса: 502527 мс.

на локальной машине выполняется более 8-ми минут!

это предел ускорения или еще как то можно ускорить?
  
Наверх
 
IP записан
 
Yahooey
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #8 - 02. Сентября 2010 :: 08:36
Печать  
мне нужно ускорить вот эту строчку:
,,,,"Операция",1);
на локальной она за 2 минуты выполняется
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #9 - 02. Сентября 2010 :: 08:41
Печать  
leshik писал(а) 02. Сентября 2010 :: 06:11:
Используй класс ПрямойЗапрос и ВТ данного класса - в частности ВТ БИОбороты с нужной детализацией. В твоем запросе не задействована таблица ОтборПроводокПоСубконто - _1ssbsel.

leshik, не берусь утверждать (дело было давно когда я ВТ делал по БИ), но по-моему в DBF варианте я отключил использование 1ssbsel поскольку реально выигрыша никакого не было. Цена подключения еще одной таблицы (пускай даже с попаданием в индекс) была выше чем работа без нее. Хотя конечно можно попробовать "включить" обратно (там один флаг за это отвечает) и посмотреть что получится.

Yahooey, ВТ БИОбороты с периодичностью "Документ" по сути тоже самое что перебрать таблицу проводок и свернуть по документам (причем дважды перебрать для ситуации Счет - КоррСчет и КоррСчет - Счет, хотя на деле перебирается она 4-жды), подумай может тебе было бы актуальнее использовать ОборотыДтКт, или на уровень проводок спустится.
А вообще то что у тебя такая скорость на локалке меня не удивляет Улыбка.
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #10 - 02. Сентября 2010 :: 08:45
Печать  
Yahooey писал(а) 02. Сентября 2010 :: 08:36:
мне нужно ускорить вот эту строчку:
,,,,"Операция",1);
на локальной она за 2 минуты выполняется

Не забывай что перед "ВыполнитьЗапрос" есть еще и другие "операторы" вроде ИспользоватьСубконто.
  

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


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #11 - 02. Сентября 2010 :: 08:47
Печать  
да они там стоят.

значит существенного ускорения по локалке ни даст прямо запрос?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #12 - 02. Сентября 2010 :: 10:13
Печать  
Yahooey писал(а) 02. Сентября 2010 :: 08:47:
да они там стоят.
значит существенного ускорения по локалке ни даст прямо запрос?

Вообще я это сказал чтобы ты "показал" что там у тебя в этом "ИспользоватьСубконто" Улыбка. А сам факт я как бы догадывался что так и есть.
Что касается "существенного" увеличения. Можно попробовать это. У меня руки так и не дошли, но я думаю что все реально. Терминал конечно тоже можно, но и тут я не практикуюсь. Вообще мне везет мои базы из DBF в SQL перерастают задолго до того как там начинаются проблемы.
Есть еще fox. Но тут... я даже не знаю что сказать. Быстрее ли... я не проводил испытания.
Кстати РежимОтладки=1 покажи что выдает (подбор индексов интересует). Только сразу прошу, в txt в качестве вложения.
  

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


1C++ rocks!

Сообщений: 28
Зарегистрирован: 25. Августа 2010
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #13 - 02. Сентября 2010 :: 10:47
Печать  
почитал - http://www.1cpp.ru/forum/YaBB.pl?num=1279614832/30
иииии что то я очкую...

режим отладки приложил
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос SQLlite совсем не хочет быстро работать на локальной машине.
Ответ #14 - 02. Сентября 2010 :: 11:03
Печать  
Суровая задачка по 9-ти месяцам все проводки перелопатить. Напрягают конечно некоторые моменты, если что можешь поделиться именно базой? Хочу попробовать на твоих данных погонять. Если что в ЛС пиши.
  

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