0

GUIDを介して接続されているMicrosoftSQLServer2008環境で2つの関連テーブルを操作しています。1つのテーブルでは、フィールドのタイプvarchar(50)は、であり、もう1つのテーブルは適切にタイプとしてuniqueidentifierです。これは明らかに悪いことですが、これはレガシーソフトウェアによって提供されているため、今は変更できません。

SQL Serverが内部結合ごとに実行する必要がある変換では、インデックスをまったく使用できないため、クエリの実行が非常に遅くなります。IDをとして保存するために、永続化される計算列を追加してみましたuniqueidentifer。このようにして、インデックスを追加して、おそらくはるかに高速に実行できるようにすることができます。私は失敗しました。

明示的に変換された値をコンピューターの列に格納できるかどうか誰かが知っていますか。可能であれば、ここで使用する式は何ですか?

乾杯、マティアス

4

3 に答える 3

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
于 2009-08-18T14:24:06.903 に答える
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 のインデックス (使用すると仮定) が使用されないことを回避するつもりはありませんが、WHERE 句でデータ型変換を実行することも良い習慣ではありません。

于 2009-08-18T14:45:03.297 に答える
1

CONVERT(一意の識別子, your_varchar_here)

于 2009-08-18T14:24:24.797 に答える