自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分享一個(gè)SQLSERVER腳本

數(shù)據(jù)庫 SQL Server
在這里就給大家一個(gè)例子了,在工作中,程序員是不會(huì)關(guān)心他要查詢的數(shù)據(jù)的大小的,他不管三七二十一只要把數(shù)據(jù)select出來就行了,然后收工。

很多時(shí)候我們都需要計(jì)算數(shù)據(jù)庫中各個(gè)表的數(shù)據(jù)量和每行記錄所占用空間。

這里共享一個(gè)腳本:

  1. CREATE TABLE #tablespaceinfo  
  2.     (  
  3.       nameinfo VARCHAR(50) ,  
  4.       rowsinfo BIGINT ,  
  5.       reserved VARCHAR(20) ,  
  6.       datainfo VARCHAR(20) ,  
  7.       index_size VARCHAR(20) ,  
  8.       unused VARCHAR(20)  
  9.     )    
  10.    
  11. DECLARE @tablename VARCHAR(255);    
  12.    
  13. DECLARE Info_cursor CURSOR 
  14. FOR 
  15.     SELECT  '[' + [name] + ']' 
  16.     FROM    sys.tables  
  17.     WHERE   type = 'U';    
  18.    
  19. OPEN Info_cursor    
  20. FETCH NEXT FROM Info_cursor INTO @tablename    
  21.    
  22. WHILE @@FETCH_STATUS = 0  
  23.     BEGIN   
  24.         INSERT  INTO #tablespaceinfo  
  25.                 EXEC sp_spaceused @tablename    
  26.         FETCH NEXT FROM Info_cursor    
  27.     INTO @tablename    
  28.     END   
  29.    
  30. CLOSE Info_cursor    
  31. DEALLOCATE Info_cursor    
  32.    
  33. --創(chuàng)建臨時(shí)表  
  34. CREATE TABLE [#tmptb]  
  35.     (  
  36.       TableName VARCHAR(50) ,  
  37.       DataInfo BIGINT ,  
  38.       RowsInfo BIGINT ,  
  39.       Spaceperrow AS ( CASE RowsInfo  
  40.                          WHEN 0 THEN 0  
  41.                          ELSE DataInfo / RowsInfo  
  42.                        END ) PERSISTED  
  43.     )  
  44.  
  45. --插入數(shù)據(jù)到臨時(shí)表  
  46. INSERT  INTO [#tmptb]  
  47.         ( [TableName] ,  
  48.           [DataInfo] ,  
  49.           [RowsInfo]  
  50.         )  
  51.         SELECT  [nameinfo] ,  
  52.                 CAST(REPLACE([datainfo], 'KB'''AS BIGINTAS 'datainfo' ,  
  53.                 [rowsinfo]  
  54.         FROM    #tablespaceinfo  
  55.         ORDER BY CAST(REPLACE(reserved, 'KB'''AS INTDESC    
  56.  
  57.  
  58. --匯總記錄  
  59. SELECT  [tbspinfo].* ,  
  60.         [tmptb].[Spaceperrow] AS '每行記錄大概占用空間(KB)' 
  61. FROM    [#tablespaceinfo] AS tbspinfo ,  
  62.         [#tmptb] AS tmptb  
  63. WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]  
  64. ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB'''AS INTDESC    
  65.  
  66. DROP TABLE [#tablespaceinfo]  
  67. DROP TABLE [#tmptb] 

注意:使用之前要計(jì)算哪個(gè)數(shù)據(jù)庫的記錄,請(qǐng)先USE一下要統(tǒng)計(jì)表記錄數(shù)的那個(gè)數(shù)據(jù)庫?。?/strong>


工作中遇到的問題

可以說我在實(shí)際的工作中 ,在100個(gè)問題中有90個(gè)都會(huì)先用到這個(gè)腳本。

這里舉一個(gè)我本人工作中遇到的一些問題。

問題一:

程序員反映數(shù)據(jù)庫查詢慢,5分鐘還沒有出結(jié)果。

我先用這個(gè)腳本看一下這個(gè)表有多少記錄,大概有1000w+條數(shù)據(jù)。

然后在本地的SSMS里查詢,確實(shí)也是大概4分鐘的樣子才出來數(shù)據(jù),看一下執(zhí)行計(jì)劃,發(fā)現(xiàn)查詢能使用到索引。

看一下數(shù)據(jù)庫的壓力,并不是很大,我跟會(huì)不會(huì)跟數(shù)據(jù)量有關(guān)系呢?

程序員要查詢的結(jié)果條數(shù)是500條數(shù)據(jù),業(yè)務(wù)表是做了分區(qū)的,按道理應(yīng)該不會(huì)慢成這樣。。。

后來我再看一下共享出來的那個(gè)腳本的結(jié)果,發(fā)現(xiàn)查詢的結(jié)果大小=每行記錄的大小*記錄數(shù)。

要查詢大概500MB的數(shù)據(jù),再傳到客戶端,不慢才怪。

為什麼查詢出的結(jié)果這么大?

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

并且時(shí)間范圍跨度比較大

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

問題二:

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

再結(jié)合當(dāng)前服務(wù)器的磁盤可用空間,來評(píng)估刪除的數(shù)據(jù)是否太多或者太少。

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

如果沒有每行記錄數(shù)這個(gè)字段,那么你手工計(jì)算,是不是效率就變慢了???

問題三:

導(dǎo)數(shù)據(jù)的時(shí)候,你想知道當(dāng)前已經(jīng)導(dǎo)了多少數(shù)據(jù)了,那么執(zhí)行一下這個(gè)腳本就可以了,這個(gè)腳本基本不會(huì)被阻塞。

很快就能查出結(jié)果。


腳本的計(jì)算方法

方法一

實(shí)際上利用的就是數(shù)據(jù)行大小的信息除以記錄數(shù)

  1. CASE RowsInfo  
  2. WHEN 0 THEN 0  
  3. ELSE DataInfo / RowsInfo 

方法二

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

#p#

說一下兩種方法的區(qū)別:

第一種方法是效率高,當(dāng)表有上億條記錄的時(shí)候,如果你使用第二種方法執(zhí)行AVG(DATALENGTH(C0))是很慢的,因?yàn)镾QLSERVER要統(tǒng)計(jì)字段大小信息。

可能十幾分鐘都出不來結(jié)果。

當(dāng)然,第一種方法也有一些缺陷,就是當(dāng)表的記錄數(shù)少的時(shí)候,統(tǒng)計(jì)出來的每行記錄占用空間是不準(zhǔn)確的。

因?yàn)閐atainfo這個(gè)值是以數(shù)據(jù)頁大小為單位的,因?yàn)榫退惚碇挥幸粭l記錄,那么也會(huì)占用一個(gè)數(shù)據(jù)頁(8KB)

那么當(dāng)8KB/1 =8KB,一條記錄肯定不會(huì)是8KB大小的,所以記錄少的時(shí)候會(huì)不準(zhǔn)確。

但是當(dāng)記錄數(shù)很多的時(shí)候,就準(zhǔn)確了。

看一下TB106這個(gè)表統(tǒng)計(jì)出來的結(jié)果值

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

可以看到是比較準(zhǔn)確的

注意:

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


總結(jié)

大家平時(shí)一定會(huì)想:究竟DBA有什么作用?

在這里就給大家一個(gè)例子了,在工作中,程序員是不會(huì)關(guān)心他要查詢的數(shù)據(jù)的大小的,他不管三七二十一只要把數(shù)據(jù)select出來就行了,然后收工。

DBA這里就要解決數(shù)據(jù)查詢不出來的問題,一般的程序員覺得查詢500條數(shù)據(jù)是很少的,根本不會(huì)關(guān)心表設(shè)計(jì),表的字段的數(shù)據(jù)類型。

當(dāng)工作越來越多,開發(fā)任務(wù)越來越重的時(shí)候更是這樣。

所以本人覺得DBA這個(gè)角色還是比較重要的o(∩_∩)o 

如有不對(duì)的地方,歡迎大家拍磚o(∩_∩)o 

2014-7-7 腳本bug修復(fù)

由于算出來每行記錄的精度有問題,我又對(duì)腳本的精度進(jìn)行了改進(jìn)

  1. CREATE TABLE #tablespaceinfo  
  2.     (  
  3.       nameinfo VARCHAR(50) ,  
  4.       rowsinfo BIGINT ,  
  5.       reserved VARCHAR(20) ,  
  6.       datainfo VARCHAR(20) ,  
  7.       index_size VARCHAR(20) ,  
  8.       unused VARCHAR(20)  
  9.     )    
  10.    
  11. DECLARE @tablename VARCHAR(255);    
  12.    
  13. DECLARE Info_cursor CURSOR 
  14. FOR 
  15.     SELECT  '[' + [name] + ']' 
  16.     FROM    sys.tables  
  17.     WHERE   type = 'U';    
  18.    
  19. OPEN Info_cursor    
  20. FETCH NEXT FROM Info_cursor INTO @tablename    
  21.    
  22. WHILE @@FETCH_STATUS = 0  
  23.     BEGIN   
  24.         INSERT  INTO #tablespaceinfo  
  25.                 EXEC sp_spaceused @tablename    
  26.         FETCH NEXT FROM Info_cursor    
  27.     INTO @tablename    
  28.     END   
  29.    
  30. CLOSE Info_cursor    
  31. DEALLOCATE Info_cursor    
  32.    
  33. --創(chuàng)建臨時(shí)表  
  34. CREATE TABLE [#tmptb]  
  35.     (  
  36.       TableName VARCHAR(50) ,  
  37.       DataInfo BIGINT ,  
  38.       RowsInfo BIGINT ,  
  39.       Spaceperrow  AS ( CASE RowsInfo  
  40.                          WHEN 0 THEN 0  
  41.                          ELSE CAST(DataInfo AS decimal(18,2))/CAST(RowsInfo AS decimal(18,2))  
  42.                        END ) PERSISTED  
  43.     )  
  44.  
  45. --插入數(shù)據(jù)到臨時(shí)表  
  46. INSERT  INTO [#tmptb]  
  47.         ( [TableName] ,  
  48.           [DataInfo] ,  
  49.           [RowsInfo]  
  50.         )  
  51.         SELECT  [nameinfo] ,  
  52.                 CAST(REPLACE([datainfo], 'KB'''AS BIGINTAS 'datainfo' ,  
  53.                 [rowsinfo]  
  54.         FROM    #tablespaceinfo  
  55.         ORDER BY CAST(REPLACE(reserved, 'KB'''AS INTDESC    
  56.  
  57.  
  58. --匯總記錄  
  59. SELECT  [tbspinfo].* ,  
  60.         [tmptb].[Spaceperrow] AS '每行記錄大概占用空間(KB)' 
  61. FROM    [#tablespaceinfo] AS tbspinfo ,  
  62.         [#tmptb] AS tmptb  
  63. WHERE   [tbspinfo].[nameinfo] = [tmptb].[TableName]  
  64. ORDER BY CAST(REPLACE([tbspinfo].[reserved], 'KB'''AS INTDESC    
  65.  
  66. DROP TABLE [#tablespaceinfo]  
  67. DROP TABLE [#tmptb] 

本文出自:http://www.cnblogs.com/lyhabc/p/3828496.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2022-07-30 07:50:40

數(shù)據(jù)庫字段存儲(chǔ)

2020-12-11 07:00:42

MySQL數(shù)據(jù)庫備份腳本

2021-12-23 09:50:46

Python游戲腳本

2015-04-30 08:03:36

2020-12-16 09:53:46

Redis腳本運(yùn)維

2020-12-29 11:04:57

Linux安裝系統(tǒng)RedHat

2023-03-17 18:33:12

ChatGPTLLM應(yīng)用

2022-12-28 12:29:45

duf命令

2023-11-28 14:22:54

Python音頻

2019-08-09 13:50:08

shellLinux

2019-11-28 08:25:53

Linux腳本SSH

2020-06-02 09:22:45

腳本CPUDDG

2018-11-16 17:00:05

Python腳本數(shù)據(jù)分析

2022-05-26 08:12:52

debugSpringFeign

2019-08-02 15:39:06

PythonLinuxJSON

2010-03-02 16:33:14

linux數(shù)據(jù)備份

2013-09-09 16:11:10

2011-08-23 17:42:42

Lua腳本

2011-06-02 10:23:33

程序員

2017-09-15 15:13:33

效果設(shè)備UI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)