SqlServer 2005 T-SQL Query 学习笔记(3)
2010-02-18 00:05
411 查看
利用ROW_NUMBER()进行高效率的分页。
ADHOCPAGING:
就是指用页面的序号和页面的大小请求一个单独的页面。下面是例子。
MULTIPAGEACCESS:
首先创建按ROW_NUMBER把列编好,
然后直接按ROWNUM查询,
RANK&DENSERANK
这2个函数和ROW_NUMBER的区别是:ROW_NUMBER在ORDERBY的条件里有重复行存在的话,是把这些重复行也按INDEX排列的,但是RANK和DENSERANK总是确定的,即只要是ORDERBY重复的行,他们是统一INDEX的。
RANK和DENSE_RANK的区别是,RANK是如果上级的INDEX和下级的INDEX有可能不是+1关系,是按下级真正处于列里的位置进行INDEX,而DENSE_RANK是按照跟上级的INDEX+1的关系进行的编码。
比如:
NTILE
NTILE的用法和其他的RANK函数一样,只不过它可以传入一个参数,用来决定最大的INDEX是多少:它会按行数进行除法,然后平均分配行数进行INDEX的标示。
比如,如果有11列,那么首先11/3=3,3列一组作为一个INDEX,然后,11%3=2,这2列会分别加在前面的2组上。
比如,
Technorati标签:sql2005,t-sql,query
ADHOCPAGING:
就是指用页面的序号和页面的大小请求一个单独的页面。下面是例子。
DECLARE@pagesize AS INT,@pagenum AS INT; SET@pagesize=5; SET@pagenum=2; WITHSalesCTE AS
(SELECTROW_NUMBER() OVER( ORDER BYqty,empid) ASrownum,
empid,mgrid,qtyFROMdbo.Sales
)SELECTrownum,empid,mgrid,qty FROMSalesCTE WHERErownum>@pagesize*(@pagenum-1) ANDrownum<=@pagesize*@pagenum ORDER BYrownum;
说明:在上个例子中,其实SQL只审视了10行(2*5),也就是说,查看N页的话,SQL只查到N的页的数据,N页后面的数据一概不查看。
另外,每当移动一页,都会把这页放进缓存里,因此每次查询,就是逻辑查询(缓存)+物理查询的过程。物理查询只需要查询新请求的页即可,其他全部在缓存里执行,这样大大加快了查询速度。
MULTIPAGEACCESS:
如果结果集不是很大,而且分了多个请求页面,请求也不向前移动,那么这是一个好的方案:首先在一个表里使用ROW_NUMBER具体化所有的页,然后创建一个群集索引。下面是例子。
首先创建按ROW_NUMBER把列编好,
SELECTROW_NUMBER() OVER( ORDER BYqty,empid) ASrownum,empid,mgrid,qty INTO#SalesRN FROMdbo.Sales; CREATE UNIQUE CLUSTERED INDEXidx_rn ON#SalesRN(rownum);
然后直接按ROWNUM查询,
DECLARE@pagesize AS INT,@pagenum AS INT; SET@pagesize=5; SET@pagenum=2; SELECTrownum,empid,mgrid,qty FROM#SalesRN WHERErownum BETWEEN@pagesize*
(@pagenum-1)+1AND@pagesize*@pagenum ORDER BYrownum;
RANK&DENSERANK
这2个函数和ROW_NUMBER的区别是:ROW_NUMBER在ORDERBY的条件里有重复行存在的话,是把这些重复行也按INDEX排列的,但是RANK和DENSERANK总是确定的,即只要是ORDERBY重复的行,他们是统一INDEX的。
RANK和DENSE_RANK的区别是,RANK是如果上级的INDEX和下级的INDEX有可能不是+1关系,是按下级真正处于列里的位置进行INDEX,而DENSE_RANK是按照跟上级的INDEX+1的关系进行的编码。
比如:
SELECTempid,qty,RANK() OVER( ORDER BYqty) ASrnk,DENSE_RANK() OVER( ORDER BYqty) ASdrnk FROMdbo.Sales ORDER BYqty;
NTILE
NTILE的用法和其他的RANK函数一样,只不过它可以传入一个参数,用来决定最大的INDEX是多少:它会按行数进行除法,然后平均分配行数进行INDEX的标示。
比如,如果有11列,那么首先11/3=3,3列一组作为一个INDEX,然后,11%3=2,这2列会分别加在前面的2组上。
比如,
SELECTempid,qty, CASENTILE(3) OVER( ORDER BYqty,empid) WHEN1 THEN'low' WHEN2 THEN'medium' WHEN3 THEN'high' END ASlvl FROMdbo.Sales ORDER BYqty,empid;
Technorati标签:
相关文章推荐
- SqlServer 2005 T-SQL Query 学习笔记(9)
- SqlServer 2005 T-SQL Query 学习笔记(5)
- SqlServer 2005 T-SQL Query 学习笔记(1)
- SqlServer 2005 T-SQL Query 学习笔记
- SqlServer 2005 T-SQL Query 学习笔记
- SqlServer 2005 T-SQL Query 学习笔记(6)
- SqlServer 2005 T-SQL Query 学习笔记(2)
- SqlServer 2005 T-SQL Query 学习笔记(7)
- SqlServer 2005 T-SQL Query 学习笔记(8)
- SqlServer 2005 T-SQL Query 学习笔记(1)
- SqlServer 2005 T-SQL Query 学习笔记(2)
- SqlServer 2005 T-SQL Query 学习笔记(4)
- SqlServer 2005 T-SQL Query 学习笔记(3)
- SqlServer 2005 T-SQL Query 学习笔记(10)
- SqlServer 2005 T-SQL Query 学习笔记(4)
- SQLSERVER2005学习笔记
- Delphi2005学习笔记5 NET Interoperability: .NET ↔ Win32
- SQL Server 2005 T-SQL学习笔记:PIVOT和UNPIVOT
- SQL Server 2005 T-SQL 学习笔记:新数据类型
- sql server 2005学习笔记之触发器简介