我想返回数据库中的记录总数,以便我可以设置分页.在SQL Server 2008中使用以下分页方法时,如何返回数据库中的记录总数?
ALTER PROCEDURE [dbo].[Nop_LoadAllOptimized]
(
@PageSize int = 20,
@PageNumber int = 1,
@WarehouseCombinationID int = 1,
@CategoryId int = 58,
@OrderBy int = 0,
@TotalRecords int = null OUTPUT
)
AS
BEGIN
WITH Paging AS (
SELECT rn = (ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @OrderBy = 0 AND @CategoryID IS NOT NULL AND @CategoryID > 0
THEN pcm.DisplayOrder END ASC,
CASE WHEN @OrderBy = 0
THEN p.[Name] END ASC,
CASE WHEN @OrderBy = 5
THEN …Run Code Online (Sandbox Code Playgroud) 我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.
经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. Worktable logical reads = 1 + NumberOfRows * 2 + NumberOfGroups * 4
我不明白为什么这个公式成立的原因.这比我想象的更有必要看一下这个计划.任何人都可以通过吹嘘这个帐户的内容来打击这个吗?
或者失败那是否有任何方法来跟踪每个逻辑读取中读取的页面,以便我可以自己解决?
SET STATISTICS IO OFF; SET NOCOUNT ON;
IF Object_id('tempdb..#Orders') IS NOT NULL
DROP TABLE #Orders;
CREATE TABLE #Orders
(
OrderID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
CustomerID NCHAR(5) NULL,
Freight MONEY NULL,
);
CREATE NONCLUSTERED INDEX ix
ON #Orders (CustomerID)
INCLUDE (Freight);
INSERT INTO #Orders
VALUES (N'ALFKI', 29.46),
(N'ALFKI', 61.02),
(N'ALFKI', 23.94),
(N'ANATR', 39.92),
(N'ANTON', 22.00);
SELECT PredictedWorktableLogicalReads =
1 + …Run Code Online (Sandbox Code Playgroud) 我试图返回一个数据页面,并在一个存储过程中的所有数据的行计数,如下所示:
WITH Props AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber
FROM Property
WHERE PropertyType = @PropertyType AND ...
)
SELECT * FROM Props
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize);
Run Code Online (Sandbox Code Playgroud)
我无法返回行计数(最高行号).
我知道这已经讨论过了(我已经看过了: 使用row_number从查询中获取@@ rowcount的有效方法)但是当我在CTE中添加COUNT(x)OVER(PARTITION BY 1)性能降低并且上面的查询通常没有时间需要永远执行.我估计这是因为计算了每一行的数量?我似乎无法在另一个查询中重用CTE.Table Props有100k记录,CTE返回5k记录.
我有超过30万行,即使我使用TOP*语句只选择20/50/100记录,我想返回记录的总数.
是否可以过滤选择之类的
select top 50 * from table where rule1=rule1 and rule=rule2
假设数据库为300 000并且上面选择的记录总数将返回4 000条记录.但实际上它只返回50条记录,我需要知道manu是如何在数据库中使用这个where语句(它将返回4000).
谢谢