Имя: Пароль:
1C
 
Как понять, что массив значений присутствует в таблице?
0 H A D G E H O G s
 
31.01.23
01:53
Дня доброго.
Есть у меня массив значений, пусть это будут документы - регистраторы. И мне надо одним запросом понять, какие из этих документов есть в регистре. Регистр - большой, 95 млн строк, а по одному документу записей около 30-50k.
Если мы напишем что-то типа

ВЫБРАТЬ РАЗЛИЧНЫЕ
    БольшойРегистр.Документ КАК Документ
ИЗ
    РегистрСведений.БольшойРегистр КАК БольшойРегистр
ГДЕ
    БольшойРегистр.Документ В (&МассивДокументов)

то он будет читать 30-50к строк по каждому документу. Наверное.

Мы могли бы сделать это например, в цикле, в виде
ВЫБРАТЬ ПЕРВЫЕ 1
    БольшойРегистр.Документ КАК Документ
ИЗ
    РегистрСведений.БольшойРегистр КАК БольшойРегистр
ГДЕ
    БольшойРегистр.Документ =&МассивДокументов
и это бы сработало, он читал бы по 1 строке по каждому документу, и это было бы возможно быстрее, во всяком случае, СУБД не читало бесполезные данные, как бешанный.


Но как это сделать для набора данных? Как сказать SQL-ю, что достаточно считать 1 строку для каждого документа? Горшочек, не вари!
1 xraf
 
31.01.23
03:00
Может из массива сделать таблицу в запросе?
И потом с соединениями поиграть?
2 H A D G E H O G s
 
31.01.23
03:06
(1) какое 2-ое условие соединения?
3 rphosts
 
31.01.23
03:14
Если есть ну пусть НомерСтроки - группировать по документу с агрегатом Максимум(НомерСтроки)?
4 H A D G E H O G s
 
31.01.23
03:39
(3) это если в индекс входит. Там можно и просто условие номерстроки=1. Но у меня такого нет
5 SleepyHead
 
гуру
31.01.23
04:36
(0) А сколько документов в массиве?
6 rphosts
 
31.01.23
05:10
(4) И давно у РС перестало быть кластерного индекса?
7 rphosts
 
31.01.23
05:35
А вообще конечно неплохо-бы структуру РС увидеть
8 АНДР
 
31.01.23
06:23
(0)
Второй вариант, только в цикле собирай запрос через Объединить ВСЕ
9 RomaH
 
naïve
31.01.23
06:43
как-то так?


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ втНабор
ИЗ
    Справочник.Номенклатура КАК Номенклатура
{ГДЕ
    Номенклатура.Ссылка.* КАК Набор}
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(ВЫБОР
            КОГДА втТовары.Ссылка ЕСТЬ NULL
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ) КАК ПолныйНабор
ИЗ
    втНабор КАК втНабор
        ЛЕВОЕ СОЕДИНЕНИЕ втТовары КАК втТовары
        ПО (втТовары.Номенклатура = втНабор.Ссылка)
10 RomaH
 
naïve
31.01.23
06:45
"Как сказать SQL-ю, что достаточно считать 1 строку для каждого документа?" - а - ну тогда нет - не так
11 xraf
 
31.01.23
08:39
(2) какое-нибудь максимум или минимум
12 RomanYS
 
31.01.23
08:46
Если различные не устраивает и номера строки нет, значит нужен отдельный МаленькийРегистр
13 НЕА123
 
31.01.23
08:56
(0)
если МассивДокументов небольшой, то как в (0)
ВЫБРАТЬ ПЕРВЫЕ 1
    БольшойРегистр.Документ КАК Документ,
    БольшойРегистр.ИзмерениеРесурс КАК ИзмерениеРесурс
ИЗ
    РегистрСведений.БольшойРегистр КАК БольшойРегистр
ГДЕ
    БольшойРегистр.Документ =&ДокументИзМассива
14 RomanYS
 
31.01.23
08:59
(13) неужели СУБД настолько плохи, что запрос в цикле будет лучше чем различные?
15 mikecool
 
31.01.23
09:01
поддержу (8), экзист не завезли...
16 Kassern
 
31.01.23
09:07
(0) "о он будет читать 30-50к строк по каждому документу. Наверное. " - проверяли план запроса? Типов документов много в МассивДокументов?
17 Fedor-1971
 
31.01.23
09:11
(0) так-то РАЗЛИЧНЫЕ и есть ограничение для SQL.
По идее, выборка пойдёт по индексу Регистратор и не будет перебирать все строки в регистре
18 mikecool
 
31.01.23
09:16
(17) различные, емнип, де-факто группировка
19 Fedor-1971
 
31.01.23
09:22
(18) о ёлки палки, у ТС Документ - это типа измерение и не факт, что с индексом, тогда, да группировка с перебором всего регистра
20 H A D G E H O G s
 
31.01.23
11:04
(16) проверял, читает. Из индекса вычитывает все строки по документу.
(8) вариант, но, это каждый раз компиляция нового плана запроса.
21 magicSan
 
31.01.23
11:09
(18) группирвока рабоатет быстрей чем различные это раз, два distinct и group by разные операторы
22 Кирпич
 
31.01.23
11:13
внутреннее соединение же
23 mikecool
 
31.01.23
12:45
(21) уверен, что дистинкт не превращается в груп бай? емнип на каких то курсах было про это
24 Кирпич
 
31.01.23
13:14
может наоборот попробовать?


ВЫБРАТЬ Документ
ИЗ ВТ_МассивДокументов
ГДЕ Документ В (ВЫБРАТЬ БольшойРегистр.Документ ИЗ БольшойРегистр)
25 H A D G E H O G s
 
31.01.23
13:19
(24) бинго! Но надо проверить.
26 Dmitrii
 
гуру
31.01.23
17:38
(0) >> надо одним запросом понять, какие из этих документов есть в регистре.

Может быстрее будет найти те документы, которых нет в регистре, а потом вычесть их из исходного массива?
27 H A D G E H O G s
 
02.02.23
01:34
(24) Спасибо тебе, заработало!
28 Кирпич
 
02.02.23
09:43
(27) И чо, долго считало?
29 H A D G E H O G s
 
02.02.23
11:24
(28) сколько документов в ВТ - столько и прочитанных строк индекса.