AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.04.2016, 13:09   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,719 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
На всякий случай.

Если поля DataAreaId указывать в качестве ключа связи, то скорость выполнения запроса резко проседает по сравнению с указанием конкретного значения DataAreaId. Не на порядки, конечно, но в несколько раз.

Поэтому, с точки зрения производительности, выгоднее сделать несколько последовательных запросов меняя значение DataAreaId (если необходимо, объединить потом по UNION ALL), чем один общий запрос в котором указано объединение таблиц в том числе и по DataAreaId

Т.е. запрос вида

X++:
select *
from custTrans
inner join custTable on custTable.AccountNum = custTrans.AccountNum
   and custTrans.DataAreaId = custTable.dataAreaId
как правило, будет выполняться существенно медленнее, чем связка

X++:
select *
from custTrans
inner join custTable on custTable.AccountNum = custTrans.AccountNum
where custTrans.DataAreaId = 'dt1'
    and custTable.dataAreaId = 'dt1'

union all

select *
from custTrans
inner join custTable on custTable.AccountNum = custTrans.AccountNum
where custTrans.DataAreaId = 'dt2'
    and custTable.dataAreaId = 'dt2'

(...)
Бывают исключения, конечно, но обычно выгоднее все-таки указывать конкретное значение DataAreaId для всех таблиц-источников, чем использовать объединение по DataAreaId
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (5).
Старый 21.04.2016, 13:28   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Alexius Посмотреть сообщение
Построить план выполнения для всех трех запросов в одном окне и посмотреть какой из них оптимизатор признает наиболее шустрым.
сейчас занимаюсь тем что запустил все три на многотеррабайтной базе.

а как "посмотреть какой из них оптимизатор признает наиболее шустрым"?

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если поля DataAreaId указывать в качестве ключа связи, то скорость выполнения запроса резко проседает по сравнению с указанием конкретного значения DataAreaId. Не на порядки, конечно, но в несколько раз.
Наверное. Я компании стараюсь в самом низу вставлять. Когда виртуальных компаний нет. С виртуальными компаниями да... проще захардкодить компании по всему запросу.

Если используется with, то SQL нормально поднимает константы.
Старый 21.04.2016, 13:32   #3  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от mazzy Посмотреть сообщение
а как "посмотреть какой из них оптимизатор признает наиболее шустрым"?
Если в одно окно запроса вставить три запроса один за другим и посмотреть план выполнения, то на каждый из них будет указан процент.
За это сообщение автора поблагодарили: mazzy (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Произвольный SQL-запрос listener DAX: База знаний и проекты 26 26.07.2016 09:31
Пользовательские настройки. Выборки формы r2d2 DAX: Функционал 1 13.11.2014 11:37
Автоматический выбор профиля разноски при создании заказа ada DAX: Функционал 15 30.06.2005 14:46
Настройка профиля разноски модуля Основные средства mnu DAX: Функционал 24 23.06.2004 09:45
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:04.