Sql server 存储和索引一个varchar列,其中大多数值都是数字

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 这些

我有两张桌子。这在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亿个唯一的源标识符。我希望查询速度超快。我有几个问题:

  • 如果我在SourceIdentifier列上添加索引,这是个好主意吗?因为列中大约有75%的整数存储为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