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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top