2020年2月23日 星期日

MSSQL 查詢資料表大小

SET NOCOUNT ON

--http://msdn.microsoft.com/zh-tw/library/ms188414.aspx
--更新目前資料庫中之所有物件的頁面及 (或) 資料列計數
DBCC UPDATEUSAGE(0)

-- DB size.
EXEC sp_spaceused

-- Table row counts and sizes.
CREATE TABLE #t
(
    [name] NVARCHAR(128),
    [rows] CHAR(11),
    reserved VARCHAR(18),
    data VARCHAR(18),
    index_size VARCHAR(18),
    unused VARCHAR(18)
)

--把每個Table使用的資訊存到#t之中
INSERT #t EXEC sys.sp_MSforeachtable 'EXEC sp_spaceused ''?'''

--依使用空間較大的依序排列並顯示MB
SELECT *, LTRIM(STR(CAST(LEFT(reserved,LEN(reserved)-3) AS NUMERIC(18,0)) / 1024, 18))
AS reservedSize_M
, LTRIM(STR(CAST(LEFT(data,LEN(data)-3) AS NUMERIC(18,0)) / 1024, 18)) + 'MB'
AS dataSize_M
, LTRIM(STR(CAST(LEFT(index_size,LEN(index_size)-3) AS NUMERIC(18,0)) / 1024, 18)) + 'MB'
AS indexSize_M
FROM #t
ORDER BY CAST(LEFT(data,LEN(data)-3) AS NUMERIC(18,0)) DESC

-- 顯示總共筆數及總共使用資訊
SELECT SUM(CAST([rows] AS int)) AS [rows]
, LTRIM(STR(SUM(CAST(LEFT(reserved,LEN(reserved)-3) AS NUMERIC(18,0))) / 1024, 18)) + 'MB'
AS sumOfreservedSize_M
, LTRIM(STR(SUM(CAST(LEFT(data,LEN(data)-3) AS NUMERIC(18,0))) / 1024, 18)) + 'MB'
AS sumOfdataSize_M
, LTRIM(STR(SUM(CAST(LEFT(index_size,LEN(index_size)-3) AS NUMERIC(18,0))) / 1024, 18)) + 'MB'
AS sumOfindexSize_M
FROM #t

DROP TABLE #t

MS SQL刪除超大型資料

工作中有时候需要清理历史数据的时候,往往数据量达到了几百万.这个时候采用一次性删除的方法是很不明智的: a.delete操作会被完整记录到日志里,它需要大量空间和时间; b.如果删除中间发生中断,一切删除会回滚(在一个事务里); c.同时删除多行,记录上的锁也许会被提升为排它表锁,从而阻碍操作完成之前有对这个表的操作(有时候会妨碍正常的业务) 所以一般采取分批删除的方法. sql2000:通过set rowcount 来控制每次删除的记录数 SET ROWCOUNT 5000; WHILE 1 = 1 BEGIN DELETE FROM dbo.LargeOrders WHERE OrderDate < '19970101'; IF @@rowcount < 5000 BREAK; END SET ROWCOUNT 0; sql2005:通过TOP的方法 WHILE 1 = 1 BEGIN DELETE TOP(5000) FROM dbo.LargeOrders WHERE OrderDate < '19970101'; IF @@rowcount < 5000 BREAK; END -----------------