Имя: Пароль:
1C
1C 7.7
v7: Виснет прямой запрос на "топорах". ИЧСХ, не всегда...
,
0 Перелетный косяк
 
08.02.12
17:07
Сабж.
Чаще в монополе (50/50), реже в разделенном. Не могу понять из-за чего.
Самописка на топорах, Оперучет.
7.7.027, 1cpp.dll-3.2.2.0, 1sqlite.dll- 1.0.2.4


ВремКонтр = СоздатьОбъект("Справочник.Контрагенты");
ВремКонтр.НайтиПоКоду("О0001011");    
Сфера = ВремКонтр.ТекущийЭлемент();

Если глПроверкаДаты(ВыбКонПериода,ВыбКонПериода)=0 Тогда
   Возврат;
КонецЕсли;      
   
Попытка
   база = СоздатьОбъект("SQLiteBase");
Исключение
      ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
       база = СоздатьОбъект("SQLiteBase");
КонецПопытки;

Состояние("Формируем запрос по приходу товара от ""Сфера""...");
   
ВремяНачала = _GetPerformanceCounter();
база.Открыть(":memory:");
запрос = база.НовыйЗапрос();
запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");

******************************************************************************
//запросом получим список товаров Cферы ******************************************************************************
Текст = "select


|РегОстатки.Товар [Товар :Справочник.Номенклатура],
|РегОстатки.Клиент [Покупатель :Справочник.Контрагенты]
   
|from [Регистр.ТовОстатки] as РегОстатки

|where date BETWEEN :Дата1 And :Дата2";
       
Текст = Текст + " and РегОстатки.Клиент = :ВыбКлиент";
Текст = Текст + " group by РегОстатки.Товар";

Запрос.Подставлять("ВыбКлиент", Сфера);
Запрос.Подставлять("Дата1",ВыбНачПериода);  
Запрос.Подставлять("Дата2",ВыбКонПериода);  
ВремяКонца = _GetPerformanceCounter();

  //Сообщить("Время выполнения запроса: " + ((ВремяКонца - ВремяНачала)) + " мил.сек." );
     //запрос.Отладка();

тз=запрос.ВыполнитьЗапрос(текст);                  
//ТЗ.ВЫбратьСтроку();
СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
ТЗ.Выгрузить(СписокНоменклатуры,,,"Товар");
Сообщить("Закуп от " + Сфера + " в течении этого года ведется по " + СписокНоменклатуры.РазмерСписка() + " позициям");
база.Закрыть();
1 orefkov
 
08.02.12
17:10
Обновить на 1.0.2.6
ТиИ
Покурить план запроса...
2 Попытка1С
 
08.02.12
17:12
СписокНоменклатуры.РазмерСписка() - тут скока?
3 orefkov
 
08.02.12
17:13
И это, понятно, что sqlite крайне снисходительно относится к синтаксису, но злоупотреблять этим не надо.
Поля
Товар, Покупатель, а групбай только по Товар.
4 Перелетный косяк
 
08.02.12
17:13
(1) Спасибо, Александр.
ТиИ не помогает, да и база под 6 гб, погибну ждать.

А по последнему пункту можно пнуть конкретней?
5 Ёпрст
 
08.02.12
17:14
и это, мот disinict будет быстрее чем group by в данном случае..
6 orefkov
 
08.02.12
17:14
И эта, убрать поле Покупатель из запроса, и получать сразу в СЗ.

СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
запрос.ВыполнитьЗапрос(текст, СписокНоменклатуры);
7 Ёпрст
 
08.02.12
17:14
(4) выкини из селекта вот это, для начала
:
|РегОстатки.Клиент [Покупатель :Справочник.Контрагенты]
8 Перелетный косяк
 
08.02.12
17:16
Вопрос закрыт.
(3) спасло отца рос. демократии

Александру низкий поклон и +100500 в карму
9 Ёпрст
 
08.02.12
17:16
ну и для ускорения, можешь отбор движений воткнуть у измерения
10 orefkov
 
08.02.12
17:16
+(5) и (6)
И тогда да, group by выродиться в distinct

(4)
Для начала включить отладку, потом прогнать запрос в консоли с флагом "Показать план".
Ну, или что то же самое, добавить в начало запроса explain query plan
11 orefkov
 
08.02.12
17:19
Причем тут только топоры, так и не понял...
12 Перелетный косяк
 
08.02.12
17:19
Спасибо товарищи гуру
13 orefkov
 
08.02.12
17:22
А, понял.
На некоторых диалектах клюшки топорами называют...
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан