Domanda

Sto lavorando con 2 tabelle correlate in un ambiente Server 2008 di Microsoft SQL che sono collegati tramite un GUID. In una tabella, il campo ha il tipo varchar(50), l'altro è correttamente tipi come uniqueidentifier. Questo è ovviamente male, ma non posso cambiare questo adesso perché è dato da un pezzo l'eredità di software.

La conversione di SQL Server deve eseguire ad ogni join interno rende l'esecuzione di query terribilmente lento, dal momento che non posso usare gli indici a tutti. Ho provato ad aggiungere una colonna calcolata, che è persistente, per ottenere l'ID memorizzato come un uniqueidentifer. In questo modo ho potuto aggiungere un indice per farlo correre molto più veloce, probabilmente. Ho fallito.

Qualcuno sa se posso memorizzare un valore esplicitamente convertito in una colonna computer. Se posso, qual è la formula da usare qui?

Saluti, Matthias

È stato utile?

Soluzione

Questo ha funzionato per me:

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

Altri suggerimenti

Converti (uniqueidentifier, your_varchar_here)

A seconda di come spesso è necessario effettuare la conversione per l'adesione, mi piacerebbe utilizzare un CTE per convertire il tipo di dati (s). E 'costruito più veloce di una vista in linea (la prossima opzione migliore temporanea). In entrambi i casi, ci si espone valore come il tipo di dati corretto in una colonna risultato dal punto di vista / linea CTE che consente di raggiungere su di esso. CTE Esempio:

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

Inline vista esempio:

SELECT t.*
  FROM TABLE t
  JOIN (SELECT t.guid
               CONVERT(UniqueIdentifier, t.guid) 'cguid'
          FROM TABLE t) e ON e.cguid = t.guid

Non è intenzione di aggirare che l'indice per la guid (supponendo che si fa) non sarà utilizzato, ma non è anche una buona abitudine da eseguire la conversione del tipo di dati nella clausola WHERE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top