Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Замер двух запросов. Неожиданный результат

Замер двух запросов. Неожиданный результат
Я
   чувак
 
07.10.20 - 14:19
Доброго дня!

Есть два запроса. Формируют одну и ту же таблицу.
Но запрос2 в 3-4 раза быстрее формирует чем запрос1. По логике запрос1 быстрее должен формироваться.
В чем подвох?

Запрос1 = Новый Запрос;
Запрос1.Текст = "ВЫБРАТЬ
    ЭСФ.СчетФактура КАК СчетФактура,
    ЭСФ.РегистрационныйНомер,
    ЭСФ.ПометкаУдаления
ПОМЕСТИТЬ втЭСФ
ИЗ
    Документ.ЭСФ КАК ЭСФ
ГДЕ
    НЕ ЭСФ.Статус В (&СтатусОтозван)

ИНДЕКСИРОВАТЬ ПО
    СчетФактура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.СФ,
    МАКСИМУМ(втЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер
ИЗ
    (ВЫБРАТЬ
        ВТ_Документы.НомерСтроки КАК НомерСтроки,
        ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
        МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
    ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
    ГДЕ
        СчетФактураВыданныйДокументыОснования.Ссылка В
                (ВЫБРАТЬ
                    втЭСФ.СчетФактура
                ИЗ
                    втЭСФ КАК втЭСФ)
    
    СГРУППИРОВАТЬ ПО
        ВТ_Документы.НомерСтроки,
        ВТ_Документы.ГТДДокумент) КАК ДокументыСФ
        ЛЕВОЕ СОЕДИНЕНИЕ втЭСФ КАК втЭСФ
        ПО ДокументыСФ.СФ = втЭСФ.СчетФактура
            И (НЕ втЭСФ.ПометкаУдаления)

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ"



Запрос2 = Новый Запрос;
Запрос2.Текст = "ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.СФ,
    МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер
ИЗ
    (ВЫБРАТЬ
        ВТ_Документы.НомерСтроки КАК НомерСтроки,
        ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
        МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
    ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
    ГДЕ
        СчетФактураВыданныйДокументыОснования.Ссылка В
                (ВЫБРАТЬ
                    ЭСФ.СчетФактура
                ИЗ
                    Документ.ЭСФ КАК ЭСФ
                ГДЕ
                    НЕ ЭСФ.Статус В (&СтатусОтозван))
    
    СГРУППИРОВАТЬ ПО
        ВТ_Документы.НомерСтроки,
        ВТ_Документы.ГТДДокумент) КАК ДокументыСФ
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
        ПО ДокументыСФ.СФ = ЭСФ.СчетФактура
            И (НЕ ЭСФ.ПометкаУдаления)
            И (НЕ ЭСФ.Статус В (&СтатусОтозван))

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ"
   Жан Пердежон
 
1 - 07.10.20 - 14:25
оба запроса из серии: "слышал, что в 1С временные таблицы есть". тут они не нужны
   чувак
 
2 - 07.10.20 - 14:27
(1) а когда они нужны?
   fisher
 
3 - 07.10.20 - 14:27
Планы выполнения надо смотреть, чтобы понять за счет чего оптимизация.
Но максимальное использование временных таблиц (как часто советуют) - палка о двух концах.
В общем случае это костыль - страховка от ошибок оптимизатора запросов. Особенно для постгри актуально.
Потому что если оптимизатор запросов не лажает - то чем меньше временных таблиц, тем больше у него пространство для маневра и оптимизаций.
   чувак
 
4 - 07.10.20 - 14:28
(3) Скуля под рукой нет. База файловая
   H A D G E H O G s
 
5 - 07.10.20 - 14:30
Тут уместна цитата Эскобар, который из группы Бредор.
   GANR
 
6 - 07.10.20 - 14:30
На формирование и индексирование ВТ время уходит. И ещё может реквизит ЭСФ.СчетФактура уже индексирован (или в критерии отбора включен)? Тогда здесь ВТ да ещё с индексированием как зонтик рыбке явно.
   чувак
 
7 - 07.10.20 - 14:31
(6) Знаю. С ним ли без него - результат один и тот же
   fisher
 
8 - 07.10.20 - 14:31
(4) Не отозванные ЭСФ - это большая выборка или маленькая?
   чувак
 
9 - 07.10.20 - 14:32
(8) много, больше мильёна
   GANR
 
10 - 07.10.20 - 14:33
(7) Результат один, время выполнения - разное, ибо в 1 случае бесполезную ВТ создаем. Что именно не понятно?
   fisher
 
11 - 07.10.20 - 14:34
(9) Ну вот. А во втором случае условие могло отработать "наоборот" - искать небольшое количество вхождений в большой таблице, не загоняя всю эту выборку во временную таблицу.
   чувак
 
12 - 07.10.20 - 14:35
(10) Ну индексировать чтоб потом в другом запросе использовать при соединении. Или во временной таблице не надо ее?
   H A D G E H O G s
 
13 - 07.10.20 - 14:38
(12) Конечно не надо
   GANR
 
14 - 07.10.20 - 14:38
(12) Не надо, потому что только ещё больше времени потеряем на её создание как говорит (11). К тому же реквизит ЭСФ.СчетФактура вполне возможно уже индексирован (свойство реквизита в конфигурации задано) и соединение и без ВТ быстро отработает.
   fisher
 
15 - 07.10.20 - 14:39
А нафига там вообще "В"? Почему не через соединение с ВЫРАЗИТЬ для получения статуса?
   GANR
 
16 - 07.10.20 - 14:40
(15) +1 так сделать можно ещё ускорить
   fisher
 
17 - 07.10.20 - 14:42
(16) Вряд ли. Скорее всего план выполнения будет похож для второго случая. Но шансов на правильный план выполнения в этом случае больше.
   чувак
 
18 - 07.10.20 - 14:43
Еще один вопрос.

Вот здесь формируется быстро и 35 строк:

ВЫБРАТЬ
    ВТ_Документы.НомерСтроки КАК НомерСтроки,
    ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
    МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
ИЗ
    ВТ_Документы КАК ВТ_Документы
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
        ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
ГДЕ
    СчетФактураВыданныйДокументыОснования.Ссылка В
            (ВЫБРАТЬ
                ЭСФ.СчетФактура
            ИЗ
                Документ.ЭСФ КАК ЭСФ
            ГДЕ
                НЕ ЭСФ.Статус В (&СтатусОтозван))

СГРУППИРОВАТЬ ПО
    ВТ_Документы.НомерСтроки,
    ВТ_Документы.ГТДДокумент


А здесь очень долго

ВЫБРАТЬ
                ЭСФ.СчетФактура
            ИЗ
                Документ.ЭСФ КАК ЭСФ
            ГДЕ
                НЕ ЭСФ.Статус В (&СтатусОтозван)

Получается здесь подзапрос эффективнее чем через времнную таблицу?
   fisher
 
19 - 07.10.20 - 14:44
(18) Если скорость - критерий эффективности, то чем быстрее - тем эффективнее! Ваш кэп.
   trad
 
20 - 07.10.20 - 14:47
(18) во втором, долгом запросе - скан всей таблицы
В первом, быстром - сик на запись ибо  ЭСФ.СчетФактура скорее всего индексировано, как предполагают выше
   Uberschall
 
21 - 07.10.20 - 14:48
мне кажется, без значения статистики (состояния базы) польза от такой темы ну разве что в поиске грубых ошибок, т.к. при разной статистике планы запросов могут быть разными.
т.е. получается какой-то сферический конь в ваккуме. по факту если есть проблема- смотришь план и разбираешь его.
   чувак
 
22 - 07.10.20 - 14:49
(21) Возможно ли средствами 1с посмотреть план запроса? Или только скул?
   trad
 
23 - 07.10.20 - 14:50
(18) первый запрос в плане выполнения вырождается в такое:

ИЗ
    ВТ_Документы КАК ВТ_Документы
        ВНУТР СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
        ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
        ВНУТР СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
        ПО СчетФактураВыданныйДокументыОснования.Ссылка = ЭСФ.СчетФактура И НЕ ЭСФ.Статус В (&СтатусОтозван)
   чувак
 
24 - 07.10.20 - 14:50
(20) Т.е. если ЭСФ.СчетФактура не индексирован то в первом запросе тоже будет полное сканирование?
   Said_We
 
25 - 07.10.20 - 14:51
А вот так:

ВЫБРАТЬ
    ВТ_Документы.НомерСтроки КАК НомерСтроки,
    ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
    МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
ИЗ
    ВТ_Документы КАК ВТ_Документы
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
                         СчетФактураВыданныйДокументыОснования.Ссылка
                        ,СчетФактураВыданныйДокументыОснования.ДокументОснование
                ИЗ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
                ГДЕ
                    СчетФактураВыданныйДокументыОснования.Ссылка В
                            (ВЫБРАТЬ
                                ЭСФ.СчетФактура
                            ИЗ
                                Документ.ЭСФ КАК ЭСФ
                            ГДЕ
                                НЕ ЭСФ.Статус В (&СтатусОтозван))
                ) как СчетФактураВыданныйДокументыОснования

        ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование

СГРУППИРОВАТЬ ПО
    ВТ_Документы.НомерСтроки,
    ВТ_Документы.ГТДДокумент
   trad
 
26 - 07.10.20 - 14:51
(24) да
   Timon1405
 
27 - 07.10.20 - 14:52
(22) https://its.1c.ru/db/metod8dev/content/5808/hdoc читать про plansql, много думать, пробовать.
   Said_We
 
28 - 07.10.20 - 14:52
В (25) к (18).
   trad
 
29 - 07.10.20 - 14:52
(24) зачем людям голову морочить? сложно посмотреть и ответить??
   VladZ
 
30 - 07.10.20 - 14:54
(0) Потому что голову нужно включать.
Тебе нужны СФ по указанным реализациям.
Зачем ты выбираешь ВСЕ СФ?

Порядок должен быть такой:
1. выбрать реализацию за период.
2. выбрать сф по указанным реализациям (с фильтром по статусу).
3. Собрать всё в кучу.
 
 Рекламное место пустует
   чувак
 
31 - 07.10.20 - 14:56
(28) Тоже долго
   Said_We
 
32 - 07.10.20 - 14:57
(31) Это понятно. Но в сравнении с 18 обоими как?
   чувак
 
33 - 07.10.20 - 14:59
(32) Первоначально первом запрос в среднем было 6-8 сек. во втором 1-2 сек. В твоем 5-6
   Said_We
 
34 - 07.10.20 - 15:01
(33) Первый и второй, которые в (18) или который в (0)?
   чувак
 
35 - 07.10.20 - 15:03
(34) 0
   Said_We
 
36 - 07.10.20 - 15:03
НЕЕЕЕ сравнивай с (18)
   Said_We
 
37 - 07.10.20 - 15:07
Ещё вопрос. В//*** не пробовал кусочек добавить?


ИЗ
    ВТ_Документы КАК ВТ_Документы
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
                         ...
                ИЗ Документ.СчетФактураПолученный.ДокументыОснования
                ГДЕ
                    СчетФактураВыданныйДокументыОснования.Ссылка В (...)

//**********************************

И СчетФактураВыданныйДокументыОснования.ДокументОснование в (
ВЫБРАТЬ
    ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
ИЗ
    ВТ_Документы КАК ВТ_Документы
)
//**********************************


) как СчетФактураВыданныйДокументыОснования
   чувак
 
38 - 07.10.20 - 15:09
Ок, всем спасибо. Попробую варианты
   Said_We
 
39 - 07.10.20 - 15:09
У тебя основная таблица ВТ_Документы. К ней ты цепляешь другую таблицу, связывая по некому полю. Так возьми сразу только те, которые входят в значение этого поля.
   чувак
 
40 - 07.10.20 - 15:10
(39) ок, попробую
   Said_We
 
41 - 07.10.20 - 15:11
И условие тоже можно поменять. Сначала то что в//**** максимально обрежет множество, а потом уточняющее условие на ГДЕ СчетФактураВыданныйДокументыОснования.Ссылка В (...).
По идее должно быть одинаково, но бывают случаи, что не одинаково.
   чувак
 
42 - 07.10.20 - 15:23
дааа, стыдно на мою седую голову ))))
   Said_We
 
43 - 07.10.20 - 15:27
ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
     СчетФактураВыданныйДокументыОснования.Ссылка
    ,СчетФактураВыданныйДокументыОснования.ДокументОснование
ПОМЕСТИТЬ ВТ_СФ
ИЗ
    Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
ГДЕ
    СчетФактураВыданныйДокументыОснования.ДокументОснование В
                (ВЫБРАТЬ
                    Т.ГТДДокумент
                ИЗ
                    ВТ_Документы КАК Т
                 )
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЭСФ.СчетФактура КАК СчетФактура,
    ЭСФ.РегистрационныйНомер,
    ЭСФ.ПометкаУдаления
ПОМЕСТИТЬ втЭСФ
ИЗ
    Документ.ЭСФ КАК ЭСФ
ГДЕ
         ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
    И (НЕ ЭСФ.ПометкаУдаления)
    И НЕ ЭСФ.Статус В (&СтатусОтозван)

ИНДЕКСИРОВАТЬ ПО
    СчетФактура
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.СФ,
    МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер
ИЗ
    (ВЫБРАТЬ
        ВТ_Документы.НомерСтроки КАК НомерСтроки,
        ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
        МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
    ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
    
    СГРУППИРОВАТЬ ПО
        ВТ_Документы.НомерСтроки,
        ВТ_Документы.ГТДДокумент
    ) КАК ДокументыСФ

    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
    ПО ДокументыСФ.СФ = ЭСФ.СчетФактура

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ
   Said_We
 
44 - 07.10.20 - 15:28
Что-то скопировалось не всё....
Посмотри на английские и русские буквы, мог напортачить. Ну так по мелочи....

ВЫБРАТЬ
    РеализацияТоваровУслугТоварыПоГТД.НомерСтроки,
    РеализацияТоваровУслугТоварыПоГТД.ГТДДокумент КАК ГТДДокумент
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    Документ.РеализацияТоваровУслуг.ТоварыПоГТД КАК РеализацияТоваровУслугТоварыПоГТД
ГДЕ
    РеализацияТоваровУслугТоварыПоГТД.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    ГТДДокумент
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
     СчетФактураВыданныйДокументыОснования.Ссылка
    ,СчетФактураВыданныйДокументыОснования.ДокументОснование
ПОМЕСТИТЬ ВТ_СФ
ИЗ
    Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураВыданныйДокументыОснования
ГДЕ
    СчетФактураВыданныйДокументыОснования.ДокументОснование В
                (ВЫБРАТЬ
                    Т.ГТДДокумент
                ИЗ
                    ВТ_Документы КАК Т
                 )
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЭСФ.СчетФактура КАК СчетФактура,
    ЭСФ.РегистрационныйНомер,
    ЭСФ.ПометкаУдаления
ПОМЕСТИТЬ втЭСФ
ИЗ
    Документ.ЭСФ КАК ЭСФ
ГДЕ
         ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
    И (НЕ ЭСФ.ПометкаУдаления)
    И НЕ ЭСФ.Статус В (&СтатусОтозван)

ИНДЕКСИРОВАТЬ ПО
    СчетФактура
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.СФ,
    МАКСИМУМ(ЭСФ.РегистрационныйНомер) КАК РегистрационныйНомер
ИЗ
    (ВЫБРАТЬ
        ВТ_Документы.НомерСтроки КАК НомерСтроки,
        ВТ_Документы.ГТДДокумент КАК ГТДДокумент,
        МАКСИМУМ(СчетФактураВыданныйДокументыОснования.Ссылка) КАК СФ
    ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
    
    СГРУППИРОВАТЬ ПО
        ВТ_Документы.НомерСтроки,
        ВТ_Документы.ГТДДокумент
    ) КАК ДокументыСФ

    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
    ПО ДокументыСФ.СФ = ЭСФ.СчетФактура

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ
   Said_We
 
45 - 07.10.20 - 15:29
Результат отпишись. Интересно же.
   чувак
 
46 - 07.10.20 - 15:37
(45) По сравнению с первым запросом (0) 30 раз быстрее ))
   чувак
 
47 - 07.10.20 - 15:42
респект! спасибо! ознакомлюсь с твоим запросом на досуге
   hhhh
 
48 - 07.10.20 - 15:48
(46) вообще-то еще из-за кеша может быть. Если запустить 2 идентичных запроса, то 2-й запрос обычно выполняется в 10 раз быстрее, чем первый. Потому что он использует кеш после первого запроса.
   Said_We
 
49 - 07.10.20 - 15:51
(47) Не за что.
Это не мой запрос, а твой :-)
Просто не вдумываясь, что он там делает и какая структура данных он был немного переписан.
Если структуру глянуть, где и какие индексы, то возможно можно ещё быстрее. В данном случае изначально не оптимально был сделан сам запрос.
   чувак
 
50 - 07.10.20 - 15:52
(49) Вообщето запрос не мой тоже )) Дали мне просьбу оптимизировать )
   Said_We
 
51 - 07.10.20 - 15:53
:-)
Везет же кому-то!!! :-)
   чувак
 
52 - 07.10.20 - 15:56
(44) Можешь объяснить такой нюанс?
Ф.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
    И (НЕ ЭСФ.ПометкаУдаления)
    И НЕ ЭСФ.Статус В (&СтатусОтозван)ЭС


вот этот "И НЕ ЭСФ.Статус В (&СтатусОтозван)" будет сканировать уже отобранные ЭСФшки?

Если был бы так, то замедлился бы?

НЕ ЭСФ.Статус В (&СтатусОтозван)
    И (НЕ ЭСФ.ПометкаУдаления)
    И ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
   чувак
 
53 - 07.10.20 - 16:05
(44) И еще. Третий пакет вроде нигде не используется. Странно
   чувак
 
54 - 07.10.20 - 16:08
3-й пакет убрал, три раза быстрее стало
   Said_We
 
55 - 07.10.20 - 16:11
Вместо
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
    ПО ДокументыСФ.СФ = ЭСФ.СчетФактура

    ЛЕВОЕ СОЕДИНЕНИЕ втЭСФ КАК ЭСФ
    ПО ДокументыСФ.СФ = ЭСФ.СчетФактура
   Said_We
 
56 - 07.10.20 - 16:12
Это я забыл доисправлять...
   Said_We
 
57 - 07.10.20 - 16:16
При создании "ВТ_СФ" необходимо добавить Индекс по полю "ДокументОснование"....
И т.д.

Это примерный вариант, но ход мысли понятно думаю...
   Said_We
 
58 - 07.10.20 - 16:19
А вообще если нужна производительность, то виртуальные таблицы лучше не использовать....
Но тогда будет малочитаемый код и копипаст сплошной.
Виртуальные таблицы не сильно влияют на производительность, если они не большие. Тогда на производительность это сильно не повлияет.
   чувак
 
59 - 07.10.20 - 16:21
(58) Имел ввиду временные таблицы?
   Said_We
 
60 - 07.10.20 - 16:23
да
 
 Рекламное место пустует
   чувак
 
61 - 07.10.20 - 16:23
ок, спасибо
   H A D G E H O G s
 
62 - 07.10.20 - 17:57
(58) Настало время оуительных историй
   H A D G E H O G s
 
63 - 07.10.20 - 17:58
(57) Индексы в ВТ не нужны.
   Жан Пердежон
 
64 - 07.10.20 - 18:49
(58) иногда лучше ничего не писать
   Said_We
 
65 - 07.10.20 - 19:04
(62) (64) Пишите свой вариант.
   Said_We
 
66 - 08.10.20 - 09:23
(62) и (64) Где ваши варианты? Ждать?
   H A D G E H O G s
 
67 - 08.10.20 - 09:49
(66) Мой не ждать. Мне лениво в этой каше разбираться.
   Said_We
 
68 - 08.10.20 - 11:17
(67) Тогда каков вклад в пользу дела?
   H A D G E H O G s
 
69 - 08.10.20 - 11:35
(68) Покритиковать глупые высказывания.
   trad
 
70 - 08.10.20 - 12:58
(69) одно из таких в (63)
   H A D G E H O G s
 
71 - 08.10.20 - 13:23
(70) Давай, расскажи, как ты юудешь использовать индексы в ВТ
   trad
 
72 - 08.10.20 - 13:31
(71) Мне лениво
   H A D G E H O G s
 
73 - 08.10.20 - 13:34
(72) Ну значит ваш удел прозябать в невежестве.
   Said_We
 
74 - 08.10.20 - 13:57
(71), (72)
А мне не лень. Ниже запрос с закомментированным индексом. Выполнить можно на любой базе - от данных не зависит.
Без интекса у меня выполняется 3 сек. С индексом 1 сек.
(71) Давай расскажи почему так?

ВЫБРАТЬ
    0 КАК А
ПОМЕСТИТЬ ВТ_Два

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2
;
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 11
    ВТ_Два.А * 3 + ВТ_Два1.А * 2 + ВТ_Два2.А КАК А
ПОМЕСТИТЬ ВТ_Десять
ИЗ
    ВТ_Два КАК ВТ_Два,
    ВТ_Два КАК ВТ_Два1,
    ВТ_Два КАК ВТ_Два2

УПОРЯДОЧИТЬ ПО
    А
;

////////////////////////////////////////////////////////////////////////////////

УНИЧТОЖИТЬ ВТ_Два
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5000
    ВТ_Десять3.А * 1000 + ВТ_Десять2.А * 100 + ВТ_Десять1.А * 10 + ВТ_Десять.А КАК А
ПОМЕСТИТЬ ВТ_1000
ИЗ
    ВТ_Десять КАК ВТ_Десять,
    ВТ_Десять КАК ВТ_Десять1,
    ВТ_Десять КАК ВТ_Десять2,
    ВТ_Десять КАК ВТ_Десять3

УПОРЯДОЧИТЬ ПО
    А
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ_1000.А КАК А,
    ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВТ_1000.А) КАК Дата
ПОМЕСТИТЬ ВТ_Даты
ИЗ
    ВТ_1000 КАК ВТ_1000

//ИНДЕКСИРОВАТЬ ПО

//    А,
//    Дата

;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    т1.А КАК А,
    т1.Дата КАК Дата,
    т2.А КАК А1,
    т2.Дата КАК Дата1
ИЗ
    ВТ_Даты КАК т1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Даты КАК т2
        ПО т1.А <= т2.А
            И т1.Дата >= т2.Дата
   Said_We
 
75 - 08.10.20 - 13:59
К (74) "Без интекса у меня выполняется 3 сек. С индексом 1 сек." - это когда десяток раз запускаешь с индексом и десяток раз без индекса и в перемешку по нескольку раз. Для чистоты эксперимента.
   H A D G E H O G s
 
76 - 08.10.20 - 14:16
(74) Потому что используется индекс. В этом уникальном случае.
   H A D G E H O G s
 
77 - 08.10.20 - 14:23
Но когда ты соединяешь свою 'относительно' небольшую временную таблицу с большой физической, то индекс временной таблицы использоваться не будет. В лучшем случае используется индекс физической таблицы и !порядок! записей временной таблицы.
   trad
 
78 - 08.10.20 - 14:37
(77) и почему же в запросе ниже индекс ВТ использоваться не будет (если бы он был)
ИЗ
    Документ.ЭСФ КАК ЭСФ
ГДЕ
         ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
   trad
 
79 - 08.10.20 - 14:40
(78) + или в таком
ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
   H A D G E H O G s
 
80 - 08.10.20 - 14:40
(78) Потому что, чтобы использовался индекс, надо, чтобы каждый документ ЭСФ поискал своим полем в таблице ВТ_СФ
Нужно перебрать все документы ЭСФ
   trad
 
81 - 08.10.20 - 14:41
(78) тут нужен индекс ВТ_СФ.Ссылка
(79) а тут - ВТ_СФ.ДокументОснование
   H A D G E H O G s
 
82 - 08.10.20 - 14:42
(79) В таком, если записей мало, то проще обойти весь индекс (indexscan) через mergejoin. А если записей много - то вы сами себе злые буратины пихать большие куски в ВТ.
Это у вас сейчас, в спокойной системе ВТ и индексы строятся махом, вы попробуйте в нагруженной.
   Said_We
 
83 - 08.10.20 - 14:43
(76) В (63) вы написали "Индексы в ВТ не нужны."
А тут оказывается нужны.
   trad
 
84 - 08.10.20 - 14:44
(80) справедливо, если знаем, что есть индекс ЭСФ.СчетФактура
   trad
 
85 - 08.10.20 - 14:48
(82) а mergejoin по вашему святым духом питается?
Вообще то, для его выполнения, нужно для начала два источника упорядочить. За сколько то и где то.
   Said_We
 
86 - 08.10.20 - 14:50
(82) Я это ещё в (58) написал. Но в данном случае в (0) просил найти узкое место. В самом запросе их хватало. На выходе ВТ не большие будут - в разрезе ТЧ с ГТД по одному документу. Это не большие ВТ. Так что большой потери производительности тут не будет и что бы понять в чем узкое место вполне достаточно оставить ВТ, что бы не путать сложными конструкциями.

А вам бы только покритиковать, вместо того что бы применить свои знания с пользой дела. Как-то так получается. :-(

(0) Вам сильно помогла критика "H A D G E H O G s" и "Жан Пердежон"?
   trad
 
87 - 08.10.20 - 14:51
(85) поэтому, лучше вместо условно двух наборов упорядочивающих служебных данных (индексов по сути), один индекс и лупджойн по нему
   H A D G E H O G s
 
88 - 08.10.20 - 14:53
(85) СОртировка проще индексации, так как индексация включает в себя сортировку.
   H A D G E H O G s
 
89 - 08.10.20 - 14:54
(87) Нет, не индексов по сути, а сортировок.
   trad
 
90 - 08.10.20 - 14:56
(88) а я бы сказал наоборот: сортировка включает в себя индексацию, если сортировка не предполагает перестановку записей источника.
   H A D G E H O G s
 
91 - 08.10.20 - 14:57
SQL, кстати, вполне себе сам выполнит сортировку, если захочет сделать merge. Но, тут можно оказать медвежью услугу, когда SQL не хотел делать merge, а у него на входе отсортированная таблица (не особо важно, через Индекс или через Упорядочить).
   H A D G E H O G s
 
92 - 08.10.20 - 14:58
(90) Сортировка строит и хранит копию части данных в B+ дереве? Я все правильно вас понял?
   trad
 
93 - 08.10.20 - 14:58
(91) "SQL, кстати, вполне себе сам выполнит сортировку, если захочет сделать merge"
да, именно. И это нифига не дешево
   H A D G E H O G s
 
94 - 08.10.20 - 14:59
(93) Но дешевле индексации
   H A D G E H O G s
 
95 - 08.10.20 - 15:02
(84) есть или нет индекса в ЭСФ.СчетФактура - это не важно. Важно, что индекс в ВТ_СФ в лучшем случае будет использоваться в mergejoin как источник упорядоченных данных и может подтолкнуть SQL к mergejoin вместо nestedloop.
   trad
 
96 - 08.10.20 - 15:03
(95) нет, индекс в ВТ_СФ как раз подтолкнет SQL к nestedloop вместо mergejoin
   trad
 
97 - 08.10.20 - 15:04
(96) + повторю. в случае отсутствия индекса ЭСФ.СчетФактура. И это важно
   чувак
 
98 - 08.10.20 - 15:07
(86) Помог только твой лайфхак
   H A D G E H O G s
 
99 - 08.10.20 - 15:08
(96) Будет цикл, для каждой записи таблицы документа ЭСФ, будет искаться соответствующая запись в ВТ по ее индексу? Я правильно понял?
   trad
 
100 - 08.10.20 - 15:10
(92) нет, сортировка - выстраивание идентификаторов записей источник в нужном порядке.

Например:
имеем источник И1 - много записей, и И2 - мало записей
и И1 join И2

для мерджа нужно отсортировать и И1 и И2
для лупа можно проиндексировать только И2, по И1 пройтись как есть выдергивая из И2 то что нужно
  1  2   

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