2010-12-13 16 views
0

は誰が終了しない理由は、この操作に参加アイデアを持っているん:SQL Server 2005 - 結合が終了しない - スピードの問題?

SELECT * FROM 
(SELECT LOWER([Computer Name]) AS 'cname' FROM table1) 
AS export, 
(SELECT AssetID AS 'CCID', Hostname AS 'cname' FROM table2 WHERE LastVersionFlag=1) 
AS known 

WHERE export.cname = LEFT(known.cname, LEN(export.cname)); 

私が解決したい問題がある:

  • 表1の欄「CNAME」は含まれています:「PC1」
  • を表2の欄 "ホスト名は、" 含まれています: "pc1.domain.com"
  • は、表2には、列 "CCID" が含ま:123123

クエリの結果、私はtable1から各 "cname"のCCIDを受け取る必要があります。

EDIT:

クエリは今> 15分間実行し、出力を生成しません、また終了されます。

  • 表1は、表2には、クエリをスピードアップする方法について200.000rows

任意のアイデアが含まれています!について100.000rows

  • が含まれています

    EDIT2:

    インデックスは、タスクのスケジュールは次のようになります表1のCNAMEおよび表2 CNAME

    に置かれています。http://i55.tinypic.com/1z3o0t4.png

  • 答えて

    1

    は、あなたが探しているものこれは、基本的に参加?

    SELECT known.CCID, export.[Computer Name] AS cname 
    FROM 
    table1 AS export 
    INNER JOIN table2 AS known ON LOWER(export.[Computer Name]) = LOWER(LEFT(known.cname, LEN(export.[Computer Name]))) 
    WHERE LastVersionFlag=1 
    

    編集: はここでクエリをスピードアップするためのいくつかの提案です:

    まず、参加中の文字列の操作は非常に高価です。結合の大文字と小文字を区別しない照合を強制すると、lower()を呼び出す必要がなくなります。

    ...ON known.cname = export.[Computed Column] collate SQL_Latin1_General_Cp437_CI_AS_KI_WI

    LEFT(known.cname, LEN(export.[Computer Name]))の数式を使用してcnameを含むtable2に永続計算列を作成すると、計算された列とtable1のcname列にインデックスを付けることができます。いったん完了すると、あなたの参加は、大幅に操作された比較ではなく、単純な同等性になります。これにより、クエリエンジンはより最適化された計画を立てることができます。

    +0

    正確に。私の知る限りでは、クエリは私と同じアクションを実行し、終了しません。 –

    +0

    "終了しない"ということを聞かれますか? – Laramie

    +0

    これに応じてタイトル/説明を更新しました。 –

    1

    私の推測では、データのサイズのためにクエリが実行されません。

    100.000 * 200.000行のCartesian productを生成し、WHERE条件を適用する必要があります。

    SQL Serverの比較では、列の照合順序で大文字と小文字を区別しない場合(データベースとサーバーの照合順序でデフォルト)、大文字と小文字は区別されません。

    結合操作を高速化するには、table1。[Computer Name]およびtable2.Hostnameに(unique?)インデックスを追加します。

    、すべてのホスト名が点線のCNAME表記を使用する場合は、使用、

    SELECT known.CCID, export.[Computer Name] AS cname 
    FROM table1 AS export 
    INNER JOIN table2 AS known 
        ON known.Hostname LIKE export.[Computer Name] + '%' 
        AND LastVersionFlag=1 
    

    に '%' をあなたのクエリを変更します。

    +0

    この入力のおかげで、私はそれに応じて私のクエリを調整しました。それにもかかわらず、処理に20分かかり、空の結果セットを返します。私は2つのテーブルの中に一致があるので、これについての説明はありません... –

    1

    ちょっとした注意:SQL Serverはデフォルトで大文字と小文字を区別しないモードで動作しています(変更を加えなかった場合)ので、大文字と小文字を区別する必要はありません。 LOWERのような関数を使用すると、インデックスの使用を防止できます。

    最後にWHEREをスピードアップするには、関連する列のインデックスを利用するLIKEで書き直すことができます。これは、(devioの回答のように)次のようになります。

    known.cname LIKE (export.cname + '%') 
    
    1

    すべての提案を一緒にすると、次のクエリが表示されます。
    インデックスとレコード数が適切であれば、結果を返すのに数分かかることはありません。

    SELECT cname = t1.[Computer Name] 
         , CCID = k.AssetID 
         , Hostname = k.cname 
    FROM table1 t1 
         INNER JOIN known k ON k.Hostname LIKE t1.[Computer Name] + '%' 
    WHERE k.LastVersionFlag = 1   
    
    +0

    この入力のおかげで、私はそれに応じて私のクエリを調整しました。それにもかかわらず、処理に20分かかり、空の結果セットを返します。私は2つのテーブル内で一致があるので、これについての説明はありません... –

    +0

    @Michael、SHOWPLANステートメントの出力を表示できますか? –

    +0

    'SET SHOWPLAN_ALL ON' –