Имя: Пароль:
1C
1С v8
Замер двух запросов. Неожиданный результат
,
0 чувак
 
07.10.20
14:19
Доброго дня!

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

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

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

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

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

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

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



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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

СГРУППИРОВАТЬ ПО
    ДокументыСФ.ГТДДокумент,
    ДокументыСФ.НомерСтроки,
    ДокументыСФ.СФ
45 Said_We
 
07.10.20
15:29
Результат отпишись. Интересно же.
46 чувак
 
07.10.20
15:37
(45) По сравнению с первым запросом (0) 30 раз быстрее ))
47 чувак
 
07.10.20
15:42
респект! спасибо! ознакомлюсь с твоим запросом на досуге
48 hhhh
 
07.10.20
15:48
(46) вообще-то еще из-за кеша может быть. Если запустить 2 идентичных запроса, то 2-й запрос обычно выполняется в 10 раз быстрее, чем первый. Потому что он использует кеш после первого запроса.
49 Said_We
 
07.10.20
15:51
(47) Не за что.
Это не мой запрос, а твой :-)
Просто не вдумываясь, что он там делает и какая структура данных он был немного переписан.
Если структуру глянуть, где и какие индексы, то возможно можно ещё быстрее. В данном случае изначально не оптимально был сделан сам запрос.
50 чувак
 
07.10.20
15:52
(49) Вообщето запрос не мой тоже )) Дали мне просьбу оптимизировать )
51 Said_We
 
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-й пакет убрал, три раза быстрее стало
55 Said_We
 
07.10.20
16:11
Вместо
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЭСФ КАК ЭСФ
    ПО ДокументыСФ.СФ = ЭСФ.СчетФактура

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

Это примерный вариант, но ход мысли понятно думаю...
58 Said_We
 
07.10.20
16:19
А вообще если нужна производительность, то виртуальные таблицы лучше не использовать....
Но тогда будет малочитаемый код и копипаст сплошной.
Виртуальные таблицы не сильно влияют на производительность, если они не большие. Тогда на производительность это сильно не повлияет.
59 чувак
 
07.10.20
16:21
(58) Имел ввиду временные таблицы?
60 Said_We
 
07.10.20
16:23
да
61 чувак
 
07.10.20
16:23
ок, спасибо
62 H A D G E H O G s
 
07.10.20
17:57
(58) Настало время оуительных историй
63 H A D G E H O G s
 
07.10.20
17:58
(57) Индексы в ВТ не нужны.
64 Жан Пердежон
 
07.10.20
18:49
(58) иногда лучше ничего не писать
65 Said_We
 
07.10.20
19:04
(62) (64) Пишите свой вариант.
66 Said_We
 
08.10.20
09:23
(62) и (64) Где ваши варианты? Ждать?
67 H A D G E H O G s
 
08.10.20
09:49
(66) Мой не ждать. Мне лениво в этой каше разбираться.
68 Said_We
 
08.10.20
11:17
(67) Тогда каков вклад в пользу дела?
69 H A D G E H O G s
 
08.10.20
11:35
(68) Покритиковать глупые высказывания.
70 trad
 
08.10.20
12:58
(69) одно из таких в (63)
71 H A D G E H O G s
 
08.10.20
13:23
(70) Давай, расскажи, как ты юудешь использовать индексы в ВТ
72 trad
 
08.10.20
13:31
(71) Мне лениво
73 H A D G E H O G s
 
08.10.20
13:34
(72) Ну значит ваш удел прозябать в невежестве.
74 Said_We
 
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.Дата
75 Said_We
 
08.10.20
13:59
К (74) "Без интекса у меня выполняется 3 сек. С индексом 1 сек." - это когда десяток раз запускаешь с индексом и десяток раз без индекса и в перемешку по нескольку раз. Для чистоты эксперимента.
76 H A D G E H O G s
 
08.10.20
14:16
(74) Потому что используется индекс. В этом уникальном случае.
77 H A D G E H O G s
 
08.10.20
14:23
Но когда ты соединяешь свою 'относительно' небольшую временную таблицу с большой физической, то индекс временной таблицы использоваться не будет. В лучшем случае используется индекс физической таблицы и !порядок! записей временной таблицы.
78 trad
 
08.10.20
14:37
(77) и почему же в запросе ниже индекс ВТ использоваться не будет (если бы он был)
ИЗ
    Документ.ЭСФ КАК ЭСФ
ГДЕ
         ЭСФ.СчетФактура в (ВЫБРАТЬ Т.Ссылка ИЗ ВТ_СФ КАК Т)
79 trad
 
08.10.20
14:40
(78) + или в таком
ИЗ
        ВТ_Документы КАК ВТ_Документы
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СФ КАК СчетФактураВыданныйДокументыОснования
            ПО ВТ_Документы.ГТДДокумент = СчетФактураВыданныйДокументыОснования.ДокументОснование
80 H A D G E H O G s
 
08.10.20
14:40
(78) Потому что, чтобы использовался индекс, надо, чтобы каждый документ ЭСФ поискал своим полем в таблице ВТ_СФ
Нужно перебрать все документы ЭСФ
81 trad
 
08.10.20
14:41
(78) тут нужен индекс ВТ_СФ.Ссылка
(79) а тут - ВТ_СФ.ДокументОснование
82 H A D G E H O G s
 
08.10.20
14:42
(79) В таком, если записей мало, то проще обойти весь индекс (indexscan) через mergejoin. А если записей много - то вы сами себе злые буратины пихать большие куски в ВТ.
Это у вас сейчас, в спокойной системе ВТ и индексы строятся махом, вы попробуйте в нагруженной.
83 Said_We
 
08.10.20
14:43
(76) В (63) вы написали "Индексы в ВТ не нужны."
А тут оказывается нужны.
84 trad
 
08.10.20
14:44
(80) справедливо, если знаем, что есть индекс ЭСФ.СчетФактура
85 trad
 
08.10.20
14:48
(82) а mergejoin по вашему святым духом питается?
Вообще то, для его выполнения, нужно для начала два источника упорядочить. За сколько то и где то.
86 Said_We
 
08.10.20
14:50
(82) Я это ещё в (58) написал. Но в данном случае в (0) просил найти узкое место. В самом запросе их хватало. На выходе ВТ не большие будут - в разрезе ТЧ с ГТД по одному документу. Это не большие ВТ. Так что большой потери производительности тут не будет и что бы понять в чем узкое место вполне достаточно оставить ВТ, что бы не путать сложными конструкциями.

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

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

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

для мерджа нужно отсортировать и И1 и И2
для лупа можно проиндексировать только И2, по И1 пройтись как есть выдергивая из И2 то что нужно
101 trad
 
08.10.20
15:12
(100) + и если И2 - это наша ВТ, то вполне оправдано ее проиндексировать, и не утверждать что "Индексы в ВТ не нужны."
102 H A D G E H O G s
 
08.10.20
15:12
(100) А индексирование - это выстраивание идентификаторов записей источник в нужном порядке и построение по ним b+ дерева.
103 H A D G E H O G s
 
08.10.20
15:13
(101) Это если не нарвешься на hashjoin. В вашем, синтетическом, не нарвешься.
104 trad
 
08.10.20
15:14
(102) только двоичное дерево строится по ключу индекса, а идентификаторы записей в листьях
105 trad
 
08.10.20
15:16
(103) ну так все таки, индексы в ВТ бывают нужны?
106 H A D G E H O G s
 
08.10.20
15:17
(104) Чтобы построить дерево поиска, данные нужно отсортировать
Не находишь никакой закономерности?
http://cburch.com/cs/340/reading/btree/btree-6.png
107 H A D G E H O G s
 
08.10.20
15:19
(105) Нужно соединять 2 таблицы, временная таблица должна быть мала (но это очевидно и так) при этом физическая таблица не должна содержать индексов по полям соединения и условие соединения должно быть больше или меньше. Да, в таком охренено распространном случае нужно индексировать.
108 H A D G E H O G s
 
08.10.20
15:54
На как и прогнозировалось.

Выполнил твой пример без индексов и без больше-меньше

        ПО т1.А = т2.А
            И т1.Дата = т2.Дата

Прекрасный hashjoin за 0.03 секунды.

http://prntscr.com/uvgw7i
109 trad
 
08.10.20
16:34
(108) "без индексов и без больше-меньше" - это не мой пример
Я привел пример, когда индекс оправдан
Закон Брукера: Даже маленькая практика стоит большой теории.