Sql server 存储和索引一个varchar列,其中大多数值都是数字
我有两张桌子。这在SQL Server 2008 R2中: dbo.Source:SourceId(int),SourceName(varchar(10)) dbo.SourceIdentifiers:Id(int),SourceId(int)外键Source.SourceId,SourceIdentifier varchar(30) 正如您所看到的,我从多个源接收数据,大多数源都有一个数字作为其标识符,但其中一些也有字符。所以我的SourceIdentifier列需要是一个varchar 这些表通常基于SourceIdentifier进行查询。我可以拥有多达1亿个唯一的源标识符。我希望查询速度超快。我有几个问题:Sql server 存储和索引一个varchar列,其中大多数值都是数字,sql-server,sql-server-2008,indexing,Sql Server,Sql Server 2008,Indexing,我有两张桌子。这在SQL Server 2008 R2中: dbo.Source:SourceId(int),SourceName(varchar(10)) dbo.SourceIdentifiers:Id(int),SourceId(int)外键Source.SourceId,SourceIdentifier varchar(30) 正如您所看到的,我从多个源接收数据,大多数源都有一个数字作为其标识符,但其中一些也有字符。所以我的SourceIdentifier列需要是一个varchar 这些
谢谢 我认为您可以使用选项1)即:在SourceIdentifer列上创建非聚集索引,如果需要从查询中获取SourceId以避免键查找,请确保它覆盖索引
2)方法的问题是,您的联接将变得复杂,这将影响性能。我认为您可以使用选项1)即:在SourceIdentifer列上创建非聚集索引,如果需要从查询中获取SourceId以避免键查找,请确保它覆盖索引
2)方法的问题是,您的连接将变得复杂,这将影响性能。如果这样做有意义,我将为
源标识符编制索引。但是,如果您对此感到担忧,您可以执行以下操作:
创建一个用户定义的函数,用于解析字符串并返回
整数表示形式(如果可能),否则为NULL
将持久化的计算列添加到表中
SourceIdentifierInteger
定义为该结果的
SourceIdentifier的用户定义函数
在SourceIdentifierIntegrater上添加筛选索引,其中
SourceIdentifierIntegrater不为空
查询时,如果是整数值,则在SourceIdentifierInteger
上构建WHERE
子句,否则在SourceIdentifier
列上构建
我不知道这会比仅仅索引SourceIdentifier
列获得任何性能提升,但这是一个选项。如果这样做有意义,我会索引SourceIdentifier
。但是,如果您对此感到担忧,您可以执行以下操作:
创建一个用户定义的函数,用于解析字符串并返回
整数表示形式(如果可能),否则为NULL
将持久化的计算列添加到表中
SourceIdentifierInteger
定义为该结果的
SourceIdentifier的用户定义函数
在SourceIdentifierIntegrater上添加筛选索引,其中
SourceIdentifierIntegrater不为空
查询时,如果是整数值,则在SourceIdentifierInteger
上构建WHERE
子句,否则在SourceIdentifier
列上构建
我不知道这会比仅仅索引SourceIdentifier
列带来任何性能提升,但这是一种选择
SourceId|SourceName
1|Source1
2|Source2
3|Source3
Id|SourceId|SourceIdentifier
1|1|123
2|1|456
3|2|789
4|2|789
5|2|789
6|3|ABC