Имя: Пароль:
1C
 
Оптимизация запроса. Недоумеваю.
0 Михаил Козлов
 
26.08.10
14:55
В задании потенциального работодателя:
Оптимизируйте, пожалуйста, нижеприведенный запрос:
ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ГДЕ КурсыВалютСрезПоследних.Валюта В(&Валюты)

Ответил:
ВЫБРАТЬ Валюта, Курс ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В (&Валюты))

Получил минус. Может кто подскажет, как такой запрос оптимизировать?
1 v8Newbie
 
26.08.10
14:56
(0) ...СрезПоследних параметров не принимает?
2 AndrewKiev
 
26.08.10
14:57
(1) с чего так?
3 butterbean
 
26.08.10
14:57
(0) не нужен тебе такой работодатель....
4 Копер
 
26.08.10
14:58
(1) да вы шо!, а было удобно
5 Vitello
 
26.08.10
14:58
(3)+100, тока хотел написать))))
6 selenat
 
26.08.10
14:59
(3) +1
7 AndrewKiev
 
26.08.10
14:59
(3), (5) но интересно узнать, что у них за ответ...
8 Копер
 
26.08.10
15:00
(7) в цикле
9 Михаил Козлов
 
26.08.10
15:00
(7) Именно.
10 palpetrovich
 
26.08.10
15:01
(0) не пережиывай, ты просто работодателю не понравился ;)
11 Armando
 
26.08.10
15:01
(0) Я бы еще "&Период" запихал
12 чувак
 
26.08.10
15:02
Условие должно быть в параметрах виртуальной таблицы

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних (,КурсыВалютСрезПоследних.Валюта В(&Валюты)) КАК КурсыВалютСрезПоследних
13 v8Newbie
 
26.08.10
15:02
(2) дык и мне интересно стало...
14 AndrewKiev
 
26.08.10
15:02
(8), (9) согласен, но нам так не показали.
15 Я не курил
 
26.08.10
15:02
Период определенно нужен там
16 palpetrovich
 
26.08.10
15:02
+(10) упс, кажись я был нетактичен, прошу прощения
17 selenat
 
26.08.10
15:02
(11) это уже меняет смысл запроса.
18 Armando
 
26.08.10
15:02
Не всегда можно оптимизировать запрос не зная задачу
19 Vitello
 
26.08.10
15:03
(15)Его не было, и вот он вдруг стал нужен?
20 Armando
 
26.08.10
15:04
(0) Формально запрос оптимизирован, это факт
21 AndrewKiev
 
26.08.10
15:04
(12) какая разница - в этом случае все равно
22 Михаил Козлов
 
26.08.10
15:04
(11) В исходном тексте даты среза нет.
23 selenat
 
26.08.10
15:04
(18) если речь идет об оптимальности без изменения смысла запроса, то кнотекст не важен...
24 smitru
 
26.08.10
15:04
(0) Вообще-то СрезПоследних всегда должен иметь параметр Период (дату среза)


ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&Период, Курс В (&Валюта)) КАК КурсыВалютСрезПоследних
25 Александр_
Тверь
 
26.08.10
15:05
А я бы вообще отказался выполнять такое задание т.к. ОПТИМИЗАЦИЯ, если она делается именно для получения результата, а не для понтов, выполняется В КОНКРЕТНЫХ СИТУАЦИЯХ.
Запрос, прежде чем выполниться в субд проходит через
сервер предприятия, где переводится в SQL, а уж после в самом SQL (если речь конечно идет о клиент-серверном режиме работы)оптимизируется.
В конечном  итоге различные варианты запроса написанного на языке 1С могут транслироваться в один и тот же запрос SQL и на оборот!

так что в топку такие задачи
26 palpetrovich
 
26.08.10
15:06
(24) ваще-т непонятно что такое "Курс" в Курс В (&Валюта)
27 чувак
 
26.08.10
15:06
(25) А если база файловая?
28 EasyRider
 
26.08.10
15:06
(25)Ну условие-то в параметры перенести - это святое
29 Александр_
Тверь
 
26.08.10
15:06
(24) кому это он должен? Просто если не поставить параметр период, то будет использовать что-то вроде 3999 года.
30 smitru
 
26.08.10
15:06
(25) нормальная проверка на вшивость :-)

Тут смысл убрать из Где во внутрь виртуальной таблицы и учесть, что СрезПоследних должен иметь период
31 Я не курил
 
26.08.10
15:06
Может у них так:

ВЫБРАТЬ
       КурсыВалютСрезПоследних.Курс
    ИЗ
       Справочник.Валюты КАК Валюты
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
           ПО КурсыВалютСрезПоследних.Валюта = Валюты.Ссылка
    ГДЕ
       Валюты.Ссылка В(&Валюты)
32 selenat
 
26.08.10
15:06
(24) не гони...
33 Михаил Козлов
 
26.08.10
15:07
(24) Период необязателен. Без даты - актуальный.
34 Александр_
Тверь
 
26.08.10
15:08
(27) а если файловая, то посоветовать переходить на серверную версию и не ипать мозг.
Преимущество ЛЮБОГО из вариантов со 100% уверенностью можно получить только взяв и измерив в каждом конкретном случае время выполнения.
35 selenat
 
26.08.10
15:10
(34) т.е. я правильно понимаю, что ты это делаешь при каждом написании запроса?
36 Дикообразко
 
26.08.10
15:11
(0) а кто минусы ставил? случайно не тупая кадровичка?
37 Михаил Козлов
 
26.08.10
15:12
(25) Так можно было отказаться почти от половины задач.
38 Александр_
Тверь
 
26.08.10
15:12
(35)
это - это что?
если под "это" подразумевается измерение скорости получения результата запроса. То да, делаю. Более того, я сначала пишу запрос и смотрю как он будет работать. А после, в случае необходимости, оптимизирую его.
39 selenat
 
26.08.10
15:14
(38) стесняюсь спросить, а как ты определяешь необходимость его оптимизации? У тебя где-то есть табличка с записанным оптимальным временем?
40 Дикообразко
 
26.08.10
15:16
(39) кости кидает
41 Александр_
Тверь
 
26.08.10
15:17
(39) не стесняйся, я готов поделиться с тобой опытом.
Оптимальным является время, при котором суммарное время на выполнению операции не создает неудобств пользователю.
42 EasyRider
 
26.08.10
15:18
(41)Так может пользователю и в (31) нормально?Так и оставлять чтоли?
43 selenat
 
26.08.10
15:18
(42) +1
44 selenat
 
26.08.10
15:19
+43 да и исходный вариант в (0) наверняка не создаст неудобств пользователю.
45 Александр_
Тверь
 
26.08.10
15:21
еще раз повторюсь - ОПТИМИЗАЦИЯ ради ОПТИМИЗАЦИИ - это веселое и абсолютно бессмысленное занятие.
Оптимизация требуется тогда и только тогда, когда какое-то действие или процесс затрудняет работу пользователя.
46 Александр_
Тверь
 
26.08.10
15:21
+(45) конечно при условии, что программист грамотный и не делает явных ляпов.
47 selenat
 
26.08.10
15:23
(45) т.е. в момент написания кода ты абсолютно не заботишься о том, чтобы он был по возможности оптимален. А вопросом этим задаешься только если написанное работает слишком долго. Правильно я понял?
48 Александр_
Тверь
 
26.08.10
15:24
Один и тот же запрос, при разных данных в БД, разном количестве пользователей, при разной текущей нагрузке на БД, разном состоянии актуальности статистики на сервере и т.д. (еще куча параметров)
может работать ПО РАЗНОМУ. В одном случае он будет быстрее, в другом медленнее в третьем они будут равны.
Не существует идеального варианта. Нет его.
49 Михаил Козлов
 
26.08.10
15:26
(48) Что не отменяет общих рекомендаций. В частности, желательности переноса параметров в виртуальную таблицу.
50 selenat
 
26.08.10
15:26
(46) вопрос в (0) преследует своей целью показать, насколько программист способен видеть эти явные ляпы. Но что ты ответишь на такой вопрос? Ты ответишь (34). И заставишь человека купить скуль, даже если он по его потребностям нафиг не нужен. Ну просто, чтоб ты мог упражняться в оптимизации запросов там, где посчитаешь это нужным...
51 Александр_
Тверь
 
26.08.10
15:28
(47) я профессионал имеющий хороший опыт.
Когда я пишу я во главу угла ставлю простоту, четкость, логичность кода.
Если (на первом этапе разработке) результат можно достичь простым (с точки зрения кода) решением но более медленным (возможно) или методом сложным, но возможно более быстрым. Я выберу первый вариант.
Оптимизация ТОЛЬКО после.
52 selenat
 
26.08.10
15:28
(48) тогда как ты вообще можешь добиться хоть какой-нибудь оптимальности? Ведь и количество пользователей, и нагрузка на БД, и многие другие параметры постоянно меняются даже для одной и той же БД. Ты будешь переписывать запрос каждый день для его оптимизации?
53 Александр_
Тверь
 
26.08.10
15:30
(50) нет. Я отвечу, что вопрос поставлен не корректно. И к оптимизации никакого отношения эта задача не имеет. Код с параметром виртуальной таблицы или без него, с высокой степенью вероятности, на SQL сервере преобразуется в один и тот же исполняемый код.
54 Дикообразко
 
26.08.10
15:31
(53) чушь... и необразованность
55 sash-ml
 
26.08.10
15:31
(53) исполняемый код будет разный
56 Дикообразко
 
26.08.10
15:31
+ неграмотность, но собственно другого от 1Снека ждать и не приходиться
57 Александр_
Тверь
 
26.08.10
15:32
(55) а ты профайлер пользовал? Я пользовал, и получаел ОЧЕНЬ удивительные результаты.
58 Михаил Козлов
 
26.08.10
15:32
А вот задание, решение которого мне было бы очень интересно. Может кто подскажет.
9. В регистре сведений СвязанныеДокументы два индексированных реквизита – Документ1 и Документ2. Нижеприведенный запрос выдает верные результаты. Попробуйте найти возможность оптимизировать его по скорости
ВЫБРАТЬ
   Регистр.Документ1,
   Регистр.Документ2
ИЗ  РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ (Регистр.Документ1 В (&СписокДокументов)
ИЛИ Регистр.Документ2 В (&СписокДокументов))

Я ответил:
Если честно, мне бы и в голову не пришло, что этот запрос можно оптимизировать.
Наверное потому, что не слишком четко понимаю, как влияет индексированность полей на скорость выполнения запроса. Да и анализом запросов в профайлере MS SQL не занимался.
Но раз вопрос задан, попробую предположить, что объединение будет быстрее:

ВЫБРАТЬ    
   Документ1 КАК Документ1,
   Документ2 КАК Документ2
ИЗ РегистрСведений. СвязанныеДокументы
ГДЕ Документ1 В (&СписокДокументов)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
   Документ1,
   Документ2
ИЗ РегистрСведений. СвязанныеДокументы
ГДЕ Документ2 В (&СписокДокументов)
59 Дикообразко
 
26.08.10
15:34
(58) объединение будет быстрее
60 Дикообразко
 
26.08.10
15:34
только ОБЪЕДИНИТЬ ВСЕ
нужно было юзать, а на ОБЪЕДИНИТЬ
61 Михаил Козлов
 
26.08.10
15:35
(59) Минус получил.
62 Александр_
Тверь
 
26.08.10
15:35
(56)
OFF: Зачем нужны секции? -верх грамотности.

Ты вообще похож на троля. В курсе что это форум по 1С?
63 supremum
 
26.08.10
15:36
(58) Где-то уже я это видел )
64 Михаил Козлов
 
26.08.10
15:36
(60) При ОБЪЕДИНИТЬ ВСЕ будут дубликаты.
65 sash-ml
 
26.08.10
15:36
(57)
ВЫБРАТЬ

   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В(&Валюты)) КАК КурсыВалютСрезПоследних


exec sp_executesql N'SELECT
#V8TblAli1_Q_000_T_001._Fld8781RRef AS f_2,
#V8TblAli1_Q_000_T_001._Fld8782 AS f_3
FROM
(
SELECT
_InfoReg8780_IR2._Fld8781RRef AS _Fld8781RRef,
_InfoReg8780_IR2._Fld8782 AS _Fld8782
FROM
(
SELECT
_InfoReg8780._Fld8781RRef AS _Fld8781RRef,
MAX(_InfoReg8780._Period) AS _MAXPERIOD
FROM
_InfoReg8780 WITH(NOLOCK)
WHERE
_InfoReg8780._Fld8781RRef IN (@P1)
GROUP BY
_InfoReg8780._Fld8781RRef
) #V8TblAli1_IR1
INNER JOIN _InfoReg8780 _InfoReg8780_IR2 WITH(NOLOCK)
ON #V8TblAli1_IR1._Fld8781RRef = _InfoReg8780_IR2._Fld8781RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoReg8780_IR2._Period
) #V8TblAli1_Q_000_T_001',N'@P1 varbinary(16)',0x9FA500000000000011DD7A4D7248BB1C




ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(,) КАК КурсыВалютСрезПоследних
ГДЕ КурсыВалютСрезПоследних.Валюта В(&Валюты)

exec sp_executesql N'SELECT
#V8TblAli1_Q_000_T_001._Fld8781RRef AS f_2,
#V8TblAli1_Q_000_T_001._Fld8782 AS f_3
FROM
(
SELECT
_InfoReg8780_IR2._Fld8781RRef AS _Fld8781RRef,
_InfoReg8780_IR2._Fld8782 AS _Fld8782
FROM
(
SELECT
_InfoReg8780._Fld8781RRef AS _Fld8781RRef,
MAX(_InfoReg8780._Period) AS _MAXPERIOD
FROM
_InfoReg8780 WITH(NOLOCK)
GROUP BY
_InfoReg8780._Fld8781RRef
) #V8TblAli1_IR1
INNER JOIN _InfoReg8780 _InfoReg8780_IR2 WITH(NOLOCK)
ON #V8TblAli1_IR1._Fld8781RRef = _InfoReg8780_IR2._Fld8781RRef AND #V8TblAli1_IR1._MAXPERIOD = _InfoReg8780_IR2._Period
) #V8TblAli1_Q_000_T_001
WHERE
#V8TblAli1_Q_000_T_001._Fld8781RRef IN (@P1)',N'@P1 varbinary(16)',0x9FA500000000000011DD7A4D7248BB1C
66 Александр_
Тверь
 
26.08.10
15:36
(63) да ты его не слушай. Посмотри какие он темы создает. Судя по всему, он вообще 1С не занимается, а только флудит.
67 supremum
 
26.08.10
15:37
(66) На дубовом тема была с таким вот в точности вопросом.
68 supremum
 
26.08.10
15:38
+(67) правда там не Михаил Козлов был.
69 Александр_
Тверь
 
26.08.10
15:39
(65) молодец. И что?
У Тебя у оптимизатор  еще не имеет статистики по выполнению запроса.
В зависимости от кучи параметров (о которых я писал выше) эти запросы могут меняться. Вплоть до скатывания к прямому перебору.
70 supremum
 
26.08.10
15:41
71 fisher
 
26.08.10
15:42
(0) Я бы ответил также. Если минус заслуженный, то в конторе какие-то мегаоптимизаторы сидят.
(53) В случае конкретно этой виртуальной таблицы точно не знаю. В более сложных виртуальных таблицах (остатков и оборотов, например) используются временные таблицы. Там разница в производительности может составлять порядки. А даже если в этом конкретном случае разницы и не будет, то никто не даст гарантии что в следующем релизе это будет также. Есть чёткие рекомендации от 1С по поводу использования параметров временных таблиц.
(58) Объединение точно не быстрее. Но как этот запрос оптимизировать, ума не приложу. Контора какая-то слишком прохаванная :)
72 Дикообразко
 
26.08.10
15:43
(62) мне уже давным давно нечего спрашивать по 1С
73 Дикообразко
 
26.08.10
15:46
(69) дятел, учи внутреннюю структуру регистров, может тогда дойдет...
хотя вряд ли
74 НЕА123
 
26.08.10
15:47
(0)
может из-за того, что "кратность" не выбирается? но это, вроде, не относится к оптимизации...
75 Дикообразко
 
26.08.10
15:47
(63) а ОБЪЕДИНИТЬ будет не быстрее ...
76 Дикообразко
 
26.08.10
15:50
(63) кто принимал тест?
77 НЕА123
 
26.08.10
15:52
(58)
ВЫБРАТЬ
   Регистр.Документ1,
   Регистр.Документ2
ИЗ  РегистрСведений.СвязанныеДокументы КАК Регистр
ГДЕ

Выбор когда (Регистр.Документ1 В (&СписокДокументов) Тогда Истина
Иначе Регистр.Документ2 В (&СписокДокументов))
Конец

в файловой версии быстрее работало в 8.1
78 supremum
 
26.08.10
15:53
(76) см (70)
79 fisher
 
26.08.10
15:54
Похоже на каких-то псевдооптимизаторов. Потому что результаты более тонкой оптимизации сильно зависят от конкретных наборов данных и движка вообще. ИМХО. Получили в своем конкретном случае более быстрый результат на каких-то хитровжаренных запросах, а потом выяснится что они статистику не апдейтили или на файловой прогоняли...
80 Михаил Козлов
 
26.08.10
15:55
(77) Интересно.
81 Дикообразко
 
26.08.10
15:56
(78) через левое соединение, значит в правильную сторону думал
82 fisher
 
26.08.10
15:55
(79) + Т.е. оптимизация в итоге вполне конкретная, но для общего случая а тем более для тестовых заданий вряд ли катит.
83 Александр_
Тверь
 
26.08.10
15:55
(73) вроде как получается, что дятел ты сам.
Первое: я ни где не говорил, что не надо использовать параметры виртуальных таблиц (т.к. таблица виртуальная, то она создается при обращении к ней, и чем больше условий будет задано на данном этапе, тем выше шанс, что запрос будет работать быстрее).
Второе: есть рекомендации 1С, и им надо следовать - это не только хороший тон, но а так же хороший задел на будущее т.к. версии программ меняются, меняются внутренние механизмы.
Третье: вопрос в (0) в отрыве от контекста (конкретной задачи по ОПТИМИЗАЦИИ) не имеет смысла. Запрос в (0), скорее, относится к знанию рекомендаций 1С, а так же пониманию процессов происходящий на уровне платформы. На что я бы и предложил указать при решении задачи.
84 Дикообразко
 
26.08.10
15:57
(78) через левое соединение, значит в правильную сторону думал
(80) через левое надо было...
ОБЪЕДИНИТЬ слишком долго будет обрабаываться

(83) ты дятел... просто запомни это

[т.к. таблица виртуальная, то она создается при обращении к ней,]

надо будет при встречи 1Сам рассказать пусть поржут
85 Дикообразко
 
26.08.10
16:00
(82) в (70) есть правильный ответ
86 H A D G E H O G s
 
26.08.10
16:01
(83) Масло масленное.
Товарисчу уже все показали на примере (65) - будь там хоть FullScan, но предварительный фильтр вложенного запроса с последующих соединением отработает быстрее, чем соединение с полной таблице и последующий фильтр.
87 fisher
 
26.08.10
16:02
(85) Вижу два предложения по оптимизации. Оба умозрительные, тесты не проводились.
88 Дикообразко
 
26.08.10
16:02
(86) это бесполезно ... до него не дойдет...
у него могучая платформа сам колдуют и знает чего он хочет получить

(87) у Ненавижу1С правильное ;)
89 H A D G E H O G s
 
26.08.10
16:06
(84) <<
[т.к. таблица виртуальная, то она создается при обращении к ней,]

надо будет при встречи 1Сам рассказать пусть поржут
>>

Ничего смешного.

Она, скажем так, не создается, это - фикция. Это фактически результат запроса.

Ты только не путай это понятие с таблицами остатков/оборотов, которые реальны.
90 fisher
 
26.08.10
16:06
(88) "у Ненавижу1С правильное ;)"
Загнать список во временную таблицу и соединением через тоже самое ИЛИ?
Вот не уверен, что в общем случае будет быстрее. Верю, что в каком-то конкретном случае может быть быстрее.
91 Михаил Козлов
 
26.08.10
16:07
(89) А запрос не к реальной таблице остатков?
92 Александр_
Тверь
 
26.08.10
16:08
(86) Понимаешь, суть того, что я говорил выше сводится к тому, что:
Запрос, написанный на языке 1С, проходит несколько стадий оптимизации. Нельзя сказать, что один и тот же запрос будет всегда выполняться одним и тем же способом непосредственно на sql сервере. Способ выполнения запроса будет зависеть от многих параметров. Выяснить со 100% вероятностью какой запрос будет работать реально быстрее (а не умозрительно) можно только проведя тесты.
На результаты тестов будет влиять конкретные данные. В отрыве от этих данных, сказать что будет быстрее можно только умозрительно без привязки к реальности.
(89) судя по всему (84) путает виртуальные таблицы остатков (которые рассчитываются и хранятся в базе и другие виртуальные таблицы)
93 Дикообразко
 
26.08.10
16:09
(89) я имел ввиду все регистры...
понятно дело, что в случае периодического регистра сведений , там просто идет вложенный запрос...
но и результат для РС будет разные в зависимости от того куда условие давать
94 Дикообразко
 
26.08.10
16:10
(90) условие ИЛИ дает Full Scan
95 Новиков
 
26.08.10
16:10
(90) =)
>>Вот не уверен, что в общем случае будет быстрее.
Во первых помещение в темп - это время. Второе - в join
96 fisher
 
26.08.10
16:12
(94) В любом случае без исключений? Буду знать, если так.
Только ведь у Ненавижу1С тоже ИЛИ. Только в джойне.
Оптимизатор конечно в джойнах обычно более уверенно индексы использует, но разница далеко не всегда есть. Были примеры, когда через ГДЕ быстрее отрабатывало.
97 Александр_
Тверь
 
26.08.10
16:13
ппц пошли споры теоретиков. Хотя знать теорию - это хорошо и нужно, но терроризировать нужно до определенного предела.
98 Новиков
 
26.08.10
16:13
второе: в джойне надо будет указывать индексированные поля темпа. Индексация полей темпа - сожрет дохринища времени (относительно всего выполнения конечно). И в итоге получится, что все это будет работать на охриненной выборке. В итоге - пустая трата времени.

Кстати, Евгений Гилев, очень подробно эту тему объяснял.
99 Новиков
 
26.08.10
16:14
так я и не понял, чем дело в (0) кончилось то?

"Высер" то какой-то есть хоть у этой псевдо-оптимизации?
100 fisher
 
26.08.10
16:15
(98) Так и я к тому же, что не вижу явной оптимизации. А что за статья, кстати?
101 Новиков
 
26.08.10
16:16
(100) еще раз - ЕВГЕНИЙ Гилев :) Ты путаешь с Гилевым db2 =)
А Евгений рассматривал эту тему в мастер группе. Кстати очень интересно все рассказал и показал. И итог такой: нефих не зная броду, индексировать поля в темпе, т.к. такая оптимизация, сродни (0)
102 Александр_
Тверь
 
26.08.10
16:16
(100)
http://www.gilev.ru/1c/81/index/optimquery.htm
http://www.gilev.ru/1c/81/index/
это наверное он имеет в виду.
103 Новиков
 
26.08.10
16:17
(102) извиняюсь, но это - не тот Гилев. Наш Гилев - это который с Фаритом Насиповым курс по программированью сделал.

Гилевых два получилось. И оба одаренные люди.
104 Александр_
Тверь
 
26.08.10
16:18
(103) :)
ну то что я привел тоже интересно.
105 fisher
 
26.08.10
16:39
Короче, так нифига и непонятно с этими заданиями и тем паче с ответами. И еще больше непонятно с вакансией. Либо биллинги на 1С рисовать с заточкой на конкретный движок, либо составитель просто самодовольный Чудак, думающий что постиг дао и жаждущий самоутверждения.
106 BabySG
 
26.08.10
16:55
СрезПоследних вообще не быстрая операция посмотрите в профайлере, во что она превращается.
И быстрее будет ВООБЩЕ НЕ ИСПОЛЬЗОВАТЬ срез последних!
Вот, что КАК надо было подойти к задаче, а не переносить в параметры условия :)
107 Расколбас
 
26.08.10
16:57
Ну, чё, уже 55 поддержавших.
Автор, если ты не врешь, то удачи тебе. Забодай их.
108 Расколбас
 
26.08.10
16:57
Сори..
109 Расколбас
 
26.08.10
16:59
Не в ту тему запостил.
110 Расколбас
 
26.08.10
17:03
Но раз уж зашел к вам, то спрошу (106), а нафиг вообще тогда этот срез последних придумали, как вы думаете? Если он такой страшный и медленный.
111 Demiurg
 
27.08.10
18:29
Рад, что Гилёвых хоть как то стали различать
а то уже утомили "когда нам ваш диск придет"
112 Demiurg
 
27.08.10
18:39
(105) что не понятно, спроси
113 BabySG
 
27.08.10
19:46
(110) Что бы не городить тоже самое в конструкторе.
Рекомендую посмотреть профайлером, во что превращается срез последних.
Вопросы отпадут.
114 Demiurg
 
27.08.10
20:00
(113) на маленьких объемах пофиг
на больших объемах совершенное другие проблемы :)
115 rsv
 
27.08.10
20:21
(0) :) Вообще можно ответить тому кто предлагает чего то оптимизировать подождать полгодика дабы SQL сервер статистику поднабрал для оптимизатора.
116 Immortal
 
27.08.10
20:30
(106)это справедливо только на больших объемах
117 Immortal
 
27.08.10
20:31
а какие там нафиг объемы обычно? мизер
118 Лефмихалыч
 
27.08.10
21:02
адиэснеги - такие адинэснеги...
(0) ты либо не за это задание минус получил, либо тебя для массовки пригласили заведомо не желая тебя брать или/и как-либо оценивать. Расслабься - shit hapends.
119 fisher
 
28.08.10
11:50
(112) Кого спросить? Для начала интересны правильные ответы на озвученные два задания. Очень интересны хитрые варианты оптимизации, справедливые для любого движка. Не говоря уже о том, что первое задание выглядит классической проверкой на использование параметров виртуальных таблиц и другого ответа при такой вводной ожидать просто глупо.
120 selenat
 
28.08.10
11:54
(119) может быть (112) и есть составитель вопросов?
121 fisher
 
28.08.10
11:56
(120) Тогда он сможет дать ответы.
122 selenat
 
28.08.10
11:59
(121) тоже на это надеюсь.
123 NcSteel
 
28.08.10
12:07
Еще можно добавить выборку валют в временную таблицу
124 NcSteel
 
28.08.10
12:07
И вообще трудно оптимизировать запрос оторванный от задачи.
125 NcSteel
 
28.08.10
12:08
(124) + Я бы сказал это явный и д и о т и з м
126 fisher
 
28.08.10
12:29
(113) Кстати. Во что же такое страшное в профайлере превращается срез последних?
Смотрю в (65), криминала не вижу.
127 ReaLg
 
гуру
28.08.10
12:57
(58) Интересно, все вопросы из данного теста будут выложены на форуме? :) Вроде как нехорошо по отношению к составителю это:( Хотя тест, как я понял, довольно таки давно сделан и многие его уже видели. Я когда отвечал, написал, что через объединение быстрее будет, т.к. скорее всего индекс по Документ1 кластерный и выборка очень быстро отработает. Хз, правильно или нет, по задачам оценку мне не давали, но вцелом тест я прошел, так что вероятность достаточно высокая :)
128 fisher
 
28.08.10
13:04
(127) А! Так это какое-то комплексное тестирование было? В части, скажем, навыков тонкой настройки запросов 1С под MSSQL? Тогда это многое объясняет. Под таким углом задания совсем по-другому выглядят.
129 Domovoi
 
28.08.10
13:14
У 1сников есть предубеждение насчет точки, может надо было как-то в переменных или где там описать эту штуку чтоб потом везде без них использовать?
РегистрСведений.КурсыВалют.СрезПоследних
130 fisher
 
28.08.10
13:36
(129) Шедеврально.
131 selenat
 
28.08.10
13:37
(130) а мне лень было комментировать...
132 BabySG
 
28.08.10
16:48
(126) Криминала нет, пока не сложных RLS. А вот тут план запроса может измениться совсем не в лучшую сторону. И получим TABLE SCAN
133 Demiurg
 
28.08.10
18:07
(119) я не являюсь составителем вопросов
классический ответ подразумевает не выбирать сначало всю таблицу, а потом делать по ней отбор, а сразу накладывать отбор в виртуальную таблицу

хотя по моей практике иногда есть смысл делать отбор и там, и там
кроме того, ответ существенно будет различаться по субд

не думаю, что найдется много спецов, которые опишут поведение этого запроса под ораклом или дб2
134 BabySG
 
28.08.10
18:09
(133) Слава, а соображения исходя из MS SQL какие будут? Ведь 100% опыт подобного у тебя был.
135 Demiurg
 
28.08.10
18:25
(134) я бы исходил их конкретных условий
а) пользователей 3 человека, объем базы 2 Gb - да пофиг
б) 20 активных юзерей, 20 Gb - если железо тянет, то тоже не принципиально, если не тянет уже, то в виртуальную таблицу засунул отбор
в) 100 пользователей, 100 Gb база - наверно посмотрел бы сначало ЦУПом и профайлером, нужно ли улучшать
в этом случаи скуль на КОНКРЕТНОЙ железке может себя вести ОТЛИЧНО ОТ СОСЕДСКОГО, и универсального ответа нет, все будет определять ПЛАН ЗАПРОСА
г) 500 пользователей, 200GB база - поменял бы MS SQL Server на DB2 и не парился бы :)
136 BabySG
 
28.08.10
18:58
(135) А если такое используется в RLS? Мельком на партнерском читал, что это не очень хорошо отрабатывает...
137 selenat
 
28.08.10
20:46
(135) >>в этом случаи скуль на КОНКРЕТНОЙ железке может себя вести ОТЛИЧНО ОТ СОСЕДСКОГО, и универсального ответа нет, все будет определять ПЛАН ЗАПРОСА

Чем определяется план запроса? Конкретой железкой или чем-то еще? Другими словами, есть ли уверенность, что план запроса на одной и той же железке не изменится со временем?
138 Armando
 
28.08.10
21:23
>> Чем определяется план запроса?
Статистикой
139 Amiralnar
 
28.08.10
21:34
(0) А ни кто не заметил, что результат запроса изменится? На ИТС подробно описано, что наложение условия на виртуальную таблицу может к изменению результата запроса, если таблица - срез последних.
140 Armando
 
28.08.10
21:38
(139) Валюта это измерение.
Иди еще раз читай
141 Beans
 
29.08.10
12:24
(0)

может быть вопрос касался более базовых знаний

просто не вытащил представление ссылочных данных

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   Представление(КурсыВалютСрезПоследних.Валюта),
   КурсыВалютСрезПоследних.Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
142 PR
 
29.08.10
14:36
Специалисты я смотрю собрались :))
Даже неловко говорить, что в регистре сведений виртуальная таблица _тормозит_, а не ускоряет запрос :))

Для тех, кто на танке, повторяю, _именно_ для регистра сведений.
Да, для регистра накопления, расчета и бухгалтерии  все по-другому.
143 PR
 
29.08.10
14:38
Все же интересно, что имелось ввиду, может сделать несколько объединений с отбором по одной валюте?
144 PR
 
29.08.10
14:43
(11) Это ускорение по-твоему? :))
145 PR
 
29.08.10
14:44
(24) Почему?
146 PR
 
29.08.10
15:01
+(142) А, кстати, сорри, в (106)-то мысль была :)))
147 Шляпентох
 
29.08.10
18:38
(127) В условии задачи сказано, что Документ1 и Документ2 - это реквизиты, то есть никаким кластерным индексом там и не пахнет..

Что касается варианта с ОБЪЕДИНИТЬ (ВСЕ) - он вообще неправильный, поскольку возвращает другой набор данных.
148 Armando
 
30.08.10
09:54
может так?
т.е. отказываемся от использования подзапроса в пользу временной таблицы

ВЫБРАТЬ
   МАКСИМУМ(КурсыВалют.Период) КАК Период,
   КурсыВалют.Валюта КАК Валюта
ПОМЕСТИТЬ ВТ_ПоследниеДатыКурсов
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   КурсыВалют.Валюта В(&Валюты)

СГРУППИРОВАТЬ ПО
   КурсыВалют.Валюта
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   КурсыВалют.Валюта,
   КурсыВалют.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследниеДатыКурсов КАК ВТ_ПоследниеДатыКурсов
       ПО КурсыВалют.Период = ВТ_ПоследниеДатыКурсов.Период
           И КурсыВалют.Валюта = ВТ_ПоследниеДатыКурсов.Валюта
149 fisher
 
30.08.10
19:11
(142)
"Специалисты я смотрю собрались :))
Даже неловко говорить, что в регистре сведений виртуальная таблица _тормозит_, а не ускоряет запрос :))"
Даже неловко спрашивать... Ведь все специалисты давно в курсе... Один я, дурак, остался непросветлённый... Приведите, пожалуйста, альтернативный запрос к основной таблице регистра сведений, который не будет _тормозить_ так, как родная виртуальная таблица среза последних для тестового примера из (0).
150 PR
 
31.08.10
00:48
(149) Честно скажу, не знаю :))
Может так?

ВЫБРАТЬ
   КурсыВалют.Валюта КАК Валюта,
   МАКСИМУМ(КурсыВалют.Период) КАК Период
ПОМЕСТИТЬ ПериодыВалют
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   КурсыВалют.Валюта В(&Валюты)

СГРУППИРОВАТЬ ПО
   КурсыВалют.Валюта

ИНДЕКСИРОВАТЬ ПО
   Валюта,
   Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   КурсыВалют.Период,
   КурсыВалют.Валюта,
   КурсыВалют.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПериодыВалют КАК ПериодыВалют
       ПО КурсыВалют.Период = ПериодыВалют.Период
           И КурсыВалют.Валюта = ПериодыВалют.Валюта

Я бы вообще конечно же оптимизировать тут ничего не стал, кроме параметра виртуальной таблицы, но ведь задача думаю была дана не для того, чтобы что-то тут ускорить, а наверное для того, чтобы понять, человек рубит фишку или нет.
Если так, то все грамотно, тест показал, что не рубит :))
151 PR
 
31.08.10
00:51
+(150) Хе, сначала написал, а потом прочитал (148) :))
Впрочем, в (148) индексирования нет :))
152 zyto
 
31.08.10
01:36
(148)(150)Жесть :)
Надеюсь вы типовые конфы не пишете, и никогда не будете писать...
Ради ускорения в 1 миллионную секунды текст запроса раздут в несколько раз, читаемость так же снизилась в несколько раз...
153 fisher
 
31.08.10
11:26
(148) А я вовсе не уверен, что этот вариант оптимальней по производительности. Почти уверен в обратном. И уж точно зависит от конкретной ситуации и движка. Тестировать лениво, да и времени нет.
(150) Не вижу логики. Честно признаетесь, что не знаете. Но при этом продолжаете ОДНОЗНАЧНО утверждать, что виртуальная таблица среза последних работает не оптимально.
154 PR
 
31.08.10
12:02
(152) Не ради ускорения, а ради демонстрации понимания принципов работы программы.
В реальности я бы за такое убил бы :))
(153) Я утверждаю не это, а то, что виртуальная таблица регистра сведений работает медленнее реальной таблицы регистра сведений. Все. Точка.
155 selenat
 
31.08.10
12:18
(154).2 Нет, не точка. Если в качестве результата нужно получить то, для чего используется срез последних, то мало утверждать, что запрос к реальной таблице работает быстрее. Нужно показать как это "быстрее" реализовать запросом к реальной таблице...
156 PR
 
31.08.10
12:52
(155) Кому нужно? Мне не нужно :))
Кому нужно или интересно, дерзайте :))
157 Armando
 
31.08.10
13:19
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Валюты", Валюта);

Запрос.Текст =
"ВЫБРАТЬ
|    КурсыВалютСрезПоследних.Валюта,
|    КурсыВалютСрезПоследних.Курс
|ИЗ
|    РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
|ГДЕ
|    КурсыВалютСрезПоследних.Валюта В(&Валюты)";
Запрос.Выполнить();
// 0,006249 сек

Запрос.Текст =
"ВЫБРАТЬ
|    КурсыВалютСрезПоследних.Валюта,
|    КурсыВалютСрезПоследних.Курс
|ИЗ
|    РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В (&Валюты)) КАК КурсыВалютСрезПоследних";
Запрос.Выполнить();
// 0,003674 сек

Запрос.Текст =
"ВЫБРАТЬ
|    МАКСИМУМ(КурсыВалют.Период) КАК Период,
|    КурсыВалют.Валюта КАК Валюта
|ПОМЕСТИТЬ ВТ_ПоследниеДатыКурсов
|ИЗ
|    РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
|    КурсыВалют.Валюта В(&Валюты)
|
|СГРУППИРОВАТЬ ПО
|    КурсыВалют.Валюта
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    КурсыВалют.Валюта,
|    КурсыВалют.Курс
|ИЗ
|    РегистрСведений.КурсыВалют КАК КурсыВалют
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследниеДатыКурсов КАК ВТ_ПоследниеДатыКурсов
|        ПО КурсыВалют.Период = ВТ_ПоследниеДатыКурсов.Период
|            И КурсыВалют.Валюта = ВТ_ПоследниеДатыКурсов.Валюта";
Запрос.Выполнить();
// 0,013053 сек

Запрос.Текст =
"ВЫБРАТЬ
|    КурсыВалют.Валюта КАК Валюта,
|    МАКСИМУМ(КурсыВалют.Период) КАК Период
|ПОМЕСТИТЬ ПериодыВалют
|ИЗ
|    РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
|    КурсыВалют.Валюта В(&Валюты)
|
|СГРУППИРОВАТЬ ПО
|    КурсыВалют.Валюта
|
|ИНДЕКСИРОВАТЬ ПО
|    Валюта,
|    Период
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    КурсыВалют.Период,
|    КурсыВалют.Валюта,
|    КурсыВалют.Курс
|ИЗ
|    РегистрСведений.КурсыВалют КАК КурсыВалют
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПериодыВалют КАК ПериодыВалют
|        ПО КурсыВалют.Период = ПериодыВалют.Период
|            И КурсыВалют.Валюта = ПериодыВалют.Валюта";
Запрос.Выполнить();
// 0,016352 сек


В регистре 919 строк
Платформа: 8.1.15.14
Сервер БД: MS SQL 2000 (SP4)
158 Armando
 
31.08.10
13:26
В данном конкретном случае "СрезПоследних" оказался самым скоростным.
Не понятно чего хотел потенциальный работодатель?
159 luckyluke
 
31.08.10
13:34
(157)
Интересно, а если так

ВЫБРАТЬ ПЕРВЫЕ 1
   КурсыВалют.Валюта,
   КурсыВалют.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   КурсыВалют.Валюта = &Валюта

УПОРЯДОЧИТЬ ПО
   Период УБЫВ

?
160 AndreYAN
 
31.08.10
13:36
(159) это запрос вернет не тоже самое что и в (0) какая тут оптимизация?!
161 AndreYAN
 
31.08.10
13:36
(160) Глюканул.
162 cathode
 
31.08.10
13:45
(0) Вам как, мнение Д. Э. Кнута является авторитетным или нет?

"Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%."

Самый главный кусок вышесказанного по-русски: несвоевременная оптимизация - корень всех зол.

Оптимизировать надо только имея фактические данные о производительности. Во всех остальных случаях это не оптимизация, это мозго.бство.
163 AndreYAN
 
31.08.10
13:45
(159) похоже это самое оптимальный запрос :) Проверял на файловой чуть быстрее 2 запроса в (157)
164 Armando
 
31.08.10
13:47
(159) 0,003264
но это справедливо для одной валюты
165 luckyluke
 
31.08.10
13:50
(162) хорошая цитата, спасибо.
166 PR
 
31.08.10
13:51
(157) 919 строк - это ничто, увеличь хотя бы до 100 000.
(163) LOL :))
167 fisher
 
31.08.10
14:26
(154) "Я утверждаю не это, а то, что виртуальная таблица регистра сведений работает медленнее реальной таблицы регистра сведений. Все. Точка."
Охренеть. А я думал что разговор о неоптимальной работе виртуальной таблицы среза последних, а не о том, что вычисление функции медленнее тупого вывода исходных данных.
(157) Спасибо. Совпадает с моими ожиданиями.
(159),(163) Для одной валюты это быстрее всего будет, спору нет. Но в сабже нужно для списка валют.
168 AndreYAN
 
31.08.10
14:45
(166) смотрел на к-с варианте, записей в таблице курсов 3900
(169) как оказалось в (159) не быстрей :(

Вот что получил:


   Запрос.Текст =
   "ВЫБРАТЬ
   |    КурсыВалютСрезПоследних.Валюта,
   |    КурсыВалютСрезПоследних.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
   |ГДЕ
   |    КурсыВалютСрезПоследних.Валюта В(&Валюты)";
   Запрос.Выполнить();
   // 0,012822
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    КурсыВалютСрезПоследних.Валюта,
   |    КурсыВалютСрезПоследних.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В (&Валюты)) КАК КурсыВалютСрезПоследних";
   Запрос.Выполнить();
   // 0,004443
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    МАКСИМУМ(КурсыВалют.Период) КАК Период,
   |    КурсыВалют.Валюта КАК Валюта
   |ПОМЕСТИТЬ ВТ_ПоследниеДатыКурсов
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В(&Валюты)
   |
   |СГРУППИРОВАТЬ ПО
   |    КурсыВалют.Валюта
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   
   |ВЫБРАТЬ
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследниеДатыКурсов КАК ВТ_ПоследниеДатыКурсов
   |        ПО КурсыВалют.Период = ВТ_ПоследниеДатыКурсов.Период
   |            И КурсыВалют.Валюта = ВТ_ПоследниеДатыКурсов.Валюта";
   Запрос.Выполнить();
   // 0,019310
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    КурсыВалют.Валюта КАК Валюта,
   |    МАКСИМУМ(КурсыВалют.Период) КАК Период
   |ПОМЕСТИТЬ ПериодыВалют
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В(&Валюты)
   |
   |СГРУППИРОВАТЬ ПО
   |    КурсыВалют.Валюта
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    Валюта,
   |    Период
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   
   |ВЫБРАТЬ
   |    КурсыВалют.Период,
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПериодыВалют КАК ПериодыВалют
   |        ПО КурсыВалют.Период = ПериодыВалют.Период
   |            И КурсыВалют.Валюта = ПериодыВалют.Валюта";
   Запрос.Выполнить();
   // 0,014724
   
   
   Запрос.Текст    = "ВЫБРАТЬ ПЕРВЫЕ 1
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В (&Валюты)
   |
   |УПОРЯДОЧИТЬ ПО
   |    КурсыВалют.Период УБЫВ";
   Запрос.Выполнить();
   // 0,006106

Правда (0) напоминает мышиную возню, но все-равно в обед делать нечего :) и для меня еще сегодня пятница :)
169 fisher
 
31.08.10
14:46
(166) Индексированная временная таблица тут даст только при многократном использовании. При однократном использовании для сабжевого примера вряд ли вообще отобьется хоть на каких объемах. План выполнения запроса смотреть лень, но почти уверен, что по вложенному запросу будет выполняться соединение хэшированием, что однозначно быстрее, ИМХО.
170 luckyluke
 
31.08.10
14:47
(168) не, ну для списка валют не будет работать:

   Запрос.Текст    = "ВЫБРАТЬ ПЕРВЫЕ 1
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В (&Валюты)
   |
   |УПОРЯДОЧИТЬ ПО
   |    КурсыВалют.Период УБЫВ";
   Запрос.Выполнить();
171 luckyluke
 
31.08.10
14:48
(168) вот еще вариант:

ВЫБРАТЬ
   КурсыВалют.Валюта,
   КурсыВалют.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   (КурсыВалют.Валюта, КурсыВалют.Период) В
           (ВЫБРАТЬ
               КурсыВалют.Валюта,
               МАКСИМУМ(КурсыВалют.Период) КАК Период
           ИЗ
               РегистрСведений.КурсыВалют КАК КурсыВалют
           ГДЕ
               КурсыВалют.Валюта В (&Валюты)
           СГРУППИРОВАТЬ ПО
                       КурсыВалют.Валюта)
172 fisher
 
31.08.10
14:53
(168) Гм... Разница между 0,004443 и 0,006106 может быть в пределах погрешности. По-идее, не должно медленнее быть. Хотя я в этих делах не настоящий сварщик :) Большого опыта копания в планах выполнения запросов не имею.
173 luckyluke
 
31.08.10
14:59
(172) та не будет же работать запрос для списка валют с "Выбрать ПЕРВЫЕ 1", он же получает только 1 строку, так что через виртуальную таблицу с заданными параметрами самый быстрый вариант по идее.
174 AndreYAN
 
31.08.10
15:00
Вот еще сделал отбор по двум валютам из той же таблицы в 3900 записей:


   "ВЫБРАТЬ
   |    КурсыВалютСрезПоследних.Валюта,
   |    КурсыВалютСрезПоследних.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
   |ГДЕ
   |    КурсыВалютСрезПоследних.Валюта В(&Валюты)";
   Запрос.Выполнить();
   // 0,012822 0,005847
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    КурсыВалютСрезПоследних.Валюта,
   |    КурсыВалютСрезПоследних.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В (&Валюты)) КАК КурсыВалютСрезПоследних";
   Запрос.Выполнить();
   // 0,004443 0,006225
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    МАКСИМУМ(КурсыВалют.Период) КАК Период,
   |    КурсыВалют.Валюта КАК Валюта
   |ПОМЕСТИТЬ ВТ_ПоследниеДатыКурсов
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В(&Валюты)
   |
   |СГРУППИРОВАТЬ ПО
   |    КурсыВалют.Валюта
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   
   |ВЫБРАТЬ
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПоследниеДатыКурсов КАК ВТ_ПоследниеДатыКурсов
   |        ПО КурсыВалют.Период = ВТ_ПоследниеДатыКурсов.Период
   |            И КурсыВалют.Валюта = ВТ_ПоследниеДатыКурсов.Валюта";
   Запрос.Выполнить();
   // 0,019310 0,016802
   
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    КурсыВалют.Валюта КАК Валюта,
   |    МАКСИМУМ(КурсыВалют.Период) КАК Период
   |ПОМЕСТИТЬ ПериодыВалют
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В(&Валюты)
   |
   |СГРУППИРОВАТЬ ПО
   |    КурсыВалют.Валюта
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    Валюта,
   |    Период
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   
   |ВЫБРАТЬ
   |    КурсыВалют.Период,
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПериодыВалют КАК ПериодыВалют
   |        ПО КурсыВалют.Период = ПериодыВалют.Период
   |            И КурсыВалют.Валюта = ПериодыВалют.Валюта";
   Запрос.Выполнить();
   // 0,014724 0,021979
   
   
   Запрос.Текст    = "ВЫБРАТЬ ПЕРВЫЕ 1
   |    КурсыВалют.Валюта,
   |    КурсыВалют.Курс
   |ИЗ
   |    РегистрСведений.КурсыВалют КАК КурсыВалют
   |ГДЕ
   |    КурсыВалют.Валюта В (&Валюты)
   |
   |УПОРЯДОЧИТЬ ПО
   |    КурсыВалют.Период УБЫВ";
   Запрос.Выполнить();
   // 0,006106 0,002842
   
   Запрос.Текст    = "ВЫБРАТЬ
                     |    КурсыВалют.Валюта,
                     |    КурсыВалют.Курс
                     |ИЗ
                     |    РегистрСведений.КурсыВалют КАК КурсыВалют
                     |ГДЕ
                     |    (КурсыВалют.Валюта, КурсыВалют.Период) В
                     |            (ВЫБРАТЬ
                     |                КурсыВалют.Валюта,
                     |                МАКСИМУМ(КурсыВалют.Период) КАК Период
                     |            ИЗ
                     |                РегистрСведений.КурсыВалют КАК КурсыВалют
                     |            ГДЕ
                     |                КурсыВалют.Валюта В (&Валюты)
                     |            СГРУППИРОВАТЬ ПО
                     |                        КурсыВалют.Валюта)";
   Запрос.Выполнить();
   // 0,021986

Обед закончился и мышиной возне пришел капут :)


P.S.: Мне кажется на такие задачи можно отвечать только встречным вопросом, даже в задачах на специалист такого бреда не найдешь!
175 Armando
 
31.08.10
15:02
Ну а что в итоге-то? Почему (0) получил "неуд"?
176 fisher
 
31.08.10
15:04
(173) Я знаю. И если бы ты читал ветку, то знал бы, что я знаю.
(175) В том-то и дело. Все недоумевают.
177 AndreYAN
 
31.08.10
15:04
(175) В итоге работодатель уже в самом начале знал какую оценку дать.
178 luckyluke
 
31.08.10
15:08
(177) а смысл, можно и по другой причине отказать...
К тому же, задача была не единственная.
179 fisher
 
31.08.10
15:12
(178) Кстати да. Если по первой задаче велик шанс ошибки оценки её работодателем, то вторая задачка явно поинтереснее. Но экспериментировать лень :)
В жизни мне бы в голову не пришло оптимизировать этот запрос, если бы явно не упёрся в него как в узкое место. Правильный ответ лично мне очень интересен. Кидайте варианты, а AndreYAN в следующий обед сравнит :)
180 AndreYAN
 
31.08.10
15:28
(179) Ну если только через 2 недели. Это у меня сегодня пятничное настроение.
181 fisher
 
31.08.10
15:29
(180) Не горит :)
182 Armando
 
31.08.10
15:33
В (58) имеются в виду именно "реквизиты" или все-таки "измерения"?