惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
F
Full Disclosure
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Register - Security
The Register - Security
G
Google Developers Blog
C
Check Point Blog
GbyAI
GbyAI
A
About on SuperTechFans
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
T
Tor Project blog
AWS News Blog
AWS News Blog
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
aimingoo的专栏
aimingoo的专栏
U
Unit 42
Y
Y Combinator Blog
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
S
Schneier on Security
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
C
Cisco Blogs
Webroot Blog
Webroot Blog
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
罗磊的独立博客
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog

博客园 - 搞IT的狐狸

ASP.Net动态使用CSS - 搞IT的狐狸 - 博客园 SqlDataReader或DATATABLE DATASET 到EXCEL (转载)ASP.NET本地化 VS2005 TreeView 的 CheckBox 被点击时的引发页面回发事件 (转发) ASP.NET 2.0,C#----利用GridView控件导出其他文件(导出Excel,导出Word文件) 什么是SHTML 如何使用IFRAM JS来刷新UpdatePanel 随即验证码实现(根据韩现龙代码修改) [北京]招聘 网站设计师 我这半个月的代码总结(小技巧,小代码)之二 我这半个月的代码总结(小技巧,小代码)之一 用Themes实现网站换肤 将数据控件(如GridView)的内容转化成Excel格式文件 ASP.NET新手实用技巧!(C#) 学历不高!写给自己!自勉! 一张笑死我又让我辛酸的图片!开发人员的辛酸! 服务器刚开,凑个沙发!.NET几点你应该知道的细节! 求动态绑定控件ID的值的方法!着急!
[转载]ROW_NUM实现分页
搞IT的狐狸 · 2008-05-03 · via 博客园 - 搞IT的狐狸

微软最新发布的MSSQL2005,对TSQL进行了小规模的加强,有些函数的确非常实用。就比如ROW_NUMBER()函数,实现了原先一直要用存储过程来进行大数据分页的功能。现在有了这个函数,只要简单一个语句就能解决任何情况下的数据分页,不管你要排序的字段是否唯一。
  个人感觉,这个函数应该能再进的一步优化性能,当然这个工作不是我们所能为,MS不去开发,我们就没办法了。
select * from (SELECT ROW_NUMBER() OVER (order by id desc) as pos from [table] where year(birth)=1981) as sp where pos between 1 and 5
  实际底层的工作逻辑不是很清楚,假如是每次执行都需要进行全表排序的话,那真的是太浪费资源了。即使有了索引,不需要再进行全表排序,是否必然会进行一次ROW_NUMBER()函数的全表运算呢?
  我们假设索引都有一个索引表的rowID,就类似于ROW_NUMBER()产生的值。那么事先已经有过索引的,是不是就能直接根据索引表的rowID进行高效分页呢?这种方法应该是可行,具体MSSQL2005中是否有这个功能,还需要进一步学习。
  按照以上方法,应该能简单写出分页的SQL语句:
SELECT from [table] where year(birth)=1981 and ROW_NUMBER() between 1 and 5 order by id desc
  分析器执行此语句时,对于ROW_NUMBER()函数,首先检查是否有索引匹配,若匹配,则直接访问索引中的rowID进行条件读取,若是无匹配索引,则根据当前排序条件重新进行一次全表的ROW_NUMBER()计算。
不过这个方法可能会增加索引的工作强度,由于每次的索引重建都需要进行一次全表ROW_NUMBER()运算。不过由于索引是多字段及多方向的,例如,一个索引有2个字段,那么就必然需要4个ROW_NUMBER()表,如果索引字段更多,就变得很复杂了。因此,可以选择性的为某些字段的排序方向保存rowID。


  下面是我简单写的一个存储过程,希望对你有用,相对之前的存储分页,性能自然也是非常高效的。个人觉得用存储过程调用,不管是性能上还是使用上,都应该更方便一些。如果你觉得直接程序中用SQL语句调用,那也是完全没问题的。


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE PROCEDURE [dbo].[ShowPage]
@tblName   varchar(255),       -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@strOrder varchar(255)='',      -- 排序的字段名
@PageSize   int = 10,          -- 页尺寸
@PageIndex int = 1,           -- 页码
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(5000)

if @strWhere !=''
set @strWhere=' where '+@strWhere

set @strSQL='SELECT * FROM (SELECT ROW_NUMBER() OVER ('+@strOrder+') AS pos,'+@strGetFields+' FROM ['+@tblName+']'+@strWhere+') AS sp WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)

exec (@strSQL)

这个只能用2005以上级别的数据库 传统2000 还是咱们来TOP  X TOP  把 嘎嘎