|
запрос долго работает | ☑ | ||
---|---|---|---|---|
0
ic-kat
11.03.13
✎
15:01
|
есть два документа
заявка и накладная, они могут быть друг у друга документами основаниями. если у заявки операция забрать, то на основании ее создается накладная, и на основании накладной можно создать заявку с операцией отвезти. помимо операций забрать и отвезти есть куча других, также на основании накладной можно ввести кучу других документов. нужно отобрать пары заявка-накладная чтобы в выборку попали лишь заявки с операцией забрать и накладные, на основании которых они введены, и заявки с операцией отвезти и их основания-накладные делаю |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл |ПО (Накл.ДокументОснование = Заявка.Ссылка | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать) | ИЛИ Накл.Ссылка = Заявка.ДокументОснование | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти)) работает, но оооочень долго подскажите, как лучше сделать? |
|||
1
butterbean
11.03.13
✎
15:08
|
убрать левое соединение и написать условие
ГДЕ Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать) ИЛИ Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти) |
|||
2
GANR
11.03.13
✎
15:09
|
ИЛИ отрубает работу индексов. А если так?
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл |ПО (Накл.ДокументОснование = Заявка.Ссылка | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать) ОБЪЕДИНИТЬ ВСЕ |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл | Накл.Ссылка = Заявка.ДокументОснование | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти)) + и перед присоединением таблицы справа неплохо-бы сделать (1) |
|||
3
GANR
11.03.13
✎
15:11
|
Таблицы перед соединением неплохо-бы отфильтровать - количество проверок условия соединения равно
(число строк в левой таблице) x (число строк в правой таблице). |
|||
4
viktor_vv
11.03.13
✎
15:12
|
И еще вариант во временную таблицу выгрести заявки с условием по операция и через Выбор сформировать поле для связи, потом в основном запросе по этому полю соединять.
|
|||
5
Владимир1С
11.03.13
✎
15:14
|
Если есть возможность, для ускорения подбора можно создать опорные регистры сведений, в которые при проведении документов заносить пары означенных документов, дабы потом не тратить время на поиск
|
|||
6
Maxus43
11.03.13
✎
15:14
|
ГДЕ
Заявка.Операция В (ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать), ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти)) |
|||
7
sapphire
11.03.13
✎
15:23
|
(0) Запрос полностью?
|
|||
8
GANR
11.03.13
✎
15:25
|
(0) запрос ускорился ???
|
|||
9
GANR
11.03.13
✎
15:27
|
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл
|ПО Накл.ДокументОснование = Заявка.Ссылка ОБЪЕДИНИТЬ ВСЕ |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл | Накл.Ссылка = Заявка.ДокументОснование ... |ГДЕ |Заявка.Операция В (ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать), ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти)) |
|||
10
Rooslan
11.03.13
✎
15:34
|
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл
|ПО (Накл.ДокументОснование = Заявка.Ссылка | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать) | ИЛИ Накл.Ссылка = Заявка.ДокументОснование | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти)) УБЕРИ .Ссылка |
|||
11
mistеr
11.03.13
✎
15:42
|
(3) Вообще говоря не должно отрубать. Планировщик должен сообразить и переписать на union. Но платформа бывает столько накручивает в запросе, что он путается.
|
|||
12
mistеr
11.03.13
✎
15:42
|
(11) -> (2)
|
|||
13
ic-kat
11.03.13
✎
15:43
|
отвлекали...
про объединить тоже думала. сам запрос большой, громоздко будет, попробуй сейчас. |
|||
14
GANR
11.03.13
✎
15:44
|
(11) http://its.1c.ru/db/v8std#content:2149184307:1 это из стандартов
|
|||
15
ic-kat
11.03.13
✎
15:52
|
(10) - а как связывать тогда?
(14) - нет доступа :( |
|||
16
Владимир1С
11.03.13
✎
15:58
|
(0) Озвучьте пожалуйста, параметры железа и размер базы данных. Это может многое прояснить.
|
|||
17
GANR
11.03.13
✎
15:59
|
(15) Да не суть... Главное, чтобы ИЛИ в секции запроса ПО не было. И в левой таблице перед соединением неплохо-бы уменьшить число записей (см. (1)(6)).
|
|||
18
mistеr
11.03.13
✎
16:11
|
(14) Я про Скуль
|
|||
19
sapphire
11.03.13
✎
16:13
|
(11) если ты про скуль, то не обязан.
|
|||
20
Rooslan
15.03.13
✎
16:48
|
(15) при указании .ссылка обращение происходит к данным столько, сколько у Вас в запросе будет выводиться Заявка.Ссылка.
Без указания .ссылка тоже будет работать!!!! Проверенно! Производительность увеличиться в разы! |
|||
21
ic-kat
16.03.13
✎
20:49
|
(20)нет, ругается, что не найдено поле Заявка и не найдено поле Накл
|
|||
22
ic-kat
16.03.13
✎
20:51
|
(8) когда сделала объединение, да быстро отрабатывает.
только запрос громоздкий. а если оставлять в соединение таблиц ИЛИ, то сразу начинает тормозить |
|||
23
ic-kat
16.03.13
✎
20:52
|
(4) в вт выгружаю все заявки с видом операции. а дальше не совсем поняла, чего делать
|
|||
24
GANR
16.03.13
✎
22:07
|
(22) пусть громоздкий будет, стандарты 1С (14) кровью написаны. (23) это не избавит от ИЛИ, игнорирующего индексы
|
|||
25
banco
17.03.13
✎
08:14
|
(0) ВЫРАЗИТЬ(<Выражение> КАК <Тип>)
|
|||
26
GANR
17.03.13
✎
10:57
|
(22) Я вспомнил основы математической логики. Кстати, можно избавиться от ИЛИ не увеличив запрос в размерах:
Условие А или Б, тождественно условию НЕ (НЕ А И НЕ Б). Мысль понятна!? то есть, условие соединения можно преобразовать к виду |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл |ПО НЕ (НЕ (Накл.ДокументОснование = Заявка.Ссылка | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Забрать)) | И НЕ (Накл.Ссылка = Заявка.ДокументОснование | И Заявка.Операция = ЗНАЧЕНИЕ(Справочник.ВидыОпераций.Отвезти))) P.S. Не уверен, что сработает, но, очень прошу, отпишись о результатах эксперимента - мне самому интересно. |
|||
27
Web00001
17.03.13
✎
11:44
|
Требуется пакетный запрос.
1 Запрос будет состоять из двух запросов которые будут объединяться по вертикали(через объеденить). 1.1 В первом Выбираем Заявки у которых вид операции забрать 1.2 Во втором Выбираем накладные у которых основание заявка с нужным видом операции 2. Запрос будет формироваться на основании работы первого запроса(он же пакетный) и он будет возвращать документы основанием которых являются документы из первого запроса. Все. Выполняем пакет. Из первого запроса берем основания, из второго нужные документы. Вроде все просто. Или я что то забыл\не понял? |
|||
28
Web00001
17.03.13
✎
11:46
|
Никаких или
|
|||
29
GANR
17.03.13
✎
11:52
|
(27) ОБЪЕДИНИТЬ ВСЕ было уже и дало ускорение (22), теперь надо попробовать (26) - может получится компактный И быстрый запрос
|
|||
30
Web00001
17.03.13
✎
12:16
|
Там
>>только запрос громоздкий. совершенно непонятно, почему он громоздкий, он простой должен быть как апельсин. |
|||
31
GANR
17.03.13
✎
12:19
|
(30) Один и тот же запрос 2 раза, только с разными условиями соединения вместо ИЛИ как в (2) - вот и текст запроса растет.
|
|||
32
Web00001
17.03.13
✎
12:30
|
Выбрать Ссылка
Из Документ.Заявка Где Документ.Операция = Значение(КакоеТоТамЗначение) ОбъеденитьВсе Выбрать Ссылка Из Документ.Накладная Где Документ.Основание.Операция = Значение(КакоеТоТамЗначение) Где тут громоздкость?(за ситаксис ссори) писал на скорую руку из головы |
|||
33
GANR
17.03.13
✎
12:44
|
(32) По сравнению с
Выбрать Ссылка Из Документ.Заявка Где Документ.Операция = Значение(КакоеТоТамЗначение) ИЛИ Документ.Основание.Операция = Значение(КакоеТоТамЗначение) В 2 раза размер увеличивается, а представь, если в исходном запросе уже 200 строк и в 2 раза увеличить его - это уже 400 строк. |
|||
34
Web00001
17.03.13
✎
13:29
|
Первое решение, все таки более правильное и читаемое и удобное, я бы даже и не смотрел другие варианты. Зачем смотреть в другую сторону, если есть правильный вариант, гляньте на ЗуП, процедура заполнения табеля
http://test-bootst.appspot.com/p/ho5l163f8l146lu (не буду сюда постить эту простыню) |
|||
35
GANR
17.03.13
✎
13:48
|
(34) Ладно, будет Profiler под рукой - на простых примерах выложу планы запросов через ОБЪЕДИНИТЬ, ИЛИ и (26).
|
|||
36
GANR
17.03.13
✎
13:55
|
(34) операция индексирования
|ИНДЕКСИРОВАТЬ ПО | Ссылка кстати, тоже машинное время отнимает. А без ВТ и без ИЛИ используются уже "готовые" индексы. |
|||
37
EvgeniuXP
17.03.13
✎
14:26
|
(22) громоздкий - это 6 экранов, но лучше такой, т.к. быстро отрабатывает. Я вот планирую еще 2 экрана туда добавить, чем писать на один экран и отрабатывает долго.
|
|||
38
ic-kat
18.03.13
✎
07:53
|
(26) неа, долго отрабатывает, так же, как с или
|
|||
39
ic-kat
18.03.13
✎
07:54
|
(32) я привела только соединение. сам запрос большо и несет в сееб несколько таблиц. если без или, то становится в два раза больше. если с или, то тормозит
|
|||
40
ic-kat
18.03.13
✎
08:52
|
в итоге сделала так:
в вт делаем отбор по видам операций в запросе |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Накладная КАК Накл |ПО (Накл.ДокументОснование = Заявка.Ссылка) а в новое поле выдергиваю |ВЫБОР |КОГДА (НЕ Заявка.ДокументОснование.Ссылка = ЗНАЧЕНИЕ(Документ.Накладная.Пустаяссылка)) |ТОГДА ЗаявкаЭкспедитора.ДокументОснование.Ссылка |ИНАЧЕ ЗНАЧЕНИЕ(документ.накладная.пустаяссылка) |КОНЕЦ КАК НакладнаяОснование компактно и работает так же быстро, как с объединением |
|||
41
GANR
18.03.13
✎
11:27
|
(40) Спасибо! Будем в перспективе делать через ВЫБОР.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |