SQL数据库mdf文件巨大!求解决办法。

说其中一个数据库,版本2008R2,这个数据库中只有一张表,其中一个字段为varchar(8000),存储的都是中文。加上其他字段为一般的int或者varchar,都不长... 说其中一个数据库,版本2008R2,这个数据库中只有一张表,其中一个字段为varchar(8000),存储的都是中文。加上其他字段为一般的int或者varchar,都不长。整个表加起来我按最大算10000个字节。假设30万条记录,我是否可以这样计算占用空间大小 1万*30万/1024/1024/1024=2.8G 但事实上,在不足27万条记录的情况下,我的MDF文件已经90G了。
已经没有压缩百分比,该表有一个约束。使用过的方法:新建数据库,设置不自动更新统计,利用数据库导入数据功能将数据导入到新数据库中,结果还是几十个G。
展开
 我来答
wzpsfather
2012-05-08 · TA获得超过559个赞
知道小有建树答主
回答量:765
采纳率:33%
帮助的人:384万
展开全部
sql server的数据是按页存储的,页是记录存储的最小单位!一个页最多4096B左右,就是说一条记录的最大量应在4096之内,你的一个字段就为varchar(8000)了,整个表加起来按最大算10000个字节计算,一条记录需要占用3个页,第3个页面最少只占用了一少半,就不能再利用了。
建议你将一个表分成1:1的两个表或多个表来存储!
再有,可能建立了聚集类的索引,会使空间和存取效率都降低,不要建立聚集类的索引了!
万山数据
2024-11-14 广告
数据仓库处理是北京万山数据科技有限公司的核心业务之一。我们专注于高效、安全地处理大规模数据,通过先进的数据仓库技术,实现数据的集成、存储、管理和分析。我们的数据仓库解决方案能够支持复杂的数据查询和分析需求,提供实时的数据洞察,助力企业做出更... 点击进入详情页
本回答由万山数据提供
百度网友477033f12
2012-05-08 · TA获得超过125个赞
知道小有建树答主
回答量:236
采纳率:100%
帮助的人:301万
展开全部
他使用的是varchar,不是char,所以,最坏的情况是你说三页。
另外,聚集索引是一张表中最宝贵的资源,如果检索的是聚集索引列,数据读取的效率显然最高,怎么可能降低存取效率。
我觉得lz的这个现象还是得根据实际情况分析一下表空间的占用情况。附一个表空间查看语句(非原创):

USE [要查询空间信息的库名]
GO
SELECT
ServerName = CONVERT(sysname, SERVERPROPERTY('ServerName')),
DatabaseID = DB_ID(),
DatabaseName = DB_NAME(),
ObjectID = DATA.id,
Owner = USER_NAME(DATA.uid),
ObjectName = DATA.Name,
Reserved = CONVERT(decimal(15, 2), DATA.Reserved / SPER.PageSperMB),
DataSize = CONVERT(decimal(15, 2), (DATA.DataSize + DATA.[TextSize]) / SPER.PageSperMB),
IndexSize = CONVERT(decimal(15, 2), (DATA.IndexSize - DATA.DataSize - DATA.[TextSize]) / SPER.PageSperMB),
UnUsedSize = CONVERT(decimal(15, 2), (DATA.Reserved - DATA.IndexSize) / SPER.PageSperMB),
DATA.Rows
FROM(
SELECT
O.id, O.uid, O.name, O.xtype,
Reserved = ISNULL(SUM(CASE WHEN IX.indid IN (0, 1, 255) THEN CONVERT(dec(15), IX.reserved) ELSE 0 END), 0),
DataSize = ISNULL(SUM(CASE WHEN IX.indid < 2 THEN CONVERT(dec(15), IX.dpages) ELSE 0 END), 0),
[TextSize] = ISNULL(SUM(CASE WHEN IX.indid = 255 THEN CONVERT(dec(15), IX.used) ELSE 0 END), 0),
IndexSize = ISNULL(SUM(CASE WHEN IX.indid IN (0, 1, 255) THEN CONVERT(dec(15), IX.used) ELSE 0 END), 0),
Rows = ISNULL(MAX(CASE WHEN IX.indid < 2 THEN IX.rows ELSE 0 END), 0)
FROM dbo.sysindexes IX WITH(NOLOCK)
INNER JOIN dbo.sysobjects O WITH(NOLOCK)
ON IX.id = O.id
WHERE O.xtype IN ( 'U')--, 'S')
AND O.status > =0
AND (IX.indid < 2 OR IX.indid = 255)
GROUP BY O.id, O.uid, O.name, O.xtype
)DATA
CROSS JOIN(
SELECT PageSperMB = 1048576. / low, low
FROM master.dbo.spt_values
WHERE number = 1
AND type = 'E'
)SPER
ORDER BY ObjectName, Owner
GO
追问
话说我只有一张表。另外2个数据库有很多表,之前倒是查看过占用空间情况。软件开发人员说是软件存储的问题,导致异常增大,只是我没明白,无论软件怎么存储,数据插入到库到表应该都差不多吧,为什么就出现这种问题了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱可生云数据库
2020-12-21 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部

我有个大的 SQL 文件要回放,需要马上做,但又怕压死业务,怎么办?

先来建一个测试库:

塞一些数据进去:

看看我们填充数据的成果:

使用 mysqldump 导出一份数据:

现在我们假设要把这个 dump 文件,回放到一个数据库中,并且现在数据库正在承担很重的业务,我们不希望业务受到太大影响。

先来看看如果直接回放 dump 文件,会发生什么?

我们看到 MySQL 的 cpu 会彪起来,

我们换一个方式来回放 dump:

看看 CPU 压力:

可以看到 CPU 已经非常冷静,并且缓慢的处理数据。

💡小贴士:pv 工具既可以用于显示文件流的进度,也可以用于文件流的限速。在本实验中,我们用 PV 来限制 SQL 文件发到 MySQL client 的速度,从而限制 SQL 的回放速度,达到不影响其他业务的效果。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2017-07-13 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7787万
展开全部
统计信息用来存储什么的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式