Должен ли я создать уникальный индекс для этого? - PullRequest
0 голосов
/ 05 февраля 2012

Я делаю свой собственный гусеничный ход.Теперь мой вопрос об индексах.

У меня есть 2 столбца, которые об индексах.

Один - pageurl, а другой - hashcode столбец.

pageurl столбец VARCHAR и hashcode столбец 64-битный int.

Это основной запрос, который я выполняю:

SELECT PageId FROM tblPages WHERE HashCode=biginthashcode AND PageUrl='pageurl'

PageId - это первичный ключ идентификации.

Теперь я использовал его в качестве индекса:

CREATE nonclustered INDEX indexHashCode ON tblpages (hashcode)
INCLUDE (pageurl,pageid)

Но этот индекс выше вызывает слишком много дублирующихся строк из-за многопоточной природыпрограммного обеспечения.Вероятно, это вызвано задержками SQL.

Так что я должен сделать это, как показано ниже:

CREATE UNIQUE nonclustered INDEX indexHashCode ON tblpages (hashcode,pageurl)
INCLUDE (pageid)

Или как-то заставить его не добавлять дублирующиеся значения.Какие повторяющиеся значения?

Дублирующее значение означает, что и хэш-код, и Pageurl одинаковы.Возможно ли это без создания уникального индекса, как указано выше, с моим первым индексом?

Я использую Microsoft SQL Server 2008.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Как отмечает комментарий Джонатана Леффлера, вы, вероятно, пытаетесь решить проблему слишком поздно в процессе.Почему ваш многопоточный код генерирует дубликаты в первую очередь?

Тем не менее, если создание дублирующейся строки неизбежно, использование уникального индекса может быть целесообразным.Вы все еще хотите проверить, существуют ли строки, прежде чем вставлять их - обычно для этого используется хранимая процедура.В любом случае транзакция, которая содержит как проверку, так и вставку, должна предотвращать дублирование.

Наконец, для чего бы это ни стоило, хеш-коды обычно не хранятся в базе данных.Они не уникальны, поэтому два URL могут иметь одинаковый хеш-код.

2 голосов
/ 05 февраля 2012

Похоже, вы просто хотите обновить, если (hashcode, pageurl) уже существует.В этом случае посмотрите здесь для ваших вариантов.

Если вы не хотите обновлять, но просто не хотите вставлять новое значение, у вас также есть много опций (запрос и проверка, если оно существует, или изменение решения по заданной ссылке ...или что-то еще), но, скорее всего, вы делаете что-то плохое в своих потоках, поскольку многие потоки выполняют одну и ту же работу, и для всех из них (кроме одного) вы просто отбрасываете результаты.

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