【发布时间】:2011-04-08 14:46:21
【问题描述】:
我在 Windows Server 2008 Enterprise 上使用 SQL Server 2008 Enterprise。我正在使用以下代码返回查询的一部分数据以在我的 Web 应用程序(我使用 pageCount 作为数字每页显示的结果个数,startPos 为结果的起始编号)。例如,pageCount 10 表示每页显示 10 个结果,startPos = 0 表示第一页,startPos = 1 表示第二页,以此类推
我的问题是如何在我的场景中有效地获得结果总数?我主要关心的是如何实现分页(即只触摸结果的一部分)并同时检索结果总数?
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
提前致谢, 乔治
【问题讨论】:
-
如果你的 SQL 查询包含
LIKE '%something%':-) -
这里有一篇很好的文章比较了计算分页总数的技术:sqlservercentral.com/articles/paging/70120
-
我的意思是在
like子句中使用%xx%几乎肯定会阻止使用索引来定位行。这意味着全表(或索引,如果列被索引)扫描,这是一个性能杀手。 -
感谢@paxdiablo,如果不使用该模式,您如何实现具有“包含”功能的查询?我要搜索 aaa 列中包含“xxx”的所有记录?
-
对于任意“包含”,这很困难。对于单词边界“包含”,您可以将字段拆分为单词,丢弃干扰词('and'、'or'、'the' 等)并将其他单词存储在引用该行的单独表中.然后,您只需在单独的表中查询特定单词。这可以作为插入/更新触发器来提高效率:请参阅stackoverflow.com/questions/3521627/…
标签: sql sql-server tsql sql-server-2008 pagination