Имя: Пароль:
1C
1C 7.7
v7: Натолкните на мысль. Оптимизация запроса SQLiteBase
0 serpentt
 
30.03.15
10:56
Здравствуйте. При подборе товара в документ необходимо видеть количество товара ранее отгруженного и количество по Договору.
Написал запрос
|SELECT
            |    Выборка.Номенклатура as [Номенклатура $Справочник.Номенклатура],
            |    Выборка.Количество as Количество,
            |    SUM(СпрКонтракт.Количество) as КолВоПоКонтракту
            |FROM
            |    (SELECT
            |        ДокТЧ.Номенклатура  as Номенклатура,
            |        SUM(ДокТЧ.Количество * ДокТЧ.Коэффициент) as Количество
            |    FROM
            |        [ДокументСтроки.Реализация] as ДокТЧ
            |    
            |    INNER JOIN
               |        [Журнал] Жур ON (Жур.iddocdef = :ВидДокумента.Реализация) and (ДокТЧ.IDDOC = Жур.IDDOC)
               |    
               |    LEFT JOIN
               |        [Документ.Реализация] as Док on (Док.IDDOC = Жур.IDDOC)
               |
            |    WHERE
            |        (Жур.Date Between :ДатаОтбораН AND :ДатаОтбораК) AND
            |        (Жур.CLOSED = 1) AND
            |        ДокТЧ.Номенклатура = @ВыбТовар AND
            |        Док.Договор = :ДоговорОтбора
            |    ) as Выборка
            |
            |LEFT JOIN
               |    [Справочник.s_НоменклатураКонтракта] as СпрКонтракт
               |        ON (СпрКонтракт.ParentExt = :ДоговорОтбора)
               |        AND (СпрКонтракт.Товар = @ВыбТовар)

Данные получаются и отображаются... База выросла и стало подтормаживать. Причем в монопольном режиме все быстренько(0,205 мс), а в раздельном сразу тормоза(1,17мс).
Что можно оптимизировать в запросе????

Если-бы в регистрах "Продажи" был Договор, наверно проще из регистров взять, а так приходится перелапачивать ТабЧасти Реализаций и делать соединения.
Заранее спасибо.
1 Ёпрст
 
30.03.15
11:05
Запрос к 2-м регистрам, покупатели и продажи
2 serpentt
 
30.03.15
11:10
(1) а соединение делать по Договор.Владелец ?
3 Ёпрст
 
30.03.15
11:11
зачем ?
по iddoc
4 Ёпрст
 
30.03.15
11:12
у тебя же всегда, 1 документ=1договор=1 клинтос
5 serpentt
 
30.03.15
11:14
да....
Покупатели.IDDOC = Продажи.IDDOC

так???
6 Ёпрст
 
30.03.15
11:15
ага
7 serpentt
 
30.03.15
11:18
(6) спасибо... сейчас перепищу
8 Ёпрст
 
30.03.15
11:37
+ продажный регистр воткни быстрая обработка движений, чтоб не соединять с журналом для фильтра по дате.
9 serpentt
 
30.03.15
14:39
Быстрые движения воткнул...
Таблицы подключил как виртуальные

запрос_Sqlite.ВыполнитьЗапрос("create virtual table Регистр_Покупатели using dbeng(Регистр.Покупатели)");
            запрос_Sqlite.ВыполнитьЗапрос("create virtual table Регистр_Продажи using dbeng(Регистр.Продажи)");
            запрос_Sqlite.ВыполнитьЗапрос("create virtual table Справочник_s_НоменклатураКонтракта using dbeng(Справочник.s_НоменклатураКонтракта)");

Запрос переписал выполнение ускорилось НО хочется побыстрее. Получил следующие показатели...Монопольно 0,089с , раздельно 0,862 было 1,17.

|SELECT
            |    Выборка.Номен  as [Номенклатура $Справочник.Номенклатура],
            |    SUM(Выборка.Количество) as Количество,
            |    СпрКонтракт.Количество as КолВоПоКонтракту
            |FROM
            |    (SELECT
            |        РегПрод.Количество as Количество,
            |        РегПрод.Номенклатура as Номен,
            |        РегПрод.IDDOC
            |  
            |    FROM
            |        Регистр_Продажи as РегПрод
            |    INNER JOIN
            |        Регистр_Покупатели as РегПок ON (РегПок.IDDOC = РегПрод.IDDOC)
            |                                    AND РегПок.Договор = :ДоговорОтбора    
            |    WHERE
            |        (РегПрод.DATE Between :ДатаОтбораН AND :ДатаОтбораК)
            |        AND РегПрод.Номенклатура = @ВыбТовар
            |
            |    GROUP BY
            |        РегПрод.IDDOC) as ВЫБОРКА
            |
            |LEFT JOIN
            |    Справочник_s_НоменклатураКонтракта as СпрКонтракт
            |   ON (СпрКонтракт.ParentExt = :ДоговорОтбора) AND (СпрКонтракт.Товар = @ВыбТовар)
            |
            |GROUP BY    
            |    Выборка.Номен
10 Salimbek
 
30.03.15
14:54
(9) Раздельно при нескольких подключениях всегда намного медленнее монопольного. Чем больше база - тем тормознее будет. Варианты - всех в терминал или V7DBNet отсель: http://www.wirth.ru/load/v7dbnet/1-1-0-2 или сделать свой регистр для этой задачи и писать в него информацию при проведении документов, а при подборе брать уже готовые данные.
11 Ёпрст
 
30.03.15
14:56
на покупателей тоже воткни фильтр по дате в место соединения.. попробуй
12 Ёпрст
 
30.03.15
14:56
хотя.. лишнее.
13 Salimbek
 
30.03.15
15:03
(9) Кстати - давно уже не надо подключать таблицы (create virtual table)
14 Ёпрст
 
30.03.15
15:05
и это, выбирать лучше с покупателей и джойнить продажи, будет шустрее, по идее - там меньше записей.
15 serpentt
 
30.03.15
15:08
(9) Я один в раздельном подключении и всеравно тормозит. Рабочая база в терминале(сейчас тестирую локально)
С регистром вряд-ли При подборе товара необходимо знать сколько осталось отгрузить по договору. Проще договор добавить в регистр, но тогда придется закрывать еще и в разрезе регистра
16 serpentt
 
30.03.15
15:08
(13) ок. переделал и прочитал ХЕЛП, спасибо
17 serpentt
 
30.03.15
15:09
(14) щас попробую "перевернуть"
18 Ёпрст
 
30.03.15
15:16
(15) если договор добавить в реквизит регистра, то ничего делать не надо будет.. прямым апдейтом проставить его и привет..
И в коде потом только прописать его заполнение.
19 serpentt
 
30.03.15
15:37
(14) результат не изменился(в выборкой по Покупатели и Джойн Продажи)
20 serpentt
 
30.03.15
15:39
(15) а прямым UPDATE это прям можно с помощью SQLite сделать?
21 Ёпрст
 
30.03.15
15:41
(20) нет. sqllite не способен на insert/update..
тут писать на oledb надо будет
22 Ёпрст
 
30.03.15
15:41
ну или тупо запрос в консоли, 1sqa выполнить
23 Ёпрст
 
30.03.15
15:42
в общем, дел на 5 сек +/ правка модуля проведения через turbomd..минут за 5 справишься
24 serpentt
 
30.03.15
15:42
(22) или перепровести все документы :)
Спасибо за ответы. Будем дальше мучить
25 serpentt
 
30.03.15
15:43
а что за консоль ???
26 Ёпрст
 
30.03.15
15:46
27 Ёпрст
 
30.03.15
15:46
lkz sqlite тоже есть, созданная самим Орефковым :)
28 serpentt
 
30.03.15
15:48
(27) у Орефкова фидел, но там ничего про Апдейт не увидел
29 Ёпрст
 
30.03.15
15:54
(28) потому, что в sqlite можно инсертить/апдейтить только родные таблички от самого sqlite
30 Ёпрст
 
30.03.15
15:59
а тебе .. так вообще примитив:

update
  Рег
set
  $Рег.Договор = $Покупатели.Договор
from
  $регистр.Продажи as Рег
inner join $Регистр.Покупатели as Покупатели on Покупатели.iddoc = Рег.iddoc
31 Ёпрст
 
30.03.15
15:59
Ну и в коде поправить
32 serpentt
 
30.03.15
16:13
переделал, переписал запрос на один регистр... странно но ускорения не произошло, произошло замедление выборки. В раздельном режиме раньше было 0,862 стало 0,874
SELECT
            |    РегПрод.Номенклатура as [Номенклатура $Справочник.Номенклатура],
            |    SUM(РегПрод.Количество) as Количество,
            |    СпрКонтракт.Количество as КолВоПоКонтракту
            |  
            |FROM
            |    [Регистр.Продажи] as РегПрод
            |LEFT JOIN
            |    [Справочник.s_НоменклатураКонтракта] as СпрКонтракт
            |   ON (СпрКонтракт.ParentExt = :ДоговорОтбора)  AND (СпрКонтракт.Товар = @ВыбТовар)
            |
            |WHERE
            |    РегПрод.Договор = :ДоговорОтбора
            |    AND РегПрод.Номенклатура = @ВыбТовар
            |    AND (РегПрод.DATE Between :ДатаОтбораН AND :ДатаОтбораК)
            |
            |GROUP BY    
            |    РегПрод.Номенклатура
33 Ёпрст
 
30.03.15
16:16
а ты оберни как было - подзапрос и к нему уже лефт джоин
НоменклатураКонтракта
34 serpentt
 
30.03.15
16:36
Обернул... но ничего не изменилось...
|SELECT
            |    ВЫБОРКА.Номенклатура as [Номенклатура $Справочник.Номенклатура],
            |    ВЫБОРКА.Количество,
            |    СпрКонтракт.Количество as КолВоПоКонтракту
            |FROM
            |(SELECT
            |    РегПрод.Номенклатура,
            |    SUM(РегПрод.Количество) as Количество
            |  
            |FROM
            |    [Регистр.Продажи] as РегПрод
            |
            |WHERE
            |    РегПрод.Договор = :ДоговорОтбора
            |    AND РегПрод.Номенклатура = @ВыбТовар
            |    AND (РегПрод.DATE Between :ДатаОтбораН AND :ДатаОтбораК)
            |
            //|GROUP BY    
            //|    РегПрод.Номенклатура
            |) as ВЫБОРКА
            |
            |LEFT JOIN
            |    [Справочник.s_НоменклатураКонтракта] as СпрКонтракт
            |   ON (СпрКонтракт.ParentExt = :ДоговорОтбора)  AND (СпрКонтракт.Товар = @ВыбТовар)
35 Ёпрст
 
30.03.15
16:37
ну, тогда поставь отбор движений на договор свой.. будет быстрее
36 Ёпрст
 
30.03.15
16:37
ну и на номенклатуру..
37 serpentt
 
30.03.15
16:41
(36) Все ОК, сразу полетело замер показал 0,043. Быстрее чем раньше было в монопольном режиме...
Спасибо еще раз.
2 + 2 = 3.9999999999999999999999999999999...