выбор из вида занимает больше 30 минут - PullRequest
0 голосов
/ 02 марта 2019

Я работаю над тем, чтобы сделать это представление достаточно быстрым, чтобы получить набор результатов за разумное время, которое на данный момент занимает более 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 ]

0 голосов
/ 02 марта 2019

Ваш компьютерный скаляр составляет 59% от стоимости вашего запроса.Я думаю, это следующая строка: row_number () over (разделение по si.work_orders_hash_key, порядок si.inspection_id по si.dss_version desc) rnk Это оценивает 159014000000000 строк!Ударить эту строку (много работы, чтобы вернуть номер строки) и запустить его снова.

0 голосов
/ 02 марта 2019

возможно, это поможет вам оставаться в бизнесе, так как проблема заключалась в 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;
...