我有一张表(例如)1500行。我已经确定(由于服务器的资源),我的查询可以在我想要的查询中快速处理多达500行的表。一次超过500行,它突然变得很慢。
如何构建查询以处理行组500中的表内容,直到表的末尾?
[编辑] 需要很长时间的查询是:
select p.childid, max(c.childtime) ChildTime
from child c
inner join @parents p on p.parentid = c.parentid
and c.ChildTypeID = 1
AND c.childtime < getdate()
group by p.parentid
问题是point
表有数百万行,并且(由于我不能进入这里的原因)无法减少。
主要问题是:减少子表中的行数以使查询具有高性能。不幸的是,正在执行此查询以填充临时表,以便后续查询可以快速执行。
答案 0 :(得分:0)
一种可能性是使用窗口函数。唯一的技巧是它们不能在WHERE子句中使用,因此您必须使用子查询。
Select a.*, b.*
From
(
Select *, rownum = ROW_NUMBER() over (order by fieldx)
From TableA
) a
Inner Join TableB b on a.fieldx=b.fieldx
Where a.rownum between @startnum and @endnum
答案 1 :(得分:0)
如果这仅用于处理,您可以执行以下操作:
DECLARE @RowsPerPage INT = 500, @PageNumber INT = 1
DECLARE @TotalRows INT
SET @TotalRows = (SELECT count(1) from test)
WHILE (@RowsPerPage * @PageNumber < @TotalRows)
BEGIN
SELECT
Id
FROM
(
SELECT
Id,
ROW_NUMBER() OVER (ORDER BY Id) as RowNum
FROM Test
) AS sub
WHERE sub.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
SET @PageNumber = @PageNumber + 1
END
计算总行数,然后计算结果中的循环和页数。但是,如果你需要你的结果,这并没有太大帮助,因为这将运行X个单独的查询。您可以将它放在存储过程中并将结果或类似的东西结合起来,以便在一个“查询”中获得结果。
我仍然认为更好的选择是修复原始查询的缓慢程度。是否可以将连接结果加载到CTE / Temp表中以仅执行一次计算?如果你能提供一个对你的查询有帮助的例子......