我有一个处理排序,过滤和分页的存储过程(使用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页面之间性能差异的原因是什么?
答案 0 :(得分:1)
我遇到过类似的问题,存储过程的执行计划会在一段时间内发挥作用,但随后会因为选项发生变化而获得新计划。因此,它将针对一个案例进行“优化”,然后对另一个选项执行“表扫描”。这是我过去尝试过的:
显然,选项#2和#3优于选项#1。老实说,在大多数情况下,选项#3正成为最好的选择。
我只有另一个选项4.您可以在一个查询中执行“内部选择”,而不是将内部选择的结果放入临时表中,然后加入这些结果。如果可能的话,我仍然会推动选项#3,但我知道有时你只需要继续使用存储过程直到它“正常”。
祝你好运。答案 1 :(得分:1)