|
v7: 1С 7.7. Оптимизировать прямой запрос | ☑ | ||
---|---|---|---|---|
0
es3000
25.05.17
✎
09:21
|
Надо по каждому элементу номенклатуры найти последний документ, в котором используется эта номенклатура.
Написал такой запрос: ТекстЗапроса = " |SELECT | ОбщаяТаблица.Номенклатура as [Номенклатура $Справочник.Номенклатура], | мЖурДок.IDDoc as [Док $Документ], | мЖурДок.IDDocDef as Док_вид |FROM | ( | SELECT | ОбъединеннаяТаб.Номенклатура AS Номенклатура, | MAX(ОбъединеннаяТаб.DATE_TIME_IDDOC) AS DATE_TIME_IDDOC | FROM | ( | SELECT | $СтрДокРеализация.Номенклатура AS Номенклатура, | ЖурДок.DATE_TIME_IDDOC AS DATE_TIME_IDDOC | FROM | $ДокументСтроки.Реализация as СтрДокРеализация | INNER JOIN | _1SJourn as ЖурДок ON ЖурДок.IDDoc = СтрДокРеализация.IDDoc AND ЖурДок.Closed & 1 = 1 | | UNION ALL | | SELECT | $СтрДокПоступление.Номенклатура AS Номенклатура, | ЖурДок.DATE_TIME_IDDOC AS DATE_TIME_IDDOC | FROM | $ДокументСтроки.ПоступлениеТМЦ as СтрДокПоступление | INNER JOIN | _1SJourn as ЖурДок ON ЖурДок.IDDoc = СтрДокПоступление.IDDoc AND ЖурДок.Closed & 1 = 1 | ) | AS ОбъединеннаяТаб | GROUP BY | ОбъединеннаяТаб.Номенклатура | ) | AS ОбщаяТаблица | | INNER JOIN | _1SJourn as мЖурДок ON мЖурДок.Date_Time_IDDoc = ОбщаяТаблица.Date_Time_IDDoc |"; Получается громоздко. Нельзя ли этот запрос как-то оптимизировать? |
|||
1
Ёпрст
25.05.17
✎
09:27
|
ну, разве что хинты nolock повтыкать и в соединении видДокумента добавиь, чтоб индекс другой использовался при соединении с журнальчиком
|
|||
2
Ёпрст
25.05.17
✎
09:28
|
было бы быстрее, если бы графа отбора была бы.
|
|||
3
МихаилМ
25.05.17
✎
09:45
|
я бы от Closed отказаля в пользу регистров
либо заменил Closed & 1 = 1 на = 1,3,5 соответстенно подсистеме и с журналом соединял бы в последнюю очередь + если maxdop <> 1 то распараллелил бы в юнионы выборки . |
|||
4
Ёпрст
25.05.17
✎
09:48
|
Если в регистре, есть галка быстрая обработка движений, то да, можно было бы оттуда взять сразу.
|
|||
5
МихаилМ
25.05.17
✎
09:49
|
+(3)
последний джоин _1SJourn явно лишний тк IDDocDef и так известен и нужен для регистров без галочки быстрых движений. |
|||
6
Ёпрст
25.05.17
✎
09:49
|
без соединения с журналом.
|
|||
7
ADirks
25.05.17
✎
09:50
|
небольшое замечание: когда в запросах используется джойн журнала с табличками документов определенного вида, то лучше писать так
FROM _1SJourn as ЖурДок INNER JOIN $ДокументСтроки.Реализация as СтрДокРеализация ON СтрДокРеализация.IDDoc = ЖурДок.IDDoc WHERE ЖурДок.IDDocDef = $ВидДокумента.Реализация AND ЖурДок.Closed & 1 = 1 при этом задействуется индекс DOCTYPE |
|||
8
Ёпрст
25.05.17
✎
09:52
|
проще взять любой останковый регистр, теже ОстанкиТМЦ
|
|||
9
es3000
25.05.17
✎
10:16
|
А если нужно будет искать и по другим видам документов?
Надо будет добавлять подзапрос по каждому виду документов в секцию UNION ALL? Ничего по проще нельзя придумать? |
|||
10
Ёпрст
25.05.17
✎
10:17
|
(9) попроще - это регистр остатков с галкой быстрая обработка движений
|
|||
11
es3000
25.05.17
✎
10:21
|
(10) не все виды документов пишут в регистр остатков
|
|||
12
Ёпрст
25.05.17
✎
10:31
|
(11)те, которые не пишут и не нужны вовсе.
|
|||
13
es3000
25.05.17
✎
10:51
|
(12) почему не нужны?
цель запроса - выбрать все документы, в которых есть ссылка на интересующую номенклатуру |
|||
14
Ёпрст
25.05.17
✎
10:52
|
(13) Ну и зачем тебе документ, который, даже регистр не толкает ?
|
|||
15
Ёпрст
25.05.17
✎
10:53
|
а так, только через юнион + (7)
|
|||
16
es3000
25.05.17
✎
10:59
|
(5) >> последний джоин _1SJourn явно лишний
>> тк IDDocDef и так известен и из какой таблицы его взять? |
|||
17
МихаилМ
25.05.17
✎
11:08
|
(16) в языке запросов 1с++ есть вид документа.
или подсмотреть номер из IDDocDef |
|||
18
Ёпрст
25.05.17
✎
11:09
|
(16) можешь его влепить вправо к DATE_TIME_IDDOC, потом через right и left получишь без соединения с журналом
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |