ВЫБЕРИТЕ поле varchar для одной записи в таблице записей на 8,2 миллиона записей - помощь в производительности - PullRequest
3 голосов
/ 22 августа 2011

У меня есть таблица с 8,2 миллионами записей в базе данных SQL Server 2005. В этой таблице хранятся основные данные о прошлом клиента (реферер, ip, введены ли они с помощью рекламы и т. Д.) Для каждого клиента, которого мы посетили на сайте. К сожалению, тот, кто спроектировал таблицу (еще до того, как я здесь оказался, я практикант), использовал поле varchar(50) для поля ip address в таблице.

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

Вот пример запроса из того, что я выполнял:

SELECT TOP(1) [ID]
FROM [dbo].[SiteVisit]
WHERE [IPAddress] = '61.135.249.118'

Этот запрос выполнялся более 2 минут и 31 секунды, прежде чем я его отменил. Есть ли способ повысить скорость этого поиска или было бы более целесообразно создать новый индекс в таблице, в котором хранятся значения INET_ATON, и выполнить поиск по этому вопросу?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 22 августа 2011

Если бы поле IP_Address было проиндексировано, поиск был бы очень и очень быстрым.

Рекомендуемый индекс для этого будет IP_Address INCLUDE(ID), если только ID не является вашим кластеризованным ключом, и в этом случае вы можете исключить его.

3 голосов
/ 22 августа 2011

Если вы собираетесь часто выполнить запрос "есть ли у нас этот IP-адрес", то вам обязательно нужно добавить индекс по IP-адресу.Но если это одноразовое упражнение, то нет.

1 голос
/ 22 августа 2011

Попробуйте создать индекс на IP-адресе.Если вам нужно выбрать только идентификатор, основанный на IP-адресе, и это частый способ поиска, то вы должны создать такой индекс:

...