小编nat*_*vin的帖子

减小 varchar 列的大小会对数据库文件产生什么影响?

我们的数据库中有许多表,VARCHAR(MAX)其中包含 a VARCHAR(500)(或远小于 max 的值)就足够的列。当然,我想清理这些,并将尺寸缩小到更合理的水平。我明白如何做到这一点:我的问题是改变这些列会对磁盘上​​的页面和现存内容产生什么影响?(有很多关于当你增加一个列时会发生什么的信息,但是很难找到当你缩小一个时会发生什么的信息。)

有些表的行数非常少,所以我不担心更改的成本,但有些表非常大,我担心它们可能会被重组并导致大量阻塞/停机。实际上,我只是想要一种估计维护窗口的方法。一般来说,我想更好地了解数据库引擎在这种情况下的行为。

提前致谢!

编辑:

我正在查看 20 个表,但其中只有一半的行数大于 1,000。最大的有近一百万行。最糟糕的是一张有 350,000 行和 4VARCHAR(MAX)列的表格,可以缩小到一个VARCHAR(500)水平。

sql-server varchar disk-space sql-server-2012

16
推荐指数
1
解决办法
1万
查看次数

批量更改表添加列,但使用 NEWSEQUENTIALID()

我有一个很大的表,但不是很大(在老化的硬件上少于 200 万行),并且当向现有表添加不可空列时,我通常遵循此处列出的结构,以避免脚本超时的问题我们的数据库迁移在部署上运行(仅供参考 - 这不是全文索引问题)。

所以,总而言之,我:

  • 更改表并将列添加为 NULL 并且不添加默认约束
  • 批量回填柱
  • 更改表并将列更改为 NOT NULL 并添加默认约束

但是,在以下情况下,我想添加一个新的 UNIQUEIDENTIFER 列并用 NEWSEQUENTIALID() 而不是 NEWID() 值填充它。

如果不批量运行,我的脚本将如下所示:

IF NOT EXISTS (
    SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Invoice' 
    AND COLUMN_NAME = 'InternalId')
BEGIN
    ALTER TABLE Invoice 
        ADD InternalId UNIQUEIDENTIFIER NOT NULL 
        CONSTRAINT [DF_Invoice_InternalId] DEFAULT (NEWSEQUENTIALID())
END
GO
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其分成批次,并尝试使用以下内容填充可为空的 InternalId:

IF NOT EXISTS (
    SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Invoice' 
    AND COLUMN_NAME = 'InternalId')
BEGIN
    ALTER TABLE Invoice 
        ADD InternalId UNIQUEIDENTIFIER …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

7
推荐指数
1
解决办法
1591
查看次数

当我已经在运行 SQL Server 2014 时,我应该安装 SQL Server 2012 SP3 吗?

我们已经运行 SQL Server 2014 将近一年了,但 SQL Server 2012 SP3 继续出现在 Windows 更新列表中(作为可选安装)。从以前的版本安装服务包似乎很荒谬,所以我只是忽略了它。

但是,我们最近开始遇到断言失败(有关更多信息,请参见下文),我们正在尝试解决的一件事是确保服务器已完全修补。我们安装了 2014 年最新的累积更新,但它没有解决问题或使 SP3 项目从 Windows 更新中消失。SP3 仍然不在我的关注范围内,但后来我发现了一篇Microsoft 产品支持服务博客文章,其中说使用最佳实践安全分析器来尝试解决断言失败,当我这样做时,它提出了一个警告,我们没有应用那个SP3。

所以现在我正在考虑应用该安装,但我担心我会不小心降级我的服务器 - 不是我们会完全回到 2012 年,而是一些累积更新可能会被还原,或者其他一些奇怪的行为。

不是我们收到的确切断言失败,但它很接近。我找不到似乎描述我们遇到的实际问题的知识库文章 - 上一句中链接的知识库与TOP N我们的有关与使用 的过程有关OFFSET X ROWS FETCH NEXT Y ROWS ONLY。实际的断言失败是SQL Server Assertion: File: <op_ppqte.cpp>, line=12258)

sql-server installation sql-server-2012 service-pack sql-server-2014

2
推荐指数
1
解决办法
2177
查看次数