2017-03-03 59 views
0

我有两个表。这是SQL Server 2008 R2:存储和索引varchar列,其中大部分值将是数字

dbo.Source:的sourceID(INT),SOURCENAME(VARCHAR(10))

SourceId|SourceName 
1|Source1 
2|Source2 
3|Source3 

dbo.SourceIdentifiers:ID(INT)的sourceID(INT)外键Source.SourceId,SOURCEIDENTIFIER VARCHAR(30)

Id|SourceId|SourceIdentifier 
1|1|123 
2|1|456 
3|2|789 
4|2|789 
5|2|789 
6|3|ABC 

正如你看到的我是从多个来源接收数据,大部分的来源有一个号码作为识别码,但其中一些有字符了。所以我的SourceIdentifier列需要是一个varchar。

通常会根据SourceIdentifier查询表。我可以拥有多达1亿个唯一的源标识符。我希望查询速度超快。我有几个问题:

  1. 如果我在SourceIdentifier列上添加一个索引,这是一个好主意吗?由于该列有大约75%的整数作为varchars存储。
  2. 如果不是,可以采用哪种替代方法。创建两个源标识符表,一个用于整数源和一个用于字符源?

谢谢!

回答

1

我认为你可以选择1)即:在SourceIdentifer列上创建非聚集索引,如果您需要从查询中获取SourceId以避免密钥查找,请确保覆盖索引。

2)方法的问题是您的连接会变得复杂,这会影响性能。

1

我会索引SourceIdentifier如果这样做是有道理的。不过,如果你担心,你可以做到以下几点:

  1. 创建用户定义函数解析字符串,如果可能的返回 整数表示,否则NULL。
  2. 一个PERSISTED计算列添加到表 SourceIdentifierInteger被定义为SourceIdentifier
  3. 该 用户定义函数的该结果添加筛选索引上SourceIdentifierInteger WHERE SourceIdentifierInteger IS NOT NULL

当您查询,如果它是一个整数值,建立在SourceIdentifierIntegerWHERE条款,否则就SourceIdentifier

我不知道这会买任何性能增益经过短短索引SourceIdentifier列,但它是一个选项。