永続計算列での型変換
-
18-09-2019 - |
質問
私は、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句でデータ型変換を実行するためにも良い習慣ではありません。