Phi*_*ett 30 sql sql-server sql-server-2005
我使用SQL Server 2005中的row_number over()功能进行了一次昂贵的查询.在查询被分页时,我只返回这些记录的子列表.但是,我还想返回记录总数,而不仅仅是分页子集.有效地运行查询两次以获得计数是不可能的.
选择计数(*)也是不可能的,因为当我尝试这个时表现非常糟糕.
我真正喜欢的是@@ ROW_NUMBERROWCOUNT :-)
RBa*_*ung 36
与OVER(PARTITON BY ..)一起使用时,检查COUNT(*)聚合,如下所示:
SELECT
ROW_NUMBER() OVER(ORDER BY object_id, column_id) as RowNum
, COUNT(*) OVER(PARTITION BY 1) as TotalRows
, *
FROM master.sys.columns
Run Code Online (Sandbox Code Playgroud)
这是恕我直言,这是最好的方式,而无需做两个查询.
EBa*_*arr 36
多年来,一堆开发人员的汗水已经有效地分页结果集.然而,没有一个答案 - 这取决于你的用例.部分用例是有效地获取页面,部分是确定完整结果集中有多少行.很抱歉,如果我稍微偏离分页,但这两者在我的脑海里紧紧相连.
有很多策略,如果你有任何类型的数据量并且不适合用例,那么大多数策略都是不好的.虽然这不是一个完整的清单,但以下是一些选项......
Count(*)WHERE/JOIN标准时会崩溃,因为运行WHERE/JOIN两次是很昂贵的.ROW_Number() OVER()和COUNT(1) OVER(PARTITION By 1)COUNT(*) OVER(PARTITION BY 1) as TotalRows结果是大约12,000次读取.比较简单SELECT COUNT(*) FROM Media- 12读.Wowzers. 更新 - 我提到的读取问题有点红鲱鱼.事实证明,对于窗口函数,用于测量读取的单位是混合的.最终结果似乎是大量的读取.您可以在此处查看有关此问题的更多信息:为什么窗口聚合函数的逻辑读取如此之高?
Row_Number())开始,1到N的行数是 (N + 1) - 1.链接中有更多解释. ROW_Number() OVER(Order by ID),ROW_Number() OVER(Order by ID DESC) 然后将两个数相加并减去1.读我的好人,读.以下是我倾斜的一些文章......
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
8139 次 |
| 最近记录: |