代码之家  ›  专栏  ›  技术社区  ›  Matthias Meid

持久化计算列中的类型转换

  •  0
  • Matthias Meid  · 技术社区  · 15 年前

    我正在使用Microsoft SQL Server 2008环境中的两个相关表,它们通过GUID连接。在一个表中,字段的类型为 varchar(50) ,另一个是正确的类型 uniqueidentifier . 这显然很糟糕,但我现在无法改变,因为它是由一个遗留软件提供的。

    SQL Server在每次内部连接时需要执行的转换使得查询运行非常慢,因为我根本无法使用索引。我尝试添加一个持久化的计算列,以将ID存储为 uniqueidentifer . 这样我就可以添加一个索引,让它运行得更快。我失败了。

    马蒂亚斯

    3 回复  |  直到 15 年前
        1
  •  3
  •   Quassnoi    15 年前

    这对我很有用:

    CREATE TABLE t_uuid (charid VARCHAR(50) NOT NULL, uuid AS CAST(charid AS UNIQUEIDENTIFIER))
    
    CREATE INDEX IX_uuid_uuid ON t_uuid (uuid)
    
    INSERT
    INTO    t_uuid (charid)
    VALUES  (NEWID())
    
    SELECT  *
    FROM    t_uuid
    
        2
  •  1
  •   KM.    15 年前

    转换(uniqueidentifier,此处为您的\u varchar\u)

        3
  •  1
  •   OMG Ponies    15 年前

    根据加入时需要转换的频率,我会使用 CTE 转换数据类型。它的构造速度比内联视图快(次佳临时选项)。在任何一种情况下,您都应该在CTE/inline视图的结果列中将值公开为正确的数据类型,以便可以加入到该列中。CTE示例:

    WITH example AS (
       SELECT t.guid
              CONVERT(UniqueIdentifier, t.guid) 'cguid'
         FROM TABLE t)
    SELECT t.*
      FROM TABLE t
      JOIN example e ON e.cguid = t.guid
    

    内联视图示例:

    SELECT t.*
      FROM TABLE t
      JOIN (SELECT t.guid
                   CONVERT(UniqueIdentifier, t.guid) 'cguid'
              FROM TABLE t) e ON e.cguid = t.guid
    

    不会绕过guid的索引(假设使用了),但在WHERE子句中执行数据类型转换也不是一个好习惯。

    推荐文章