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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top