使用ssdt,如何在最近7天创建过滤索引?

时间:2016-07-01 02:10:15

标签: sql-server-data-tools ssdt-bi

我们使用SSDT来部署我们的数据库更改。我们有一个脚本每周重新创建索引。我们的脚本如下所示:

declare @cmd varchar(max)
set @cmd = '
CREATE NONCLUSTERED INDEX [iAudit-ModifiedDateTime] ON [dbo].[Audit]
(
[ModifiedDateTime] ASC
)
WHERE ModifiedDateTime > ''###''
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY]
'
set @cmd = replace(@cmd, '###', convert(varchar(8), dateadd(day, -3, getdate()), 112))
exec (@cmd)

不幸的是,当我们运行SSDT来更新数据库时,它会将索引更改为项目中的定义,或者在未包含时将其删除。有什么方法可以解决这个问题吗? 我们需要过滤索引的原因是将包含100万个行的Audit表中的最新记录添加到数据仓库中。

1 个答案:

答案 0 :(得分:2)

有一些选项,按复杂程度排列:

  • 不要在项目中包含索引定义,并禁用不在源代码中的"删除索引"选项。在Visual Studio中,可以在“发布”对话框的“高级选项”对话框中找到它。使用SqlPackage.exe发布时,可以使用参数/ p:DropIndexesNotInSource = false
  • 不要在项目中包含索引定义,并将索引创建脚本放入部署后脚本中。这将确保在部署架构更新后始终重新创建索引。
  • 使用社区创作的部署参与者过滤掉对此索引的修改。请参阅https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-Deployments
  • 创建部署参与者以过滤掉对此索引的修改。请参阅https://github.com/Microsoft/DACExtensions/