简单从句和详细从句的区别WITH
:
在 YouTube 教程SQL Server 教程 20:表、索引和行压缩中,示例有时5:43
包含一个简单的WITH
索引选项子句,only WITH (DATA_COMPRESSION = ROW)
。
USE myDatabase;
CREATE TABLE dbo.Ch7RowCompression
(
ID int PRIMARY KEY,
FirstName varchar(50),
LastName varchar(50),
BirthDate datetime
)
WITH (DATA_COMPRESSION = ROW);
但是,使用 GUI Management Studio,Storage > Manage Compression...
向导会生成带有更详细WITH
子句的命令,明确给出索引选项的值。例如,要压缩索引,它会获取以下示例命令:
ALTER INDEX [SALES_ORDER_CREATED_AT] ON [schema].[sales_order]
REBUILD PARTITION = ALL WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
, DATA_COMPRESSION = PAGE
)
关于 GUI Management Studio 行为的另一个观察结果:
GUI Management Studio 生成错误的命令来取消索引压缩。
我们已经Script Data Compression Options
在True
. Management Studio > Toolbar > Tools > Options... > SQL Server Object Explorer > Scripting > Object scripting options
测试中的系统有 Management Studio 2016 版本 13.0.16106.4 和 SQL Server 2016。如果您需要更多详细信息,请告诉我。
我们怀疑在索引上撤消压缩时系统行为是错误的:例如,通过将压缩从“Page”设置为“None”,向导将获取以下命令,missing DATA_COMPRESSION = NONE
。并且我们在测试中确认该命令不会撤消压缩。
ALTER INDEX [SALES_ORDER_CREATED_AT] ON [schema].[sales_order]
REBUILD PARTITION = ALL WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
)
不过,该向导可以正常撤消表上的压缩,并且生成的命令DATA_COMPRESSION = NONE
按预期包含。
我们的问题:
我们如何获得执行和取消压缩的 SQL Server 命令?通过 GUI 向导、手写还是更好的方法?
WITH
简单子句和带有显式索引选项的详细子句有什么区别?并且,当WITH
子句不包含选项时,默认值是什么?只是仔细检查一下,其他人是否在 GUI Management Studio 中看到相同的症状试图撤消索引压缩?不确定这是一个错误还是我们错过了一些东西。
我们感谢任何提示和建议。
创建 SSMS (SQL Server Management Studio) 的开发人员不一定是开发 SQL Server 产品本身的开发人员。因此,SSMS 自动生成的代码与某些场景的理想代码之间肯定存在一些差异。
最好的办法是始终自己编写脚本,而不是依赖 SSMS。除了让您学习和理解代码的实际用途之外,它还为您提供最大的灵活性和可靠性。
SSMS 生成的详细
WITH
子句仅包含可用的每个索引重建选项及其该索引的当前值,无论该选项是否是默认值,也无论该选项是否与压缩相关。SSMS 不会跟踪每个选项的默认值,因此为了安全起见,它只是生成每个选项及其当前值,以确保选项不会因省略而意外更改。这取决于特定选项及其正常默认值,这将在 Microsoft 关于 SQL Server 的文档中指定。
是的。Bug?...也许或可以说只是设计使然(确实缺乏设计)。