ASP.NET的SP性能不佳

时间:2011-06-30 02:16:34

标签: asp.net performance sql-server-2008 stored-procedures

我有一个处理排序,过滤和分页的存储过程(使用Row_Number)和一些时髦的技巧:) SP正在运行一个大约140k行的表。

整个过程非常有效,至少前几十页非常快。 但是,如果我尝试导航到更高的页面(例如,前往10k的最后一页),整个过程就会停止并导致SQL超时错误。

如果我在工作室管理器查询窗口中使用相同的参数运行相同的查询,则无论我传入的页码如何,响应都是即时的。

目前它的测试代码只是绑定到ASP:.NET 3.5中的Datagrid

SP看起来像这样:

BEGIN
WITH    Keys 
AS (
SELECT 
     TOP (@PageNumber * @PageSize) ROW_NUMBER() OVER (ORDER BY JobNumber DESC) as rn
    ,P1.jobNumber
    ,P1.CustID
    ,P1.DateIn
    ,P1.DateDue
    ,P1.DateOut
FROM vw_Jobs_List P1 
WHERE 
    (@CustomerID = 0 OR CustID = @CustomerID) AND 
    (JobNumber LIKE '%'+@FilterExpression+'%' 
  OR OrderNumber LIKE '%'+@FilterExpression+'%' 
  OR [Description] LIKE '%'+@FilterExpression+'%' 
  OR Client LIKE '%'+@FilterExpression+'%')    
ORDER BY P1.JobNumber DESC ),SelectedKeys
AS (
SELECT 
     TOP (@PageSize)SK.rn
    ,SK.JobNumber
    ,SK.CustID
    ,SK.DateIn
    ,SK.DateDue
    ,SK.DateOut 
FROM Keys SK 
WHERE SK.rn > ((@PageNumber-1) * @PageSize) 
ORDER BY SK.JobNumber DESC)

SELECT  
    SK.rn
   ,J.JobNumber
   ,J.Description
   ,J.Client
   ,SK.CustID
   ,OrderNumber
   ,CAST(DateAdd(d, -2, CAST(isnull(SK.DateIn,0) AS DateTime)) AS nvarchar) AS DateIn
   ,CAST(DateAdd(d, -2, CAST(isnull(SK.DateDue,0) AS DateTime)) AS nvarchar) AS DateDue 
   ,CAST(DateAdd(d, -2, CAST(isnull(SK.DateOut,0) AS DateTime)) AS nvarchar) AS DateOut
   ,Del_Method
   ,Ticket#
   ,InvoiceEmailed
   ,InvoicePrinted
   ,InvoiceExported
   ,InvoiceComplete
   ,JobStatus   
FROM SelectedKeys SK 
JOIN vw_Jobs_List J ON j.JobNumber=SK.JobNumber 
ORDER BY SK.JobNumber DESC
END

通过

调用它
sp_jobs (PageNumber,PageSize,FilterExpression,OrderBy,CustomerID)

e.g。

sp_Jobs '13702','10','','JobNumberDESC','0'

任何人都可以了解SQL查询窗口和执行数据集的asp.net页面之间性能差异的原因是什么?

2 个答案:

答案 0 :(得分:1)

我遇到过类似的问题,存储过程的执行计划会在一段时间内发挥作用,但随后会因为选项发生变化而获得新计划。因此,它将针对一个案例进行“优化”,然后对另一个选项执行“表扫描”。这是我过去尝试过的:

  1. 重新执行存储过程以计算新的执行计划,然后密切关注它。
  2. 将存储过程分解为每个选项的单独存储过程,以便可以对其进行优化,然后整个存储过程只调用每个“优化”存储过程。
  3. 将记录导入对象,然后在代码中执行所有“时髦技巧”,然后它为您提供“缓存”结果的选项。
  4. 显然,选项#2和#3优于选项#1。老实说,在大多数情况下,选项#3正成为最好的选择。

    我只有另一个选项4.您可以在一个查询中执行“内部选择”,而不是将内部选择的结果放入临时表中,然后加入这些结果。如果可能的话,我仍然会推动选项#3,但我知道有时你只需要继续使用存储过程直到它“正常”。

    祝你好运。

答案 1 :(得分:1)