Отбрасывание гипотетических индексов

8

Раньше я думал, что удаляю гипотетические индексы, используя оператор DROP INDEX для кластеризованных индексов и оператор DROP STATISTICS для некластеризованных индексов.

У меня есть база данных, заполненная остатками DTA, которые я хотел бы очистить; однако, когда я пытаюсь отбросить объект, я всегда получаю сообщение об ошибке, говорящее мне, что я не могу отбросить объект «потому что он не существует или у вас нет разрешения». Я являюсь полным системным администратором на сервере, поэтому могу ожидать, что у меня есть права на все.

Я пробовал это с обоими операторами DROP STATS и DROP INDEX, но оба дают мне ту же ошибку.

Кто-нибудь удалял их раньше и есть ли хитрость, которую я пропускаю?


добавление

Оглядываясь на это, я просто заметил, что если я R-Click на объекте, опции «Script As» и «DELETE» будут недоступны.

PseudoToad
источник
Как насчет скриншота того, как выглядит гипотетический?
Джейсон Камберленд
Привет Джейсон. Запустите SELECT * FROM sys.indexes, ГДЕ is_hypothetical = 1
PseudoToad
DROP INDEX требует разрешения ALTER для таблицы. Можете ли вы выполнить мягкую инструкцию ALTER TABLE, чтобы проверить ваши разрешения? (Я знаю. Я знаю. Вы - системный администратор. Делайте это в любом случае.)
Майк Шеррилл 'Cat Recall'
1
Я предполагаю, что вы видите эти индексы в SSMS правильно? Если это так, попробуйте обновить ваше соединение и посмотреть, есть ли еще индексы. Возможно, они уже были удалены. Также DROP INDEXправильный синтаксис для кластеризованных и некластеризованных индексов. DROP STATISTICSспециально для статистики, которые разные.
Кеннет Фишер
Да ... Я в SSMS, и я пробовал все вышеописанное несколько раз. CheckDB чистый. Я даже пытался сделать это через o-SQL и SQLCMD, надеясь, что использование другого стека соединений освободит его. Я бросаю в полотенце и живу с ним. В какой-то момент я брошу и воссоздаю таблицы. Это определенно исправит это!
PseudoToad

Ответы:

5

Гипотетические индексы, созданные мастером настройки индекса, начинаются с имени «hind_%» и не должны существовать после завершения настройки; все они должны быть удалены. Вы можете запустить следующий скрипт из анализатора запросов SQL Server, чтобы удалить любые такие индексы, которые могут существовать. Вы должны войти в систему, используя учетную запись, которая имеет разрешения sysadmin или db_owner, или является владельцем объекта, для которого была создана эта статистика.

Например

ОБЪЯВИТЬ @strSQL nvarchar (1024) 
ОБЪЯВИТЬ @objid int 
ОБЪЯВИТЬ @indid tinyint 
ЗАЯВИТЕ ITW_Stats CURSOR FOR SELECT id, indid ОТ sysindexes, ГДЕ ИМЯ НРАВИТСЯ 'hind_%', ЗАКАЗАТЬ ПО ИМЕНИ 
OPEN ITW_Stats 
ПОЛУЧИТЬ СЛЕДУЮЩУЮ С ITW_Stats INTO @objid, @indid 
WHILE (@@ FETCH_STATUS -1) 
НАЧАТЬ 
SELECT @strSQL = (ВЫБЕРИТЕ случай, когда INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1, затем 'drop statistics [' else 'drop index [' end + OBJECT_NAME (i.id) + ']. [' + i.name + ']' 
ИЗ sysindexes я присоединяюсь к sysobjects o на i.id = o.id 
ГДЕ i.id = @objid и i.indid = @indid И 
(INDEXPROPERTY (i.id, i.name, 'IsHypothetical') = 1 ИЛИ
(INDEXPROPERTY (i.id, i.name, 'IsStatistics') = 1 И 
INDEXPROPERTY (i.id, i.name, 'IsAutoStatistics') = 0))) 
EXEC (@strSQL) 
ПОЛУЧИТЬ СЛЕДУЮЩУЮ С ITW_Stats INTO @objid, @indid
КОНЕЦ
ЗАКРЫТЬ ITW_Stats 
DEALLOCATE ITW_Stats

Выше скрипт предоставлен Microsoft для более подробной информации вы можете перейти по следующей ссылке. http://support.microsoft.com/kb/q293177

Сагар Махесана
источник
Привет Сэм. К сожалению, это возвращает меня к началу. Скрипт показывает мне гипотетические индексы и дает мне правильное выражение drop, которое я использовал все это время. Проблема в том, что оператор drop просто не работает. Я считаю, что это ошибка в двигателе, и я почти отказался от нее. В какой-то момент я сниму таблицы с производства, а затем отброшу / заново создаю все с нуля. Я знаю, что это исправит!
PseudoToad
2

Книги в Интернете включают несколько причин, по которым вы не сможете удалить индекс.

  • Индекс связан с ограничением первичного ключа.
  • Файловая группа находится в автономном режиме или только для чтения.
  • «Вы не можете удалить кластеризованный индекс онлайн, если индекс отключен в представлении или содержит столбцы text, ntext, image, varchar (max), nvarchar (max), varbinary (max) или xml в строках данных конечного уровня «.
  • У вас нет необходимых разрешений: «Для выполнения DROP INDEX требуется как минимум разрешение ALTER для таблицы или представления. Это разрешение предоставляется по умолчанию для предопределенной роли сервера sysadmin и предопределенных ролей базы данных db_ddladmin и db_owner. "

Могут быть и другие причины.

Майк Шеррилл 'Cat Recall'
источник
Спасибо майк Все они являются гипотетическими, поэтому не попадут ни в одну из этих категорий. Помимо этого, это все некластерные гипотетические индексы, которые рассматриваются как статистика для отбрасывания. В конечном итоге они не являются «реальными показателями».
PseudoToad
Как вы думаете, бег dbcc checktableнужен?
Майк Шеррилл 'Cat Recall'
Полная проверка чиста
PseudoToad
1

Это немного упрощенно, но если вы закончили с предложениями DTA, попробуйте удалить сеансы настройки с этого сервера через интерфейс DTA.

Matt
источник
Только что попробовал это - открыть DTA, подключиться к серверу, удалить все предыдущие сеансы. все еще имеют индекс DTA и статистику в базе данных.
Разван Зойтану