| 
    
        
     
     | 
    
    
  | 
Оптимизация запроса с "ГДЕ" | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Owner2005    
     09.07.23 
            ✎
    21:14 
 | 
         
        Доброго вечера всем, товарищи программисты!
 
        Зело вынес мне все равновесие такой запрос: ВЫБРАТЬ Реализация.Ссылка ИЗ Документ.Реализация КАК Реализация ГДЕ ГОД(Реализация.Дата) >= &Год Запрос.УстановитьПараметр("Год", 2000); Как видно сложного тут ничего нет, но коллега утверждает что его нужно оптимизировать. Знаю про "Или" и тому подобное, но тут совершенно нет ничего... Если сравнивать просто дату, итоговый план запроса не изменится. Единственное, что увидел, это использование > вместо >=, со смещением даты на 1 сек. раньше, но назвать это оптимизацией язык не поворачивается. Очень было бы здорово услышать коллег, хотя догадываюсь, что тут можно услышать...  | 
|||
| 
    1
    
        Волшебник    
     09.07.23 
            ✎
    21:16 
 | 
         
        Где Реализация.Дата >= датавремя(2000,1,1,0,0,0)     
         | 
|||
| 
    2
    
        Owner2005    
     09.07.23 
            ✎
    21:36 
 | 
         
        (1) Спасибо, но датавремя по сути ничего не меняет.
 
        Сделал базу вот план запроса. Никаких торомозов тут быть не может, Index Seek есть... Nested Loops(Inner Join, OUTER REFERENCES:([Expr1003], [Expr1004], [Expr1002])) Compute Scalar(DEFINE:(([Expr1003],[Expr1004],[Expr1002])=GetRangeWithMismatchedTypes([@P1],NULL,(22)))) Constant Scan Index Seek(OBJECT:(Документ.МаршрутныйЛист.[_Document21_2] AS [T1]), SEEK:([T1].[Дата] > [Expr1003] AND [T1].[Дата] < [Expr1004]) ORDERED FORWARD)  | 
|||
| 
    3
    
        Жан Пердежон    
     09.07.23 
            ✎
    21:36 
 | 
         
        на таблице документов всегда есть индекс по дате...
 
        когда ты сравниваешь по дате - он может использоваться, как только ты с датой что-то делаешь в запросе - индекс идет нафиг... план запроса не изменится, если у тебя в базе 3,5 документа;  | 
|||
| 
    4
    
        Жан Пердежон    
     09.07.23 
            ✎
    21:37 
 | 
         
        (2) план запроса явно не от запроса в (0)     
         | 
|||
| 
    5
    
        Owner2005    
     09.07.23 
            ✎
    21:39 
 | 
         
        (4) Да, вместо "реализация" "МаршрутныйЛист" единственное различие.     
         | 
|||
| 
    6
    
        Owner2005    
     09.07.23 
            ✎
    21:43 
 | 
         
        (3) Создал порядка 15000 документов. План запроса такой же. 
 
        Любые функции работы с датой вроде ДатаВремя или ГОД на плане запросов никак не сказывются.  | 
|||
| 
    7
    
        Owner2005    
     09.07.23 
            ✎
    21:44 
 | 
         
        Тут не нравится GetRangeWithMismatchedTypes.     
         | 
|||
| 
    8
    
        Жан Пердежон    
     09.07.23 
            ✎
    21:44 
 | 
         
        самый правильный вариант: Дата > &ПараметрДата     
         | 
|||
| 
    9
    
        Owner2005    
     09.07.23 
            ✎
    21:45 
 | 
         
        Согласен, самое простое и очевидное.     
         | 
|||
| 
    10
    
        Волшебник    
     10.07.23 
            ✎
    09:17 
 | 
         
        Надо смотреть не планы запроса, а замерять время выполнения     
         | 
|||
| 
    11
    
        polosov    
     10.07.23 
            ✎
    11:01 
 | 
         
        (10) Ваши сведения не соответствуют действительности.     
         | 
|||
| 
    12
    
        unenu    
     10.07.23 
            ✎
    11:28 
 | 
         
        Может соединением будет быстрее:
 
        ВЫБРАТЬ датавремя(2000,1,1,0,0,0) КАК ГодОтбора Поместить ВтГодОтбора ; ВЫБРАТЬ Реализация.Ссылка ИЗ Документ.Реализация КАК Реализация Внутренее соединение ВтГодОтбора КАК ВтГодОтбора По Реализация.Дата >= ВтГодОтбора.ГодОтбора  | 
|||
| 
    13
    
        JanK    
     10.07.23 
            ✎
    12:37 
 | 
         
        (1) Язык запросов 8ки пытается оптимизировать такие сравнения сам, в этом случае должен был справиться.
 
        (5) В плане явно есть join, откуда он могут взяться в запросе (0) как-то не видно (я, конечно, слепой - но пока уверен что там всего одна таблица).  | 
|||
| 
    14
    
        Смотрящий    
     10.07.23 
            ✎
    12:45 
 | 
         
        (0) Шариться надо по всем документам за период - не проведенный и помеченным на удаление ?     
         | 
|||
| 
    15
    
        Жан Пердежон    
     10.07.23 
            ✎
    13:15 
 | 
         
        (15) это GetRangeWithMismatchedTypes() из параметра &Год создает таблицу c двумя датами, с которой и соединяет, чтобы использовать Index Seek...     
         | 
|||
| 
    16
    
        JanK    
     10.07.23 
            ✎
    14:19 
 | 
         
        (16) Спасибо, интересно.
 
        Но откуда в запросе (0) GetRangeWithMismatchedTypes?  | 
|||
| 
    17
    
        alexey123perm    
     10.07.23 
            ✎
    16:35 
 | 
         
        (0)
 
        Посмотрите этот курс. Там как раз рассматривается ситуация про условия в функциях работы с датами https://xn----1-bedvffifm4g.xn--p1ai/free/queries-optimization-mini-course/ Нужно изменить, Как в (1)  | 
|||
| 
    18
    
        Конструктор1С    
     10.07.23 
            ✎
    19:13 
 | 
         
        (6) ошибаешься, ещё как сказываются     
         | 
|||
| 
    19
    
        mistеr    
     11.07.23 
            ✎
    08:34 
 | 
         
        (2) Неужели платформа научилась переписывать Год()?
 
        Респект, если так.  | 
|||
| 
    20
    
        Simod    
     11.07.23 
            ✎
    09:39 
 | 
         
        (0) Автор, см. https://its.1c.ru/db/v8std#content:658:hdoc
 
        Твой случай там явно разобран.  | 
|||
| 
    21
    
        Owner2005    
     25.07.23 
            ✎
    12:23 
 | 
         
        Всем большое спасибо за обсуждение и ссылки.
 
        Ветку можно закрывать.  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |