Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса  [new]
VASABI
Member

Откуда:
Сообщений: 63
Помогите пожалуйста оптимизировать запрос=)

Осуществляется выборка из трех таблиц (d_param,d_param_type,v_hist).

SELECT dp.obj_id, vh_1.valuedate, vh_1.value state_engine_su, vh_2.value i_ph_a, vh_3.value i_ph_b, vh_4.value i_ph_c, 
vh_5.value u_line_ab, vh_6.value u_line_bc, vh_7.value u_line_ac, vh_8.value temper_engine, vh_9.value pressure_env, vh_10.value imbamp_su, vh_11.value imbvolt_su, vh_12.value download_su, vh_13.value resistizol, vh_14.value reasonendstop_su, vh_15.value sost_mode 

FROM d_param dp
LEFT JOIN v_hist AS vh_1 ON dp.param_id = vh_1.param_id 
LEFT JOIN d_param_type AS dpt_1 ON dp.param_type_id = dpt_1.param_type_id AND dpt_1.param_type = 'state_engine_su'

LEFT JOIN d_param AS dp_2 ON dp.obj_id = dp_2.obj_id
LEFT JOIN d_param_type AS dpt_2 ON dp_2.param_type_id = dpt_2.param_type_id AND dpt_2.param_type = 'i_ph_a'
LEFT JOIN v_hist AS vh_2 ON dp_2.param_id = vh_2.param_id AND vh_1.valuedate = vh_2.valuedate

LEFT JOIN d_param AS dp_3 ON dp.obj_id = dp_3.obj_id
LEFT JOIN d_param_type AS dpt_3 ON dp_3.param_type_id = dpt_3.param_type_id AND dpt_3.param_type = 'i_ph_b'
LEFT JOIN v_hist AS vh_3 ON dp_3.param_id = vh_3.param_id AND vh_1.valuedate = vh_3.valuedate

LEFT JOIN d_param AS dp_4 ON dp.obj_id = dp_4.obj_id
LEFT JOIN d_param_type AS dpt_4 ON dp_4.param_type_id = dpt_4.param_type_id AND dpt_4.param_type = 'i_ph_c'
LEFT JOIN v_hist AS vh_4 ON dp_4.param_id = vh_4.param_id AND vh_1.valuedate = vh_4.valuedate

LEFT JOIN d_param AS dp_5 ON dp.obj_id = dp_5.obj_id
LEFT JOIN d_param_type AS dpt_5 ON dp_5.param_type_id = dpt_5.param_type_id AND dpt_5.param_type = 'u_line_ab'
LEFT JOIN v_hist AS vh_5 ON dp_5.param_id = vh_5.param_id AND vh_1.valuedate = vh_5.valuedate

LEFT JOIN d_param AS dp_6 ON dp.obj_id = dp_6.obj_id
LEFT JOIN d_param_type AS dpt_6 ON dp_6.param_type_id = dpt_6.param_type_id AND dpt_6.param_type = 'u_line_bc'
LEFT JOIN v_hist AS vh_6 ON dp_6.param_id = vh_6.param_id AND vh_1.valuedate = vh_6.valuedate

LEFT JOIN d_param AS dp_7 ON dp.obj_id = dp_7.obj_id
LEFT JOIN d_param_type AS dpt_7 ON dp_7.param_type_id = dpt_7.param_type_id AND dpt_7.param_type = 'u_line_bc'
LEFT JOIN v_hist AS vh_7 ON dp_7.param_id = vh_7.param_id AND vh_1.valuedate = vh_7.valuedate

LEFT JOIN d_param AS dp_8 ON dp.obj_id = dp_8.obj_id
LEFT JOIN d_param_type AS dpt_8 ON dp_8.param_type_id = dpt_8.param_type_id AND dpt_8.param_type = 'temper_engine'
LEFT JOIN v_hist AS vh_8 ON dp_8.param_id = vh_8.param_id AND vh_1.valuedate = vh_8.valuedate

LEFT JOIN d_param AS dp_9 ON dp.obj_id = dp_9.obj_id
LEFT JOIN d_param_type AS dpt_9 ON dp_9.param_type_id = dpt_9.param_type_id AND dpt_9.param_type = 'imbamp_su'
LEFT JOIN v_hist AS vh_9 ON dp_9.param_id = vh_9.param_id AND vh_1.valuedate = vh_9.valuedate

LEFT JOIN d_param AS dp_10 ON dp.obj_id = dp_10.obj_id
LEFT JOIN d_param_type AS dpt_10 ON dp_10.param_type_id = dpt_10.param_type_id AND dpt_10.param_type = 'pressure_env'
LEFT JOIN v_hist AS vh_10 ON dp_10.param_id = vh_10.param_id AND vh_1.valuedate = vh_10.valuedate

LEFT JOIN d_param AS dp_11 ON dp.obj_id = dp_11.obj_id
LEFT JOIN d_param_type AS dpt_11 ON dp_11.param_type_id = dpt_11.param_type_id AND dpt_11.param_type = 'imbvolt_su'
LEFT JOIN v_hist AS vh_11 ON dp_11.param_id = vh_11.param_id AND vh_1.valuedate = vh_11.valuedate

LEFT JOIN d_param AS dp_12 ON dp.obj_id = dp_12.obj_id
LEFT JOIN d_param_type AS dpt_12 ON dp_12.param_type_id = dpt_12.param_type_id AND dpt_12.param_type = 'download_su'
LEFT JOIN v_hist AS vh_12 ON dp_12.param_id = vh_12.param_id AND vh_1.valuedate = vh_12.valuedate

LEFT JOIN d_param AS dp_13 ON dp.obj_id = dp_13.obj_id
LEFT JOIN d_param_type AS dpt_13 ON dp_13.param_type_id = dpt_13.param_type_id AND dpt_13.param_type = 'resistizol'
LEFT JOIN v_hist AS vh_13 ON dp_13.param_id = vh_13.param_id AND vh_1.valuedate = vh_13.valuedate

LEFT JOIN d_param AS dp_14 ON dp.obj_id = dp_14.obj_id
LEFT JOIN d_param_type AS dpt_14 ON dp_14.param_type_id = dpt_14.param_type_id AND dpt_14.param_type = 'reasonendstop_su'
LEFT JOIN v_hist AS vh_14 ON dp_14.param_id = vh_14.param_id AND vh_1.valuedate = vh_14.valuedate

LEFT JOIN d_param AS dp_15 ON dp.obj_id = dp_15.obj_id
LEFT JOIN d_param_type AS dpt_15 ON dp_15.param_type_id = dpt_15.param_type_id AND dpt_15.param_type = 'sost_mode'
LEFT JOIN v_hist AS vh_15 ON dp_15.param_id = vh_15.param_id AND vh_1.valuedate = vh_15.valuedate

WHERE dp.obj_id in (SELECT su.obj_id 
FROM d_obj kust, d_obj gzu, d_obj skv, d_obj su,d_obj_type dot
WHERE kust.obj_id = 1371 
AND kust.obj_id = gzu.obj_pid
AND gzu.obj_id = skv.obj_pid
AND skv.obj_id = su.obj_pid
AND su.obj_type_id = dot.obj_type_id
AND dot.obj_type = 'su_ecn')
AND vh_1.valuedate > '2012-10-01' AND vh_1.valuedate < '2012-10-03'
AND dpt_1.param_type_id IS NOT NULL
AND dpt_2.param_type_id IS NOT NULL
AND dpt_3.param_type_id IS NOT NULL
AND dpt_4.param_type_id IS NOT NULL
AND dpt_5.param_type_id IS NOT NULL
AND dpt_6.param_type_id IS NOT NULL
AND dpt_7.param_type_id IS NOT NULL
AND dpt_8.param_type_id IS NOT NULL
AND dpt_9.param_type_id IS NOT NULL
AND dpt_10.param_type_id IS NOT NULL
AND dpt_11.param_type_id IS NOT NULL
AND dpt_12.param_type_id IS NOT NULL
AND dpt_13.param_type_id IS NOT NULL
AND dpt_14.param_type_id IS NOT NULL
AND dpt_15.param_type_id IS NOT NULL
AND vh_1.value IS NOT NULL
5 окт 12, 10:59    [13272218]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
VASABI
Помогите пожалуйста оптимизировать запрос
что значит "оптимизировать"?
5 окт 12, 11:30    [13272512]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
VASABI,
Такие запросы лучше никому не показывать.
Вроде можно посмотреть в сторону pivot.
5 окт 12, 11:34    [13272564]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
AnaceH
Member

Откуда:
Сообщений: 109
VASABI,

Зачем тут left join? потом же IS NOT NULL все равно
В подзапросе нет джойнов.
Схема не указана.
Жесть, а не запрос. Еще и структура eav.
5 окт 12, 11:40    [13272625]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Если
dpt_1.param_type_id IS NOT NULL
, то зачем
LEFT JOIN d_param_type AS dpt_1 ON dp.param_type_id = dpt_1.param_type_id AND dpt_1.param_type = 'state_engine_su'
Надо
JOIN d_param_type AS dpt_1 ON dp.param_type_id = dpt_1.param_type_id AND dpt_1.param_type = 'state_engine_su'
То же самое с остальными dpt_X.
5 окт 12, 11:40    [13272630]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
denis2710
VASABI,
Такие запросы лучше никому не показывать.
Вроде можно посмотреть в сторону pivot.

+1 один.

Переписать через одинарный джойн, результат в нужном виде формировать либо при помощи PIVOT, либо банальным CASE + GROUP BY
5 окт 12, 11:47    [13272703]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34703
VASABI,

прежде всего, убери лишние LEFT JOIN-ы. Это те, у которых в WHERE упоминается
AND dpt_1.param_type_id IS NOT NULL
и все в этой подветке JOIN-ов.
5 окт 12, 12:30    [13273154]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
VASABI
Member

Откуда:
Сообщений: 63
Ооок=) Много коментов сейчас будем править=)
5 окт 12, 12:41    [13273258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить