SQL Server确定表列的物理大小

and*_*dyJ 14 sql-server

是否有可能找出表中各列的数据大小(KB或MB)?我有一个脚本告诉我每个表的物理大小,但我想知道数据库中的某些列占用了多少,特别是当我将XML存储在列中时.

任何帮助非常感谢

干杯

And*_*rew 24

您应该能够使用datalength函数,例如

select sum(datalength(yourfield))
from yourtable
Run Code Online (Sandbox Code Playgroud)

这将总结表中该字段的所有条目的数据长度 - 它不会考虑诸如可变长度字段指针,可空性位图中的空间等的开销.

  • 应当注意,这返回了以字节为单位的长度-我发现这对于我的目的很有用。从您的表中选择concat(sum(datalength(yourfield))/ 1024,'kb') (2认同)

inf*_*ent 9

这将返回特定数据库中的所有列及其数据大小,并且可以轻松更新为仅返回特定表或列的数字。

USE [YourDatabase]
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #temp (tablename varchar(max), columnname varchar(max), sizeinkb float)

DECLARE MY_CURSOR Cursor LOCAL FAST_FORWARD 
FOR SELECT table_name, column_name, table_schema FROM INFORMATION_SCHEMA.COLUMNS

Open My_Cursor 
DECLARE @table varchar(max), @column varchar(max), @schema varchar(max)
Fetch NEXT FROM MY_Cursor INTO @table, @column, @schema
While (@@FETCH_STATUS <> -1)
BEGIN
    DECLARE @sql varchar(1000) = 'INSERT #temp SELECT ''' + @schema + '.' + @table + ''', ''' + @column + ''', sum(isnull(datalength([' + @column + ']), 0)) / 1024.0 FROM [' + @schema + '].[' + @table + '] (NOLOCK)'
    EXEC (@sql)

    FETCH NEXT FROM MY_CURSOR INTO @table, @column, @schema
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

SELECT *, sizeinkb / 1024.0 sizeinmb FROM #temp ORDER BY 3 DESC
Run Code Online (Sandbox Code Playgroud)


moh*_*deh 6

对于“表的所有列”的视图大小,您可以首先使用以下命令生成表的字段:

SELECT 'SUM(DATALENGTH('+Column_name+')) / (1024*1024) as '+Column_name+'_MB,'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '--TABLE_NAME--'
Run Code Online (Sandbox Code Playgroud)

接下来,运行此查询:

SELECT
    /*result previous query (with remove last comma)*/
FROM --TABLE_NAME--
Run Code Online (Sandbox Code Playgroud)