我有一个存储过程,它在 SQL Server Management Studio 中在大约 10 秒内生成 2,675 条记录。
但是,当我从 C# 应用程序调用它时,需要 1:05 才能填充DataTable
. 我能做些什么来提高性能吗?
这是我填写的方式DataTable
:
public static DataTable GetDataTable(string procName, params SqlParameter[] procParams)
{
using (_conn = new SqlConnection(_connStr))
{
SqlCommand cmd = _conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procName;
if (procParams != null)
{
foreach (SqlParameter p in procParams)
{
cmd.Parameters.Add(p);
}
}
_conn.Open();
var da = new SqlDataAdapter(cmd);
var table = new DataTable();
da.Fill(table);
return table;
}
}
具体到这一步:
var table = new DataTable();
da.Fill(table);
几乎所有时间都被占用(几乎 60 秒)。
我以前使用这种方法处理过大数据,并且没有遇到这么多的延迟。
有什么建议或想法吗?
更新:
我们也尝试过DataReader
这样的:
var dataReader = cmd.ExecuteReader();
table.Load(dataReader);
dataReader.Close();
更新:
在桌面报表查看器中为同一个报表运行相同的 sp 可以在 12 秒内获得结果。这是在 Web 和桌面上运行的同一份报告。为什么这么慢?
称为 SP:
这是为报告获取数据的 SP 运行。
ALTER PROCEDURE [dbo].[rptCheckRegDetail]
@ldStartDt as char(10) = '',
@ldEndDt as char(10) = '',
@lcStartCkNo as char(10)= ' ',
@lcEndCkNo as char(10) =' ',
@lcUniqSupNo as char(10)=' ',
@lcBk_Uniq as char(10)= ' ',
@lnStatus as int=1
as
begin
declare @ChkHd table (ApChk_uniq char(10),Bank char(35),Bk_acct_no char(15),
iCheckno char(10),Checkno char(10),CheckDate smalldatetime,
SupName char(35),CheckAmt numeric(12,2),Status char(15), Detail char(6),
CheckNote text,ReconcileStatus char(1),ReconciledDate smalldatetime)
Insert into @ChkHd
exec [CheckRegView] @ldStartDt,@ldEndDt,@lcStartCkNo,@lcEndCkNo,@lcUniqSupNo,@lcBk_Uniq,@lnStatus
SELECT c1.ApChk_uniq, c1.Bank, c1.Bk_acct_no, c1.iCheckno, c1.Checkno,
c1.CheckDate, c1.SupName,
case when
ROW_NUMBER() over (partition by c1.apchk_uniq order by c1.checkno) = 1
then CheckAmt else cast(0.00 as numeric(12,2)) end as CheckAmt,
c1.status,c1.checknote,Apchkdet.item_no, Apchkdet.ponum, Apchkdet.invno,
Apchkdet.invdate, Apchkdet.due_date, Apchkdet.item_desc, Apchkdet.invamount,
Apchkdet.disc_tkn, Apchkdet.aprpay,Apchkdet.apchk_uniq, Apchkdet.itemnote,
MICSSYS.LIC_NAME
FROM @ChkHd as C1
inner join apchkdet on apchkdet.APCHK_UNIQ = c1.ApChk_uniq
cross join micssys
ORDER BY Checkno,Apchkdet.item_no
end