SQL 语句技巧--排名函数的使用实例
?? 今天看到一篇文章,關(guān)于討論如何優(yōu)化語句,原文如下:
?????? 作者總結(jié)貼: http://blog.csdn.net/wangd1121/archive/2008/06/23/2579435.aspx
???????網(wǎng)友討論貼:?http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f88f8e42.html?
?
?? 問題描述:
比如,假設(shè)我們有下面這樣結(jié)構(gòu)的一張表,這張表的數(shù)據(jù)量非常巨大。
CREATE?TABLE?table1(
????[ID]?[bigint]?IDENTITY(1,1)?NOT?NULL,
????[Name]?[nvarchar](128)?NOT?NULL,
????[class]?int?not?null,
????[date]?datetime?not?null
)
??class表示分類編號。?分類數(shù)不固定,至少有上千種分類,date?表示該條記錄被更新的時間?
? 要求: 我們現(xiàn)在想獲得每個分類最新被更新的5條記錄。
?
?? 解決的SQL語句:
select?id,name,class,date?from(select?id,name,class,date?,row_number()?over(partition?by?class?order?by?date?desc)
as?rowindex?from?table1)?a
where?rowindex?<=?5
?
?? 的確是一個很好的解決辦法。
????? 注意:OVER 子句中的 PARTITION BY 將結(jié)果集分為多個分區(qū),這里的partition by class是按照類型分區(qū),當(dāng)然是有多少個類型分多少個區(qū)。
?
??? 當(dāng)然作者討論沒有涉及到后續(xù)的性能優(yōu)化討論,因為表的數(shù)據(jù)量比較大情況下,如何優(yōu)化該查詢。如果不建立任何索引和處理,以上的執(zhí)行語句是全表掃描,速度很慢的。
?? 由于沒有上面的數(shù)據(jù)量,我們從另一個表中模擬這個實現(xiàn):
??? 表[zping.com]大約有數(shù)據(jù)70多萬數(shù)據(jù),有字段id,operator,operatedate,remark等字段信息,其中operator有兩三百個不同值,和上面的執(zhí)行意義一樣:
select?*?from?(select?operator?,?operatedate,row_number()?over?
(partition?by?operator?order?by?operatedate?)?rn?
from??dbo.[zping.com]
)?t where?rn<=5
?
? 如果沒有建立索引,上述查詢速度很慢,這時要如果在operator和operatedate分別建立索引也很慢,建立(operatedate,operator)索引也比較慢,因為要排序,這時建立復(fù)合索引(operator,operatedate).
??
???
轉(zhuǎn)載于:https://www.cnblogs.com/zping/archive/2008/09/25/1281832.html
總結(jié)
以上是生活随笔為你收集整理的SQL 语句技巧--排名函数的使用实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何对SQL Server中的XML数据
- 下一篇: “四不像”病毒冒充多款知名软件 窃取电脑