Что быстрее сравнивать uniqueidentifier или строку в tsql? - PullRequest
3 голосов
/ 25 января 2012

У меня есть таблица, которая содержит guid для пользователя и его фактическое имя в виде строки. Я хотел бы получить некоторую информацию на основе пользователя. Но какое поле мне использовать? Должен ли мой код сказать:

select * 
from userinboxcount 
where countDate >= startDate and countDate <= endDate and userid = '<guid here>'

or 

select * 
from userinboxcount 
where countDate >= startDate and countDate <= endDate and username = "FirstName LastName"

Ответы [ 5 ]

3 голосов
/ 25 января 2012

См. План запроса, и вы можете увидеть его сами.

Но уникальный идентификатор обычно имеет индекс, а строка (имя пользователя) может не иметь.Если это так, и если имеется много записей, то уникальный идентификатор будет быстрее!


Для плана запроса проверьте ЭТА статья.

2 голосов
/ 25 января 2012

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

Если оба поля имеют индексы, то индексэто меньше будет несколько быстрее, потому что он загружается быстрее, и, скорее всего, он останется в кэше.

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

Кроме этого, было бы несколько быстрее сравнивать значения GUID, потому что это простое числовое сравнение и недолжны учитывать лексические правила.

1 голос
/ 25 января 2012

Вы полностью женаты на GUID? Вы должны использовать GUID, когда вам нужен первичный ключ, который будет уникальным для нескольких систем. Я бы предложил пропустить GUID и использовать составной ключ. Например, вы можете использовать идентификатор плюс GETDATE () в качестве составного ключа. Это даст вам простой способ запроса ваших данных (попробуйте запомнить GUID над целым числом). Это также будет работать намного лучше GUID. Вероятно, в два раза быстрее.

1 голос
/ 25 января 2012

GUID будет достаточно хорошим.

1. GUID will produce unique values in the table.
2. Create Non Clustered Index on this column. 

Ссылка - Некластеризованные индексы особенно удобны, когда мы хотим вернуть одну строку из таблицы.

0 голосов
/ 25 января 2012

Если userid является первичным ключом, вы должны использовать его.Если вы используете имя и фамилию, вы, например, можете иметь две записи Джона Смита, и это может создать для вас проблему.Использование PK должно быть более безопасным

С точки зрения производительности рекомендуется ознакомиться с планом объяснения (путем выполнения?) Запроса.Я ожидаю, что использование userid будет быстрее, но проверка плана должна сказать вам наверняка.

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