У меня есть сохраненный процесс на SQL Server 2000, который принимает 3 параметра. Когда я вызываю хранимый процесс из DotNet с помощью SqlCommand.ExecuteReader (), это занимает около 28 секунд.
Когда я запускаю тот же запрос в SSMS напрямую, он немедленно возвращается.
Когда я извлекаю запрос из сохраненного процесса и запускаю его напрямую с помощью DotNet, он также немедленно возвращается.
Это результаты сеанса SQL Profiler
SP Inside Dot Net
- Продолжительность: 28030
- Читает: 2663365
- пишет: 0
SP Inside SSMS
- Продолжительность: 450
- Читает: 23535
- пишет: 65
Запрос непосредственно внутри Dot Net
- Продолжительность: 360
- Читает: 24865
- пишет: 57
Мне выделяются следующие вещи:
- Статистика для SSMS и прямой запрос в Dot Net очень похожи
- Dot Net SP выполняет огромное количество операций чтения, но не пишет
- Два других делают очень мало чтения, но несколько записей
Буду признателен за любую помощь.
Вот несколько упрощенная версия SP:
Я сомневаюсь, что это проблема плана запросов, потому что даже если я запускаю его повторно из DotNet, я всегда получаю одинаковые результаты.
Вот версия SP, которая была слегка изменена из-за проблем с IP. Я надеюсь, что это все еще имеет смысл:
SELECT
t1.pkiOrderID,
t1.fkiBasketId,
t1.sOriginBasketCode,
t1.dtDateCreated,
t1.sOrderCode,
t1.fkiUserCde,
t1.fkiOrgCde,
t1.sApprovalPerson,
t1.dtDateApproved,
t1.sRequestNo,
t1.dtRequiredDate,
t1.Requestor,
t1.OnBehalfOf,
t1.OrderDesc,
t1.OrderTypeId,
t1.fkiAgentID,
t1.fkiAgentRegionID,
stat.iStatus,
count(oi.pkiOrderItemId) as OrderItems,
count(wf.fkiOrderId) as WorkflowCount,
t1.Currency_Id,
t1.ExchangeRate,
t1.ref_odr_idn,
t2.sOrderCode as ref_odr_cde,
t1.ref_rfq_nbr,
t1.ref_rfs_nbr,
t1.ref_doc_nbr,
t1.ref_rsn,
t1.ref_forip_cde,
t1.ref_fa_nbr,
t1.odr_sub_typ
FROM tbl1 t1 INNER JOIN
tbl1Status stat ON
t1.pkiOrderID = stat.fkiOrderID AND
stat.dtDateStatusChanged = (SELECT MAX(stat2.dtDateStatusChanged)
FROM tbl1Status stat2
WHERE stat2.fkiOrderId = t1.pkiOrderID) LEFT OUTER JOIN
tbl1Item oi ON
t1.pkiOrderID = oi.fkiOrderId LEFT OUTER JOIN
tbl1Workflows wf ON
t1.pkiOrderID = wf.fkiOrderId LEFT OUTER JOIN
tbl1 t2 ON
t1.ref_odr_idn = t2.pkiOrderID
WHERE (t1.fkiUserCde = 'x'
or t1.fkiUserCde in (select fkiUserCde from tbl1 where fkiOrgCde in
(select sys_org_cde from tbl3 t3 where t3.sys_lnk_org_cde = '123')))
AND ((t1.fkiOrgCde = '123'
and ('123' not in (select sys_org_cde from tbl3 t3)
or (t1.OrderTypeID < 1 or stat.iStatus IN (2,3,4,5,6,7))))
OR (t1.fkiOrgCde in (select sys_org_cde from tbl3 t3 where t3.sys_lnk_org_cde = '123')
and t1.OrderTypeID = 1
and stat.iStatus NOT IN (2,3,4,5,6,7)))
AND t1.OrderTypeID = 2
GROUP BY
t1.pkiOrderID,
t1.fkiBasketId,
t1.sOriginBasketCode,
t1.dtDateCreated,
t1.sOrderCode,
t1.fkiUserCde,
t1.fkiOrgCde,
t1.sApprovalPerson,
t1.dtDateApproved,
t1.sRequestNo,
t1.dtRequiredDate,
t1.Requestor,
t1.OnBehalfOf,
t1.OrderDesc,
t1.OrderTypeId,
t1.fkiAgentID,
t1.fkiAgentRegionID,
stat.iStatus,
t1.Currency_Id,
t1.ExchangeRate,
t1.ref_odr_idn,
t2.sOrderCode,
t1.ref_rfq_nbr,
t1.ref_rfs_nbr,
t1.ref_doc_nbr,
t1.ref_rsn,
t1.ref_forip_cde,
t1.ref_fa_nbr,
t1.odr_sub_typ
ORDER BY t1.dtDateCreated DESC
Извините за форматирование. Я изо всех сил пытался сделать его читаемым на форуме.