如何一次查询有限行中的T-SQL表

时间:2013-11-20 16:55:34

标签: sql sql-server-2008 grouping query-performance

我有一张表(例如)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表有数百万行,并且(由于我不能进入这里的原因)无法减少。

主要问题是:减少子表中的行数以使查询具有高性能。不幸的是,正在执行此查询以填充临时表,以便后续查询可以快速执行。

2 个答案:

答案 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表中以仅执行一次计算?如果你能提供一个对你的查询有帮助的例子......