在持久化计算列的类型转换
-
18-09-2019 - |
题
我与在Microsoft SQL Server 2008环境2个相关的表,它们通过一个GUID连接工作。在一个表中,该字段有类型varchar(50)
,另一种是正常类型作为uniqueidentifier
。这显然是不好的,但因为它是由一个传统的软件给我现在不能改变这一点。
在转换SQL Server需要执行在每个内部连接使得查询运行非常缓慢,因为我不能使用索引的。我尝试添加一个计算列,这是持续,以获得存储为uniqueidentifer
的ID。这样,我可以添加一个索引来让它运行得更快可能。我失败。
是否有人知道是否能在一个计算机列存储一个显式转换后的值。如果可以,有什么在这里使用的公式?
干杯, 的Matthias
解决方案
这为我工作:
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
其他提示
CONVERT(唯一标识符,your_varchar_here)
根据您需要多长时间让加盟转换,我会使用一个的 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子句中要被执行的数据类型转换。
不隶属于 StackOverflow