持久计算列中的类型转换

时间:2009-08-18 14:17:47

标签: sql sql-server performance indexing calculated-columns

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

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

是否有人知道我是否可以在计算机列中存储显式转换的值。如果可以的话,这里使用的公式是什么?

干杯, 的Matthias

3 个答案:

答案 0 :(得分:3)

这对我有用:

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

答案 1 :(得分:1)

CONVERT(uniqueidentifier,your_varchar_here)

答案 2 :(得分:1)

根据您需要进行加入转换的频率,我会使用CTE来转换数据类型。它构建得比内联视图(下一个最佳临时选项)更快。在任何一种情况下,您都可以在CTE /内联视图的结果列中将值公开为正确的数据类型,以便您可以加入它。 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子句中执行数据类型转换也不是一个好习惯。