Оптимальный запрос

1. tolyan_ekb 104 30.09.22 16:18 Сейчас в теме
Подскажите, пожалуйста. Цель получить дату документа продажи. Такой запрос оптимальный или есть вариант лучше.
   ВЫБРАТЬ
 ДокументыРеализацииСерийСрезПоследних.ДокументПродажи КАК ДокументПродажи,
   ДокументыРеализацииСерийСрезПоследних.Период КАК ДатаПродажи,
   ДокументыРеализацииСерийСрезПоследних.Номенклатура КАК Номенклатура
   ПОМЕСТИТЬ втДокументыРеализацииСрез
  ИЗ
   РегистрСведений.ДокументыРеализацииСерий.СрезПоследних(, Серия = &Серия) КАК ДокументыРеализацииСерийСрезПоследних  
  ;
   ////////////////////////////////////////////////////////////­////////////////////
  ВЫБРАТЬ
   втДокументыРеализацииСрез.ДокументПродажи КАК ДокументПродажи,
   втДокументыРеализацииСрез.ДатаПродажи КАК ДатаПродажи,
   втДокументыРеализацииСрез.Номенклатура КАК Номенклатура,
   ЕСТЬNULL(втДокументыРеализацииСрез.ДокументПродажи.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаДокументаПродажи
  ИЗ
   втДокументыРеализацииСрез КАК втДокументыРеализацииСрез
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 72 30.09.22 16:41 Сейчас в теме
(1)если ДокументПродажи - составного типа, то ваще не оптимальный.
5. tolyan_ekb 104 30.09.22 16:44 Сейчас в теме
(4)да, составного типа, но все типы документов нужны для получения номера
2. user1831019 30.09.22 16:22 Сейчас в теме
Это очень оптимально! Для того ,чтобы получить Дату из документа - несомненно необходимо использовать несколько временных таблиц!

PS. 13 лет на форуме, 193 звездочки.
PPS. А что - бывают документы без даты?
aka Любитель XML; Fatenm; +2 Ответить
3. tolyan_ekb 104 30.09.22 16:36 Сейчас в теме
(2) про оптимазатор СУБД читал чего-нибудь, когда нибудь? ))
13. user1831019 30.09.22 16:59 Сейчас в теме
(3) Конечно.
1. Ты сначала делаешь некий запрос по таблице регистра, и помещаешь его результат в tempdb
2. Потом ты эту таблицу из tempdb лефтджойном соединяешь с реальной таблицей документов.
И в чем смысл?
15. Sashares 34 30.09.22 17:01 Сейчас в теме
(13)Тем что соединяются не все записи регистра, а только записи таблицы?
20. user1831019 30.09.22 17:17 Сейчас в теме
(15) Он уже отобрал в параметрах виртуальной таблицы НУЖНЫЕ ему записи. То есть соединяются уже явно НЕ ВСЕ. А только записи виртуальной таблицы. (у него же нет дополнительного отбора ГДЕ)
Зачем дополнительно пихать записи виртуальной таблицы во временную - не понимаю.
22. Sashares 34 30.09.22 17:54 Сейчас в теме
(20)По идее вы правы.
Но лучше все же проверить в консоли.
23. user1831019 30.09.22 18:37 Сейчас в теме
(22) Проверьте, я вам не препятствую. Особенно, если вы доверяете консоли.
24. spacecraft 30.09.22 19:56 Сейчас в теме
(20) В данном случае, если сразу выбирать реквизит Дата у виртуальной таблицы, то будут соединения с таблицами составного типа, у которых есть такой тип реквизита.
И да, тесты это подтверждают.
Для теста, создал периодический независимый РС. В измерение добавил Объект тип ЛюбаяСсылка. Вторым измерением тип Строка, для отбора.
Гарантированно добавил только одну запись соответствующую отбору. И несколько записей не соответствующих. отбору.
При выбирании Поле Дата, план выполнения запроса построил соединение со всеми таблицами все возможных документов.
Вот повторяющаяся часть плана для каждого типа документов:
NESTED OUTER LOOP
_Document43 (T6) RANGE SCAN USING INDEX (_IDRREFIDX) (1 fields)
WHERE
        (T1.Fld119_TYPE = 08)
        AND
        (T1.Fld119_RTRef = 0000002B)
        AND
        (T1.Fld119_RRRef = T6._IDRRef)

Причем, даже с теми, записи по которым вообще не делались в РС. Так что ничем не отличается от такой же выборки реквизита регистратора. Только вместо регистратора используется составной тип измерения.
17. tolyan_ekb 104 30.09.22 17:06 Сейчас в теме
(13) 1. Делается запрос по таблице регистра и сразу же делаются левые соединения по количества типов докумнета, не?
21. user1831019 30.09.22 17:51 Сейчас в теме
6. SlavaKron 30.09.22 16:46 Сейчас в теме
(5) Тогда ничего особо не оптимизируешь.
ВЫБРАТЬ
   ДокументыРеализацииСерийСрезПоследних.ДокументПродажи КАК ДокументПродажи,
   ДокументыРеализацииСерийСрезПоследних.Период КАК ДатаПродажи,
   ДокументыРеализацииСерийСрезПоследних.Номенклатура КАК Номенклатура,
   ДокументыРеализацииСерийСрезПоследних.ДокументПродажи.Дата КАК ДатаДокументаПродажи
ИЗ
   РегистрСведений.ДокументыРеализацииСерий.СрезПоследних(, Серия = &Серия) КАК ДокументыРеализацииСерийСрезПоследних
7. tolyan_ekb 104 30.09.22 16:49 Сейчас в теме
(6) А как же рекомендация, не делать соединений с виртуальными таблицами?
8. SlavaKron 30.09.22 16:51 Сейчас в теме
(7) Ну так рекомендация же была нам, программистам, а мы нигде явно не делаем соединения.
9. tolyan_ekb 104 30.09.22 16:53 Сейчас в теме
(8)Тут согласен, тоже сначала рассматривал только вариант в (5), но потом засомневался. Вдруг у кого-то есть опыт и он им поделиться.
10. Sashares 34 30.09.22 16:55 Сейчас в теме
(9)а что мешает проверить?
Выполнить 2 запроса и сравнить время.
11. tolyan_ekb 104 30.09.22 16:58 Сейчас в теме
(10) в профайлере или в консоли запросов?
14. Sashares 34 30.09.22 17:00 Сейчас в теме
(11)Да хотя бы в консоли, есть же консоли, которые показывают время запроса
19. tolyan_ekb 104 30.09.22 17:10 Сейчас в теме
(14) попробую, но есть же кэширование, думаю оно будет влиять на результат
12. tolyan_ekb 104 30.09.22 16:59 Сейчас в теме
Я в копии, может на рабочей будет по-другому. На рабочей не могу выполнить.
16. soft_wind 30.09.22 17:02 Сейчас в теме
(12) Проверьте запросом, как правило Период = Документ.Дата
- может вам Период подойдет?
18. tolyan_ekb 104 30.09.22 17:07 Сейчас в теме
(16)К сожалению, этот вариант не подходит из-за изменившейся логики. А когда-то так и было, да.
26. nomad_irk 72 03.10.22 06:38 Сейчас в теме
(18)в таком случае, вам и в РС необходимо добавить дату, заполняемую из даты документа, чтобы не городить запросы, который вы привели.
25. SlavaKron 01.10.22 20:12 Сейчас в теме
В некоторых случаях, когда в результате запроса количество различных типов документов почти всегда меньше всех возможных, то можно сделать в 2 этапа:
Сначала получить данные без даты, а затем отдельным запросом получить Даты документов, ограничив связь по фактическим типам.
27. triviumfan 93 03.10.22 09:21 Сейчас в теме
Для таких целей обычно используют РС "РеестрДокументов". Проверь, есть ли он в твоей конфе.
Если есть, то он сильно оптимизирует запрос.
28. scientes 289 05.10.22 13:25 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот