这是一个奇怪的..
我的数据库中有一个存储过程,如下所示:
SET NOCOUNT ON;
WITH CTE AS(
--FC
SELECT transno, RECHASEON,
convert(varchar(12),orderdate, 101) as orderdate,
convert(varchar(12),duedate, 101) as duedate,
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1c.Comments FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) as MostRecentComment,
'FC' as PortalType,
(SELECT COUNT(*) FROM dbo.qcComments c WHERE m.transno = c.transno) AS NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.Comment_Date), 101) FROM dbo.qcComments c WHERE m.transno = c.transno) as MostRecentReturnDate,
(SELECT TOP 1 c.UserID FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) AS LastUserKickBack
FROM dbo.maindata m (NOLOCK)
inner join bluscreen.dbo.Lender L (NOLOCK) on L.clientid = M.clientid
where m.cid = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
and m.RCD='' -- open assignment
and exists ( -- qc kickback comments exist for the transno
select transno
from dbo.qcComments c
where c.TransNo = m.TransNo)
UNION
--RPI
SELECT m.TransNo,
m.RechaseON,
convert(varchar(12),m.OrderDate, 101),
convert(varchar(12),m.DueDate, 101),
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1 c.message FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS MostRecentComment,
'RPI' as PortalType,
(SELECT COUNT(*) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.datetime), 101) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as MostRecentReturnDate,
(SELECT TOP 1 c.username FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS LastUserKickBack
FROM webdata.dbo.MainData m
INNER JOIN rpi.dbo.Requests r on m.TransNo=r.transno
INNER JOIN bluscreen.dbo.Lender l on l.clientid = m.clientid
INNER JOIN rpi.dbo.msgbrd msg on m.TransNo=msg.transno and msgtype='QC' --This join is used to check where a TransNo has been kicked back
where m.RCD='' --open
AND r.qcpending='ON' --qc kickback
AND m.CID = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
UNION
--LM
select m.TransNo,
m.RechaseON,
convert(varchar(12), m.OrderDate, 101),
convert(varchar(12),m .DueDate, 101),
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1 c.NOTES FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as MostRecentComment,
'LM' as PortalType,
(SELECT COUNT(*) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.DATETIME_ENTRY), 101) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as MostRecentReturnDate,
(SELECT TOP 1 c.USERID FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as LastUserKickback
from webdata.dbo.MainData m
INNER JOIN lossmitigation.dbo.Requests r on m.TransNo=r.TRANSNO
INNER JOIN lossmitigation.dbo.Translog_Call t on m.TransNo=t.TRANSNO and t.CALL_RESULT_CODE='DIS' --This join is used to check where a TransNo has been kicked back
INNER JOIN bluscreen.dbo.Lender l on l.clientid = m.clientid
where r.Status='PENDING' --open assignment
AND m.CID = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
)
SELECT * FROM cte
ORDER BY
CASE
WHEN @SortBy = 'Rechase' THEN RechaseON
END DESC,
CASE
WHEN @SortBy = 'NumKickbacks' THEN NumTimesKickedBack
END DESC,
CASE
WHEN @SortBy = 'TransNo' THEN TransNo
WHEN @SortBy = 'ClientID' THEN ClientName
WHEN @SortBy = 'Subrep' THEN Subrep
WHEN @SortBy = 'LastKickbackUser' THEN LastUserKickBack
END DESC,
CASE
WHEN @SortBy = 'OrderDate' THEN OrderDate
WHEN @SortBy = 'DueDate' THEN DueDate
WHEN @SortBy = 'ReturnDate' THEN MostRecentReturnDate
ELSE TransNo
END ASC
在我的代码中,我使用实体框架调用存储过程,如下所示:
using webDataDBContext = new WebDataEntities() {
var data = webDataDBContext.view_inqc_manifest_cid_II("11R", "REP", "rpfield", "TransNo").ToList()
}
如果我在服务器上运行存储过程,它会在不到一秒的时间内执行。它运行此查询:
EXEC [dbo].[view_inqc_manifest_cid_II] '11R', 'REP', 'rpField', 'TransNo'
然而,.NET中的等价物运行时间超过100秒(我取消查询,因为运行时间太长)。我完全不知道为什么.NET存储过程调用会花费多长时间,它会执行完全相同的查询。
有谁知道为什么会这样?
答案 0 :(得分:0)
表格一定被锁定了吗?
SET NOCOUNT ON;
WITH CTE AS(
--FC
SELECT transno, RECHASEON,
convert(varchar(12),orderdate, 101) as orderdate,
convert(varchar(12),duedate, 101) as duedate,
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1c.Comments FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) as MostRecentComment,
'FC' as PortalType,
(SELECT COUNT(*) FROM dbo.qcComments c WHERE m.transno = c.transno) AS NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.Comment_Date), 101) FROM dbo.qcComments c WHERE m.transno = c.transno) as MostRecentReturnDate,
(SELECT TOP 1 c.UserID FROM dbo.qcComments c WHERE m.transno = c.transno ORDER BY c.Comment_Date DESC) AS LastUserKickBack
FROM dbo.maindata m (NOLOCK)
inner join bluscreen.dbo.Lender L (NOLOCK) on L.clientid = M.clientid
where m.cid = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
and m.RCD='' -- open assignment
and exists ( -- qc kickback comments exist for the transno
select transno
from dbo.qcComments c
where c.TransNo = m.TransNo)
UNION
--RPI
SELECT m.TransNo,
m.RechaseON,
convert(varchar(12),m.OrderDate, 101),
convert(varchar(12),m.DueDate, 101),
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1 c.message FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS MostRecentComment,
'RPI' as PortalType,
(SELECT COUNT(*) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.datetime), 101) FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC') as MostRecentReturnDate,
(SELECT TOP 1 c.username FROM rpi.dbo.msgbrd c WHERE m.transno = c.transno and c.msgtype= 'QC' ORDER BY c.datetime DESC) AS LastUserKickBack
FROM webdata.dbo.MainData m (NOLOCK)
INNER JOIN rpi.dbo.Requests r (NOLOCK) on m.TransNo=r.transno
INNER JOIN bluscreen.dbo.Lender l (NOLOCK) on l.clientid = m.clientid
INNER JOIN rpi.dbo.msgbrd msg (NOLOCK) on m.TransNo=msg.transno and msgtype='QC' --This join is used to check where a TransNo has been kicked back
where m.RCD='' --open
AND r.qcpending='ON' --qc kickback
AND m.CID = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
UNION
--LM
select m.TransNo,
m.RechaseON,
convert(varchar(12), m.OrderDate, 101),
convert(varchar(12),m .DueDate, 101),
m.clientid+'-'+l.name as clientname,
(SELECT TOP 1 c.NOTES FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as MostRecentComment,
'LM' as PortalType,
(SELECT COUNT(*) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as NumTimesKickedBack,
m.SubRep,
m.ClientID,
(SELECT convert(varchar(12),MAX(c.DATETIME_ENTRY), 101) FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS') as MostRecentReturnDate,
(SELECT TOP 1 c.USERID FROM LossMitigation.dbo.Translog_Call c WHERE m.transno = c.transno and c.CALL_RESULT_CODE = 'DIS' ORDER BY c.DATETIME_ENTRY DESC) as LastUserKickback
from webdata.dbo.MainData m (NOLOCK)
INNER JOIN lossmitigation.dbo.Requests r (NOLOCK) on m.TransNo=r.TRANSNO
INNER JOIN lossmitigation.dbo.Translog_Call t (NOLOCK) on m.TransNo=t.TRANSNO and t.CALL_RESULT_CODE='DIS' --This join is used to check where a TransNo has been kicked back
INNER JOIN bluscreen.dbo.Lender l (NOLOCK) on l.clientid = m.clientid
where r.Status='PENDING' --open assignment
AND m.CID = @CID
and ((@userlevel='SUBREP' and m.subrep=@UserName) or (@UserLevel<>'SUBREP'))
)
SELECT * FROM cte
ORDER BY
CASE
WHEN @SortBy = 'Rechase' THEN RechaseON
END DESC,
CASE
WHEN @SortBy = 'NumKickbacks' THEN NumTimesKickedBack
END DESC,
CASE
WHEN @SortBy = 'TransNo' THEN TransNo
WHEN @SortBy = 'ClientID' THEN ClientName
WHEN @SortBy = 'Subrep' THEN Subrep
WHEN @SortBy = 'LastKickbackUser' THEN LastUserKickBack
END DESC,
CASE
WHEN @SortBy = 'OrderDate' THEN OrderDate
WHEN @SortBy = 'DueDate' THEN DueDate
WHEN @SortBy = 'ReturnDate' THEN MostRecentReturnDate
ELSE TransNo
END ASC
我没有对表添加锁定并且它有效,奇怪,因为它在遗留版本的网站中有效...必须与实体框架有关