0

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

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

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

干杯,马蒂亚斯

4

3 回答 3

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
于 2009-08-18T14:24:06.903 回答
1

转换(唯一标识符,your_varchar_here)

于 2009-08-18T14:24:24.797 回答
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 子句中执行数据类型转换也不是一个好习惯。

于 2009-08-18T14:45:03.297 回答