39位数字的T-SQL数据类型?
Posted
技术标签:
【中文标题】39位数字的T-SQL数据类型?【英文标题】:T-SQL data type for 39-digit number? 【发布时间】:2019-09-16 22:19:42 【问题描述】:我正在使用来自Ip2Location 的免费 IPv6 数据表。表架构定义为:
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
类型的最大范围。有什么办法可以缩短查询时间吗?
【问题讨论】:
什么数据库,什么版本? csv 中的文本是什么样的?既然应该是约会,你能不能把它变成约会? Microsoft SQL Server 2016 忽略我的date
评论。我误读了数据应该是什么。您是否按照blog.ip2location.com/knowledge-base/… 中的步骤填充您的IP_TO
和IP_FROM
字符串? (更正表名)
@IPNumber
的值和数据类型是什么?您正在使用 BETWEEN
进行隐式转换,这可能会影响您的查询时间。
【参考方案1】:
您可以尝试使用BINARY(17)
,39 位小数适合 17 个字节。 Binary type doc.
【讨论】:
以上是关于39位数字的T-SQL数据类型?的主要内容,如果未能解决你的问题,请参考以下文章