2009-08-18 52 views
0

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

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

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

干杯, 马蒂亚斯

回答

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 
+0

谢谢,效果很好。查询需要4秒而不是半小时。 :) – 2009-08-18 14:51:32

1

CONVERT(唯一标识符,your_varchar_here)

+0

工作正常。 Management Studio说'错误验证列'MyColumn'的公式',但仍保存更改并且工作正常。奇怪... – 2009-08-18 14:50:32

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子句中执行数据类型转换。