1万条数据大概占多大空间_「数据分析」Sqlserver的窗口函数的精彩应用之数据差距与数据岛...
上一篇介紹過數據差距與數據島的背景,這里不再贅述,請翻閱上一文。此篇在Sqlserver上給大家演示1000萬條記錄的計算性能。
測試電腦軟硬件說明
一般般的筆記本電腦,2017年7月,價格:4500+。
電腦配置
數據構造
1000萬行數據,由10萬個用戶+每用戶100條記錄組成,同樣使用書中所提及的構造序列的表值函數輕松構造完成。
同樣使用窗口函數完成的表值函數
生成1000萬條數據記錄
數據源結構
使用循環和隨機函數,實現刪除10萬條數據,因測試時先建了索引再刪除數據,慢得一塌糊涂,最終中途中止了,沒有實際刪除這么多數據。
隨機刪除10萬條記錄,用于實現數據差距和數據島效果
關系型數據庫,性能優化的核心是適當的索引,此次肯定要加上索引才能客觀地表現出該有的合理效果。
增加聚集索引
算法代碼演示
數據差距范圍
此部分計算的邏輯是將每個用戶分組下本來連續的序號中,缺失了某些記錄,這些缺失的部分對應的區間范圍,若缺失的為連續的,返回連續的區間,若缺失為單個記錄,返回首尾相同的序號。
數據差距的SQL代碼及結果
原理:關鍵思路是使用LEAD函數,使用“用戶”列作分區,按序號的升序排列,取當前用戶組的當前行序號為cur列,其下一行內容作為nxt列,最終構造結構表是,將當前行的cur列值+1構造出差距的首范圍,當前行的nxt列值-1作為結束范圍。
而最終的結果只會取nxt和cur之差大于1的記錄,即開始有缺失產生差距的行記錄。
總記錄1000萬條,10萬個用戶,分組計算后,返回數據產距90899條記錄,用時27秒
分解下步驟,將CTE虛擬表C給大家看下效果,可以看到97和100之間是缺失了98、99兩值,最終在97序號上,cur為97、nxt為100,此行記錄是我們后面where條件要篩選出來的記錄行(模擬刪除數據過程中,盡量刪除連續的兩條記錄,讓差距結果更清晰)。
將cur+1,nxt-1后,就拿到98-99這樣的差距區間。
分步驟演示
數據島范圍
這個就是一般來說連續記錄的區間,如現實場景中的用戶連續打卡天區間。10萬個用戶測試,100天打卡天數,足夠滿足一般互聯網中等規模的活動場景使用。
數據島范圍的SQL代碼及結果
原理:使用排名窗口函數,對用戶進行分組計算。若有數據缺失時,排名的序號和正常序號之差會有跳躍性的差距(正常無缺失時序號和排名是相同,且差異為0)。
下一步對排名產生的相同的數值進行分組匯總,連同用戶字段,最終可統計出某用戶在某個差異值grp下的連續區間。
分解步驟后可知,在用戶1中,58后缺失了59、60兩個值,最終在61的排名與序號差grp為2,直到下一次有缺失時,此2的值再更新為下一個缺失的值區間長度2+2=4。
分步驟演示
下一個缺失值為98和99兩值
結語
Sqlserver的窗口函數,非常多的應用場景,對傳統的SQL的查詢進行了極大的簡化,在PowerBI的DAX查詢語言中,暫時還缺少其在集合的基礎上進行窗口的處理,致使同樣都是對數據集合進行運算,但因為缺失窗口函數特性支持,性能上仍然和SQL中的窗口函數處理有非常大的差距。
想必有人好奇地問,這些內容在其他數據庫中是否同樣可以?窗口函數在其他關系型數據庫中是否也一樣支持?
據筆者知識范圍所知,MySQL和Sqlite是沒有的,Oracle是有的,并且比Sqlserver更強大(為何不推薦,因為筆者是微軟系的信徒唄,Oracle人家是法務團隊強大,你懂得)。
總結
以上是生活随笔為你收集整理的1万条数据大概占多大空间_「数据分析」Sqlserver的窗口函数的精彩应用之数据差距与数据岛...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把分钟转化成秒_怎么利用抖音短视频引
- 下一篇: python有框架吗_Python几种主