2016-07-18 13 views
0

テーブル1のレコードがテーブル2にあるかどうか、および別のテーブルへのリンクがまだ存在するかどうか、基本的に2つのことを行うビューを作成しようとしています。それはデータのサブセットで動作しましたが、完全なクエリを実行しようとすると、ビューデザイナでタイムアウトになりました。SQLビューの最適化

別のテーブルへのリンクが存在するかどうかを確認するために、チェックを追加するまでビューが正常に機能しました。

当初は表Bに、表Aに参加しA.IDがテーブルBにID列に

を本波平ここで、Iは、次いで人物とアドレステーブル(の間のリンクは、に格納されている場合と言われた濾別テーブルC)が削除された場合、そのテーブルを完全に抽出して、リンクが存在しなくなったことを知る方法以外の方法はありません。

Column1 = case when exists (select LinkID from LinkTable C 
      where cast(C.LinkAddressID as varchar) = A.AddressID 
      and cast(C.LinkID as varchar) = A.ID) 
      then Column1 
      else NULL 
      end 

があります:私は、私は列に情報を表示するかどうかを選択するために60倍に近い次の構造を使用しています

特定の列にいくつかのデータを表示するかどうかを判断するためにそのチェックを使用しようとしています表Aの約1.6mレコードは、リンクテーブルの4mレコードをわずかに上回っています。

この最適化されたクエリ/ビューを作成するより良い方法はありますか?

より多くの情報が両方の条件が満たされない場合、一致は二つの条件とNULLに存在する場合、これはあなたにC.LinkIDを与える

+1

varcharデータ型を定義するときは、常にサイズを指定する必要があります。それ以上の詳細がなければ、何が起こっているのか分かりにくいですが、LinkTableへの左への結合が良いと思われます。あなたが本当に助けることができる前に、もっと多くの情報を提供する必要があります。クエリの小さな部分だけでは、パフォーマンスを向上させるのに十分ではありません。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

実際の実行計画とクエリを入力してください – Devart

+0

また、クエリはSARGABLEではありませんが、スキャンを終了する可能性があります – TheGameiswar

答えて

0
Select C.LinkID 
    From A 
    Left Join C On C.LinkAddressID = A.AddressID And C.LinkID = A.ID 

を必要とされている場合は私に知らせてください。

A.IDの主キーなどの索引/キーと、結合節の内容に基づく外部キーの関係は、非常に優れたパフォーマンスを提供します。

0

ジョーが示唆したように、あなたは2つのテーブルを一致させるために同じのAddressId及びIdフィールドを使用しているすべての60個の列のために、私はあなたが次のクエリ

SELECT 
    Column1 = CASE WHEN C.LinkID IS NULL THEN NULL ELSE A.Column1 END, 
    .... 
FROM A 
Left Join LinkTable C 
    ON C.LinkAddressID = A.AddressID AND C.LinkID = A.ID 

ようなものを使用することができると信じている場合のデータ・タイプをキャストすることは間違いなく無効になりますインデックスからの利点。可能であれば、ジョインおよびWHERE句でデータ型キャストを避けてください。