SQL Server 2008等效于带WHERE子句的获取偏移量
我有一个程序,我的用户可以用它查找过去7天发生的所有数据流量。我使用一个存储过程来获取数据,用户可以一次翻页查看250条记录。问题是,当用户想要查看数据时,会出现很多超时 这是我尝试优化ist之前的存储过程SQL Server 2008等效于带WHERE子句的获取偏移量,sql,sql-server-2008,stored-procedures,sql-server-2012,Sql,Sql Server 2008,Stored Procedures,Sql Server 2012,我有一个程序,我的用户可以用它查找过去7天发生的所有数据流量。我使用一个存储过程来获取数据,用户可以一次翻页查看250条记录。问题是,当用户想要查看数据时,会出现很多超时 这是我尝试优化ist之前的存储过程 @MaxRecCount INT, @PageOffset INT, @IncludeData BIT SELECT [Client], [Schema], [Version], [Records], [Fetched], [Receipted], [ProvidedAt], [Fetch
@MaxRecCount INT,
@PageOffset INT,
@IncludeData BIT
SELECT [Client], [Schema], [Version], [Records], [Fetched], [Receipted], [ProvidedAt], [FetchedAt], [ReceiptedAt],[PacketIds], [Record] FROM (
SELECT TOP(@MaxRecCount) MAX(bai_ExportPendingArchive.[UserName]) AS Client,
MAX(bai_ExportPendingArchive.Category) AS [Schema],
MAX(bai_ExportPendingArchive.ContractVersion) AS [Version],
COUNT(*) AS [Records],
SUM (CASE WHEN bai_ExportPendingAckArchive.ExportPendingId IS NULL THEN 0 ELSE 1 END) as [Fetched],
SUM (CASE WHEN bai_ExportPendingAckArchive.Receipted IS NULL THEN 0 ELSE 1 END) as [Receipted],
MAX(bai_ExportArchive.Inserted) AS [ProvidedAt],
MAX(CASE WHEN bai_ExportPendingAckArchive.ExportPendingId IS NULL THEN NULL ELSE bai_ExportPendingAckArchive.Inserted END) AS [FetchedAt],
MAX(CASE WHEN bai_ExportPendingAckArchive.Receipted IS NULL THEN NULL ELSE bai_ExportPendingAckArchive.Receipted END) AS [ReceiptedAt],
bai_ExportArchive.PacketIds AS [PacketIds],
NULL AS [Record],
ROW_NUMBER() Over (Order By MAX(bai_ExportArchive.Inserted) desc) as [RowNumber]
FROM bai_ExportArchive
INNER JOIN bai_ExportPendingArchive ON bai_ExportArchive.Id = bai_ExportPendingArchive.ExportId
LEFT OUTER JOIN bai_ExportPendingAckArchive ON bai_ExportPendingAckArchive.ExportPendingId = bai_ExportPendingArchive.Id
GROUP BY bai_ExportPendingArchive.[UserName], bai_ExportArchive.PacketIds, bai_ExportPendingArchive.Category
) AS InnerTable WHERE RowNumber > (@PageOffset * @MaxRecCount) and RowNumber <= (@PageOffset * @MaxRecCount + @MaxRecCount)
ORDER BY RowNumber
@MaxRecCount、@PageOffset和@IncludeData是来自我的C方法的参数。
这个版本需要大约1:35分钟才能得到我想要的数据。为了加快存储过程的速度,我插入了一个WHERE子句来过滤插入的列,我还为此列创建了一个索引,并使用偏移量获取:
优化后的存储过程:
@MaxRecCount INT,
@PageOffset INT,
@IncludeData BIT
Declare @pageStart int
Declare @pageEnd int
SET @pageStart = @PageOffset * @MaxRecCount
SET @pageEnd = @pageStart + @MaxRecCount + 50
IF @IncludeData = 0
BEGIN
SELECT [Client], [Schema], [Version], [Records], [Fetched], [Receipted], [ProvidedAt], [FetchedAt], [ReceiptedAt],[PacketIds], [Record] FROM (
SELECT TOP(@MaxRecCount) bai_ExportPendingArchive.[UserName] AS Client,
bai_ExportPendingArchive.Category AS [Schema],
MAX(bai_ExportPendingArchive.ContractVersion) AS [Version],
COUNT(*) AS [Records],
SUM (CASE WHEN bai_ExportPendingAckArchive.ExportPendingId IS NULL THEN 0 ELSE 1 END) as [Fetched],
SUM (CASE WHEN bai_ExportPendingAckArchive.Receipted IS NULL THEN 0 ELSE 1 END) as [Receipted],
MAX(bai_ExportArchive.Inserted) AS [ProvidedAt],
MAX(CASE WHEN bai_ExportPendingAckArchive.ExportPendingId IS NULL THEN NULL ELSE bai_ExportPendingAckArchive.Inserted END) AS [FetchedAt],
MAX(CASE WHEN bai_ExportPendingAckArchive.Receipted IS NULL THEN NULL ELSE bai_ExportPendingAckArchive.Receipted END) AS [ReceiptedAt],
bai_ExportArchive.PacketIds AS [PacketIds],
NULL AS [Record],
ROW_NUMBER() Over (Order By MAX(bai_ExportArchive.Inserted) desc) as [RowNumber]
FROM bai_ExportArchive
INNER JOIN bai_ExportPendingArchive ON bai_ExportArchive.Id = bai_ExportPendingArchive.ExportId
LEFT OUTER JOIN bai_ExportPendingAckArchive ON bai_ExportPendingAckArchive.ExportPendingId = bai_ExportPendingArchive.Id
Where bai_ExportArchive.Inserted <= (Select bai_ExportArchive.Inserted from bai_ExportArchive Order by bai_ExportArchive.Inserted DESC Offset @pageStart ROWS FETCH NEXT 1 ROWS Only)
And bai_ExportArchive.Inserted > (Select bai_ExportArchive.Inserted from bai_ExportArchive Order by bai_ExportArchive.Inserted DESC Offset @pageEnd ROWS FETCH NEXT 1 ROWS Only)
GROUP BY bai_ExportPendingArchive.[UserName], bai_ExportArchive.PacketIds, bai_ExportPendingArchive.Category
) AS InnerTable
ORDER BY RowNumber
这个版本给了我大约2秒钟的数据。唯一的问题是,我使用的是Microsoft SQL Server 2014,但我的用户使用的是SQL Server 2008+。现在的问题是,偏移量提取在Server2008中不起作用。现在我不知道如何优化我的存储过程,使其快速并在SQLServer2008上工作
非常感谢您的帮助:在SQLServer2005/2008中尝试使用此方法处理分页 首先,在select查询中使用CTE,并在行数列中标识记录编号/计数。之后,您可以使用页码和页码从该CTE中选择一系列记录。下面是一个例子
DECLARE @P_PAGE_NUM INT = 0
,@P_PAGE_SIZE INT = 20
;WITH CTE
AS
( /*SELECT ROW_NUMBER() OVER (ORDER BY COL_to_SORT DESC) AS [ROW_NO]
,...
WHERE ....
*/ -- You can replace your select query here, but column [ROW_NO] should be there in your select list.
--ie ROW_NUMBER() OVER (ORDER BY put_column-to-sort-here DESC) AS [ROW_NO]
)
SELECT *
--,( SELECT COUNT(*) FROM CTE) AS [TOTAL_ROW_COUNT]
FROM CTE
WHERE (
ISNULL(@P_PAGE_NUM,0) = 0 OR
[ROW_NO] BETWEEN ( @P_PAGE_NUM - 1) * @P_PAGE_SIZE + 1
AND @P_PAGE_NUM * @P_PAGE_SIZE
)
ORDER BY [ROW_NO]
请尝试此方法来处理SQL Server 2005/2008中的分页 首先,在select查询中使用CTE,并在行数列中标识记录编号/计数。之后,您可以使用页码和页码从该CTE中选择一系列记录。下面是一个例子
DECLARE @P_PAGE_NUM INT = 0
,@P_PAGE_SIZE INT = 20
;WITH CTE
AS
( /*SELECT ROW_NUMBER() OVER (ORDER BY COL_to_SORT DESC) AS [ROW_NO]
,...
WHERE ....
*/ -- You can replace your select query here, but column [ROW_NO] should be there in your select list.
--ie ROW_NUMBER() OVER (ORDER BY put_column-to-sort-here DESC) AS [ROW_NO]
)
SELECT *
--,( SELECT COUNT(*) FROM CTE) AS [TOTAL_ROW_COUNT]
FROM CTE
WHERE (
ISNULL(@P_PAGE_NUM,0) = 0 OR
[ROW_NO] BETWEEN ( @P_PAGE_NUM - 1) * @P_PAGE_SIZE + 1
AND @P_PAGE_NUM * @P_PAGE_SIZE
)
ORDER BY [ROW_NO]
谢谢你的回答。老实说:我不知道如何将您的建议插入到我的存储过程中。您可以在CTE中替换select查询,但“按[put\u column-To-sort-here]DESC AS[ROW\u no]”列应该在那里对记录进行排序,然后只有我们才能在记录中维护顺序。CTE后的Select脚本将保持不变。好的,现在我知道了,我按照您的建议更改了存储过程,但现在需要大约3:07分钟才能获得更改前需要的数据。更改时间为1:35分钟谢谢您的回答。老实说:我不知道如何将您的建议插入到我的存储过程中。您可以在CTE中替换select查询,但“按[put\u column-To-sort-here]DESC AS[ROW\u no]”列应该在那里对记录进行排序,然后只有我们才能在记录中维护顺序。CTE后的Select脚本将保持不变。好的,现在我得到了它,我按照您的建议更改了存储过程,但现在需要大约3:07分钟才能获得更改前需要的数据,更改时间为1:35分钟