Имя: Пароль:
1C
1C 7.7
v7: Скорость работы запроса в DBF и SQL
, ,
0 НеПалец
 
31.07.13
16:39
Есть крайне простой запрос:

    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;      
    |Группировка ТекущийЭлемент ;
    |Условие(ТекущийЭлемент.ЭтоГруппа() = 1);";

В DBF скорость работы 2 сек. В SQL 80!!!! сек.
Все локально на сервере.

Сервер на win 2008, SQL 2008.

Как можно ускорить выполнение запроса в SQL?

Спасибо.
1 НеПалец
 
31.07.13
16:40
Ой. Должно быть в 1С7.7.
Извините.
2 Denyk
 
31.07.13
16:40
Прямые запросы - будет скорость как в DBF
3 НеПалец
 
31.07.13
16:42
(2)
Согласен. Это очевидно.
Но подобная разница во времени наводит на мысль на неправильную настройку SQL.
Можно ли обойтись без прямого запроса?
4 Ёпрст
 
31.07.13
16:50
(0)
запрос в данном случае, выбирает ТОЛЬКО элементы, писать бред на ЭтоГруппа - идиотизм.

Условия через точку в sql варианте превращаются.. в просто п..ц - отсюда все тормоза.
5 Ёпрст
 
31.07.13
16:50
ускорение, элементарно:

    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)

    |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;      
    |Группировка ТекущийЭлемент ;
    //|Условие(ТекущийЭлемент.ЭтоГруппа() = 1);
    |";
6 НеПалец
 
31.07.13
16:58
(5)
Однозначно, это так.
Однако условие :

    Пока ЗапросГруппы.Группировка("ТекущийЭлемент") = 1 Цикл
        Если ЗапросГруппы.ТекущийЭлемент.ЭтоГруппа() = 1 Тогда
            
        КонецЕсли;
    КонеЦЦикла;


Сводит весь выигрыш по времени к "0".
7 Ёпрст
 
31.07.13
17:00
(6) группы запрос потом добавляет

проверять на ЭтоГруппа в тексте запроса не имеет смысла - там их просто нет.
8 ДенисЧ
 
31.07.13
17:00
Поставь Группировка ТекущийЭлемент Без Групп;

и проверку убери к такой-то
9 Ёпрст
 
31.07.13
17:01
надо скорости - так:

select
  id as [Номенклатура $Справочник.Номенклатура],
  isfolder as ЭтоГруппа
from $Справочник.Номенклатура (nolock)
10 НеПалец
 
31.07.13
17:06
(9)
Это 1С++?
11 Ёпрст
 
31.07.13
17:17
да, можешь и через ado написать, если брезгуешь, но только там типизации нема - придётся рученьками .. усё делать потом
12 vcv
 
31.07.13
21:32
А если так:
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Родитель = Справочник.Номенклатура.Родитель;      
|Группировка Родитель;"

Сам проверить сейчас не могу, инет в деревне совсем дохлый.
13 ЧеловекДуши
 
01.08.13
06:34
(0) 80 сек в SQL, просто у вас руки не из того места, для SQL запросов.
Оптимизируй :)
14 ЧеловекДуши
 
01.08.13
06:35
+ А где собственно запрос на SQL? :)
15 КонецЦикла
 
01.08.13
07:36
(3) Условие на группу?

Интересно, а что если попробовать

Запрос.ВключитьSQL(0);
16 Ёпрст
 
01.08.13
09:00
(12) так в выборке не будут "пустые" группы, те, в которых элементов нема.
17 arsik
 
гуру
01.08.13
09:20
(6) Тебе не так надо
Возможно так будет быстрее
Пока ЗапросГруппы.Группировка("ТекущийЭлемент") = 1 Цикл
   Если ЗапросГруппы.ЭтоГруппа("ТекущийЭлемент") = 1 Тогда
   КонецЕсли;
КонеЦЦикла;
18 varelchik
 
01.08.13
09:56
Запрос.ВключитьSQL(0) это бред.
select
s.id [Родитель $Спр.Номенклатура]
from $Справочник.Номенклатура s (nolock)
where
s.isfolder=1
19 ЧеловекДуши
 
01.08.13
14:14
(15) Не поможет :)
20 ЧеловекДуши
 
01.08.13
14:15
(18) Автор считает, что если куплен SQL, то он сам должен работать быстро :)
"Негоже боярину до SQL склоняться" :)
21 Chai Nic
 
01.08.13
14:27
Стандартные запросы работают так, что уж лучше бы они не работали вообще никак. Особенно с sql-сервером. Когда ВСЯ первичная выборка с сервера перекачивается в каталог временных файлов в виде dbf, а все отборы накладываются уже на эту выборку.
22 varelchik
 
01.08.13
17:28
(21) 100.
а вот 1С++ получает только результат, да и то в память а не временные файлы.