Typ-Umwandlung in Persisted Computed Column
-
18-09-2019 - |
Frage
Ich arbeite mit 2 verknüpften Tabellen in einer Microsoft SQL Server 2008-Umgebung, die über eine GUID verbunden ist. In einer Tabelle hat das Feld den Typ varchar(50)
, das andere richtig Typen wie uniqueidentifier
ist. Das ist natürlich schlecht, aber ich kann das nicht ändern, da es von einem Legacy-Stück Software gegeben wird.
Die Umwandlung von SQL Server muss auszuführen an jedem inneren Join-Abfragen macht schrecklich langsam laufen, da ich nicht Indizes überhaupt nutzen kann. Ich habe versucht, das Hinzufügen einer berechneten Spalte, die beibehalten wird, die ID als uniqueidentifer
gespeichert zu bekommen. So kann ich einen Index hinzufügen, könnte es wahrscheinlich viel schneller laufen. Ich schlug fehl.
Weiß jemand, ob ich einen explizit konvertierten Wert in einem Computer Spalte speichern kann. Wenn ich kann, was ist die Formel hier zu benutzen?
Cheers, Matthias
Lösung
Das funktioniert für mich:
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
Andere Tipps
CONVERT (unique, your_varchar_here)
Je nachdem, wie oft müssen Sie die Konvertierung machen für den Beitritt, würde ich ein CTE den Datentyp (en) zu konvertieren. Es ist schneller als ein Inline-View (nächste beste temporäre Option) aufgebaut. In jedem Fall würden Sie Wert als den richtigen Datentyp in einer Ergebnisspalte aus dem CTE / Inline-View aussetzen, damit Sie sie JOIN auf kann. CTE Beispiel:
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-Ansicht Beispiel:
SELECT t.*
FROM TABLE t
JOIN (SELECT t.guid
CONVERT(UniqueIdentifier, t.guid) 'cguid'
FROM TABLE t) e ON e.cguid = t.guid
Es wird umgehen, nicht, dass der Index für guid (vorausgesetzt, man tut) nicht verwendet werden, aber es ist auch nicht eine gute Gewohnheit Umwandlungsdatentyp in der WHERE-Klausel auftreten.