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

85
9

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


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


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

спросил(а) 2008-10-16T00:07:00+04:00 11 лет, 1 месяц назад
5
Решение
107

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

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

ответил(а) 2008-10-16T00:14:00+04:00 11 лет, 1 месяц назад
Еще 4 ответа
75

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

ответил(а) 2008-10-16T11:57:00+04:00 11 лет, 1 месяц назад
54

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


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


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


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

ответил(а) 2008-10-16T00:15:00+04:00 11 лет, 1 месяц назад
47

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


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

ответил(а) 2008-10-16T00:27:00+04:00 11 лет, 1 месяц назад
32

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

ответил(а) 2008-10-16T00:17:00+04:00 11 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема