我正在使用通过GUID连接的Microsoft SQL Server 2008环境中的2个相关表。在一个表中,该字段的类型为varchar(50)
,另一个字段的类型为uniqueidentifier
。这显然很糟糕,但我现在无法改变它,因为它是由一个传统的软件提供的。
SQL Server需要在每个内部联接中执行的转换使查询运行速度非常慢,因为我根本无法使用索引。我尝试添加一个持久化的计算列,以将ID存储为uniqueidentifer
。这样我就可以添加一个索引来让它运行得更快。我失败了。
是否有人知道我是否可以在计算机列中存储显式转换的值。如果可以的话,这里使用的公式是什么?
干杯, 的Matthias
答案 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子句中执行数据类型转换也不是一个好习惯。