2

我有一个复杂的 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 的任何其他点?

4

1 回答 1

0

我相信这两种方法都很好,我们可以选择最适合我们要求的方法


我知道两种适合我的性能\复杂性权衡的方法 -

[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 的任何其他点?

于 2012-08-30T15:32:27.357 回答