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