我在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
提前谢谢,
乔治
答案 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语句而不是子查询可以提高性能,因为查询优化器能够更好地优化查询。无论哪种方式,您都需要在搜索列上使用合适的索引。