Tipo de conversão em coluna computada persistida
-
18-09-2019 - |
Pergunta
Estou trabalhando com 2 tabelas relacionadas em um ambiente do Microsoft SQL Server 2008, conectado por meio de um GUID. Em uma mesa, o campo tem o tipo varchar(50)
, o outro é devidamente tipos como uniqueidentifier
. Isso é obviamente ruim, mas não posso mudar isso agora, porque é dado por um software legado.
O Servidor SQL de conversão precisa executar em cada junção interna torna as consultas com terrivelmente lentas, pois não posso usar índices. Tentei adicionar uma coluna calculada, que é persistida, para armazenar o ID como um uniqueidentifer
. Dessa forma, eu poderia adicionar um índice para que ele funcione muito mais rápido. Eu falhei.
Alguém sabe se eu posso armazenar um valor explicitamente convertido em uma coluna de computador. Se eu puder, qual é a fórmula para usar aqui?
Saúde, Matthias
Solução
Isso funcionou para mim:
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
Outras dicas
Converter (UniqueIdentifier, your_varchar_here)
Dependendo da frequência com que você precisa fazer a conversão para ingressar, eu usaria um Cte Para converter o (s) tipo (s) de dados. É construído mais rápido que uma visualização em linha (próxima melhor opção temporária). Em ambos os casos, você exporia o valor como o tipo de dados correto em uma coluna de resultado da visualização CTE/embutida para que você possa participar. Exemplo de 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
Exemplo de visualização embutida:
SELECT t.*
FROM TABLE t
JOIN (SELECT t.guid
CONVERT(UniqueIdentifier, t.guid) 'cguid'
FROM TABLE t) e ON e.cguid = t.guid
Não vai se contornar que o índice do GUID (assumindo que um) não será usado, mas também não é um bom hábito executar a conversão do tipo de dados na cláusula WHERE.