Индекс varchar на MS SQL Server 2005

Мне нужно проиндексировать поле varchar в моей таблице в MS SQL Server 2005, но мне непонятно, как это сделать. Если я попытаюсь добавить некластеризованный индекс в поле, появится сообщение «Столбец« xxxx »в таблице« mytable »имеет тип, недопустимый для использования в качестве ключевого столбца в индексе».

Моя таблица имеет идентификатор int с автоматическим приращением, который установлен в качестве первичного ключа в таблице. Если я устанавливаю это свойство как индекс, а затем добавляю свой столбец varchar как «включенный столбец», индекс проходит. Но я не уверен, что я хочу - я хочу иметь возможность искать в таблице только на основе поля varchar, и мое понимание индексов заключалось в том, что все проиндексированные элементы должны быть предоставлены, чтобы действительно увидеть ускорение в запросе, но я не хочу включать int ID (потому что я не знаю, что это такое, на момент данного запроса).

Я пытаюсь сделать это неправильно? Будет ли ID + my varchar как включенный столбец выполнять то, что я ищу?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
6
0
11 391
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Ваш varchar(max)? Я думаю, что их нельзя использовать в индексе.

В противном случае опубликуйте свой оператор CREATE TABLE, обычно нет проблем с добавлением varchar в индекс.

Нет, столбец ID + varchar работать не будет. Это отлично подойдет для запросов, в которых вы выполняете поиск по идентификатору и выбираете только идентификатор и / или столбец varchar - тогда у вас будет покрывающий индекс, и все можно будет получить, только посмотрев на индекс.

Я предполагаю, что у вас есть кластерный индекс в столбце идентификатора в качестве первичного ключа. Затем вам нужно будет создать некластеризованный индекс для столбца varchar - что должно быть возможно. Некластеризованный индекс также автоматически включает идентификатор.

Также помните, что индекс подходит только для таких запросов, как WHERE VarcharColumn = 'xyz' и WHERE VarcharColumn LIKE 'xyz%'.

Это не поможет для запросов LIKE "% xyz%" и "% xyz".

Вам не нужно включать поле varchar в первичный ключ для его индексации. Чтобы создать индекс, просто измените таблицу в Management Studio, нажмите кнопку «Управление индексами и ключами» и нажмите «Добавить», чтобы добавить новый индекс. Затем выберите поле VARCHAR. Не должно быть проблем.

Установка столбца в качестве первичного ключа по умолчанию создает кластерный индекс, поэтому вам не нужно создавать еще один индекс INT + VARCHAR.

То, что вы ищете, - это индекс только для вашего VARCHAR - без + INT, поскольку ваш первичный ключ неявно включен - в конце концов, SQL Server должен иметь возможность найти фактическую строку при выполнении поиска по индексу. Однако есть ограничение: я считаю, что общий размер столбцов индекса должен быть <900 байт (по крайней мере, так было с SQL Server 2000). Как долго ваш VARCHAR?

Я предполагаю, что ваш столбец VARCHAR (MAX), который, как говорится в ошибке, является типом данных инвалида для индекса. Предложение: создайте вычисляемый столбец, который является хеш-значением столбца VARCHAR (MAX) (например, с помощью функции HashBytes), а затем создайте индекс только для вычисляемого столбца. Затем в условии поиска (например, предложение WHERE) вашего SQL DML вы должны использовать как само значение поиска VARCHAR (MAX) плюс, так и хэш вашего значения поиска VARCHAR (MAX) в соответствующих столбцах таблицы. Может быть хорошей идеей инкапсулировать хеширование значений поиска во «вспомогательную» хранимую процедуру.

Другие вопросы по теме