【发布时间】:2017-05-29 19:54:39
【问题描述】:
我有两个不同的查询,每页返回 10 条记录。但是在我的第二个查询中,我已经更新了它以返回总记录数,并且它已经使用 CTE 实现了。现在我不愿意使用它,并想知道现在它在Query 02 中使用 CTE 对性能的影响。 CTE 会选择内存中表的所有记录并使其占用内存吗?这两个查询之间的性能差异有多大?因为如果存在巨大的性能差异,那么我可以跳过总数。请提出建议。
DECLARE
@PageSize tinyint=10,
@PageOffset int=0;
--Query 01
SELECT
App.Id,
Users.FirstName+' '+Users.LastName as Name,
App.Date
FROM
App
INNER JOIN Users ON App.UserId = Users.Id
WHERE
App.FolderId = 1
ORDER BY
App.Date DESC
OFFSET @PageOffset ROWS FETCH NEXT @PageSize ROWS ONLY;
--Query 02
WITH TempResult AS(
SELECT
App.Id,
Users.FirstName+' '+Users.LastName as Name,
App.Date
FROM
App
INNER JOIN Users ON App.UserId = Users.Id
WHERE
App.FolderId = 1
), TempCount AS (
SELECT COUNT(*) AS MaxRows FROM TempResult
)
SELECT *
FROM TempResult, TempCount
ORDER BY
TempResult.Date DESC
OFFSET @PageOffset ROWS FETCH NEXT @PageSize ROWS ONLY;
【问题讨论】:
-
你的测试揭示了什么?
-
我没有比较它们
-
不要认为 CTE 会改变查询计划,但要提出一个替代方案:您也可以在第一个查询中使用
Count和窗口函数(假设您有 sql server 2008或更新)。例如将字段count(1) over () cnt添加到第一个查询将添加一个名为 cnt 的字段,其中包含查询返回的所有记录的计数 -
是的,你是对的,但我认为 CTE 将是不错的选择,因为使用 CTE 我只能在单独的记录集中选择一次计数,而不是对每一行重复。
标签: sql sql-server common-table-expression