【问题标题】:Storing and indexing a varchar column in which majority of the values will be numbers存储和索引 varchar 列,其中大多数值将是数字
【发布时间】:2017-03-03 20:39:22
【问题描述】:

我有两张桌子。这是在 SQL Server 2008 R2 中:

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. 如果不是,还有什么替代方法。创建两个源标识符表,一个用于整数源,一个用于字符源?

谢谢!

【问题讨论】:

    标签: sql-server sql-server-2008 indexing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果这样做有意义,我会索引SourceIdentifier。但是,如果您对此感到担心,可以执行以下操作:

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

      查询时,如果是整数值,则在SourceIdentifierInteger 上构建WHERE 子句,否则在SourceIdentifier 列上构建您的WHERE 子句

      我不知道这是否会比仅索引 SourceIdentifier 列带来任何性能提升,但这是一种选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        相关资源
        最近更新 更多