nat*_*vin 16 sql-server varchar disk-space sql-server-2012
我们的数据库中有许多表,VARCHAR(MAX)其中包含 a VARCHAR(500)(或远小于 max 的值)就足够的列。当然,我想清理这些,并将尺寸缩小到更合理的水平。我明白如何做到这一点:我的问题是改变这些列会对磁盘上的页面和现存内容产生什么影响?(有很多关于当你增加一个列时会发生什么的信息,但是很难找到当你缩小一个时会发生什么的信息。)
有些表的行数非常少,所以我不担心更改的成本,但有些表非常大,我担心它们可能会被重组并导致大量阻塞/停机。实际上,我只是想要一种估计维护窗口的方法。一般来说,我想更好地了解数据库引擎在这种情况下的行为。
提前致谢!
编辑:
我正在查看 20 个表,但其中只有一半的行数大于 1,000。最大的有近一百万行。最糟糕的是一张有 350,000 行和 4VARCHAR(MAX)列的表格,可以缩小到一个VARCHAR(500)水平。
Sol*_*zky 12
第一件事:表中有多少数据?表的行数和大小?
第二:您能否将此表备份并恢复到测试服务器并运行alter 语句以查看影响(假设由于表太大而无法安装在非生产系统上,这不是不可行的)?我总是发现在我的环境中进行测试比来自互联网的建议更准确,因为有几个因素可能会影响结果,而这些因素可能只是由于不知道这些因素会影响结果而无法在问题中提供。
第三:增加一个可变长度字段的大小是(假设你没有超过8060字节的限制去),因为没有实际的数据将被改变了这种操作简单的元数据操作。但是,另一方面,减少可变长度字段的大小,即使减少到显然更有效的大小,也不是简单的元数据更改,因为 SQL Server 在扫描所有行之前并不知道,新请求的大小是有效的。
因此:是的,这会将表锁定一段时间。多少时间?好吧,这是我刚刚做的测试:
我从其他一些测试中得到了一个包含单个INT NOT NULL字段和 100 万行的表。为了通过以下方式进行此测试,我将其复制到新表中:
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我从一个类似的场景开始,即拥有一个MAX字段(我刚刚意识到您拥有VARCHAR并且我正在使用NVARCHAR,但这不应该改变我看到的行为)然后我可以更改为500. 它的数据可以轻松容纳在 500 个字符以内。那花了几分钟。
然后我跑了:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
Run Code Online (Sandbox Code Playgroud)
而这仅用了 11 分钟多一点。
我只是再次重新运行测试,这次放下[ResizeTest]桌子并将两个NVARCHARs都更改为 just VARCHAR,只是为了确保我将苹果与至少看起来像苹果的东西进行比较;-)。
最初的表创建需要 20 秒,而ALTER TABLE需要 2 分钟。
因此,就估计停机时间而言,这真的很难做到,因为它基于磁盘 I/O 速度,是否需要对数据文件和/或事务日志等进行任何自动增长操作。这可能是为什么我的第一个测试需要 11 分钟来更改而第二个,即使VARCHAR是NVARCHAR数据大小的一半,也只用了 2 分钟(即文件在那时预先生成)的很大一部分。但是,您仍然应该记住,我的测试是在我的笔记本电脑上运行的,这不是最快的磁盘,但它也只有 100 万行,每行 2 个小列(每行 22 个字节左右)。
既然你问它会对数据页做什么,这就是你的答案。我sp_spaceused在创建表之后、在执行ALTER COLUMN之后和执行之后做了一个ALTER TABLE dbo.ResizeTest REBUILD;。结果(以下数字基于使用 的第二次测试VARCHAR,而不是使用的第一次测试NVARCHAR):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
Run Code Online (Sandbox Code Playgroud)
如果您担心需要将操作保持在尽可能短的时间内,请查看我写的一篇关于这样做的文章:在几秒钟内重组 1 亿行(或更多)表。SRSLY!(需要免费注册)。
| 归档时间: |
|
| 查看次数: |
13368 次 |
| 最近记录: |