Имя: Пароль:
1C
1C 7.7
v7: Оптимизатор запросов SQL
,
0 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
        |";
1 monsterZE
 
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
        |";
2 monsterZE
 
03.07.19
12:13
Смысл запроса - получить те строки, которые присутствуют в первой табличке и отсутствуют во второй.
3 Sserj
 
03.07.19
12:39
AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
AND (Жур.Closed & 1 = 1)

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

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

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