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

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

6 голосов
/ 16 октября 2008

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

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

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

Ответы [ 5 ]

10 голосов
/ 16 октября 2008

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

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

4 голосов
/ 16 октября 2008

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

2 голосов
/ 16 октября 2008

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

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

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

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

1 голос
/ 16 октября 2008

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

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

0 голосов
/ 16 октября 2008

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

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