代码之家  ›  专栏  ›  技术社区  ›  George2

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

  •  1
  • George2  · 技术社区  · 16 年前

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

    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 回复  |  直到 16 年前
        1
  •  3
  •   OMG Ponies    16 年前

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

    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 .

        2
  •  1
  •   Tom H zenazn    16 年前

    如果您的数据访问技术支持,我会考虑使用多个记录集(我知道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语句而不是子查询可以提高性能,因为查询优化器能够更好地优化查询。无论哪种方式,您都需要对搜索列进行适当的索引。