2016-07-01 8 views
1

Мы используем SSDT для развертывания наших изменений в базе данных. У нас есть сценарий, который обновляет индекс каждую неделю. Наш скрипт выглядит следующим образом:using ssdt, как я могу создать отфильтрованный индекс за последние 7 дней?

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 миллионами миллионов строк в хранилище данных.

ответ

2

Есть несколько вариантов, в порядке сложности:

  • Не включать определение индекса в проекте и отключить «Drop индексов не в источнике» вариант. В Visual Studio это находится в диалоговом окне «Дополнительные параметры» диалогового окна «Опубликовать». При использовании SqlPackage.exe для публикации вы можете использовать параметр/p: DropIndexesNotInSource = false
  • Не включайте определение индекса в проект и поместите скрипт создания индекса в сценарий после развертывания. Это гарантирует, что индекс всегда воссоздается после развертывания обновлений схемы.
  • Используйте создателя, созданного сообществом, чтобы отфильтровать изменения этого индекса. См. https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-Deployments
  • Создайте вкладку для развертывания, чтобы отфильтровать изменения этого индекса. См. https://github.com/Microsoft/DACExtensions/