|
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. Быстрее чем раньше было в монопольном режиме...
Спасибо еще раз. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |