|
СКД вопросы по оптимизации | ☑ | ||
---|---|---|---|---|
0
Pirate_
03.05.12
✎
15:46
|
Замечательная статья о курсах на дату цитата из нее:
Для этого создадим набор данных "Документы" - запрос: ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК ЗаказПокупателя, ЗаказПокупателя.Дата КАК Дата, ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента, ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента {ВЫБРАТЬ ЗаказПокупателя.*, Дата, ВалютаДокумента.*, СуммаДокумента} ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя {ГДЕ ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя, ЗаказПокупателя.СуммаДокумента} Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев. http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871726.jpg Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют": ВЫБРАТЬ &Дата КАК Дата, КурсыВалютСрезПоследних.Валюта КАК Валюта, КурсыВалютСрезПоследних.Курс КАК Курс, КурсыВалютСрезПоследних.Кратность КАК Кратность {ВЫБРАТЬ Дата, Валюта.*, Курс, Кратность} ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних {ГДЕ КурсыВалютСрезПоследних.Курс, КурсыВалютСрезПоследних.Кратность} В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц. Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях. http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871728.jpg Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи: 1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата" 2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта" http://defender_aka_linn.users.photofile.ru/photo/defender_aka_linn/150041386/154871729.jpg Вопрос в следующем, как происходит в данном примере выборка из второго запроса? Формирутся отдельный запрос на каждую дату из первого запроса или формируется 1 на все? Если первый вариант, то при большом количестве данных система помрет от милиона запросов и как от этого избавиться при таком жерерультате, если второй вариант то обясните из чего это видно. Заранее спасибо. |
|||
1
Pirate_
08.05.12
✎
23:29
|
UP, может кто-то знает?
|
|||
2
БибиГон
08.05.12
✎
23:33
|
Вроде формируется один запрос, затем идет соединение по полям связи. имхо.
|
|||
3
Лефмихалыч
09.05.12
✎
00:27
|
(0) на каждые сколько-то там строк главного запроса формируется запрос для подчиненной таблицы. Пару лет назад я задавался проблемой вопроса и даже профайлер запустил в припадке любопытства.
А помрет-не помрет - зависит от того, что такое "большое количество данных" и что будет в подчиненном запросе. |
|||
4
Armando
09.05.12
✎
03:00
|
(0) >>Формирутся отдельный запрос на каждую дату из первого запроса
Да. И на сколько сейчас помню, еще и на каждую валюту. Тоже когда-то игрался профайлером/тех. журналом на эту тему. Метод соединения наборов с передачей параметра очень хорошо работает в случае, например, когда надо получить курсы нескольких валют на определенную дату. Тогда во втором запросе надо вместо "Валюта = &Валюта" написать "Валюта В (&Валюта)" и на странице "Связи наборов данных" поставить галочку "Список параметров". Тогда будет только два запроса (один запрос на каждый набор данных). |
|||
5
Armando
09.05.12
✎
03:07
|
+(4) В ситуациях подобных (0) лучше пользоваться временными таблицами, и избегать использования виртуальных таблиц регистров сведений. Иначе это как запрос в цикле получается. Типа плохая манера.
|
|||
6
fisher
09.05.12
✎
08:47
|
Несмотря на неоптимальность такого способа, СКД относительно шустро его отрабатывает. Я, когда пробовал, ожидал гораздо худшего результата. Так что в не слишком тяжелых отчетах можно смело использовать из-за простоты и красивости.
Лобовой способ с основной таблицей регистра и временными таблицами ессно шустрее и правильнее, хотя и гораздо более "развесистый" |
|||
7
Defender aka LINN
09.05.12
✎
09:05
|
(5) А потом подлый пользователь берет, и выводит, сцуко, суммы в влютах, не интересуясь, сколько это в рублях. А мега-запрос все равно за каким-то фигом лопатит данные :)
|
|||
8
Pirate_
16.05.12
✎
12:39
|
Огромное стасибо всем. Особенно (3) и (4), очень помогли.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |