【问题标题】:CHAR vs. VARCHAR and the ramifications when joiningCHAR 与 VARCHAR 以及加入时的后果
【发布时间】:2011-08-24 02:54:07
【问题描述】:

正如this 之前的帖子所讨论的那样,何时使用 CHAR 而不是 VARCHAR 指出,当存储的值的长度大致相同时,可以获得性能优势。当然,我会选择 CHAR 作为存储 2 字符状态代码数据的数据类型。

我只是想确认一下,这意味着当执行对此列进行过滤的 SQL 时,必须用足够的空白填充过滤后的值以等于 char 字段的定义长度。

例如,假设一个表“CODE_TABLE”,其中第 10_CHAR_CODE 列定义为 CHAR(10):

SELECT * FROM CODE_TABLE WHERE 10_CHAR_CODE = 'ABCDE'

并且如果 10_CHAR_CODE 是另一个表的“逻辑”外键但不存在特定的关系完整性约束,则存储在 10_CHAR_CODE 查找表中的值理想情况下应该是相同的数据类型(Char(10) 以避免必须加入时执行低效的 RTRIM 函数。

(我们有一个婴儿大小的数据仓库,DBA 认为参照完整性约束效率低下,因此我们最终会在表中对数据进行不一致的数据类型定义。)

我的印象准确吗?

【问题讨论】:

  • 从我读过的几件事中,您实际上可以通过加入整数比加入 varchar 列获得更好的性能。 :-D

标签: sql sql-server


【解决方案1】:

在 SQL Server 的字符串比较中忽略尾随空格。没有必要自己RTRIM它(这会使条件变得不可告人)

【讨论】:

    【解决方案2】:

    马丁似乎是正确的。您可能想要测试您在数据库中使用的特定排序规则。下面是一些测试代码:

    DECLARE @ten_char_field char(10),
            @ten_char_varchar varchar(10)
    
    SET @ten_char_field = 'ABCD'
    SET @ten_char_varchar = 'ABCD'
    
    SELECT @ten_char_field, CASE WHEN @ten_char_field = 'ABCD' THEN 1 ELSE 0 END,
            @ten_char_varchar, CASE WHEN @ten_char_varchar = 'ABCD' THEN 1 ELSE 0 END
    

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 2011-01-06
      • 2017-07-11
      • 2011-10-10
      • 2012-11-09
      • 2011-01-18
      • 1970-01-01
      • 2011-03-23
      • 2014-06-03
      相关资源
      最近更新 更多