我有一个复杂的 SP,它应用了多个 JOIN 和查找以及复杂的过滤器,如逗号分隔值等......在它之上,我必须部署两个复杂但性能有效的功能:
1. 动态排序,但我认为它是有限的——你知道冗长/笨拙的 CASE 层次结构,奇怪的是专家们也同意这是我们唯一的“最佳”解决方案:
SQL 存储过程中的动态排序 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=5942
无论如何,我现在对这个期望不高。
2. 动态分页——即我希望 SP 能够从 Y(Y = 页码)开始只返回 X 条记录(X = 页大小)。我希望你有一个大致的想法。
为了更清楚,我想使用 MySQL 和 PostgreSQL 中可用的东西:
[LIMIT { number | ALL }] [OFFSET number]
数据库:SQL 分页? http://www.sql.org/sql-database/postgresql/manual/queries-limit.html
奇怪的是,SQL 2005+ 中不提供如此简单和基本的功能......或者我错了(我很高兴听到它:-))
我知道两种适合我的性能\复杂性权衡的方法 -
[2.1] 使用 SQL 2005 的 'RowNumber()' 特性,然后应用过滤器:(我过去用过)
WHERE (Row BETWEEN (@PageIndex-1) * @PageSize +1 AND @PageIndex* @PageSize)
但同样,这需要创建一个临时表或使用 WITH 子句。这也在: SQL Server 中的行偏移量中进行了解释
[2.2] 我发现了一些新的方法。其中之一是使用
SET ROWCOUNT
http://www.4guysfromrolla.com/webtech/042606-1.shtml
他们说总体 2.2 比 2.1 有效。是吗?另外,我想知道如果两个用户请求同时触发同一个 SP 两次会发生什么。我希望在同时的 SP 调用中“SET ROWCOUNT”不会被“共享”或“覆盖”。请确认。比较 2.1 和 2.2 的任何其他点?