Тип данных T-SQL для 39-значного числа?

Я использую бесплатную таблицу данных IPv6 от Ip2Location. Схема таблицы определяется как:

CREATE TABLE [ip2location].[dbo].[ip2location_db11_ipv6](
    [ip_from] char(39) NOT NULL,
    [ip_to] char(39) NOT NULL,
    [country_code] nvarchar(2) NOT NULL,
    [country_name] nvarchar(64) NOT NULL,
    [region_name] nvarchar(128) NOT NULL,
    [city_name] nvarchar(128) NOT NULL,
    [latitude] float NOT NULL,
    [longitude] float NOT NULL,
    [zip_code] nvarchar(30) NOT NULL,
    [time_zone] nvarchar(8) NOT NULL
) ON [PRIMARY]
GO

CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_from]) ON [PRIMARY]
GO

CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_to]) ON [PRIMARY]
GO

Запросы к таблицам выполняются с преобразованным IPv6-адресом в IpNumber. Предоставленный поисковый запрос:

SELECT *
FROM ip2location_db11_ipv6
WHERE @IpNumber BETWEEN ip_from AND ip_to

Мое среднее время запроса, основанное на нескольких случайных поисках, составило ~1,2 секунды. Пока есть3,458,959записей в таблице, мне это кажется немного медленным (не так ли? Я ни в коем случае не гуру SQL). Первой моей мыслью было сделатьip_from а также ip_to столбцы числовой тип данных, но максимальное значение 58569107375850417935858934690443427840 (39 цифр), что выходит за пределы максимального диапазона для DECIMALтип. Есть ли что-нибудь, что можно сделать, чтобы сократить время запроса для этого?

1 ответ

Вы можете попробовать использовать BINARY(17), 39 знаков после запятой умещаются в 17 байтов. Бинарный тип doc.

Другие вопросы по тегам