两个不同的创建索引命令之间的差异

Mac*_*ver 2 index sql-server-2008 sql-server

这两个脚本之间有区别吗?或者,第一个脚本的所有额外标记/属性(即:NONCLUSTEREDWITH...等...)是否都是 SQL Server 2008 中第二个脚本的默认值?

1脚本:

CREATE UNIQUE NONCLUSTERED INDEX [DEID_MAP_IDX1] ON [dbo].[DEID_MAP]
(
    [VISIT_NUM] ASC
) WITH 
  (PAD_INDEX  = OFF, 
   STATISTICS_NORECOMPUTE  = OFF, 
   IGNORE_DUP_KEY  = OFF, 
   ALLOW_ROW_LOCKS = ON, 
   ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

2脚本:

CREATE UNIQUE INDEX [DEID_MAP_IDX1] ON [DEID_MAP] 
(
    [VISIT_NUM] ASC
);
Run Code Online (Sandbox Code Playgroud)

仅供参考:在执行批量数据加载之前,有 ETL 代码使用此脚本删除索引,然后最后使用上面的第二个脚本重新创建索引。

DROP INDEX [deid_map_idx1] ON [deid_map] WITH ( ONLINE = OFF );
Run Code Online (Sandbox Code Playgroud)

编辑:

应用上面的简单索引(第二个脚本)后,我得到了这个:

SQL Server Management Studio > 扩展表 > 扩展文件夹“索引”> 右键单击​​索引> 选择“脚本索引为..”> 选择“创建到”> 选择“新查询编辑器窗口”> 得到以下内容。

CREATE UNIQUE NONCLUSTERED INDEX [DEID_MAP_IDX1] ON [dbo].[DEID_MAP] 
(
    [VISIT_NUM] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

因此,这些似乎是通过运行简单语句添加的:

SORT_IN_TEMPDB = 关闭

DROP_EXISTING = 关闭

在线 = 关闭

Tho*_*ger 7

归结为查看默认值是什么。让我们分解一下:

CREATE UNIQUE NONCLUSTERED INDEX [DEID_MAP_IDX1] ON [dbo].[DEID_MAP]
Run Code Online (Sandbox Code Playgroud)

nonclustered在此处指定。默认值(即没有指定)是nonclustered. 因此,除非clustered指定,否则它将默认为nonclustered. 所以这在两个脚本中都是一样的。

[dbo]此处明确指定。至于第二个未指定,CREATE INDEX则完全取决于当前用户的默认架构是什么。目前只有您可以回答这个问题,因此可能会也可能不会默认为dbo

WITH (
    PAD_INDEX  = OFF, 
    STATISTICS_NORECOMPUTE  = OFF, 
    IGNORE_DUP_KEY  = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

PAD_INDEX:默认为OFF,因此未指定在第二个脚本中将与在第一个脚本中相同。

STATISTICS_NORECOMPUTE:默认为OFF,因此未指定的第二个脚本具有相同的值。

IGNORE_DUP_KEY: 默认为OFF,因此第二个CREATE INDEX与此参数相同。

ALLOW_ROW_LOCKS:默认为ON,因此第二个CREATE脚本具有相同的行为。

ALLOW_PAGE_LOCKS:默认是ON...第二个脚本具有相同的行为。

... ON [PRIMARY]:就像默认架构一样,这一切都取决于您的默认文件组是什么。如果PRIMARY是默认文件组,您的第二个CREATE INDEX脚本也将在 上创建索引PRIMARY。如果PRIMARY没有默认文件组,那么这将是一个不同的文件组,作为一个未指定文件组将转到默认文件组。

所有这些信息和默认值都可以在此处的 BOL 参考中找到