Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Оптимизатор запросов SQL

v7: Оптимизатор запросов SQL
Я
   monsterZE
 
03.07.19 - 12:11
Есть запрос, который сабж разбирает двумя разными способами. )
1 - с использованием индекса (быстрый)
2 - поиск ключа (медленный)
Как заставить его не использовать 2 способ?
Пробывал вариации с ексепт хоть лефт оутер джойн.. результат одинаковый (либо оба быстро, либо медленно)

        ТекстЗапроса = "
        |SELECT
        |     Т1.До as [Док $Документ.РасходнаяНал]
        |    ,Т1.Ск as [Склад $Справочник.СкладыТ]
        |FROM
        |    (        
        |    SELECT DISTINCT
        |          ДокР.IDDoc as До
        |        ,$СпрТов.СкладТ as Ск
        |    FROM
        |        $Документ.РасходнаяНал as ДокР (NOLOCK)
        |    INNER JOIN
        |        _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокР.IDDoc
        |        AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
        |        AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
        |        AND (Жур.Closed & 1 = 1)
        |    INNER JOIN
        |        $ДокументСтроки.РасходнаяНал as ДокРСтр (NOLOCK) ON ДокРСтр.IDDoc = ДокР.IDDoc
        |    INNER JOIN
        |        $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокРСтр.Товар %СкладТ%
        |    WHERE
        |        $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
        |        AND $ДокР.Склад = :ОснСклад
        |   ) Т1
        |left outer join
        |    (
        |    SELECT
        |        $Спр.Док as До
        |        ,$Спр.Склад as Ск
        |    FROM  
        |        $Справочник.СтатОтгрузки as Спр (NOLOCK)
        |    WHERE  
        |        $Спр.ДатаДляОтбора BETWEEN :НачДата AND :КонДата2
        |   ) Т2 ON (Т2.До=Т1.До) AND (Т2.Ск=Т1.Ск)
        |WHERE
        |    Т2.До is null
        |";
 
 
   monsterZE
 
1 - 03.07.19 - 12:11
Вариант с ексепт
        ТекстЗапроса = "
        |SELECT DISTINCT
        |    ДокР.IDDoc as [Док $Документ.РасходнаяНал]
        |    ,$СпрТов.СкладТ as [Склад $Справочник.СкладыТ]
        //|    ,$ДокР.Клиент as [Клиент $Справочник.Клиенты]

        |FROM
        |    $Документ.РасходнаяНал as ДокР (NOLOCK)
        |INNER JOIN
        |    _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокР.IDDoc 
        |    AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
        |    AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
        |    AND (Жур.Closed & 1 = 1)
        |INNER JOIN
        |    $ДокументСтроки.РасходнаяНал as ДокРСтр (NOLOCK) ON ДокРСтр.IDDoc = ДокР.IDDoc 
        |INNER JOIN
        |    $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокРСтр.Товар %СкладТ%
        |WHERE
        |    $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
        |    AND $ДокР.Склад = :ОснСклад
        |EXCEPT
        |SELECT 
        |    $Спр.Док
        |    ,$Спр.Склад
        |FROM  
        |    $Справочник.СтатОтгрузки as Спр (NOLOCK)
        |WHERE  
        |    $Спр.ДатаДляОтбора BETWEEN :НачДата AND :КонДата2
        |ORDER BY
        |    ДокР.IDDoc
        |";
   monsterZE
 
2 - 03.07.19 - 12:13
Смысл запроса - получить те строки, которые присутствуют в первой табличке и отсутствуют во второй.
   Sserj
 
3 - 03.07.19 - 12:39
AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
AND (Жур.Closed & 1 = 1)

Вот это кажись надо перенести в WHERE чтобы оптимизатор в сомнения не вводить.
   rphosts
 
5 - 03.07.19 - 12:50
(0) посмотрите план выполнения, возможно кривая статистика(обновить + очистить процедурный кэшь).
   monsterZE
 
6 - 03.07.19 - 13:00
(3) перенес, пофигу (
(5) так его и смотрю.. ставлю период, например, неделя 1 - в плане используется поиск по класт. индексу, неделя 2 - поиск ключа
статистика обновляется каждый день
   toypaul
 
7 - 03.07.19 - 13:16
(NOLOCK INDEX = МойСуперПуперИндекс)
   monsterZE
 
8 - 03.07.19 - 14:17
(7) аллилуя ))
   Ёпрст
 
9 - 03.07.19 - 14:27
и ..в первом запросе табличка 

 FROM 
        |        $Документ.РасходнаяНал as ДокР (NOLOCK) лишняя
   Ёпрст
 
10 - 03.07.19 - 14:28
ты же потом с неё ничего не берешь, а все берешь с таб части
   monsterZE
 
11 - 03.07.19 - 14:28
(9) Почему?.. вроде хуже не делает, а табличку дока не блокирует
   monsterZE
 
12 - 03.07.19 - 14:30
хм.. тако-то да.. осталось от какой-то версии запроса
собсно, наверное, можно ее вобще убрать..
   Ёпрст
 
13 - 03.07.19 - 14:32
(11) а всё,      $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа 
        |        AND $ДокР.Склад = :ОснСклад 

не увидел сперва

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.