Имя: Пароль:
1C
 
Выбрать доки с пустой табличной частью
0 medstrax
 
07.07.11
17:54
Помогите составить оптимальный по времени выполнения запрос для выборки доков (РеализацияТоваровУслуг) с пустой табличной частью Товары. База на мсскл2008
1 Amra
 
07.07.11
17:57
Количество=0
2 also
 
07.07.11
17:57
имеющие
3 also
 
07.07.11
17:58
ИМЕЮЩИЕ
   СУММА(Документ.ТЧ.Поле) = 0
4 бомболюк
 
07.07.11
17:58
Левое соединение шапки с табличной частью по условию
ГДЕ
ТабличнаяЧасть.Ссылка ЕСТЬ NULL
5 SuperMario
 
07.07.11
18:02
ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
       ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка
ГДЕ
   РеализацияТоваровУслугТовары.Ссылка ЕСТЬ NULL
6 mikecool
 
07.07.11
18:04
ВЫБРАТЬ
   РеализацияТоваровУслугТовары.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
Сгруппировать По РеализацияТоваровУслугТовары.Ссылка
Имеющие Количество(*) = 0
не?
7 medstrax
 
07.07.11
18:04
Последний вариант - первое, что мне пришло в голову, но он, к сожалению, весьма медленный. Цель найти оптимальный вариант.
8 medstrax
 
07.07.11
18:05
Сори, имел в виду пост (5)
9 бомболюк
 
07.07.11
18:07
попробуй
выбрать
шапка.ссылка где шапка.ссылка не в (выбрать табчасть.ссылка)
10 fisher
 
07.07.11
18:09
(8) Оптимальнее чем в (5)?????
11 mikeA
 
07.07.11
18:11
может быть выбрать документы с непустой табличной частью и потом использовать НЕ В?
12 medstrax
 
07.07.11
18:14
(10) думаю, есть оптимальней
13 medstrax
 
07.07.11
18:15
приводите,плиз, готовые варианты запросов, дабы их можно было оттестить. некоторые советы мне не совсем ясны в плане реализации
14 SuperMario
 
07.07.11
18:18
(13) ... готовые варианты = нормально? Вот бы мне так жить.

Голова тогда зачем?
15 fisher
 
07.07.11
18:21
(12) Ошибаешься. Голову включи. Соединение надо? Надо. А больше там и нет ничего.
16 medstrax
 
07.07.11
18:21
Голова на месте. Хотелось бы, чтобы советчики сперва сами попробовали свой способ :)
17 fisher
 
07.07.11
18:23
(16) Так пользуйся, если на месте!
18 medstrax
 
07.07.11
18:26
(12) если я приведу способ быстрее, чем (5) - ты усомнишься кому из нам стоит включить голову? :)
Дело не в мерянье письками, я реально пытаюсь найти быстрейший способ
19 fisher
 
07.07.11
18:31
(18) Чтобы определить документы с пустой табличной частью, нужно сопоставить таблицу документов с таблицей табличных частей и отобрать те строки из таблицы документов, для которых нет ни одной строки в таблице табличных частей.
Я пока правильно излагаю, или на этом этапе у тебя есть альтернативные предложения? Очень интересно будет послушать.
20 medstrax
 
07.07.11
18:35
(19)На уровне обычной логики - да, правильно. Но...
Повторю вопрос (18)
21 PR
 
07.07.11
18:37
ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
       ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка
       И РеализацияТоваровУслугТовары.Ссылка ЕСТЬ NULL
22 fisher
 
07.07.11
18:39
(20) Формализация задачи на языке запросов SQL в (5) выполнена буквально теми же словами. Удачи в поиске "быстрых" вариантов.
23 fisher
 
07.07.11
18:42
(21) У автора это медленно работает. Он считает, что запрос неоптимален. Одно единственное соединение, без которого в любом случае не обойтись - для него неоптимальное решение.
24 Kondarat
 
07.07.11
18:42
(18) Ну давай же приводи побыстрее, не томи......
25 PR
 
07.07.11
18:44
(23) Сравни мой вариант с (5) и найди отличие :))
26 acsent
 
07.07.11
18:48
(21) Твой запрос НЕ верен. 2е условие соединение никогда не отработает
27 AndreYAN
 
07.07.11
18:52
ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
   (НЕ РеализацияТоваровУслуг.Ссылка В
               (ВЫБРАТЬ
                   РеализацияТоваровУслугТовары.Ссылка
               ИЗ
                   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары))
28 fisher
 
07.07.11
18:52
(25) Таки да. Не заметил. В самом деле, твой вариант нерабочий.
29 PR
 
07.07.11
18:52
(26) А, ну да, ошибся, нельзя так :))
30 AndreYAN
 
07.07.11
18:53
(27) в условии нужно еще добавить РАЗЛИЧНЫЕ
31 medstrax
 
07.07.11
19:00
Хе-хе, печально я гляжу на наше поколенье...
И это люди в большинстве своем имеющие серты спецов по платформе :)
32 Ахиллес
 
07.07.11
19:01
(31) не томи уже. Давай свой супер пупер вариант.
33 medstrax
 
07.07.11
19:06
(32)Зачем? Подождем когда подтянутся гуру. Или они уже все отметились? :))
Тем паче что я пока сам в поисках окончательного варианта.
Хотя и нынешний процентов на 30-40% быстрее (5)
34 PR
 
07.07.11
19:08
Тогда я бы предложил либо

ВЫБРАТЬ РАЗЛИЧНЫЕ
   РеализацияТоваровУслугТовары.Ссылка
ПОМЕСТИТЬ ДокументыСТабличнойЧастью
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
   РеализацияТоваровУслугТовары.НомерСтроки = 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
   (НЕ РеализацияТоваровУслуг.Ссылка В
               (ВЫБРАТЬ
                   ДокументыСТабличнойЧастью.Ссылка
               ИЗ
                   ДокументыСТабличнойЧастью КАК ДокументыСТабличнойЧастью))

либо

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ВложенныйЗапрос.Ссылка,
   СУММА(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
ИЗ
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
       РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
       1 КАК НомерСтроки
   ИЗ
       Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
   ГДЕ
       РеализацияТоваровУслугТовары.НомерСтроки = 1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       РеализацияТоваровУслуг.Ссылка,
       0
   ИЗ
       Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Ссылка

ИМЕЮЩИЕ
   СУММА(ВложенныйЗапрос.НомерСтроки) = 0

PS: Скорость не проверял ессно, то есть не утверждаю, что будет быстрее :))
35 fisher
 
07.07.11
19:18
(33) Файловая небось? Если клиент-сервер, то чей сервер БД?
36 medstrax
 
07.07.11
19:21
(35) А внимательно прочесть первый пост затруднительно?
37 medstrax
 
07.07.11
19:33
(34)Складывается ощущение, что 1с-девелоперы совершенно не утруждают себя пониманием простейших вещей. 1)2 выборки, там где можно обойтись одной - это ОЧЕНЬ плохо. 2)Агрегатные функции это точно такое же зло в плане быстродействия.
Впрочем, все понятно. "Тормозит база? Докупите еще пару сервов в кластер. Это не софт кривой, это у вас железо не тянет". Правда? :)))
38 PR
 
07.07.11
19:34
(37) Не надо грязи.
Прочитай PS.
39 Ахиллес
 
07.07.11
19:37
(37) Запрос:
ВЫБРАТЬ
   РеализацияТоваровУслугТовары.Ссылка
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

НЕ выберет ссылки в которых табличная часть пустая. Соответственно одну выборку к какой таблице будем строить?
40 medstrax
 
07.07.11
20:11
Могу страждущим подкинуть вариант для размышлений, скорость на уровне (5) Это дабы особо умные поняли, что соединения здесь не нужны.
ВЫБРАТЬ
Реализация.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
НЕ Реализация.Товары.Ссылка=Реализация.Ссылка;
41 PR
 
07.07.11
20:12
(40) Это выборка из одной таблицы? LOL
42 medstrax
 
07.07.11
20:16
Мда...Комментарии излишни. Может все-таки, прежде чем строить домыслы, проверишь КАК это работает?
43 PR
 
07.07.11
20:20
(42) Реализация и Реализация.Товары хранятся физически в одной таблице или нескольких? :))
44 medstrax
 
07.07.11
20:28
Разумеется в разных. А ты не чувствуешь разницы между ПОЛНОЙ выборкой из Реализация.Товары и конкретной проверкой
Реализация.Товары.Ссылка=Реализация.Ссылка ? :)
45 PR
 
07.07.11
20:30
(44) А ты не понимаешь, что насколько я понимаю у тебя получается коррелирующий запрос? :))
Тебя не смущает время на уровне (5)? Казалось бы, почему? :))
46 Ахиллес
 
07.07.11
20:38
exec sp_executesql N'SELECT
_Document388_Q_000_T_001._IDRRef AS f_1
FROM
_Document388 _Document388_Q_000_T_001 WITH(NOLOCK)
WHERE
NOT EXISTS(SELECT 1 FROM _Document388_VT10200 WITH(NOLOCK) WHERE _Document388_Q_000_T_001._IDRRef = _Document388_VT10200._Document388_IDRRef AND
_Document388_Q_000_T_001._IDRRef = _Document388_VT10200._Document388_IDRRef) AND _Document388_Q_000_T_001._Date_Time < P1',N'P1 datetime','4011-06-01 00:00:00'

(44) Ну и где тут запрос к одной таблице? Два селекта к двум таблицам...
47 medstrax
 
07.07.11
21:06
(46) Разве я утверждал, что на уровне скуля не будет 2 селекта? ;)
Ты сравни теперь этот скуль-запрос с левым соединением.
А потом с
"ВЫБРАТЬ
   |    Реализация.Ссылка КАК Ссылка
   |ИЗ
   |    Документ.РеализацияТоваровУслуг КАК Реализация
   |ГДЕ
   |НЕ Реализация.Товары.НомерСтроки В (&Массив)";

   
   Массив = Новый Массив();
   Массив.Добавить(1);
   Запрос.УстановитьПараметр("Массив", Массив);
Этот вариант в 1,5 раза быстрей ,чем (5)
48 medstrax
 
07.07.11
21:17
Кстати, вполне можно обойтись без массива, достаточно
НЕ Реализация.Товары.НомерСтроки В (1)
однако выигрыша я не увидел
49 acsent
 
07.07.11
21:21
А если так

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

  РеализацияТоваровУслугТовары.Ссылка ЕСТЬ NULL
50 acsent
 
07.07.11
21:22
(49) Попадаем на индекс по номеру строки и нет лишних соединений
51 Лефмихалыч
 
07.07.11
21:26
однако, да, этот (40) запрос у меня порвал в клочья запрос с соединением - соединение на целых аж неимоверных 2 миллисекунды медленнее отработало.
52 medstrax
 
07.07.11
21:27
а (47)?
53 Лефмихалыч
 
07.07.11
21:30
(52) мне лень, я уж впн разъединил. В боевых условиях это все все равно нафиг не нужно, т.к. кроме скорости важна еще и поддержка, которая такими (40),(47) трюками будет затруднена. 2мс не стоят того, чтобы в будущем морщить лоб, пытаясь понять: "что что же это я в том году имел в виду сказать таким е..нистическим запросом?.."
54 medstrax
 
07.07.11
21:33
(53) Ога. Я так и вижу себя стоящим перед заказчиком и на вопрос гендира "какого х все юзера орут про тормоза?" отвечаю "йопта, не хочу в будущем морщить лоб... Сделал как проще" :))
55 PR
 
07.07.11
21:35
(54) Не ерничай.
Докажешь, что твой запрос оптимальнее, приходи топорщить грудь.
Пока что-то не видно преимущества.

PS: Желательно с текстом запроса из профайлера.
56 Лефмихалыч
 
07.07.11
21:37
(54) ну, что ты несешь, окстись. Где тормоза и где 2 миллисекунды?

Во-первых, "преждевременная оптимизация корень всех зол" (с) д. Кнут

Во-вторых, это перфекционанизм, который тоже до добра не доведет
57 medstrax
 
07.07.11
21:38
(49)респект, всего лишь процентов на 5 проигрывает (47)
58 medstrax
 
07.07.11
21:43
(56) Оп, уже и кнута помянули:) А что ж он 3 тома расписывал про быстрые алгосы, как думаешь? Или ты считаешь, что он свои нехитрым трудом хотел выразить сладкую мысль всех отчественных девелоперов:"главное сдать в срок,а там ниипет"?
59 fisher
 
08.07.11
10:50
(47) Да. Этот вариант быстрее. Не в 1,5 раза, но быстрее. Остроумное решение.
Но увеличение скорости здесь не за счет отсутствия соединения (оно никуда не девается, либо оно, либо коррелирующий подзапрос к другой таблице - в любом случае план выполнения сопоставляет данные двух таблиц), а за счет остроумного отбора строк второй таблицы.
Так что ты был прав. Но тешить самолюбие на протяжении полста постов - выглядит несколько по-детски.