亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

分享一個SQLSERVER腳本(計算數據庫中各個表的數據量和每行記錄所占用空間)

2024-07-21 02:49:48
字體:
來源:轉載
供稿:網友
分享一個SQLSERVER腳本(計算數據庫中各個表的數據量和每行記錄所占用空間)分享一個SQLSERVER腳本(計算數據庫中各個表的數據量和每行記錄所占用空間)

很多時候我們都需要計算數據庫中各個表的數據量和每行記錄所占用空間

這里共享一個腳本

CREATE TABLE #tablespaceinfo    (      nameinfo VARCHAR(500) ,      rowsinfo BIGINT ,      reserved VARCHAR(20) ,      datainfo VARCHAR(20) ,      index_size VARCHAR(20) ,      unused VARCHAR(20)    )   DECLARE @tablename VARCHAR(255);   DECLARE Info_cursor CURSORFOR    SELECT  '[' + [name] + ']'    FROM    sys.tables    WHERE   type = 'U';   OPEN Info_cursor  FETCH NEXT FROM Info_cursor INTO @tablename   WHILE @@FETCH_STATUS = 0    BEGIN         INSERT  INTO #tablespaceinfo                EXEC sp_spaceused @tablename          FETCH NEXT FROM Info_cursor      INTO @tablename      END  CLOSE Info_cursor  DEALLOCATE Info_cursor   --創建臨時表CREATE TABLE [#tmptb]    (      TableName VARCHAR(50) ,      DataInfo BIGINT ,      RowsInfo BIGINT ,      Spaceperrow AS ( CASE RowsInfo                         WHEN 0 THEN 0                         ELSE DataInfo / RowsInfo                       END ) PERSISTED    )--插入數據到臨時表INSERT  INTO [#tmptb]        ( [TableName] ,          [DataInfo] ,          [RowsInfo]        )        SELECT  [nameinfo] ,                CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,                [rowsinfo]        FROM    #tablespaceinfo        ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC  --匯總記錄SELECT  [tbspinfo].* ,        [tmptb].[Spaceperrow] AS '每行記錄大概占用空間(KB)'FROM    [#tablespaceinfo] AS tbspinfo ,        [#tmptb] AS tmptbWHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC  DROP TABLE [#tablespaceinfo]DROP TABLE [#tmptb]

注意:使用之前要計算哪個數據庫的記錄,請先USE一下要統計表記錄數的那個數據庫?。?/strong>


工作中遇到的問題

可以說我在實際的工作中 ,在100個問題中有90個都會先用到這個腳本

這里舉一個我本人工作中遇到的一些問題

問題一:

程序員反映數據庫查詢慢,5分鐘還沒有出結果

我先用這個腳本看一下這個表有多少記錄,大概有1000w+條數據

然后在本地的SSMS里查詢,確實也是大概4分鐘的樣子才出來數據,看一下執行計劃,發現查詢能使用到索引

看一下數據庫的壓力,并不是很大,我跟會不會跟數據量有關系呢?

程序員要查詢的結果條數是500條數據,業務表是做了分區的,按道理應該不會慢成這樣。。。

后來我再看一下共享出來的那個腳本的結果,發現查詢的結果大小=每行記錄的大小*記錄數

要查詢大概500MB的數據,再傳到客戶端,不慢才怪

為什麼查詢出的結果這么大?

主要是有幾個大字段:例如:二進制字段和NVARCHAR(MAX)

并且時間范圍跨度比較大

馬上叫程序員改一下查詢的語句,由于是entity framework程序,怎麼改我就不太清楚了,主要是不必要的字段就不查詢處理并且縮小時間范圍

問題二:

還有一些問題也需要知道每行記錄的大小,例如刪除表的歷史數據,QA說要保留2013年之前的數據,你需要查出保留的數據或者2013年之前的數據占用多少G空間

再結合當前服務器的磁盤可用空間,來評估刪除的數據是否太多或者太少

那么流程是:先查出2013年之前的記錄數有多少-》計算表的總記錄數-》計算表的大小-》手工計算每行記錄的大小-》乘以2013年之前的記錄數

如果沒有每行記錄數這個字段,那么你手工計算,是不是效率就變慢了???

問題三:

導數據的時候,你想知道當前已經導了多少數據了,那么執行一下這個腳本就可以了,這個腳本基本不會被阻塞

很快就能查出結果


腳本的計算方法

方法一

實際上利用的就是數據行大小的信息除以記錄數

CASE RowsInfoWHEN 0 THEN 0ELSE DataInfo / RowsInfo

方法二

SELECT AVG(DATALENGTH(C0))+AVG(DATALENGTH(C1))+AVG(DATALENGTH(C2))+AVG(DATALENGTH(C3)) FROM [dbo].[TB106]

說一下兩種方法的區別

第一種方法是效率高,當表有上億條記錄的時候,如果你使用第二種方法執行AVG(DATALENGTH(C0))是很慢的,因為SQLSERVER要統計字段大小信息

可能十幾分鐘都出不來結果

當然,第一種方法也有一些缺陷,就是當表的記錄數少的時候,統計出來的每行記錄占用空間是不準確的

因為datainfo這個值是以數據頁大小為單位的,因為就算表只有一條記錄,那么也會占用一個數據頁(8KB)

那么當8KB/1 =8KB,一條記錄肯定不會是8KB大小的,所以記錄少的時候會不準確

但是當記錄數很多的時候,就準確了

看一下TB106這個表統計出來的結果值

SELECT AVG(DATALENGTH(C0))+AVG(DATALENGTH(C1))+AVG(DATALENGTH(C2))+AVG(DATALENGTH(C3)) FROM [dbo].[TB106]

可以看到是比較準確的

注意:

無論方法一還是方法二都不包括索引所占用的空間 ??!


總結

大家平時一定會想:究竟DBA有什么作用?

在這里就給大家一個例子了,在工作中,程序員是不會關心他要查詢的數據的大小的,他不管三七二十一只要把數據select出來就行了,然后收工

DBA這里就要解決數據查詢不出來的問題,一般的程序員覺得查詢500條數據是很少的,根本不會關心表設計,表的字段的數據類型

當工作越來越多,開發任務越來越重的時候更是這樣

所以本人覺得DBA這個角色還是比較重要的o(∩_∩)o如有不對的地方,歡迎大家拍磚o(∩_∩)o2014-7-7 腳本bug修復由于算出來每行記錄的精度有問題,我又對腳本的精度進行了改進
CREATE TABLE #tablespaceinfo    (      nameinfo VARCHAR(500) ,      rowsinfo BIGINT ,      reserved VARCHAR(20) ,      datainfo VARCHAR(20) ,      index_size VARCHAR(20) ,      unused VARCHAR(20)    )   DECLARE @tablename VARCHAR(255);   DECLARE Info_cursor CURSORFOR    SELECT  '[' + [name] + ']'    FROM    sys.tables    WHERE   type = 'U';   OPEN Info_cursor  FETCH NEXT FROM Info_cursor INTO @tablename   WHILE @@FETCH_STATUS = 0    BEGIN         INSERT  INTO #tablespaceinfo                EXEC sp_spaceused @tablename          FETCH NEXT FROM Info_cursor      INTO @tablename      END  CLOSE Info_cursor  DEALLOCATE Info_cursor   --創建臨時表CREATE TABLE [#tmptb]    (      TableName VARCHAR(50) ,      DataInfo BIGINT ,      RowsInfo BIGINT ,      Spaceperrow  AS ( CASE RowsInfo                         WHEN 0 THEN 0                         ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))                       END ) PERSISTED    )--插入數據到臨時表INSERT  INTO [#tmptb]        ( [TableName] ,          [DataInfo] ,          [RowsInfo]        )        SELECT  [nameinfo] ,                CAST(REPLACE([datainfo], 'KB', '') AS BIGINT) AS 'datainfo' ,                [rowsinfo]        FROM    #tablespaceinfo        ORDER BY CAST(REPLACE(reserved, 'KB', '') AS INT) DESC  --匯總記錄SELECT  [tbspinfo].* ,        [tmptb].[Spaceperrow] AS '每行記錄大概占用空間(KB)'FROM    [#tablespaceinfo] AS tbspinfo ,        [#tmptb] AS tmptbWHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB', '') AS INT) DESC  DROP TABLE [#tablespaceinfo]DROP TABLE [#tmptb]


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人字幕网zmw| 在线观看精品国产视频| 久久在线观看视频| 日韩中文字幕网址| 欧美日韩在线一区| 日韩av在线影院| 亚洲性猛交xxxxwww| 欧美日韩999| 在线丨暗呦小u女国产精品| 国产精品老女人精品视频| 国产精品一区二区久久久久| 欧美一级大片在线观看| 久久精品视频一| 国产精品久久综合av爱欲tv| 91亚洲永久免费精品| 中文字幕自拍vr一区二区三区| 日韩hd视频在线观看| 97婷婷涩涩精品一区| 久久激情视频免费观看| 日韩高清免费观看| 77777亚洲午夜久久多人| 亚洲第一免费播放区| 国产一区二区黄| 国产精品高清在线| 97在线视频免费看| 91精品国产乱码久久久久久蜜臀| 神马久久桃色视频| 中文字幕欧美亚洲| 久久精视频免费在线久久完整在线看| 亚洲娇小xxxx欧美娇小| 国产精品久久久91| 国产69精品99久久久久久宅男| 国产精品久久久久久av福利软件| 久久久精品在线| 精品国产一区二区三区久久狼黑人| 中文字幕亚洲综合| 日韩欧美第一页| 亚洲自拍偷拍网址| 成人看片人aa| 自拍视频国产精品| 国产欧美精品在线| 欧美怡春院一区二区三区| 国内精品中文字幕| 色yeye香蕉凹凸一区二区av| 欧洲亚洲女同hd| 日本91av在线播放| 亚洲欧洲成视频免费观看| 久久99久久久久久久噜噜| 77777亚洲午夜久久多人| 成人精品在线视频| 97在线视频免费播放| 精品久久香蕉国产线看观看gif| 色综合伊人色综合网| 欧美人在线视频| 疯狂欧美牲乱大交777| 97超碰国产精品女人人人爽| 亚洲美女精品成人在线视频| 国产精品av在线| 亚洲天堂网在线观看| 亚洲成年人在线播放| 91精品美女在线| 国产精品日日做人人爱| 国产精品久久久久久亚洲调教| 91久久久久久久久久| 亚洲免费伊人电影在线观看av| 热re99久久精品国产66热| 欧美视频中文在线看| 日韩av色在线| 久久激情视频久久| 热久久视久久精品18亚洲精品| 国产精品午夜视频| 欧美激情中文字幕乱码免费| 日本三级韩国三级久久| 亚洲日韩欧美视频一区| 国产精品第一区| 91爱爱小视频k| 久久精品99无色码中文字幕| 久久99国产精品久久久久久久久| 538国产精品一区二区在线| 日韩精品在线播放| 国产精品69久久| 国产成人综合一区二区三区| 久久91亚洲精品中文字幕奶水| 午夜精品久久久久久久99热浪潮| 国产精品一区二区久久| 欧美日韩国产精品专区| 国产精品专区h在线观看| 一区二区三区亚洲| 日韩h在线观看| 亚洲成人在线视频播放| 欧美在线观看网址综合| 久久久久久久久久久免费| 久久天天躁狠狠躁老女人| 97国产suv精品一区二区62| 国产成人福利网站| 久久久天堂国产精品女人| 亚洲国产日韩欧美综合久久| 国产精品自产拍在线观| 日韩一区二区三区在线播放| 国产一区二区三区精品久久久| 91精品久久久久久久久久另类| 国产成人在线一区二区| 97视频色精品| 欧美激情视频在线观看| 97精品在线视频| 懂色av影视一区二区三区| 色综合五月天导航| 欧美最猛性xxxxx亚洲精品| 中文字幕精品在线| 国产精品h在线观看| 蜜臀久久99精品久久久无需会员| 亚洲福利视频久久| 伊人av综合网| 欧美日韩国产一区二区三区| 中文字幕在线精品| 日韩免费中文字幕| 日韩欧美在线播放| 日产精品99久久久久久| 欧美国产中文字幕| 在线观看中文字幕亚洲| 欧美精品videofree1080p| 欧美精品福利在线| 国产精品一区av| 国产mv免费观看入口亚洲| 国产精品69久久| 中文字幕亚洲激情| 亚洲美女性生活视频| 日本精品一区二区三区在线播放视频| 在线观看国产精品淫| 欧美一级黑人aaaaaaa做受| 国产精品日日摸夜夜添夜夜av| 国产精品久久久久久久久久东京| 亚洲欧美制服另类日韩| 国产精品永久免费| 精品久久久av| 国产一区二区丝袜高跟鞋图片| 青青草原成人在线视频| 91精品视频播放| 亚洲区中文字幕| 97国产在线观看| 91九色蝌蚪国产| 97人人做人人爱| 亚洲深夜福利视频| 欧美激情videoshd| 精品日本高清在线播放| 91在线网站视频| 欧美性资源免费| 亚洲国产精品大全| 96精品久久久久中文字幕| 国产午夜精品视频免费不卡69堂| 国产精品爽爽ⅴa在线观看| 91精品国产91| 国产精品美女在线观看| 国内精品久久久久久| 川上优av一区二区线观看| 久久国产精品视频| 国产精品自产拍在线观看| 精品无人区乱码1区2区3区在线| 国产精品美女主播| 日韩高清人体午夜| 欧美日韩成人在线视频| 97超级碰在线看视频免费在线看| 国产精品一区二区三区久久| 日韩欧美在线中文字幕|