Выбор из вида занимает больше 30 минут
Я работаю над тем, чтобы сделать это представление достаточно быстрым, чтобы получить набор результатов за разумное время, которое на данный момент занимает более 30 минут, идет параллельно и вызывает всевозможные боли с увеличением времени процессора. Я определил проблемный запрос, но не могу найти способ сократить время выполнения, переписав запрос или добавив соответствующий индекс, если это необходимо. У нас уже есть кластеризованный индекс для client_id и некластеризованный индекс для столбца hash_key в обеих таблицах. Кроме того, эти соответствующие таблицы соединений содержат около 238 миллионов записей из work_orders и 287011570 записей из таблицы s_inspections.
select
wo.client_id,
wo.work_orders_hash_key,
wo.work_order_number,
wo.work_order_id,
si.inspection_id,
si.inspection_name,
si.inspection_detail,
si.master_inspection_id,
si.master_inspection_detail,
si.status_id,
si.exception,
si.inspection_order,
si.comment,
si.[procedure_id],
si.[flag_id],
si.[asset_id],
si.[asset_name],
si.[inspection_status],
si.[is_removed],
si.[response],
row_number() over(partition by si.work_orders_hash_key, si.inspection_id order by si.dss_version desc) rnk
from
datavault.dbo.h_work_orders wo with (readuncommitted)
join datavault.dbo.s_inspections si with (readuncommitted) on wo.client_id = si.client_id and wo.work_orders_hash_key = si.work_orders_hash_key
where
wo.client_id in (7700876368663, 8800387996408)
Ниже приведен примерный план выполнения, так как он занимал довольно много времени, поэтому я не мог предоставить фактический план выполнения.
https://www.brentozar.com/pastetheplan/?id=ryLzvNwUN
Любая помощь будет принята с благодарностью.
2 ответа
Ваш компьютерный скаляр составляет 59% от стоимости вашего запроса. Я предполагаю, что это такая строка: row_number() over(разделение по si.work_orders_hash_key, si.inspection_id по si.dss_version desc) rnk Это оценивает 159014000000000 строк! Ударить эту строку (много работы, чтобы вернуть номер строки) и запустить его снова.
Может быть, это будет работать, чтобы держать вас в бизнесе, так как проблема заключалась в row_number(). пытаться:
;with x as (
select
wo.client_id,
wo.work_orders_hash_key,
wo.work_order_number,
wo.work_order_id,
si.inspection_id,
si.inspection_name,
si.inspection_detail,
si.master_inspection_id,
si.master_inspection_detail,
si.status_id,
si.exception,
si.inspection_order,
si.comment,
si.[procedure_id],
si.[flag_id],
si.[asset_id],
si.[asset_name],
si.[inspection_status],
si.[is_removed],
si.[response],
si.dss_version
from
datavault.dbo.h_work_orders wo with (readuncommitted)
join datavault.dbo.s_inspections si with (readuncommitted) on wo.client_id = si.client_id and wo.work_orders_hash_key = si.work_orders_hash_key
where
wo.client_id in (7700876368663, 8800387996408)
)
select
x.client_id,
x.work_orders_hash_key,
x.work_order_number,
x.work_order_id,
x.inspection_id,
x.inspection_name,
x.inspection_detail,
x.master_inspection_id,
x.master_inspection_detail,
x.status_id,
x.exception,
x.inspection_order,
x.comment,
x.[procedure_id],
x.[flag_id],
x.[asset_id],
x.[asset_name],
x.[inspection_status],
x.[is_removed],
x.[response],
row_number() over(partition by x.work_orders_hash_key, x.inspection_id order by x.dss_version desc) rnk
from x;