|
v7: Можно ли ускорить запрос 7.7 | ☑ | ||
---|---|---|---|---|
0
zenon46
07.02.19
✎
12:30
|
Доброго дня!
В справочнике номенклатура сделал кнопку, по которой находится документ "установка цен" в котором есть номенклатура на которой с позиционирован курсор, можно ли как то ускорить этот запрос? По большому счету работает он нормально, но можно ли быстрей? Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |ОбрабатыватьДокументы Все; |Обрабатывать НеПомеченныеНаУдаление; |ТекДок = Документ.УстановкаЦен.ТекущийДокумент; |Товар = Документ.УстановкаЦен.Номенклатура; |Группировка ТекДок; |Условие (Товар = ТекущийЭлемент()); |"; |
|||
1
ДенисЧ
07.02.19
✎
12:32
|
мойТовар = ТекущийЭлемент();
и |Условие (Товар = МойТовар); Больше некуда. Если только руками индексы создавать |
|||
2
Ёпрст
07.02.19
✎
12:35
|
ну разве что прямой запрос выгребет это быстрее
|
|||
3
Ёпрст
07.02.19
✎
12:36
|
или штатно, выбратьПоРеквизиту.. если Номенклатуру добавить в графу отбора
|
|||
4
zenon46
07.02.19
✎
12:36
|
(1) за счет чего "мойТовар = ТекущийЭлемент();" это будет быстрей?
|
|||
5
Davalebor
07.02.19
✎
12:36
|
(0) Цена наверное периодический реквизит?
Если да, то может быстрее через объект "периодический" выбрать значения цены и получить оттуда документ? |
|||
6
ДенисЧ
07.02.19
✎
12:37
|
(4) За счёт того, что один раз вычисляется. При фиксированном условии запрос целиком уйдёт на сервер
|
|||
7
zenon46
07.02.19
✎
12:38
|
(5) где речь про цену?
|
|||
8
Davalebor
07.02.19
✎
12:39
|
(7) Ну документ "Установка цен" наверное устанавливает цену в номенклатуре? Это предположение мое.
|
|||
9
trad
07.02.19
✎
12:40
|
Документ.УстановкаЦен - при проведении делать движения в оборотный регистр с измерением Товар
Дергать не из ТЧ документа, а из регистра |
|||
10
zenon46
07.02.19
✎
12:47
|
(9) это 7.7, документ самописный. В регистры ничего не складывает.
|
|||
11
trad
07.02.19
✎
12:51
|
(10) ну я употребил глагол "делать", а не "делает"
т.е. как один из способов решения задачи - расширить учет |
|||
12
Mikeware
07.02.19
✎
12:51
|
(9) лучше графу отбора.
|
|||
13
mishaPH
модератор
07.02.19
✎
12:52
|
(0) использовать в запросе обращение к функциям! 1с
|Условие (Товар = ТекущийЭлемент()); моветон. |
|||
14
mishaPH
модератор
07.02.19
✎
12:54
|
(0) как часто у вас появляются эти доки?
|
|||
15
palpetrovich
07.02.19
✎
12:54
|
тип БД никого не заинтересовал? или по дефолту - файловая? :)
|
|||
16
zenon46
07.02.19
✎
12:55
|
(13) может и так, но почему то отработал так запрос быстрей чем через переменную, проверил по 3 раза через замер производительности.
|
|||
17
zenon46
07.02.19
✎
12:55
|
(15) SQL
|
|||
18
trad
07.02.19
✎
12:57
|
(12) можно и графу - строго для решения задачи, но в регистр можно и прочего "вкусного" накидать в перспективе (ту же цену)
|
|||
19
ДенисЧ
07.02.19
✎
12:59
|
(16) План запроса тогда смотри, что в скуль летит
|
|||
20
Провинциальный 1сник
07.02.19
✎
13:01
|
Только новички в 7.7 используют штатные запросы. Забудьте про них. Есть давно уже стабильный и быстрый 1с++ с прямыми sql-запросами и индексированными таблицами.
|
|||
21
palpetrovich
07.02.19
✎
13:02
|
(17) дык что, прямыми запросами не пользуетесь?
|
|||
22
zenon46
07.02.19
✎
13:02
|
(18) поясните за гарфу, что-то я не совсем понял о чем речь идет?
|
|||
23
trad
07.02.19
✎
13:04
|
(22) ты для начала все же скажи двигает этот документ периодические цены?
|
|||
24
zenon46
07.02.19
✎
13:04
|
(23) да, в справочнике цены устанавливает цены из документа.
|
|||
25
trad
07.02.19
✎
13:07
|
(24) если периодика с опцией "Изменяется документами", то можно и без графы
но я умею только прямые запросы |
|||
26
zenon46
07.02.19
✎
13:09
|
(25) да изменяется документами
по прямым запросам, руки пока совсем не доходили до этого. Насколько прямой запрос в данном случае будет выигрышней? |
|||
27
trad
07.02.19
✎
13:10
|
а графа - в конфигурации добавляешь новую графу отбора, в нее кидаешь реквизит УстановкаЦен.Номенклатура.
Тогда условие в черном запросе будет использовать индекс |
|||
28
zenon46
07.02.19
✎
13:11
|
(27) понял
|
|||
29
trad
07.02.19
✎
13:16
|
примерно так:
select Периодика.docid [Док $Документ], Журнал.iddocdef Док_вид from _1sconst Периодика (nolock) join _1sjourn Журнал (nolock) on Журнал.iddoc = Периодика.docid where Периодика.id = $ИсторияРеквизита.Номенклатура.Цена and Периодика.objid = :Товар |
|||
30
Mikeware
07.02.19
✎
13:16
|
(25) такую периодику только прямым удобно доставать
|
|||
31
Mikeware
07.02.19
✎
13:17
|
(26) примерно на порядок. хотя зависит от количеств документов
|
|||
32
trad
07.02.19
✎
13:17
|
такая задача без запросов, а через объект Периодический решается тоже на ура
|
|||
33
Mikeware
07.02.19
✎
13:19
|
(32) в объект периодический попадут только движения, следовательно, определим толькопроведенные документы. в запрос как в (0) - все неудаленные
|
|||
34
zenon46
07.02.19
✎
13:19
|
(29) а как будет выглядеть мой "черный" запрос на прямом хотяб примерно очень инетресно замерить скорость?
|
|||
35
trad
07.02.19
✎
13:20
|
(34) боюсь что никак
|
|||
36
zenon46
07.02.19
✎
13:21
|
(35) а в чем ограничение ?
|
|||
37
trad
07.02.19
✎
13:22
|
(36) в синтаксисе черных запросов
|
|||
38
Mikeware
07.02.19
✎
13:22
|
(34)
select док.iddoc [Док $Документ.УстановкаЦен] from $ДокументСтроки.УстановкаЦен as Док where $Док.Номенклатура=:Номенклатура |
|||
39
Mikeware
07.02.19
✎
13:23
|
+(38) это все, в т.ч. помеченые на удаление
|
|||
40
zenon46
07.02.19
✎
13:23
|
(35) тады не понял. есть документ установка цен, у него в табличной части есть реквизит номенклатура, как скажем получить список документов установка цен в которой встречается номенклатура выбранная на форме отчета? Никак?
|
|||
41
Mikeware
07.02.19
✎
13:23
|
(35) ??
|
|||
42
trad
07.02.19
✎
13:23
|
(33) это да, но наверно ТСу все же нужны доки потрогавшие цену. имхо
|
|||
43
trad
07.02.19
✎
13:24
|
(38) ааа, ну да, я не врубился в вопрос )
|
|||
44
Mikeware
07.02.19
✎
13:26
|
(43) только ввиду отсутствия индекса - он будет медленным, но все равно быстрей черного раза в 3.
|
|||
45
trad
07.02.19
✎
13:26
|
(40) это я не понял. см (38)
|
|||
46
zenon46
07.02.19
✎
13:27
|
(44) да, а как потом группировку обходить ?
|
|||
47
Mikeware
07.02.19
✎
13:27
|
(46) результат получишь в ТЗ
|
|||
48
Mikeware
07.02.19
✎
13:30
|
где-то валяется расширение недоделанное для прямой замены обходов кривых запросов на обход прямых, но даже не помню, какой степени готовности... да собственно оно и не нужно особо
|
|||
49
zenon46
07.02.19
✎
13:32
|
(47) select <<?>> док.iddoc [Док $Документ.УстановкаЦен]
Запрос[2] : Ожидается '=' перед 'док' Странно зачем там знак = |
|||
50
Mikeware
07.02.19
✎
13:34
|
(49) это кто такое сказал?
|
|||
51
Mikeware
07.02.19
✎
13:46
|
(49) млин, интригу тянешь?
|
|||
52
Herby
07.02.19
✎
13:47
|
(34) даже если черный запрос протранслируется в sql в такой же прямой, как и если бы ты его сам написал, то черный все равно будет медленнее - потому что создается временный дбф файл.
|
|||
53
Провинциальный 1сник
07.02.19
✎
13:58
|
(49) Воспользуйся восьмеркоподобной консолью запросов для прямого запроса
http://www.1cpp.ru/forum/YaBB.pl?num=1193394153 |
|||
54
Mikeware
07.02.19
✎
14:12
|
(53) 1cQA проще.
|
|||
55
zenon46
07.02.19
✎
15:19
|
(51) предприятие эту ошибку выдало.
|
|||
56
Mikeware
07.02.19
✎
15:22
|
(55) дык куда ты в "предприятии" его пихал?
|
|||
57
zenon46
07.02.19
✎
15:33
|
(56) вот так намутил, правильно?
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |SELECT док.IDDOC [Док $Документ.УстановкаЦен] |FROM $ДокументСтроки.УстановкаЦен AS Док |WHERE ($Док.Номенклатура=:Товар) |"; РС = СоздатьОбъект("ODBCRecordset"); РС.УстановитьТекстовыйПараметр("Товар", ТекущийЭлемент()); Выгрузка = РС.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
58
zenon46
07.02.19
✎
15:43
|
(56) по замеру производительности показало снижение времени на общей задаче 15%, это запрос + вывод реестра на форму.
|
|||
59
Mikeware
07.02.19
✎
15:44
|
(57) ээээ...
не должно тут ругаться... |
|||
60
zenon46
07.02.19
✎
15:45
|
(59) да я уже разобрался что не так было. 1cpp.dll - нужно каждому кидать в BIN или достаточно в папку с базой закинуть?
|
|||
61
Mikeware
07.02.19
✎
15:47
|
(60) никакой разницы - смотри "порядок загрузки компонент", я не помню его уже
|
|||
62
Botanik8888
07.02.19
✎
15:47
|
В папку с базой достаточно
|
|||
63
Botanik8888
07.02.19
✎
15:47
|
1cpp.dll должна загружаться первой
|
|||
64
Mikeware
07.02.19
✎
15:48
|
(58) у тебя поле поиска неиндексировано, вот и прирост небольшой. что там скан, что тут
|
|||
65
zenon46
07.02.19
✎
15:49
|
(63) да я ее первой поставил в глПриНачалеРаботыСистемы
|
|||
66
trad
07.02.19
✎
15:53
|
(58) а по _1sconst как?
|
|||
67
zenon46
07.02.19
✎
17:11
|
(64) а как в прямом запросе исключать помеченные на удаление? А еще может занаете как синтаксис помощник добавить функции и методы из 1cpp ?
|
|||
68
Mikeware
07.02.19
✎
17:26
|
(67) 1.приджойнить журнал, и фильтровать по нему.
признак удаления (и проведения) - в журнале 2.кинуть в папку с базоq 1с++.als |
|||
69
Злопчинский
07.02.19
✎
18:50
|
(27) в скальной базе - скорее всего да, в файловой - очень- очень сомневаюсь.
|
|||
70
Злопчинский
07.02.19
✎
18:51
|
В файловой быстрее будет выборка с установкой отбора по графе
|
|||
71
zenon46
07.02.19
✎
21:48
|
(70) у меня база уже 50 гигов, какая тут файловая
|
|||
72
Salimbek
07.02.19
✎
23:11
|
(71) А мне тоже любопытно - код из (29) вы пробовали? Как он по скорости?
|
|||
73
palpetrovich
08.02.19
✎
05:02
|
(57) немного дорисуй, потом расскажещь :)
ТекстЗапроса = " |SELECT |Док.IDDOC [Док $Документ.УстановкаЦен] |FROM |$ДокументСтроки.УстановкаЦен AS Док |Inner JOIN _1SJOURN AS Жур (nolock) ON Док.IDDOC = Жур.IDDOC | AND (Жур.IsMark = 0) -- не помечен на уд | AND (Жур.CLOSED > 0) -- проведен - если надо | AND (Жур.IDDOCDEF = $ВидДокумента.УстановкаЦен) -- ограничение по виду - не в обяз, но не лишнее | AND (Жур.DATE_TIME_IDDOC >= :ДатаС) AND (Жур.DATE_TIME_IDDOC <= :ДатаПо~) - лучше таки ограничивать по позиции |WHERE ($Док.Товар=:Товар) |"; рс = СоздатьОбъект("ODBCRecordset"); рс.УстБД1С(); рс.УстановитьТекстовыйПараметр("ДатаС", ДатаС); рс.УстановитьТекстовыйПараметр("ДатаПо", ДатаПо); рс.УстановитьТекстовыйПараметр("Товар", Товар); время = _GetPerformanceCounter(); тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); время = _GetPerformanceCounter() - время; Сообщить("кво строк: "+тз.КоличествоСтрок()+" за "+время+" мс."); |
|||
74
Mikeware
08.02.19
✎
07:35
|
(71) всего 50 :-)
|
|||
75
Mikeware
08.02.19
✎
07:42
|
(73) зачем iddocdef, если при джойне будет использование индекса журнала по iddoc? и зачем дата? все равно iddocdef+date_iime_iddoc тут дополнительной информации не даст
|
|||
76
trad
08.02.19
✎
07:59
|
(75) если план построится по журну (а так и будет при наличии условия по периоду), то с видом, сработает более селективный индекс
|
|||
77
Провинциальный 1сник
08.02.19
✎
08:00
|
рс.УстБД1С() тоже лишнее
|
|||
78
xXeNoNx
08.02.19
✎
08:15
|
В клюшках есть запросы?)
|
|||
79
ADirks
08.02.19
✎
08:25
|
(78) в клюшках вообще всё есть. даже ООП.
|
|||
80
Изучаю1С8
08.02.19
✎
08:41
|
Для базы в 50 гигов уже пора освоить 1с++
|
|||
81
Mikeware
08.02.19
✎
08:41
|
(76) первым все равно будет скан.
Или ты хочеш сказать, что построитель плана при иннер джойне перевернет последовательность, и сначала отберет все доки, соединит со строками, а потом среди них будет детать скан? если ограничение по датам не нужно, то получается "что пнем об сову, что совой об пень"© |
|||
82
Mikeware
08.02.19
✎
08:43
|
(80) ну и с SQLной базой тоже.
да и вообще, прямые запросы банально удобнее. а если взять класс "ПрямойЗапрос", то вообще практически снеговиковые запросы. |
|||
83
Изучаю1С8
08.02.19
✎
08:44
|
По поводу задачи из (0), цена устанавливается документом установка цен, значит в номенклатуре есть реквизит который изменяется этим доком, значит можно из периодики это все выдернуть, зачем доки так искать не очень понятно.
|
|||
84
Изучаю1С8
08.02.19
✎
08:45
|
(82) Я в курсе)
|
|||
85
mikecool
08.02.19
✎
08:58
|
завести реквизит в номенклатуру, куда писать последний док - не предлагать?
или надо все выводить? |
|||
86
ДенисЧ
08.02.19
✎
09:01
|
(85) Может, ты ещё и плац предложишь метлой подметать, а не ломом?
|
|||
87
Изучаю1С8
08.02.19
✎
09:04
|
|SELECT
|TOP 1 | |const_vt.VALUE [Цена $Число.14.2], |const_vt.docid [id $Документ.УстановкаЦенНоменклатуры] | |FROM _1SCONST const_vt (nolock) | |LEFT JOIN $Справочник.Номенклатура as СпрНоменклатура (nolock) |ON СпрНоменклатура.ID = :ВыбТовар | |WHERE const_vt.ID = '42425' |AND const_vt.OBJID = :ВыбТовар |AND const_vt.DATE <= :ВыбДата |ORDER BY const_vt.DATE DESC,const_vt.TIME DESC,const_vt.DOCID DESC,const_vt.ROW_ID DESC Вот так из переодики док получить с ценником например |
|||
88
ADirks
08.02.19
✎
09:04
|
(82) Ага, именно так :))
Я давным давно в запросах, где есть журнал с отбором по периоду, ставлю журнал первым, и в WHERE условие по IDDocDef. Это хороший индекс. |
|||
89
zenon46
08.02.19
✎
09:12
|
(82) а как в прямых запрос использовать, заменяется функция, вот как пример "черного" запроса
|ФирмаЗ = Документ.Реализация.Фирма; |Контр = Документ.Реализация.Контрагент; |СумОтгруз = Документ.Реализация.СуммаВзаиморасчетов; |Функция СуммаСумм = Сумма(СумОтгруз); |
|||
90
Изучаю1С8
08.02.19
✎
09:15
|
(89) А регистра нет что-ли по продажам, от куда можно получить сумму отгрузки с отбором по контрагенту и фирме?
|
|||
91
Изучаю1С8
08.02.19
✎
09:16
|
Из документов это получать это говнокодинг
|
|||
92
trad
08.02.19
✎
09:16
|
(81) " при иннер джойне перевернет последовательность"
при наличии условия по позиции - к бабке не ходи И тут есть варианты: индекс по позиции или индекс по вид+позиция. поэтому по возможности нужно конкретизировать вид, что бы сработал второй, белее селективный, индекс |
|||
93
trad
08.02.19
✎
09:19
|
(80) вообще с любой базой надо осваивать прямые запросы. Потому что язык SQL придуман для людей (не то что этот 1c-BQL)
|
|||
94
Изучаю1С8
08.02.19
✎
09:20
|
(93) С восьмеркой ненадо к сожалению.
|
|||
95
trad
08.02.19
✎
09:27
|
(87) 1.зачем тут справочник?
2.что получим если периодика двигается документом отличным от $Документ.УстановкаЦенНоменклатуры ? |
|||
96
trad
08.02.19
✎
09:27
|
(94) а на восьмерке ты на каком языке запросы пишешь?
|
|||
97
Mikeware
08.02.19
✎
09:28
|
(85) "дядя петя, ты дурак?"©
|
|||
98
trad
08.02.19
✎
09:28
|
выбрать
из внутреннее соединение левое соединение где - что это если не язык SQL? |
|||
99
ADirks
08.02.19
✎
09:29
|
(94) и с восьмёркой надо
|
|||
100
Mikeware
08.02.19
✎
09:31
|
(88) ну так это если есть отбор по периоду...
а если нету, и связь по иду - то индекс iddoc ничем не хуже, чем journal |
|||
101
Изучаю1С8
08.02.19
✎
09:34
|
(95) 1. Если ты про этот кусок
|LEFT JOIN $Справочник.Номенклатура as СпрНоменклатура (nolock) |ON СпрНоменклатура.ID = :ВыбТовар то он ненужен, я выдернул у себя кусок, у меня там реквизиты нужны в запросе 2. Не известно как у (0) все организовано, поэтому не вижу смысла гадать что там будет. Если что всегда можно отобратся по вид доку например |
|||
102
Mikeware
08.02.19
✎
09:39
|
(98) ну, это некий язык запросов, основанный на операциях реляционной алгебры :-)
"ну какой же это SQL если у него нет DDL&"© :-) Ну и некоторые буквоеды на этом основании отвергают, что база 1с - реляционная... |
|||
103
trad
08.02.19
✎
09:42
|
(102) DDL ∉ SQL
|
|||
104
trad
08.02.19
✎
09:44
|
(103) чую, помидорами закидают, за такую позицию )
|
|||
105
Mikeware
08.02.19
✎
09:48
|
(103) ну, вообще говоря, мнения разные есть. в свое время видел нехилый ср@ч на эту тему...
|
|||
106
Изучаю1С8
08.02.19
✎
10:01
|
(96) Я понимаю к чему ты клонишь, но исходя из того что вижу, 90% тех кто пишет на снеговике не думают про оптимизацию и во что восьмерка конвертит запрос.
В этом смысле 1с++ хорошая школа 1сника. |
|||
107
Mikeware
08.02.19
✎
10:06
|
(106) угу. "работает медленно - это у вас сервер слабый" :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |