2009-08-18 24 views
0

私はGUIDを介して接続されているMicrosoft SQL Server 2008環境で2つの関連テーブルを使用しています。 1つのテーブルでは、フィールドのタイプはvarchar(50)で、もう1つは適切なタイプのuniqueidentifierです。これは明らかに悪いですが、これは従来のソフトウェアによって与えられているため、これを変更することはできません。永続的な列の型変換

各インナージョインでSQL Serverが実行する必要がある変換は、インデックスをまったく使用できないため、クエリの実行が非常に遅くなります。私は、保持されているComputed Columnを追加して、IDをuniqueidentiferとして取得しようとしました。このようにして、インデックスを追加しておそらくもっと速く動くようにすることができます。私は失敗しました。

コンピュータの列に明示的に変換された値を格納できるかどうかは誰にも分かりません。できれば、ここで使う式は何ですか?

乾杯、 マティアス

答えて

3

これは私の仕事:

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 
+0

ありがとう、素晴らしい作品です。クエリは30分ではなく4秒になります。 :) –

1

CONVERT(UNIQUEIDENTIFIER、your_varchar_here)

+0

うまく動作します。 Management Studioでは「列「MyColumn」の式の検証でエラーが発生しました。」と表示されますが、変更は保存され、機能します。奇妙な... –

1

あなたが参加するための変換を行う必要がありますどのくらいの頻度に応じて、私は思いますCTEを使用してデータ型を変換します。これはインラインビュー(次善の一時的オプション)よりも速く構築されます。どちらの場合でも、CTE /インライン・ビューの結果列に正しいデータ型として値を公開し、それでJOINすることができます。 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句でデータ型変換を実行しています。

関連する問題