2008-10-15 3 views
6

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

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

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

ответ

10

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

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

2

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

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

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

Это не поможет запросам LIKE '% xyz%' и '% xyz'.

0

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

1

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

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

4

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

+0

+1 Для упоминания функции HashBytes – CSharper 2011-07-12 22:42:59

Смежные вопросы