|
v7: Посоветуйте, что оптимизировать в запросе, долго выполняется | ☑ | ||
---|---|---|---|---|
0
Joshim
11.12.14
✎
12:36
|
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачПериода по КонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Заказ.ТекущийДокумент; |Номенклатура = Документ.Заказ.Номенклатура; |Группировка ТекущийДокумент; |Группировка СтрокаДокумента; |Условие(ТекущийДокумент в СписокЗаказов); |"//}}ЗАПРОС ; |
|||
1
butterbean
11.12.14
✎
12:37
|
группируй по номенклатуре, нафига строка?
|
|||
2
Vladal
11.12.14
✎
12:37
|
В файловой 7.7 часто выборка работает быстрее запроса.
Убери группировку строки |
|||
3
Vladal
11.12.14
✎
12:39
|
Группировка СтрокаДокумента замени на Группировка Номенклатура
|
|||
4
dk
11.12.14
✎
12:48
|
в списке заказов скока элементов?
|
|||
5
Joshim
11.12.14
✎
12:48
|
(1)(2)(3) поменял на группировка номенклатура запрос работает с той же скоростью (46 секунд)
(2) выборка сжирает под 1,5 Гб памяти |
|||
6
Joshim
11.12.14
✎
12:49
|
(4) 11 элементов
и запрос 46 секунд делается |
|||
7
Vladal
11.12.14
✎
12:50
|
(6) Выбирай документы, потом в цикле выборки запроса делай выборку по ТЧ документа. Должно работать быстрее.
|
|||
8
Vladal
11.12.14
✎
12:52
|
запрос сокати до
|Период с НачПериода по КонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Заказ.ТекущийДокумент; |Группировка ТекущийДокумент; |Условие(ТекущийДокумент в СписокЗаказов); |"//}}ЗАПРОС потом, зачем обработывать документы ВСЕ? И проведенные и не проведенные? |
|||
9
Локи-13
11.12.14
✎
12:52
|
разве в 7ке не нужно подключаться к SQL и тянуть данные прямыми запросами, когда штатные перестают работать?
|
|||
10
dk
11.12.14
✎
12:53
|
попробуй без итогов добавить и без группировок |
|||
11
Joshim
11.12.14
✎
12:57
|
(10) это дбф, а прямой запрос к дбф табличке можно сделать?
|
|||
12
Joshim
11.12.14
✎
13:00
|
(10) попробовал, быстрее не стало
|
|||
13
Ёпрст
11.12.14
✎
13:00
|
(11) никакой разницы нет какой формат базы при написании прямого запроса
|
|||
14
dk
11.12.14
✎
13:01
|
значит дело не в запросе
|
|||
15
Мигало
11.12.14
✎
13:02
|
(0) Номенклатуру убери из запроса - получишь ее перебором строк документа при обходе результата выборки
|
|||
16
Андрей_Андреич
naïve
11.12.14
✎
13:04
|
(15) У него и так выборка есть - "Условие(ТекущийДокумент в СписокЗаказов)"
|
|||
17
Joshim
11.12.14
✎
13:07
|
(15) выборка память жрет, после например 20 выборок упирается в предел 2 Гб и появляется ошибка
|
|||
18
Joshim
11.12.14
✎
13:08
|
(15) поэтому переделал на запрос.
|
|||
19
kortun
11.12.14
✎
13:14
|
переделай не регистр
типа Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачПериода по КонПериода; |ТекущийДокумент = Регистр.Резервы.ТекущийДокумент; |Номенклатура = Регистр.Резервы.Номенклатура; |Количество = Регистр.Резервы.Количество; |Группировка ТекущийДокумент; |Группировка СтрокаДокумента; |Условие(ТекущийДокумент в СписокЗаказов); |Заказано = Приход(Количество); |"//}}ЗАПРОС ; |
|||
20
Ёпрст
11.12.14
✎
13:14
|
(17) куда всё это потом выгружается ?
В моксель, в ТЗ ? |
|||
21
Ёпрст
11.12.14
✎
13:15
|
(19) не поможет, вообще , никак
|
|||
22
Vladal
11.12.14
✎
13:15
|
(19) В регистре будут только проведенные документы.
А ТС надо обработать ВСЕ документы (так в запросе написано) |
|||
23
Бубка Гоп
11.12.14
✎
13:20
|
(22) а что если по регистру обработать проведенные доки, а к запросу из (0) прилепить Документ.проведен=Ложь? т.е. разбить на 2 запроса
|
|||
24
Vladal
11.12.14
✎
13:26
|
(23) Я думаю, надо дождаться ответ автора на (8)
|
|||
25
Ёпрст
11.12.14
✎
14:02
|
На вот, занимайся
Перем база; //====================================================================== Процедура ПриОткрытии() Попытка база = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); база = СоздатьОбъект("SQLiteBase"); КонецПопытки; база.Открыть(":memory:"); КонецПроцедуры // ПриОткрытии //******************************************* Процедура Сформировать() ТекстЗапроса=" |Период с НачПериода по КонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Заказ.ТекущийДокумент; |Номенклатура = Документ.Заказ.Номенклатура; |Группировка ТекущийДокумент; |Группировка СтрокаДокумента; |Условие(ТекущийДокумент в СписокЗаказов); |"; запрос = база.НовыйЗапрос(); ТекстЗапроса = " |select | Журнал.iddoc [ТекущийДокумент :Документ.Заказ] | ,Док.Номенклатура [Номенклатура :Справочник.Номенклатура] | from [ДокументСтроки.Заказ] Док | Inner join [Журнал] Журнал on Журнал.iddoc=Док.iddoc | and Журнал.iddocdef=:ВидДокумента.Заказ | and Журнал.date between :НачДата and :КонДата | | |"; Запрос.Подставлять("НачДата",НачДата); Запрос.Подставлять("КонДата",КонДата); Начало = _GetPerformanceCounter(); ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); Сообщить("Запрос выполнялся:"+(_GetPerformanceCounter()-Начало)+" мс"); ТЗ.ВыбратьСтроку(); КонецПроцедуры скачай 1sqlite отседыва и помести в каталог BIN\, там, где 1с-ина развернута. http://www.1cpp.ru/forumfiles/Attachments/1sqlite_1026_37170.zip |
|||
26
Joshim
11.12.14
✎
16:18
|
(25) как задать отбор по номеру документа?
сделал так: select Журнал.iddoc [ТекущийДокумент :Документ.Заказ] ,Док.Номенклатура [Номенклатура :Справочник.Номенклатура] from [ДокументСтроки.Заказ] Док Inner join [Журнал] Журнал on Журнал.iddoc=Док.iddoc and Журнал.iddocdef=:ВидДокумента.Заказ and Журнал.date between :НачДата and :КонДата and ((Журнал.DOCNO = :420865417) OR (Журнал.DOCNO = :421953777) OR (Журнал.DOCNO = :422558121) OR (Журнал.DOCNO = :423111089) OR (Журнал.DOCNO = :423711377) OR (Журнал.DOCNO = :424304905) OR (Журнал.DOCNO = :424452273) OR (Журнал.DOCNO = :424457681) OR (Журнал.DOCNO = :424705097) OR (Журнал.DOCNO = :424943049) OR (Журнал.DOCNO = :425118809)) не работает.. |
|||
27
palpetrovich
11.12.14
✎
16:41
|
(26) а как этот СписокЗаказов формируется, может проще в самом sqlite-запросе это в условии порешать?
|
|||
28
Joshim
11.12.14
✎
16:43
|
(27) как вариант)
|
|||
29
Ёпрст
11.12.14
✎
16:44
|
(26) без нелепого фильтра по докам работает ?
Результат удовлетворяет ? |
|||
30
Joshim
11.12.14
✎
16:44
|
(29) без нелепого фильтра работает но табличка оччень большая
|
|||
31
Ёпрст
11.12.14
✎
16:45
|
если че, писать надо так:
and Жур.iddoc in (select val from :СписокДокументов) |
|||
32
ДенисЧ
11.12.14
✎
16:45
|
"Журнал.DOCNO = :420865417"
Интересно, что бы это значило... |
|||
33
Ёпрст
11.12.14
✎
16:47
|
(32) :))
|
|||
34
Joshim
11.12.14
✎
16:48
|
(32) это я попробовал отобрать в запросе строки по номеру документа
|
|||
35
Ёпрст
11.12.14
✎
16:49
|
Короче,
Список = СоздатьОбъект("СписокЗначений");//ну или это объект формы //далее пихаешь в список свои документы, далее база.УложитьОбъекты(Список,"СписокДокументов",0); далее в тексте запроса and Жур.iddoc in (select val from СписокДокументов) |
|||
36
Ёпрст
11.12.14
✎
16:49
|
(34)
по номеру, это хотя бы так: and Журнал.DOCNO like '%420865417%' |
|||
37
Ёпрст
11.12.14
✎
16:52
|
И... если есть список конкретных документов, твой запрос будет выглядеть так:
ТекстЗапроса = " |select | Док.iddoc [ТекущийДокумент :Документ.Заказ] | ,Док.Номенклатура [Номенклатура :Справочник.Номенклатура] | from [ДокументСтроки.Заказ] Док | where Док.iddoc in (select val from СписокДокументов) |"; |
|||
38
Ёпрст
11.12.14
✎
16:53
|
это если тебе не надо получать реквизиты типа ДатаДок,НомерДок.. общие реквизиты с галкой отбор.. и т.д.
|
|||
39
Joshim
11.12.14
✎
16:57
|
(37) не понимаю СписокДокументов это что?
Запрос.Подставлять("СписокДокументов", ???); |
|||
40
Ёпрст
11.12.14
✎
17:09
|
(39) см (35)
|
|||
41
Ёпрст
11.12.14
✎
17:09
|
подставлять ничего не надо
|
|||
42
Ёпрст
11.12.14
✎
17:10
|
надо уложить список в временную табличку в 1sqlite
|
|||
43
Garykom
гуру
11.12.14
✎
17:17
|
(0) Цель запроса можно словами описать?
А то ничего не понял что хочешь... |
|||
44
Joshim
11.12.14
✎
17:30
|
(42) сделал как в (35) - работает
|
|||
45
Garykom
гуру
11.12.14
✎
17:36
|
ЭЭЭ используем "прямые/быстрые" запросы чтобы выбрать товары из нескольких заказов?
Мдяя я тоже хочу ездить на PEUGEOT 2008 DKR вместо LADA KALINA на работу... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |