У меня есть огромная таблица (миллиарды строк) в моей базе данных, которая находится в простой модели восстановления, и мне нужно создать обратный индекс для одного столбца.
Каков самый быстрый способ сделать это?
Очевидный способ слишком медленный и очень широко использует файлы журналов:
ALTER TABLE MyTable
ADD COLUMN Reverse_Column1 nvarchar(50);
UPDATE MyTable
SET Reverse_Column1 = REVERSE(Column1);
CREATE INDEX idx_Reverse_Column1 ON MyTable (Reverse_Column1);
Большое спасибо!
У вас уже есть индекс на Column1? Если да, то не могли бы вы просто изменить искомый текст в ваших SQL-запросах, чтобы использовать этот существующий индекс?
Создание индекса для вычисляемого столбца было бы быстрее, но я бы сначала попробовал вышеприведенное предложение.
@marc_s Мне нужен обратный индекс для быстрого поиска окончания строки ('%searchValue')
Даже если бы у вас был индекс - поиск %searchValue НИКОГДА не сможет его использовать .....
Однако поиск eulaVhcraes% в индексированном перевернутом столбце....
@marc_s, как сказал Стю, я могу искать обратное окончание строки, и это будет использовать обратный индекс
Если вам нужно найти Column1 строки, оканчивающиеся суффиксом, индекс на Column1 вам не поможет.
Однако нет необходимости добавлять этот столбец в строки страницы данных и выполнять для этого все журналы. Вы можете добавить его как несохраняемый вычисляемый столбец (только метаданные).
ALTER TABLE MyTable
ADD Reverse_Column1 as REVERSE(Column1);
Когда вы создаете для него индекс, значения сохраняются только в индексе.
CREATE INDEX idx_Reverse_Column1 ON MyTable (Reverse_Column1);
Это повлечет за собой некоторую регистрацию, но это неизбежно. Вы можете создать индекс ONLINE, если вы используете версию, поддерживающую это, чтобы уменьшить блокировку таблицы на время операции.
Это как раз моя мотивация но моя проблема с обновлением огромной таблицы
@rotem - этот ответ не предполагает, что вы обновляете огромную таблицу. Однако вам нужно будет создать для него индекс, но это неизбежно, поскольку вы не можете создать индекс без создания индекса.
Под обновлением я подразумеваю создание обратного столбца, что является длительной операцией. я пытаюсь обновить/создать обратный столбец партиями..
@rotem - создание обратного столбца в качестве непостоянного вычисляемого столбца, как это предлагается в моем ответе, является изменением только метаданных. Так что, по сути, вы делаете что-то совершенно отличное от того, что я предлагаю, а потом ноете мне об этом.
Большое спасибо! в начале я не заметил, что вы предлагаете делать вычисляемый столбец, теперь я создал несохраняемый вычисляемый столбец и проиндексировал его, и он отлично работает!
Нет, это не очевидно, как вы сказали, вам нужен этот индекс, и поэтому вы должны жить с ним