|
Не могу понять. почему один запрос работает намного дольше схожего. | ☑ | ||
---|---|---|---|---|
0
Капюшон
25.11.13
✎
18:01
|
В первом случае (быстром) отчет работает вот так:
1)создаётся временная таблица выборкой табличных частей 2)создается запрос к регистру накопления и данные соединяются с ВТ из пункта (1) Второй случай: Создаётся запрос к регистру накопления и соединяется сразу же с табличной частью другого докумета без создания ВТ. Во втором случае в три раза дольше формируется отчет. в чем может быть дело. Первый запрос: ВЫБРАТЬ УчетТЗРОчередностьДоставки.Заказ, УчетТЗРОчередностьДоставки.ДатаДоставки ПОМЕСТИТЬ УчетТЗРОчередностьДоставки ИЗ Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки ГДЕ УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору, УчетТЗРОчередностьДоставки.ДатаДоставки ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки( &ДатаАнализа {(&ДатаАнализа)}, ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки ЛЕВОЕ СОЕДИНЕНИЕ УчетТЗРОчередностьДоставки КАК УчетТЗРОчередностьДоставки ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = УчетТЗРОчередностьДоставки.Заказ Второй запрос: ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору, УчетТЗРОчередностьДоставки.ДатаДоставки ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки( &ДатаАнализа {(&ДатаАнализа)}, ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки ЛЕВОЕ СОЕДИНЕНИЕ Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = УчетТЗРОчередностьДоставки.Заказ ГДЕ УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ И УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя |
|||
1
samozvanec
25.11.13
✎
18:11
|
в первом случае сначала отбор
ГДЕ УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ потом соединение, во втором наоборот. |
|||
2
Classic
25.11.13
✎
18:13
|
Поменяй ГДЕ на И
|
|||
3
samozvanec
25.11.13
✎
18:15
|
(0) может ты еще и внутреннее хочешь вместо левого?
|
|||
4
Капюшон
25.11.13
✎
18:17
|
(3)ну внутреннее мне не нужно в данном случае.
(2)не понял. как это поменять "Где" на "И" ? |
|||
5
Classic
25.11.13
✎
18:18
|
(4)
Да хоть автозаменой |
|||
6
Classic
25.11.13
✎
18:19
|
Правда порядок условий в соединении будет неправильным.
|
|||
7
samozvanec
25.11.13
✎
18:21
|
(4) тогда ты наверняка хочешь дате isnull сделать?
|
|||
8
Капюшон
25.11.13
✎
18:22
|
но что меня до слёз расстроило, так третий вариант сработал значительно быстрее, чем первые два.
ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору, ВложенныйЗапрос.ДатаДоставки ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки( &ДатаАнализа {(&ДатаАнализа)}, ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ УчетТЗРОчередностьДоставки.ДатаДоставки КАК ДатаДоставки, УчетТЗРОчередностьДоставки.Заказ КАК Заказ ИЗ Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки ГДЕ УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ) КАК ВложенныйЗапрос ПО ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка = ВложенныйЗапрос.Заказ |
|||
9
Капюшон
25.11.13
✎
18:23
|
(7)совершенно верно. просто Дата - это не самое последнее, что мне надо получить. Дальше это поле превратится в формулу где будет и проверка в том числе на null
|
|||
10
samozvanec
25.11.13
✎
18:24
|
(8) какой ты) опять так, потому что (1)
|
|||
11
Armando
25.11.13
✎
18:24
|
(8) не тратится время на создание ВТ
(6) какая разница? |
|||
12
Classic
25.11.13
✎
18:24
|
(8)
Кстати первый и второй запрос дадут разные результаты. И почему тебя расстроил третий вариант? Нет затрат по времени на помещение в ВТ. Ппроигрыша по скорости нет, потому что по ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом.Сделка В индекс все равно не попадаешь |
|||
13
Капюшон
25.11.13
✎
18:25
|
(12)вы прав. Оказались разные результаты. значит второй неправильный. только я еще не понял почему.
|
|||
14
Classic
25.11.13
✎
18:25
|
(9)
Во втором запросе у тебя нула не будет |
|||
15
Classic
25.11.13
✎
18:25
|
(13)
Потому что во втором у тебя по факту внутреннее соединение :) |
|||
16
samozvanec
25.11.13
✎
18:26
|
кстати, есть статейка на ИТС об оптимизации запросов, где сказано, что соединений с виртуальными таблицами делать не стоит, а стоит сачала их складывать во временные
|
|||
17
H A D G E H O G s
25.11.13
✎
18:27
|
Автора выгнать из профессии нафиг.
|
|||
18
samozvanec
25.11.13
✎
18:27
|
+(16) так что пробуй 4й вариант с записями из регистра в ВТ и табличными частями во вложенном запросе
|
|||
19
Капюшон
25.11.13
✎
18:27
|
(12)а третий расстроил, потому что я не думал, что он быстрее сработает.Значит я не так уж хорошо знал принцип работы языка запросов.
(16)сначала виртуальную таблицу регистра нужно во временную таблицу сложить а потом уже соединить её с другой? |
|||
20
Classic
25.11.13
✎
18:28
|
(16)
Вроде не "не стоит", а "не рекомендовано" |
|||
21
Капюшон
25.11.13
✎
18:28
|
(18)попробую сейчас же.
|
|||
22
H A D G E H O G s
25.11.13
✎
18:29
|
Все 3 запроса - кривые.
|
|||
23
Капюшон
25.11.13
✎
18:30
|
(22)чем же?
|
|||
24
samozvanec
25.11.13
✎
18:30
|
(20) большая разница?
(22) давай конкретнее. заодно можно будет прикинуть результаты оптимизации |
|||
25
Classic
25.11.13
✎
18:32
|
(20)
Да. Большая :) Что ТС кстати и продемонстрировал. Например 1С не рекомендует использовать вложенные подзапросы, но в случае, когда в индекс по-любому не попадаешь, вложенные запрос будет чутка быстрее |
|||
26
H A D G E H O G s
25.11.13
✎
18:34
|
виртуальную можно отфильтровать через параметры ВТ по полю
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом предварительно найденному в 1-ом пакетном. |
|||
27
Armando
25.11.13
✎
18:36
|
ДокументРасчетовСКонтрагентом - судя по всему составной тип.
Поэтому ДокументРасчетовСКонтрагентом.Сделка писать нельзя. Надо через "Выразить". И ДокументРасчетовСКонтрагентом.Сделка надо в параметры виртуальной таблицы засунуть |
|||
28
Капюшон
25.11.13
✎
18:36
|
Четвертый вариант работает медленнее третьего, но значительно быстрее первого и второго.
ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовОстаток, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ЧислоДнейЗадолжностиПоДоговору ПОМЕСТИТЬ ВзаиморассчетыПоДокументамРассчетов ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки( &ДатаАнализа {(&ДатаАнализа)}, ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем) И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВзаиморассчетыПоДокументамРассчетов.Контрагент, ВзаиморассчетыПоДокументамРассчетов.ДокументРасчетовСКонтрагентом, ВзаиморассчетыПоДокументамРассчетов.ДоговорКонтрагента, ВзаиморассчетыПоДокументамРассчетов.СуммаВзаиморасчетовОстаток, ВзаиморассчетыПоДокументамРассчетов.ЧислоДнейЗадолжностиПоДоговору, ВложенныйЗапрос.ДатаДоставки ИЗ ВзаиморассчетыПоДокументамРассчетов КАК ВзаиморассчетыПоДокументамРассчетов ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ УчетТЗРОчередностьДоставки.ДатаДоставки КАК ДатаДоставки, УчетТЗРОчередностьДоставки.Заказ КАК Заказ ИЗ Документ.УчетТЗР.ОчередностьДоставки КАК УчетТЗРОчередностьДоставки ГДЕ УчетТЗРОчередностьДоставки.Заказ ССЫЛКА Документ.ЗаказПокупателя И УчетТЗРОчередностьДоставки.Ссылка.ПометкаУдаления = ЛОЖЬ) КАК ВложенныйЗапрос ПО ВзаиморассчетыПоДокументамРассчетов.ДокументРасчетовСКонтрагентом.Сделка = ВложенныйЗапрос.Заказ |
|||
29
MM
25.11.13
✎
18:36
|
А почему я не вижу?
ВЫРАЗИТЬ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом КАК Документ.РеализацияТоваровУслуг) ДокументРасчетовСКонтрагентом - ведь составной тип и на нём ограничение. |
|||
30
Oleg_ka
25.11.13
✎
18:39
|
Вот ты ж ешкин кот ....
Павел (Чистов) киньте ему ссылку на ваш курс по запросам |
|||
31
Armando
25.11.13
✎
18:42
|
(30) Книжка халявная есть http://its.1c.ru/db/pubqlang#content:999999:1
|
|||
32
Капюшон
25.11.13
✎
18:43
|
(31)как называется7
|
|||
33
Капюшон
25.11.13
✎
18:43
|
(30)знаете. пусть запросы не самые оптимальные, но они работают и теперь уже работают быстро. а теперь оптимизацией займусь
|
|||
34
Мимохожий Однако
25.11.13
✎
18:46
|
(32)Язык запросов «1С:Предприятия 8» Хрусталевой
|
|||
35
Armando
25.11.13
✎
18:53
|
Для всяких оптимизаций могу посоветовать использовать обработку для просмотра структуры хранения базы. В частности индексы там смотреть удобно. И в подсистеме разработчика есть консоль запросов из которой можно перейти в обработку анализа тех. журнала и посмотреть план запроса.
|
|||
36
Капюшон
25.11.13
✎
18:53
|
(26)вот же у меня фильтруется по виду документов
И ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг |
|||
37
Капюшон
25.11.13
✎
18:54
|
(35)благодарю. обязательно покапаю ИР
|
|||
38
Armando
25.11.13
✎
18:57
|
(36) Это ты на тип ограничиваешь. А есть предложение ограничить на значения. Все равно по этим полям связь. Но там левое соедиенние... ну будет внутреннее, подумаешь)))
|
|||
39
H A D G E H O G s
26.11.13
✎
00:40
|
(35) Автор даже не знает, что такое индексы, очнись!
|
|||
40
Steel_Wheel
26.11.13
✎
00:55
|
(0) Левое соединение с регистром остатков. Регистр остатков слева -- зачем тебе нужны данные регистра, которых нет в документе?
|
|||
41
Armando
26.11.13
✎
01:38
|
Кстати, буквально на прошлой неделе была задача получить последнюю дату амортизации по каждому ОС. Первоначальный запрос выполнялся более минуты. С помощью (35) запрос был переписан, и стал формироваться не более 2 секунд. Так то. В смысле это реально полезные инструменты.
|
|||
43
DexterMorgan
26.11.13
✎
10:00
|
(39) + 100
Сделай две ВТ, проиндексируй по полям соединения и в третьем пакете соедини |
|||
44
Cerera
26.11.13
✎
10:13
|
(39)(43) индексы - зло. их не рекомендуется использовать в случае небольших таблиц.
Поэтому не нужно нагружать систему индексами на все случаи жизни. Во-первых, чем больше индексов в таблице, тем больше тратится времени на запись данных в эту таблицу. А во-вторых, когда индексы слишком сложные и их много, то СУБД не может подобрать среди них подходящий индекс за ограниченное время и может выбрать неоптимальный план запроса. Также следует иметь в виду, что на маленьких таблицах (порядка нескольких тысяч записей и меньше) СУБД практически всегда использует сканирование таблицы либо сканирование кластерного (автоматически созданного системой) индекса, так как это наиболее простое решение в данном случае. Так что нет смысла дополнительно индексировать заведомо небольшие таблицы. С другой стороны, часто трудно заранее предугадать размер таблицы. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |