如何获取SQL Server中所有数据类型所消耗的最大内存?

时间:2014-03-19 21:22:40

标签: sql sql-server sql-server-2008 sql-server-2005

是否可以获取数据类型所消耗的内存 SQL服务器?我想以这种方式获得记忆 -

Id, datatypes, base_memory (in bytes), memory_multiplier
1, varchar(x), 2, x
2, int, 2, 1
et cetra.

制作这样的桌子有什么问题吗?

我需要这张桌子,以便我可以用它来查找 一行ANY可以消耗的最大内存 sql server table。

如果没有用于获取我的表的SQL查询,那么 我可以手动创建一个表。但是,是我的桌子 正确的方法?

2 个答案:

答案 0 :(得分:1)

如果使用varchar(max),text,image等类型,可能会遇到问题,因为它们可能会占用大量内存 - 但是,您可能想要用作起点的是查看sys.columns,即

select top 1000 * from information_schema.columns

select top 1000 * from information_schema.columns where table_name = 'mytable'

查看结果,一些有趣的列是character_octet_length和character_maximum_length。但是你会看到类型生命整数将具有空值 - 尽管这些是屈服于你开始的方法的值。

ADDED

另请注意,文本/图像等不计入行大小的8K限制,因此根据您计算路径大小的原因,您可能希望排除。这不包括sql server用于存储行的一些额外数据库开销。

ADDED

像integer这样的固定大小元素将显示为null。您可以使用您开始使用的方法获得正确的大小,或使用等效的case语句获取以字节为单位的列大小。我不记得sql以你想要的格式提供这些数据。

ADDED后来记得

基本类型大小在sys.types中定义 - 不要以为我曾经使用过它,容易忘记。

答案 1 :(得分:0)

函数DATALENGTH(ColumnName)会有所帮助。它返回长度 以字节为单位的数据。

查询

SELECT COLUMN_NAME, DATALENGTH(COLUMN_NAME) as DataSize
from information_schema.columns where table_name = 'MyTableName'

这有效,但我不知道这种方法是否有任何陷阱。

表格的一行的最大尺寸 -

SELECT SUM(DataSize) AS MaxRowSize
FROM
(
SELECT COLUMN_NAME, DATALENGTH(COLUMN_NAME) as DataSize
from information_schema.columns where table_name = 'shop'
) AS SCHEM

您感兴趣的数据集的最大尺寸 -

DECLARE @maxRowSize int
SET @maxRowSize =
(
SELECT SUM(DataSize) AS MaxRowSize
FROM
(
SELECT COLUMN_NAME, DATALENGTH(COLUMN_NAME) as DataSize
from information_schema.columns 
where table_name = 'shop' -- enter table name only, do NOT enter the schema
) AS SCHEM
)
SELECT COUNT(Id) as NumOfRows, 
@maxRowSize as MaxRowBytes, 
COUNT(id) * @maxRowSize as MaxQueryBytes
FROM Shop -- Enter schema name if needed

购物表架构信息 -

COLUMN_NAME DataSize
id          4
date        8
sales       10

使用AdventureWorks2008R2数据库进行示例测试 -

将查询结果保存到文本文件中。查看文本文件的大小。如果它大约等于我的查询返回的值,那么我认为我们应该这样做 很高兴。

select * 
from person.Person
where FirstName = 'crystal'
-- Records = 22

文件:大小= 15.2KB 查询:6116字节

结果 - 对此表无效! :(

测试2 -

表薪水 -

[id] [int], [name] [varchar](50), [salary] [decimal](18, 2)

表 -

id  name            salary
1   azamat bagatov  100.50
2   borat           25.00
3   coci buchek     200.50

文件:大小= 65字节 查询:大小= 72字节。

结果 - 取得巨大成功???