|
Сравнение способов получения среза последних на каждую дату в запросе | ☑ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0
Ненавижу 1С
гуру
26.01.11
✎
13:03
|
Какой метод быстрее?
1. Классический Книга знаний: Срез последних на каждую дату в запросе ВЫБРАТЬ Таб1.СсылкаДок, Таб1.ДатаДок КАК ДатаДок, Таб1.ВалютаДок, Таб2.Курс ИЗ (ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК СсылкаДок, ЗаказПокупателя.Дата КАК ДатаДок, ЗаказПокупателя.ВалютаДокумента КАК ВалютаДок, МАКСИМУМ(Валюты.Период) КАК ПериодДок ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты ПО (Валюты.Период <= ЗаказПокупателя.Дата) И (Валюты.Валюта = ЗаказПокупателя.ВалютаДокумента) ГДЕ ЗаказПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон СГРУППИРОВАТЬ ПО ЗаказПокупателя.Ссылка, ЗаказПокупателя.Дата, ЗаказПокупателя.ВалютаДокумента) КАК Таб1 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2 ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта УПОРЯДОЧИТЬ ПО ДатаДок 2. Альтернатива (с временной таблицей) ВЫБРАТЬ КурсыВалют.Валюта, КурсыВалют.Период КАК ПериодНач, КурсыВалют.Курс, МИНИМУМ(ЕСТЬNULL(КурсыВалют1.Период, &ДатаКон)) КАК ПериодКон ПОМЕСТИТЬ ПериодыКурсов ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют1 ПО КурсыВалют.Валюта = КурсыВалют1.Валюта И КурсыВалют.Период < КурсыВалют1.Период ГДЕ КурсыВалют.Период МЕЖДУ &ДатаНач И &ДатаКон СГРУППИРОВАТЬ ПО КурсыВалют.Валюта, КурсыВалют.Период, КурсыВалют.Курс ОБЪЕДИНИТЬ ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Период, КурсыВалютСрезПоследних.Курс, ЕСТЬNULL(КурсыВалютСрезПервых.Период, &ДатаКон) ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаНач, ) КАК КурсыВалютСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПервых(&ДатаНач, ) КАК КурсыВалютСрезПервых ПО КурсыВалютСрезПоследних.Период <> КурсыВалютСрезПервых.Период И КурсыВалютСрезПоследних.Валюта = КурсыВалютСрезПервых.Валюта ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Таб1.Ссылка КАК СсылкаДок, Таб1.Дата КАК ДатаДок, Таб1.ВалютаДокумента КАК ВалютаДок, Таб2.Курс ИЗ Документ.ЗаказПокупателя КАК Таб1 ЛЕВОЕ СОЕДИНЕНИЕ ПериодыКурсов КАК Таб2 ПО Таб1.ВалютаДокумента = Таб2.Валюта И Таб1.Дата >= Таб2.ПериодНач И Таб1.Дата < Таб2.ПериодКон ГДЕ Таб1.Дата МЕЖДУ &ДатаНач И &ДатаКон УПОРЯДОЧИТЬ ПО ДатаДок |
||||||||||||||||
1
Cube
26.01.11
✎
13:05
|
Сравни и расскажи)
|
||||||||||||||||
2
Ненавижу 1С
гуру
26.01.11
✎
13:07
|
(1) я люблю заставлять думать
|
||||||||||||||||
3
ZanderZ
26.01.11
✎
13:07
|
какой-то странный опрос. Что быстрее то и лучше.
Классический |
||||||||||||||||
4
Ненавижу 1С
гуру
26.01.11
✎
13:09
|
(3) я и спросил что быстрее
|
||||||||||||||||
5
Axel2009
26.01.11
✎
13:14
|
в перспективе с учетом увеличения количества строк в результирующей выборке (обрабатываемых заказов) 2ой вариант в плюсе..
|
||||||||||||||||
6
Леха Дум
26.01.11
✎
13:14
|
во втором ошибка может случиться: "КурсыВалют.Период МЕЖДУ &ДатаНач И &ДатаКон" - на дату документа = &ДатаНач может не оказаться записи в выборке "КурсыВалют"
|
||||||||||||||||
7
Axel2009
26.01.11
✎
13:15
|
только индексировать временную таблицу не помешало бы =)
|
||||||||||||||||
8
Ненавижу 1С
гуру
26.01.11
✎
13:17
|
(6) для этого там объединение стоит
(7) принимается |
||||||||||||||||
9
Леха Дум
26.01.11
✎
13:18
|
(8) дочитал :)
|
||||||||||||||||
10
МихаилМ
26.01.11
✎
13:18
|
все зависит от субд, на которой 1с будет выполнять запрос.
поэтому "Какой метод быстрее" бессмысленный. Альтернатива |
||||||||||||||||
11
Ненавижу 1С
гуру
26.01.11
✎
13:20
|
не в тему, но мне кажется второй метод проще "внедрить" в уже имеющийся запрос
|
||||||||||||||||
12
Леха Дум
26.01.11
✎
13:22
|
При растущих объемах, а они должны расти :)
Альтернатива |
||||||||||||||||
13
Axel2009
26.01.11
✎
13:22
|
(11) ща тебя закидают шапками, что подзапросами пользоваться в 1с незя. нуна через временные таблицы.
|
||||||||||||||||
14
Ненавижу 1С
гуру
26.01.11
✎
13:23
|
(10) в первую очередь интересует такой расклад:
клиент-сервер 8.1 под MS SQL 2005, УТ |
||||||||||||||||
15
luckyluke
26.01.11
✎
13:23
|
Классический мне кажется будет быстрее в любом случае...
Классический |
||||||||||||||||
16
Ненавижу 1С
гуру
26.01.11
✎
13:23
|
(13) пусть закидают сначала автора Книга знаний: Срез последних на каждую дату в запросе
|
||||||||||||||||
17
Ненавижу 1С
гуру
26.01.11
✎
13:24
|
(15) какие Ваши доказательства?
|
||||||||||||||||
18
Fragster
гуру
26.01.11
✎
13:28
|
есть еще тормозной способ (в 2 раза примерно тормознее классического варианта)
типа Регистр Внутреннее соединение (Выбрать первые 1 Из Регистр как ТМП Где Тмп.Дата <= Регистр.Дата И Регистр.Валюта = Тмп.Валюта Упорядочить по Тмп.Дата Убыв) как Внутренний |
||||||||||||||||
19
Ненавижу 1С
гуру
26.01.11
✎
13:29
|
(18) в подзапросе в данном случае разве можно использовать упорядочивание?
|
||||||||||||||||
20
luckyluke
26.01.11
✎
13:30
|
(17) ну как я понимаю, выигрыш ВТ перед вложенной таблицей в том, что СУБД оптимальнее будет трактовать соединение, а выигрыш классического в то что не надо создавать ВТ и индексировать её. Я думаю у СУБД проблем с порядком соединения не возникнет, запрос не настолько "запутанный", так что если этот запрос не является вложенным запросом другого запроса, то думаю он будет быстрее в любом случае.
|
||||||||||||||||
21
Axel2009
26.01.11
✎
13:30
|
(18) cross apply доступен с 2005 скуля. и в 1ске не поддерживается если что =)
|
||||||||||||||||
22
luckyluke
26.01.11
✎
13:30
|
(19) там слово "первые" есть, так что по идее да, можно...
|
||||||||||||||||
23
Axel2009
26.01.11
✎
13:31
|
(22) области видимости разные. невзлетит
|
||||||||||||||||
24
Mitriy
26.01.11
✎
13:33
|
(13) ткни носом, где такое написано...
|
||||||||||||||||
25
Fragster
гуру
26.01.11
✎
13:35
|
(19) да
|
||||||||||||||||
26
Ненавижу 1С
гуру
26.01.11
✎
13:37
|
(22)(25) не заметил ПЕРВЫЕ
|
||||||||||||||||
27
Scooter
26.01.11
✎
13:40
|
фиолетово
Мне всё равно |
||||||||||||||||
28
Axel2009
26.01.11
✎
13:42
|
(26) и что, запрос работает? =)
|
||||||||||||||||
29
Rico_1C
26.01.11
✎
13:45
|
Если еще ВЗ запихать во ВТ - то вообще супер-турбо!.. ;))
Классический |
||||||||||||||||
30
Axel2009
26.01.11
✎
13:52
|
допустим курсы на каждый день. 2 валюты, евро и доллары.
1. (классика) за год пусть порядка 5000 заказов равномерно распределенные на каждый день. итого получаем обработку 925тыс строк для подзапроса. 2. (альтернатива) 730 строк в результирующем запросе. обработка 260тыс строк для подготовки ВТ. ну а дальше по индексам дело техники. |
||||||||||||||||
31
Axel2009
26.01.11
✎
13:53
|
для 2. ошибся. обработка порядка 133тыс строк =)
|
||||||||||||||||
32
Ненавижу 1С
гуру
26.01.11
✎
13:54
|
(30) курсы на каждый день, тогда весь этот геморой тупо не нужен ))
|
||||||||||||||||
33
Fragster
гуру
26.01.11
✎
13:55
|
работающий запрос по схеме (18), если кому интересно:
ВЫБРАТЬ КурсыВалютСрезПоследних.Период, КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс ПОМЕСТИТЬ Данные ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Начало, ) КАК КурсыВалютСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(КурсыВалют.Период, ДЕНЬ), КурсыВалют.Валюта, КурсыВалют.Курс ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Период > &Начало И КурсыВалют.Период <= &Конец ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Период ПОМЕСТИТЬ Дни ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &Начало И &Конец ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Дни.Период, Данные.Валюта, Данные.Курс ИЗ Дни КАК Дни ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные ПО (Данные.Период В (ВЫБРАТЬ ПЕРВЫЕ 1 Данные.Период ИЗ Данные ГДЕ Дни.Период >= Данные.Период УПОРЯДОЧИТЬ ПО Данные.Период УБЫВ)) |
||||||||||||||||
34
Axel2009
26.01.11
✎
13:56
|
(32) худший случай для альтернативы взял..
|
||||||||||||||||
35
Megas
26.01.11
✎
13:57
|
ИМХО,
В 2 запросе как минимум на 1 обращение к РС больше Классический |
||||||||||||||||
36
Axel2009
26.01.11
✎
13:59
|
для количества записей что подразумевается - монопенисуально. для записей больше на порядок - здрасьти тормоза. а вопрос был что быстрее
|
||||||||||||||||
37
DarkWater
26.01.11
✎
15:20
|
(35)там на 1 образщение больше, но к срезу последних, а не ко всему РС, это несущественно
|
||||||||||||||||
38
Armando
26.01.11
✎
17:55
|
|||||||||||||||||
39
Axel2009
26.01.11
✎
18:03
|
(38) там к концу топика только нашли оптимальный запрос. только задачи разные. тут получить набор строк, а там одну строку.
|
||||||||||||||||
40
Wingless
26.01.11
✎
18:09
|
2й быстрее.
Соединения с подзапросами - зло, почитайте kb.1c.ru Альтернатива |
||||||||||||||||
41
fisher
26.01.11
✎
18:27
|
Я использовал как первый, так и второй вариант. По ситуации.
Производительность не сравнивал. Второй вариант юзал только если были дополнительные аргументы к использованию временных таблиц. В СКД можно реализовать срез последних на каждую дату с помощью связанных наборов данных. IronDaemon кажись демонстрировал. Выглядит очень элегантно, и что самое странное - быстро работает. |
||||||||||||||||
42
fisher
26.01.11
✎
18:28
|
Ах да :)
Мне всё равно |
||||||||||||||||
43
Кириллка
26.01.11
✎
18:43
|
Вы голосованием(!!) определяете какой из приведенных запросов лучше? Сюр какой-то...
|
||||||||||||||||
44
Fragster
гуру
26.01.11
✎
19:01
|
(41) не, не быстро
|
||||||||||||||||
45
Garkin
26.01.11
✎
19:47
|
Автор в конце скажет правильный ответ?
Альтернатива |
||||||||||||||||
46
Axel2009
27.01.11
✎
09:04
|
попробовал оба запроса с получением всех данных по документу поступление товаров услуг (не только ссылка, и курс), второй вариант отработал, первый вылетает с ошибкой =) наверна стока группировок 1ске плохо становится
|
||||||||||||||||
47
fisher
27.01.11
✎
13:14
|
(44) Ну, относительно. Просто по логике - вообще должен быть тормоз жуткий. А по отзывам было - что время выполнения тяжелых отчетов увеличивалось некритично. "Чистых" замеров и сравнений - вроде не делалось...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |