Имя: Пароль:
1C
1C 7.7
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 получишь без соединения с журналом