如何在SQL中有效地返回记录数?

时间:2010-09-06 04:03:53

标签: sql sql-server tsql sql-server-2008 pagination

我在Windows Server 2008 Enterprise上使用SQL Server 2008 Enterprise。我正在使用以下代码返回查询的一部分数据,以便在我的Web应用程序上实现分页(即向上/向下翻页以显示每个页面的结果的一部分,如Google搜索结果分页)(我使用pageCount作为数字结果显示在每个页面上,startPos作为结果的起始编号)。例如,pageCount 10表示每页显示10个结果,startPos = 0表示第一页,startPos = 1表示第2页等。

我的问题是如何在我的场景中有效地获得结果总数?我主要担心的是如何实现分页(即仅触摸结果的一部分)并同时检索结果总数?

SELECT *
 FROM   (SELECT
    t.foo, t.goo, ROW_NUMBER() OVER (order by t.zoo DESC ) AS rowNum
   FROM
    dbo.mycorp  t

   WHERE
    (t.foo LIKE '%'+@search+'%'
    or t.foo  LIKE '%'+@search+'%'
    )
    ) tt
    WHERE  tt.rowNum between @startPos and  @pageCount + @startPos-1
提前谢谢, 乔治

2 个答案:

答案 0 :(得分:3)

这意味着一个冗余列,每行的值相同:

WITH cte AS (
    SELECT t.foo, 
           t.goo, 
           ROW_NUMBER() OVER (ORDER BY t.zoo DESC ) AS rowNum,
           (SELECT COUNT(*)
              FROM dbo.mycorp
             WHERE t.foo LIKE '%'+@search+'%'
                OR t.foo  LIKE '%'+@search+'%') AS total_count
      FROM dbo.mycorp  t
     WHERE t.foo LIKE '%'+@search+'%'
        OR t.foo  LIKE '%'+@search+'%')
SELECT c.foo,
       c.goo,
       c.total_count
  FROM cte c
 WHERE c.rowNum BETWEEN @startPos 
                    AND @pageCount + @startPos-1

更有效的搜索文字方法是使用SQL Server's Full Text Search (FTS) functionality

答案 1 :(得分:1)

如果您的数据访问技术支持,我会考虑使用多个记录集(我知道ADO.NET支持这个)。

在查询后包括以下内容

SELECT COUNT(*) AS TotalRecordCount
 FROM   dbo.mycorp  t 
   WHERE 
    (t.foo LIKE '%'+@search+'%' 
    or t.foo  LIKE '%'+@search+'%' 
    ) 
    ) tt

在数据访问层中,您需要在处理搜索结果后切换到下一个记录集,以便检索总计数。使用ADO.NET,这需要调用dataReader.NextResult()。

最重要的是衡量绩效。我发现在一些情况下,使用单独的select语句而不是子查询可以提高性能,因为查询优化器能够更好地优化查询。无论哪种方式,您都需要在搜索列上使用合适的索引。