| 
    
        
     
     | 
    
  | 
v7: Даты оснований прямым запросом | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Franchiser    
     22.03.19 
            ✎
    18:50 
 | 
         
        Нужно получить запрос 
 
        документов с основаниями за период, а также даты оснований. Как сделать оптимально, чтобы попасть в индекс: 1. Соединить _1SJourn с _1SJourn или 2. Соединить _1SJourn <-> _1SCrdoc <->_1SJourn ?  | 
|||
| 
    1
    
        Franchiser    
     22.03.19 
            ✎
    18:52 
 | 
         
        Вот запрос который получился:
 
        Declare @PERIODN Char(8) SET @PERIODN = '20190101' Select top 100 J.*, TabRod.*, JOsn.Date_Time_IdDoc as Date_Time_IdDoc_Osn from _1sJourn J (Nolock) join _1scrdoc TabRod (nolock) on TabRod.mdid=0 and TabRod.ChildId = J.IdDoc join _1sJourn JOsn (Nolock) On TabRod.ParentVal = 'O1 3M' +JOsn.IdDoc Where J.Date_Time_IdDoc > @PERIODN and J.SP652 <> ' 0 0 '  | 
|||
| 
    2
    
        Franchiser    
     22.03.19 
            ✎
    19:03 
 | 
         
        Запрос 2:
 
        Declare @PERIODN Char(8) SET @PERIODN = '20190101' Select top 100 J.*, JOsn.Date_Time_IdDoc as Date_Time_IdDoc_Osn from _1sJourn J (Nolock) join _1sJourn JOsn (Nolock) On J.SP652 = ' 3M ' +JOsn.IdDoc Where J.Date_Time_IdDoc > @PERIODN and J.SP652 <> ' 0 0 '  | 
|||
| 
    3
    
        Туц    
     23.03.19 
            ✎
    18:33 
 | 
         
        Почему не пользуешь CHILD_DATE_TIME_IDDOC? Вроде как дату подчиненного как раз из него можно.     
         | 
|||
| 
    4
    
        Franchiser    
     23.03.19 
            ✎
    18:45 
 | 
         
        (3) мне нужна даты оснований, а не подчиненного     
         | 
|||
| 
    5
    
        Туц    
     23.03.19 
            ✎
    19:02 
 | 
         
        Ну так 1 джойн.... журнал и ссылки.. в ссылках дочерний с датой.. в журнале родитель с датой.     
         | 
|||
| 
    6
    
        Franchiser    
     23.03.19 
            ✎
    20:42 
 | 
         
        (4) нужные данные документов с основаниями + дата основания     
         | 
|||
| 
    7
    
        trad    
     23.03.19 
            ✎
    21:33 
 | 
         
        Для начала: пп 1 и 2 из(0) не соответствуют запросам 1 и 2     
         | 
|||
| 
    8
    
        Franchiser    
     23.03.19 
            ✎
    23:19 
 | 
         
        (7)
 
        П.1 соответствует запросу (2), А п. 2 соответствует запросу (1)  | 
|||
| 
    9
    
        trad    
     24.03.19 
            ✎
    09:59 
 | 
         
        "документов с основаниями за период"
 
        Существительное "период" относится к документам или основаниям?  | 
|||
| 
    10
    
        Franchiser    
     24.03.19 
            ✎
    11:22 
 | 
         
        (9) к документам     
         | 
|||
| 
    11
    
        Franchiser    
     24.03.19 
            ✎
    11:24 
 | 
         
        Документы за период, основания могут быть в любой дате , в т.ч. не в указанном периоде     
         | 
|||
| 
    12
    
        trad    
     24.03.19 
            ✎
    11:47 
 | 
         
        (11) тогда схема - п.2 из (0)
 
        но запрос 1 не соответствует задаче в твоем понимании документ-основание - это родительский или подчиненный документ?  | 
|||
| 
    13
    
        Franchiser    
     24.03.19 
            ✎
    12:47 
 | 
         
        (12) родительский.
 
        Может лучше запросе 2 использовать substring или right? + Добавить связь по deffype?  | 
|||
| 
    14
    
        Djelf    
     24.03.19 
            ✎
    15:46 
 | 
         
        Если я правильно понял что (0) надо, то для 1sqlite выборка ЗаявокПокупателя для Реализаций в определенном периоде, с попаданием в индекс, выглядит так.
 
        Поправь в соответствие с со своим sql диалектом, должно взлететь. 
     | 
|||
| 
    15
    
        trad    
     25.03.19 
            ✎
    09:28 
 | 
         
        запрос (1) почти верен
 
        вместо такой связи TabRod.ParentVal = 'O1 3M' +JOsn.IdDoc нужно substring(TabRod.ParentVal, 7, 9) = JOsn.IdDoc что бы индекс работал  | 
|||
| 
    16
    
        trad    
     25.03.19 
            ✎
    09:28 
 | 
         
        select
 
        jПодч.iddoc [ПодчиненныйДок $Документ], jПодч.iddocdef ПодчиненныйДок_вид, jПодч.date_time_iddoc ПозицияПодчиненногоДок, cast(left(jПодч.date_time_iddoc, 8) as datetime) ДатаПодчиненногоДок, rtrim(ltrim(jПодч.docno)) НомерПодчиненногоДок, jОснов.iddoc [ДокОснование $Документ], jОснов.iddocdef ДокОснование_вид, jОснов.date_time_iddoc ПозицияДокОснования, rtrim(ltrim(jОснов.docno)) НомерДокОснования, cast(left(jОснов.date_time_iddoc, 8) as datetime) ДатаДокОснования from _1sjourn jПодч (nolock) join _1scrdoc cr (nolock) on cr.childid = jПодч.iddoc and cr.mdid = 0 join _1sjourn jОснов (nolock) on jОснов.iddoc = substring(cr.parentval, 7, 9) where jПодч.date_time_iddoc > '20190201'  | 
|||
| 
    17
    
        trad    
     25.03.19 
            ✎
    09:34 
 | 
         
        +
 
        and jОснов.iddocdef = $ВидДокумента.НаименованиеВидаДокументаСКодом__3M  | 
|||
| 
    18
    
        trad    
     25.03.19 
            ✎
    09:44 
 | 
         
        и что такое SP652?
 
        неужели общий реквизит ДокОснование с отбором?  | 
|||
| 
    19
    
        Franchiser    
     25.03.19 
            ✎
    11:27 
 | 
         
        SP652 это документ-основание.
 
        Как определить попадаю я в индекс? Как это выглядит в плане запроса?  | 
|||
| 
    20
    
        Franchiser    
     25.03.19 
            ✎
    11:34 
 | 
         
        (14),(15),(16) спасибо, попробую     
         | 
|||
| 
    21
    
        Franchiser    
     25.03.19 
            ✎
    12:17 
 | 
         
        Итоговый запрос (время выполнения 1-3 сек):
 
        Declare @PERIODN Char(9) Declare @PERIODK Char(9) SET @PERIODN = '20190101' SET @PERIODK = '20190331Z' Select top 100 J.IdDoc, JOsn.IdDoc, JOsn.Date_Time_IdDoc as Date_Time_IdDoc_Osn from _1sJourn J (Nolock) join _1scrdoc TabRod (nolock) on TabRod.mdid=0 and TabRod.ChildId = J.IdDoc join _1sJourn JOsn (Nolock) On Substring(TabRod.ParentVal,7,9) = JOsn.IdDoc and JOsn.IDDOCDEF = 130 Where J.Date_Time_IdDoc Between @PERIODN AND @PERIODK and J.SP652 <> ' 0 0 ' and J.IDDOCDEF = 130 Для информации время выполнения запроса 1: 3 мин 33 сек, запроса 2: 6 мин 5 сек.  | 
|||
| 
    22
    
        Ёпрст    
     гуру 
    25.03.19 
            ✎
    13:38 
 | 
         
        (19) Это общий реквизит документов с галкой отбор ?
 
        И тип <документ> ?  | 
|||
| 
    23
    
        Ёпрст    
     гуру 
    25.03.19 
            ✎
    13:39 
 | 
         
        (18) )     
         | 
|||
| 
    24
    
        trad    
     25.03.19 
            ✎
    13:39 
 | 
         
        (21) так тебя и подчиненные интересуют строго определенного вида?     
         | 
|||
| 
    25
    
        trad    
     25.03.19 
            ✎
    13:41 
 | 
         
        (21)
 
        JOsn.IDDOCDEF = 130 J.IDDOCDEF = 130 документы одного вида друг на друга ссылаются?  | 
|||
| 
    26
    
        trad    
     25.03.19 
            ✎
    13:48 
 | 
         
        (19) "Как определить попадаю я в индекс? Как это выглядит в плане запроса?"
 
        Главное, ты должен понимать в какой индекс собираешься попадать В плане выполнения, в информации по вершине графа плана, смотришь аргумент. Там будет что-то типа OBJECT(ИмяБазы.dbo.ИмяТаблицы.ИмяИндекса ... вот и смотришь попал или нет  | 
|||
| 
    27
    
        trad    
     25.03.19 
            ✎
    13:51 
 | 
         
        (26) да и важно посмотреть по каким полям ключа индекса, индекс отработал
 
        seek:(условия,...)  | 
|||
| 
    28
    
        Franchiser    
     25.03.19 
            ✎
    14:32 
 | 
         
        (22) Да, все верно     
         | 
|||
| 
    29
    
        Franchiser    
     25.03.19 
            ✎
    14:33 
 | 
         
        (25) Да, вид документа-основания и подчиненного одинаковый     
         | 
|||
| 
    30
    
        trad    
     25.03.19 
            ✎
    14:40 
 | 
         
        при наличии общего реквизита с отбором
 
        Select top 100 J.IdDoc, JOsn.IdDoc, JOsn.Date_Time_IdDoc as Date_Time_IdDoc_Osn from _1sJourn J (Nolock) join _1sJourn JOsn (Nolock) On JOsn.IdDoc = right(J.SP652, 9) Where J.Date_Time_IdDoc Between @PERIODN AND @PERIODK and J.SP652 like ' 3M%' and J.IDDOCDEF = 130  | 
|||
| 
    31
    
        trad    
     25.03.19 
            ✎
    14:41 
 | 
         
        при наличии не общего реквизита или общего без отбора, есть еще вариант с использованием таблицы документа вместо _1scrdoc     
         | 
|||
| 
    32
    
        trad    
     25.03.19 
            ✎
    14:42 
 | 
         
        и почему не пользоваться метапарсером?..     
         | 
|||
| 
    33
    
        Franchiser    
     25.03.19 
            ✎
    14:53 
 | 
         
        (32) Могу привести запрос с метапарсером (полный запрос достаточно длинный), это я тестировал в sql.
 
        Index seek есть, но на key lookup тратится 33% времени.  | 
|||
| 
    34
    
        Franchiser    
     25.03.19 
            ✎
    14:57 
 | 
         
        Вот часть запроса с метапарсером:
 
        SELECT 1 as Пометка, РасходнаяНакладная.IDDOC [Документ $Документ.РасходнаяНакладная] , $РасходнаяНакладная.СуммаВклНДС СуммаВклНДС , $РасходнаяНакладная.НДС НДС_документа , Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) as Дата , MAX($РасходнаяНакладная.ТипНакладной) [ТипНакладной $Перечисление.ТипыРасходнойНакладной] , MAX(Журнал.$ОбщийРеквизит.ДокументОснование) [ДокументОснование $Документ] ,:Ставка20 as ПравильнаяСтавка ,:Ставка18 as НеправильнаяСтавка //, Журнал.DATE_TIME_IDDOC as Позиция FROM _1SJOURN AS Журнал With (NOLOCK) join _1scrdoc TabRod (nolock) on TabRod.mdid=0 and TabRod.ChildId = Журнал.IdDoc join _1sJourn JOsn (Nolock) On Substring(TabRod.ParentVal,7,9) = JOsn.IdDoc and JOsn.IDDOCDEF = $ВидДокумента.РасходнаяНакладная and JOsn.Date_Time_IdDoc >= :ДатаПереходаНаСтавку20 INNER JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK) ON Журнал.IDDOC = РасходнаяНакладная.IDDOC AND Журнал.IDDocDef = $ВидДокумента.РасходнаяНакладная INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC WHERE (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~) AND ($РасходнаяНакладнаяСтроки.СтавкаНДС = :Ставка18) AND Журнал.$ОбщийРеквизит.ДокументОснование <> ' 0 0 ' and Журнал.IDDOCDEF = $ВидДокумента.РасходнаяНакладная --Условие на ЮЛ-- GROUP BY РасходнаяНакладная.IDDOC , $РасходнаяНакладная.СуммаВклНДС , $РасходнаяНакладная.НДС , Журнал.DATE_TIME_IDDOC  | 
|||
| 
    35
    
        Franchiser    
     25.03.19 
            ✎
    15:03 
 | 
         
        (30) что тут улучшено?     
         | 
|||
| 
    36
    
        Franchiser    
     25.03.19 
            ✎
    15:12 
 | 
         
        (30) проверил, тоже работает нормально     
         | 
|||
| 
    37
    
        trad    
     25.03.19 
            ✎
    15:26 
 | 
         
        (35) по сравнению с чем?     
         | 
|||
| 
    38
    
        trad    
     25.03.19 
            ✎
    15:28 
 | 
         
        (33) без лукапа не обойтись, если нужны поля таблицы на входящие в ключ индекса, и да - это затратная операция     
         | 
|||
| 
    39
    
        Franchiser    
     25.03.19 
            ✎
    15:35 
 | 
         
        (37) в последнем варианте lookup увеличился с 33 до 50 %. По времени примерно одинаково.     
         | 
|||
| 
    40
    
        trad    
     25.03.19 
            ✎
    15:39 
 | 
         
        (39) мне не понятно какой запрос с каким сравниваешь?     
         | 
|||
| 
    41
    
        Franchiser    
     25.03.19 
            ✎
    15:52 
 | 
         
        Сравниваю (30) и (21)     
         | 
|||
| 
    42
    
        Ёпрст    
     гуру 
    25.03.19 
            ✎
    16:03 
 | 
         
        group by какой-то бестолковый     
         | 
|||
| 
    43
    
        Ёпрст    
     гуру 
    25.03.19 
            ✎
    16:06 
 | 
         
        а.. вижу, бестолкоый фильтр на таб часть и ставку ндс     
         | 
|||
| 
    44
    
        Ёпрст    
     гуру 
    25.03.19 
            ✎
    16:06 
 | 
         
        можно выкинуть group by и хотя бы exists влепить в where     
         | 
|||
| 
    45
    
        trad    
     25.03.19 
            ✎
    16:55 
 | 
         
        (41) в 30 не используется crdoc и должно быть меньше чтений страниц     
         | 
|||
| 
    46
    
        trad    
     25.03.19 
            ✎
    16:58 
 | 
         
        (39) "lookup увеличился с 33 до 50 %"
 
        Это ведь еще можно так трактовать: нагрузка на лукап не выросла, просто остальные операции улучшились. Нужно смотреть не только относительные показатели но абсолютные  | 
|||
| 
    47
    
        Djelf    
     25.03.19 
            ✎
    17:52 
 | 
         
        (34) А итоги по колонкам с какими то Суммами в РасходнаяНакладная есть?
 
        Если есть - можно попробовать отсечь часть документов, если в них вообще нет Ставки НДС18. ИМХО Это будет быстрее чем табличные части перебирать.  | 
|||
| 
    48
    
        Туц    
     25.03.19 
            ✎
    19:26 
 | 
         
        Судя по синтаксису база MSSQL. Добавь нужный тебе индекс в нужную тебе таблицу. А чтоб не вносить его после каждой реструктуризации, хэшируй MD файл и сравнивай с сохранённым в константе и пересоздавай его.     
         | 
|||
| 
    49
    
        Franchiser    
     25.03.19 
            ✎
    22:29 
 | 
         
        (44) exists вроде медленнее работать должен     
         | 
|||
| 
    50
    
        Franchiser    
     26.03.19 
            ✎
    00:22 
 | 
         
        (48) есть 3 нетипичных индекса, которые пересоздаются после реструктуризации отдельной обработкой.
 
        Объясни подробнее, что значит хэшировать md и как пересоздать после реструктуризации?  | 
|||
| 
    51
    
        Franchiser    
     26.03.19 
            ✎
    00:49 
 | 
         
        (48) может быть ты про пересоздание файла DDS и индексы в нем?     
         | 
|||
| 
    52
    
        Туц    
     26.03.19 
            ✎
    05:56 
 | 
         
        (50) 
 
        Процедура ПриНачалеРаботыСистемы() бла бла бла MetaDataWork=СоздатьОбъект("MetaDataWork"); MDHash = СокрЛП(СервисFormEx.ПолучитьХэшМД5(КаталогИБ()+"1cv7.md",1)); Если СокрЛП(Константа.MDHash) <> MDHash Тогда ТекстЗапроса = "CREATE UNIQUE NONCLUSTERED INDEX бла бла бла "; глВыполнитьЗапрос(глБДЗапрос,ТекстЗапроса); Константа.MDHash = MDHash; КонецЕсли; бла бла бла КонецПроцедуры отполируй под себя  | 
|||
| 
    53
    
        Franchiser    
     26.03.19 
            ✎
    11:01 
 | 
         
        (52) ок, примерно тоже самое сейчас делается вручную. Ещё файл DDS кажется исправляется     
         | 
|||
| 
    54
    
        Mikeware    
     26.03.19 
            ✎
    11:02 
 | 
         
        (53) словарь исравлять не надо.     
         | 
|||
| 
    55
    
        Franchiser    
     26.03.19 
            ✎
    11:07 
 | 
         
        (54) (52) master.sp_statistics доработаны?     
         | 
|||
| 
    56
    
        Mikeware    
     26.03.19 
            ✎
    11:13 
 | 
         
        (55) у меня не было доработано. но у меня и клюшек уже, считай, нет.     
         | 
|||
| 
    57
    
        Franchiser    
     26.03.19 
            ✎
    12:17 
 | 
         
        Если просто добавить индексы то 7ка не запускается. Нужно или править DDS, или дорабатывать sp_statistics     
         | 
|||
| 
    58
    
        Mikeware    
     26.03.19 
            ✎
    12:30 
 | 
         
        (57) все прекрасно запускалось. и с добавленными индексами, и с добавленными таблицами, и с триггерами... можно вообще словарь на левый подменить - и все будет работать, пока не потребуется реструктуризация.     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |