Какова область действия временного индекса для постоянной таблицы? - PullRequest
0 голосов
/ 09 мая 2018

В рамках хранимой процедуры я создал этот индекс:

CREATE NONCLUSTERED INDEX #IX_MyTempIndex ON dbo.MyPermTable (ColumnA, ColumnB) INCLUDE (ColumnC);

Несколько дней спустя из другого сеанса другой пользователь получил ошибку "... индекс или статистика с именем '#IX_MyTempIndex' уже существует в таблице 'dbo.MyPermTable'."

1) Это правильный способ указать временный индекс для постоянной таблицы?
2) В каком событии или области действия временный индекс исчезнет?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Не существует такого понятия, как «Временный указатель».

Вы можете создать временную таблицу с индексом, и в силу того, что таблица временная, индекс тоже будет, но это не то же самое, что вы описываете.

Если вам было разрешено создать индекс, почему бы не сохранить индекс, необходимый для вашего запроса? Просто оцените это и убедитесь, что это хороший показатель для вашей таблицы. Вам не нужен дополнительный индекс, который очень похож на один дополнительный столбец, или другой неэффективный сценарий.

На данный момент вам нужно задать себе несколько серьезных вопросов о выполняемом запросе:

Вы агрегируете элементы в этой таблице и только в этой таблице? Вы присоединяетесь к другим столам? Как много? Они правильно проиндексированы? Как часто эта таблица обновляется, удаляется, вставляется и т. Д.? Как часто выполняется моя процедура?

Учитывая ответ на эти и, возможно, другие вопросы, вы будете знать, действительно ли у вас должен быть индекс на столе. Или, если вам нужно создать временную таблицу или представление для выполнения работы в вашей процедуре. В любом случае вы не захотите создавать индекс, выполнять какую-то работу, удалять индекс. Вы потеряете больше, чем получите.

Например, если вы выполняете некоторые агрегации для значений только в этой таблице, и они занимают некоторое время, может быть полезно просто скопировать всю таблицу в представление или временную таблицу. Это освободит базовую таблицу от ваших блокировок быстрее, чем выполнить агрегирование, если нет, просто выполните свою работу с базовой таблицей.

Если вы будете использовать его снова и снова, используйте представление, вам не придется каждый раз воссоздавать его, и оно будет обновляться при запуске sproc. Если выполнение агрегации на клоне все еще идет медленно, вы можете поместить индексы в представление или временную таблицу.

Если вы sproc нуждаетесь в соединениях, вероятно, вам следует проиндексировать соответствующие таблицы. В противном случае, независимо от того, что вы делаете с одной таблицей, в конечном итоге неоптимизированные таблицы приведут вас вниз.

0 голосов
/ 09 мая 2018

Создание индексов на постоянной таблице с помощью хранимой процедуры не рекомендуется. Этот индекс будет создан на вашем постоянном столе и будет там всегда, если вы не удалите его. Пожалуйста, посмотрите на картинку ниже.

Если вы создадите индекс для временной таблицы, он будет удален после завершения сеанса.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...