Сначала вы должны удалить индекс, затем автоматически удаляется его статистика, которая была создана с тем же именем, что и index. Так что я не думаю, что вам нужно сбрасывать статистику вручную.
SQL Сервер отслеживает созданную пользователем статистику через sys.stats , т.е. user_created. Вот почему при создании нового индекса, чтобы избежать этой ошибки, мы должны добавить следующий код IF EXISTS () перед фактическим кодом создания индекса.
Вот пример:
IF EXISTS ( SELECT *
FROM sys.indexes
WHERE name = N'IX_TestTable_1'
AND object_id = OBJECT_ID(N'[dbo].[TestTable]') )
DROP INDEX [dbo].[TestTable].[IX_TestTable_1]
GO
IF EXISTS ( SELECT *
FROM sys.stats
WHERE name = N'IX_TestTable_1'
AND object_id = OBJECT_ID(N'[dbo].[TestTable]')
AND user_created = 1 )
DROP STATISTICS [dbo].[TestTable].[IX_TestTable_1]
GO
CREATE NONCLUSTERED INDEX IX_TestTable_1 ON TestTable(Col1)
Должен имейте в виду, что можно удалить только статистику, созданную пользователем. Поэтому, если мы просто проверим наличие статистики по имени, он вернет ИСТИНА, но когда он попытается сбросить эту статистику, он выдаст следующую ошибку.
Cannot DROP the index ‘[dbo].[TestTable].[IX_TestTable_1]’ because it is not a statistics collection.
Пожалуйста, проверьте это, чтобы узнать о sys.stats (Transact- SQL)
auto_created: указывает, была ли статистика автоматически создана SQL Сервером.
0 = Статистика не создавалась автоматически на SQL Сервер.
1 = Статистика была автоматически создана SQL Сервером.