SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(3)
AD HOC PAGING:
就是指用頁(yè)面的序號(hào)和頁(yè)面的大小請(qǐng)求一個(gè)單獨(dú)的頁(yè)面。下面是例子。
DECLARE @pagesize AS INT, @pagenum AS INT; SET @pagesize = 5; SET @pagenum = 2; WITH SalesCTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY qty, empid) AS rownum, empid, mgrid, qty FROM dbo.Sales ) SELECT rownum, empid, mgrid, qty FROM SalesCTE WHERE rownum > @pagesize * (@pagenum-1) AND rownum <= @pagesize * @pagenum ORDER BY rownum;
說(shuō)明:在上個(gè)例子中,其實(shí)SQL只審視了10行(2*5),也就是說(shuō),查看N頁(yè)的話,SQL只查到N的頁(yè)的數(shù)據(jù),N頁(yè)后面的數(shù)據(jù)一概不查看。
另外,每當(dāng)移動(dòng)一頁(yè),都會(huì)把這頁(yè)放進(jìn)緩存里,因此每次查詢,就是邏輯查詢(緩存)+物理查詢的過(guò)程。物理查詢只需要查詢新請(qǐng)求的頁(yè)即可,其他全部在緩存里執(zhí)行,這樣大大加快了查詢速度。
MULTIPAGE ACCESS:
如果結(jié)果集不是很大,而且分了多個(gè)請(qǐng)求頁(yè)面,請(qǐng)求也不向前移動(dòng),那么這是一個(gè)好的方案:首先在一個(gè)表里使用ROW_NUMBER具體化所有的頁(yè),然后創(chuàng)建一個(gè)群集索引。下面是例子。
首先創(chuàng)建按ROW_NUMBER把列編好,
SELECT ROW_NUMBER() OVER(ORDER BY qty, empid) AS rownum, empid, mgrid, qty INTO #SalesRN FROM dbo.Sales; CREATE UNIQUE CLUSTERED INDEX idx_rn ON #SalesRN(rownum);
然后直接按ROWNUM查詢,
DECLARE @pagesize AS INT, @pagenum AS INT; SET @pagesize = 5; SET @pagenum = 2; SELECT rownum, empid, mgrid, qty FROM #SalesRN WHERE rownum BETWEEN @pagesize * (@pagenum-1) + 1 AND @pagesize * @pagenum ORDER BY rownum;
RANK & DENSE RANK
這2個(gè)函數(shù)和ROW_NUMBER的區(qū)別是:ROW_NUMBER在ORDER BY的條件里有重復(fù)行存在的話,是把這些重復(fù)行也按INDEX排列的,但是RANK和DENSE RANK總是確定的,即只要是ORDER BY重復(fù)的行,他們是統(tǒng)一INDEX的。
RANK和DENSE_RANK的區(qū)別是,RANK是如果上級(jí)的INDEX和下級(jí)的INDEX有可能不是+1關(guān)系,是按下級(jí)真正處于列里的位置進(jìn)行INDEX,而DENSE_RANK是按照跟上級(jí)的INDEX+1的關(guān)系進(jìn)行的編碼。
比如:
SELECT empid, qty, RANK() OVER(ORDER BY qty) AS rnk, DENSE_RANK() OVER(ORDER BY qty) AS drnk FROM dbo.Sales ORDER BY qty;
NTILE
NTILE的用法和其他的RANK函數(shù)一樣,只不過(guò)它可以傳入一個(gè)參數(shù),用來(lái)決定最大的INDEX是多少:它會(huì)按行數(shù)進(jìn)行除法,然后平均分配行數(shù)進(jìn)行INDEX的標(biāo)示。
比如,如果有11列,那么首先11/3=3,3列一組作為一個(gè)INDEX,然后,11%3=2,這2列會(huì)分別加在前面的2組上。
比如,
SELECT empid, qty, CASE NTILE(3) OVER(ORDER BY qty, empid) WHEN 1 THEN 'low' WHEN 2 THEN 'medium' WHEN 3 THEN 'high' END AS lvl FROM dbo.Sales ORDER BY qty, empid;
相關(guān)文章
SQL Server 2005 開(kāi)啟數(shù)據(jù)庫(kù)遠(yuǎn)程連接的方法
這篇文章主要介紹了SQL Server 2005默認(rèn)是不允許遠(yuǎn)程連接的,要想通過(guò)遠(yuǎn)程連接實(shí)現(xiàn)MSSQL,數(shù)據(jù)庫(kù)備份,需要做如下設(shè)置,需要的朋友可以參考下2015-01-01
SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(4)
作者他很喜歡建立數(shù)字輔助表(即是1-N的數(shù)字按順序組成的表),關(guān)于如何建立這些輔助表,然后他給了一些例子,這些例子很有代表性。2010-02-02
sqlserver2005自動(dòng)創(chuàng)建數(shù)據(jù)表和自動(dòng)添加某個(gè)字段索引
C#編程程序的時(shí)候,讓程序自動(dòng)創(chuàng)建數(shù)據(jù)表,然后給數(shù)據(jù)表添加索引,這個(gè)方法是在百度百科找到,我自已只是簡(jiǎn)單的修改了一下2012-06-06
安裝MSSql2005時(shí) “以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法
安裝MSSql2005時(shí) “以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法2010-02-02
SQLServer2005 XML數(shù)據(jù)操作代碼
在項(xiàng)目中經(jīng)常用XML文件,看看T-SQL程序設(shè)計(jì)發(fā)現(xiàn)SQLSERVER2005居然可以處理XML類型,而且還可以使用類似于Xpath的查詢語(yǔ)法查詢。2010-06-06
在登錄觸發(fā)器錯(cuò)誤情況下連接SQL Server的方法
如果你創(chuàng)建了一個(gè)登錄觸發(fā)器,并且在這個(gè)觸發(fā)器中有一些不好的代碼,那么當(dāng)你嘗試著登錄時(shí),你將會(huì)得到一個(gè)類似于圖一顯示的錯(cuò)誤2011-07-07
win2003 Server配置SQL Server 2005遠(yuǎn)程連接的方法
這篇文章主要介紹了win2003 Server配置SQL Server 2005遠(yuǎn)程連接的方法,需要的朋友可以參考下2015-01-01

