質問

私は、GUIDを介して接続されているのMicrosoft SQL Server 2008の環境での2つの関連テーブルで働いています。一つのテーブルでは、フィールドの型がvarchar(50)を有し、他の一つはuniqueidentifierとして適切なタイプです。これは明らかに悪いですが、それはソフトウェアのレガシーピースによって与えられていますので、私は今、これを変更することはできません。

変換SQL Serverは、各内部で実行する必要が参加するクエリが、私は全くのインデックスを使用できないため、ひどく遅い実行します。私はuniqueidentiferとして格納されたIDを取得するには、永続化される計算列を、追加してみました。このように私はそれはおそらくはるかに高速に動作させるには、インデックスを追加することができます。私は失敗します。

私はコンピュータの列に明示的に変換された値を保存することができれば誰もが知っています。私ができるならば、何がここで使用するための式ですか?

乾杯、 マティアス

役に立ちましたか?

解決

これは私のために働いてます:

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

他のヒント

CONVERT(UNIQUEIDENTIFIER、your_varchar_here)

あなたが参加するための変換を行う必要がありますどのくらいの頻度に応じて、私は<のhref =「http://msdn.microsoft.com/en-us/library/ms190766.aspx」のrel = "nofollowをを使用したいです「noreferrer> CTEは、データのタイプ(複数可)を変換することを。これは、より高速なインライン・ビュー(次の最良の一時的なオプション)より構成されています。あなたがそれに上参加できますので、いずれの場合も、あなたは、CTE /インライン・ビューからの結果列で正しいデータ型として値を公開すると思います。 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

インライン・ビューの例:

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

使用されませんGUIDのインデックスは、(1がないと仮定した場合)ことを周りに取得するつもりはないが、それはWHERE句でデータ型変換を実行するためにも良い習慣ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top