Имя: Пароль:
1C
1С v8
запрос к внешнему источнику невыносимо долог
,
0 Wobland
 
18.03.13
07:21
сделал я когда-то сравнительно большой прямой запрос в семёрке. теперь захотелось мне выполнить его на восьмёрке к внешнему источнику данных. кое-где текст запроса пришлось поправить, в целом он работает. аж 360 секунд. в семёрке он отрабатывает за 2-3. отчего так долго?
1 Wobland
 
18.03.13
07:25
правки исходного текста были следующие:
1) ВнешнийИсточникДанных.ТиС.Таблица.dbo_ --добавлено во всех нужных местах
2) SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания --вместо LEFT()
3) ((ЖурО.Closed=1) OR (ЖурО.Closed=3) OR (ЖурО.Closed=5) OR (ЖурО.Closed=7)) --вместо ЖурО.Closed&1=1
4) имена полей разыменовывал самостоятельно
2 Wobland
 
18.03.13
07:29
5) ON SUBSTRING(ВозвратШ.SP1633, 4, 9)=ОтчётККМ.IDDoc --вместо RIGHT - соединение по документу-основанию
3 Wobland
 
18.03.13
08:06

{Форма.Форма.Форма(8)}: Ошибка при вызове конструктора (COMОбъект)
   ТиС=Новый COMОбъект("V77.Application");
по причине:
Интерфейс не поддерживается

а это говорит о том, что у меня семёрка не стоит, или о вредности платформы 8.2.17.169?
4 Wobland
 
18.03.13
09:06
в качестве подъёма ветки

В каком-то институте, в котором готовили литературных переводчиков, на контрольной студентам раздали текст русской частушки, и попросили перевести.
Текст такой:
Эх, лапти мои,
Четыре оборки,
Хочу - дома заночую,
Хочу - у Егорки.

Листочки с результатами работы собрали, и выдали студентам другой группы, с предложением перевести обратно на русский. Вот. Наиболее интересные варианты.
Невыносимо туфли блещут лаком,
До бездны только шаг, все решено,
Мне дома нынче сон уже не лаком,
Мне нынче спать у Джорджа суждено.
5 cw014
 
18.03.13
09:08
Понедельник, а он уже обкуренный
6 Wobland
 
18.03.13
09:09
(5) я ещё в пятницу начал ;)
7 viktor_vv
 
18.03.13
09:09
Тормозит из-за этого скорее всего
SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания --вместо LEFT()

индексы таки не сипользуются.
8 viktor_vv
 
18.03.13
09:10
Сделай через ADO.
9 Wobland
 
18.03.13
09:13
(7) этот же запрос (убрав п.1) выполняю в семёрке. результат - максимум 9 секунд. ну тормозит, но не настолько же
10 Wobland
 
18.03.13
09:15
(8) а скажи ключевые слова, плз
11 cw014
 
18.03.13
09:16
(10) Па-жа-луй-ста :)
12 МихаилМ
 
18.03.13
09:34
в

SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания

уберите SUBSTRING

просто Date_Time_IDDoc
13 МихаилМ
 
18.03.13
09:34
лучше приведите весь текст запроса
14 Fragster
 
гуру
18.03.13
09:37
это из-за or
15 Fragster
 
гуру
18.03.13
09:38
ЖурО.Closed <> 0
16 Fragster
 
гуру
18.03.13
09:38
и SUBSTRING
17 МихаилМ
 
18.03.13
09:39
(15)
неправильно . в (1) верно
18 Wobland
 
18.03.13
09:39
сочинял для семёрки, потом переводил на восьмёрку. теперь выполняю два почти одинаковых текста. разница между текстами только в "ВнешнийИсточникДанных.ТиС.Таблица.dbo_".
исходная задача. поиметь ТЗ вида:
Дата | Касса | Суммы продаж и возвратов | себестоимости продаж и возвратов

   "SELECT
   |    ОтчётыККМ.ДатаДок AS Дата,
   |    Кассы.Descr AS Касса,
   |    SUM(ОтчётыККМ.Сумма) AS СуммаОтчётовККМ,
   |    SUM(Возвраты.Сумма) AS СуммаВозвратов,
   |    SUM(ПартииО.Сумма) AS СебестоимостьОтчётовККМ,
   |    SUM(ПартииВ.Сумма) AS СебестоимостьВозвратов,
   |    SUM(ОтчётыККМ.Сумма)-SUM(ISNULL(Возвраты.Сумма, 0)) AS ИтогПродаж,
   |    SUM(ПартииО.Сумма)-SUM(ISNULL(ПартииВ.Сумма, 0)) AS ИтогСебестоимости
   |FROM
   |    (SELECT
   |        SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) AS ДатаДок,
   |        ОтчётККМТЧ.IDDoc AS Ссылка,
   |        ОтчётККМШ.SP3363 AS Касса,
   |        ОтчётККМТЧ.SP3102 AS Номенклатура,
   |        SUM(ОтчётККМТЧ.SP3107) AS Сумма
   |    FROM
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo__1SJOURN AS ЖурО
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_DH3114 AS ОтчётККМШ
   |    ON
   |        ОтчётККМШ.IDDoc=ЖурО.IDDoc
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_DT3114 AS ОтчётККМТЧ
   |    ON
   |        ОтчётККМШ.IDDoc=ОтчётККМТЧ.IDDoc
   |    WHERE
   |        SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания
   |        AND ((ЖурО.Closed=1) OR (ЖурО.Closed=3) OR (ЖурО.Closed=5) OR (ЖурО.Closed=7))
   |        AND (ЖурО.sp5365=&Организация OR &ПустаяОрганизация)
   |        AND (ОтчётККМШ.SP3093=&Склад OR &ПустойСклад)
   |    GROUP BY
   |        SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8),
   |        ОтчётККМТЧ.IDDoc,
   |        ОтчётККМШ.SP3363,
   |        ОтчётККМТЧ.SP3102
   |    ) AS ОтчётыККМ
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_SC1809 AS Кассы
   |    ON
   |        Кассы.ID=ОтчётыККМ.Касса
   // ОтчётыККМ //////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////
   |LEFT JOIN
   |    (SELECT
   |        SUBSTRING(ЖурВ.Date_Time_IDDoc, 1, 8) AS ДатаДок,
   |        ВозвратТЧ.IDDoc AS Ссылка,
   |        ВозвратШ.SP1633 AS ДокОснование,
   |        ОтчётККМ.SP3363 AS Касса,
   |        ВозвратТЧ.SP1644 AS Номенклатура,
   |        SUM(ВозвратТЧ.SP1649) AS Сумма
   |    FROM
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo__1SJourn AS ЖурВ
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_DH1656 AS ВозвратШ
   |    ON
   |        ВозвратШ.IDDoc=ЖурВ.IDDoc
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_DT1656 AS ВозвратТЧ
   |    ON
   |        ВозвратШ.IDDoc=ВозвратТЧ.IDDoc
   |    INNER JOIN
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_DH3114 AS ОтчётККМ
   |    ON
   |        SUBSTRING(ВозвратШ.SP1633, 4, 9)=ОтчётККМ.IDDoc
   |    WHERE
   |        SUBSTRING(ЖурВ.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания
   |        AND ((ЖурВ.Closed=1) OR (ЖурВ.Closed=3) OR (ЖурВ.Closed=5) OR (ЖурВ.Closed=7))
   |        AND (ЖурВ.sp5365=&Организация OR &ПустаяОрганизация)
   |        AND (ВозвратШ.SP1639=&Склад OR &ПустойСклад)
   |    GROUP BY
   |        SUBSTRING(ЖурВ.Date_Time_IDDoc, 1, 8),
   |        ВозвратТЧ.IDDoc,
   |        ВозвратШ.SP1633,
   |        ОтчётККМ.SP3363,
   |        ВозвратТЧ.SP1644
   |    ) AS Возвраты
   |    ON
   |        SUBSTRING(Возвраты.ДокОснование, 4, 9)=ОтчётыККМ.Ссылка
   |        AND Возвраты.ДатаДок=ОтчётыККМ.ДатаДок
   |        AND ОтчётыККМ.Касса=Возвраты.Касса
   |        AND ОтчётыККМ.Номенклатура=Возвраты.Номенклатура
   // ВозвратОтПокупателя ////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////
   |LEFT JOIN
   |    (SELECT
   |        прт.IDDoc AS Ссылка,
   |        прт.SP331 AS Номенклатура,
   |        SUM(прт.SP344) AS Сумма
   |    FROM
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_RA328 AS прт
   |    GROUP BY
   |        прт.IDDoc,
   |        прт.SP331) AS ПартииО
   |    ON
   |        ОтчётыККМ.Ссылка=ПартииО.Ссылка
   |        AND ОтчётыККМ.Номенклатура=ПартииО.Номенклатура
   |LEFT JOIN
   |    (SELECT
   |        прт.IDDoc AS Ссылка,
   |        прт.SP331 AS Номенклатура,
   |        SUM(прт.SP344) AS Сумма
   |    FROM
   |        ВнешнийИсточникДанных.ТиС.Таблица.dbo_RA328 AS прт
   |    GROUP BY
   |        прт.IDDoc,
   |        прт.SP331) AS ПартииВ
   |    ON
   |        Возвраты.Ссылка=ПартииВ.Ссылка
   |        AND Возвраты.Номенклатура=ПартииВ.Номенклатура
   // Партии /////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////
   |GROUP BY
   |    ОтчётыККМ.ДатаДок,
   |    ОтчётыККМ.Касса,
   |    Кассы.Descr
   |ORDER BY
   |    ОтчётыККМ.ДатаДок,
   |    Кассы.Descr";
19 Fragster
 
гуру
18.03.13
09:41
ну нафига ИЛИ везде лепить?
20 Fragster
 
гуру
18.03.13
09:41
нафига функции к индексированным полям применять?
21 Wobland
 
18.03.13
09:43
(19) (20) чо? не дошло
22 Fragster
 
гуру
18.03.13
09:43
вот это: ЖурВ.sp5365=&Организация OR &ПустаяОрганизация вообще надо заменить на &_УсловиеОрганизации и потом менять на нужное (Истина или ЖурВ.sp5365=&Организация)
23 Fragster
 
гуру
18.03.13
09:44
(21) если у тебя по ЖурО.Date_Time_IDDoc индекс, то он не работает, если ты сравницаешь не прямое значение, а результат выполнения функции с этим полем - это основное.
24 Wobland
 
18.03.13
09:44
(22) аа.. это я в семёрке не знал, как с пустым полем сравнивать
   Запрос.УстановитьПараметр("Организация", "");
   Запрос.УстановитьПараметр("ПустаяОрганизация", Истина);
25 Fragster
 
гуру
18.03.13
09:45
а дальше - см (22) ну и непонятно, зачем ты определяешь проведенность документа по 3-м ИЛИ вместо <>0, например
26 Wobland
 
18.03.13
09:45
(23) таки (12) прав?
27 Fragster
 
гуру
18.03.13
09:45
(26) это основной тормоз, но остальные тоже добавляют
28 Wobland
 
18.03.13
09:46
(25) это от недостатка опыта/знаний. один фих семёрка это же делает на два порядка быстрее
29 Fragster
 
гуру
18.03.13
09:47
(28) прием (22) и в снеговике часто работает намного быстрее
30 Wobland
 
18.03.13
09:51
сделал типа

   |    WHERE
   //|        SUBSTRING(ЖурО.Date_Time_IDDoc, 1, 8) BETWEEN &ДатаНачала AND &ДатаОкончания
   |        ЖурО.Date_Time_IDDoc BETWEEN &ДатаНачала AND &ДатаОкончания
   //|        AND ((ЖурО.Closed=1) OR (ЖурО.Closed=3) OR (ЖурО.Closed=5) OR (ЖурО.Closed=7))
   |        AND ЖурО.Closed<>0

работало 6 секунд. верность полученного буду ещё проверять, но результат удивил.
спасибо!!
31 МихаилМ
 
18.03.13
09:56
ЖурО.Closed<>0

неправильно.

будет верно только для одной компоненты бух или опер учет.
для остальных компонент  Closed > 0 всегда.


если не нравится ИЛИ? замените на IN
32 Wobland
 
18.03.13
10:03
с "AND ((ЖурО.Closed=1) OR (ЖурО.Closed=3) OR (ЖурО.Closed=5) OR (ЖурО.Closed=7))" отработало за 4.5 секунды. не принципиально
33 viktor_vv
 
18.03.13
10:04
(30) И на всякий случай спрошу, &ДатаНачала и &ДатаОкончания у тебя, особенно Датаокончания ?
34 viktor_vv
 
18.03.13
10:05
(33)+ Я к тому, что Датаокончания должна быть "20130131z".
35 Wobland
 
18.03.13
10:07
(34)    Запрос.УстановитьПараметр("ДатаНачала", "20130317");
   Запрос.УстановитьПараметр("ДатаОкончания", "20130317Z");

про Z мне Mikeware в бананановской ветке говорил (кстати, я там тыщу уже в конце накручивал, если чо ;)
36 viktor_vv
 
18.03.13
10:12
(35) Если чо, я там тыщу и поймал :).
37 acsent
 
18.03.13
10:19
а построитель запросов работает с внешними источниками?
38 Wobland
 
18.03.13
10:25
(37)    ТабДок=Новый ТабличныйДокумент;
   Построитель=Новый ПостроительОтчета;
   Построитель.Текст=ПолучитьТекстЗапроса();
   
   Построитель.Параметры.Вставить("ДатаНачала", "20130317");
   Построитель.Параметры.Вставить("ДатаОкончания", "20130317Z");
   Построитель.Параметры.Вставить("Организация", "");
   Построитель.Параметры.Вставить("ПустаяОрганизация", Истина);
   Построитель.Параметры.Вставить("Склад", "");
   Построитель.Параметры.Вставить("ПустойСклад", Истина);
   Построитель.Выполнить();
   Построитель.Вывести(ТабДок);
   
   Возврат ТабДок;

полёт нормальный
39 Wobland
 
18.03.13
10:26
+(38) с Построитель=Новый ПостроительЗапроса; тоже
40 Fragster
 
гуру
18.03.13
11:00
(38) а нафига построитель, если все равно
   Построитель.Параметры.Вставить("Организация", "");
   Построитель.Параметры.Вставить("ПустаяОрганизация", Истина);
41 Fragster
 
гуру
18.03.13
11:01
построитель - он же как раз чтобы динамический текст, в том числе необязательные условия пихать
42 Wobland
 
18.03.13
11:05
(40) не наю. acsent спросил, я попробовал ;) более мудрёно с ним крутить не хочу. не люблю я его
43 regniws
 
18.03.13
11:12
план запроса уже рекомендовали посмотреть?
44 Wobland
 
18.03.13
11:24
(43) нет. время выполнения снизилось до психологически приемлемой величины в 1.5-6 секунд, необходимости в осмотре плана не вижу. скажу больше: лишь смутно догадываюсь, о чём речь ;) а как посмотреть план?
45 regniws
 
18.03.13
11:29
(44) ммм..http://goo.gl/FnA3S
46 regniws
 
18.03.13
11:29
(44) одно дело получить готовый рецепт, другое - понять самому..
47 Wobland
 
18.03.13
11:31
(45) +10 к опыту, спасибо