2017-08-19 6 views
1

が、私はアンピボット(または他の何か)は、より効率的かもしれないと思う、非常に遅いですが、私はクロスを使用するよりも、それ他を行う方法を見つけ出すことはできませんが適用されます。クロス適用は実行できません、アンピボット(またはその他)に変換しますか?大規模なデータセットを挿入するときにクロスが適用

CREATE TABLE LocData 
    (Airport varchar(5), City varchar(5), Country varchar(5)) 
; 

INSERT INTO LocData 
    (Airport, City, Country) 
VALUES 
    ('LHR','LON','GB'), 
    ('LGW','LON','GB'), 
    ('LCY','LON','US'), 
    ('JFK','NYC','US'), 
    ('LGA','NYC','US'), 
    ('EWR','NYC','US') 
; 

CREATE TABLE Travel 
    (ID int, Dep varchar(5), Arr varchar(5)) 
; 

INSERT INTO Travel 
    (ID, Dep, Arr) 
VALUES 
    (1, 'LHR','JFK'), 
    (2, 'LHR','EWR'), 
    (3, 'LGA','LGW'), 
    (4, 'LCY','EWR') 
; 

--theクエリは

select * from Travel; 

select 
    c.* 
    from Travel t 
    join LocData dep on dep.Airport=t.Dep 
    join LocData arr on arr.Airport=t.Arr 
    cross apply 
    (
    values 
    (t.ID, dep.Airport, 0, arr.Airport, 0), 
    (t.ID, dep.City, 1, arr.City, 1), 
    (t.ID, dep.Country, 2, arr.Country, 2) 
    ) c (ID, Dep, DepType, Arr, ArrType); 

あなたはtest it here (SQLFiddle)

+1

あなたの質問は非常に貧弱だったので、私は無礼を書こうとしていましたが、私はフィドルリンクを見ました...私は質問にコードを入力しました。 – Shnugo

+1

インデックス/外部キーはありますか?あなたは本当に* 3-char *空港コードをFKとして使用していますか? *が非常に遅く、*大きなデータセット*とはどういう意味ですか? – Shnugo

+0

ありがとう@Shnugoは私が両方を提供すべきかどうか確かではなかった、将来するだろう。 – baileyswalk

答えて

1

あなたのクエリがあることができます。

select c.* 
from Travel t join 
    LocData dep 
    on dep.Airport = t.Dep join 
    LocData arr 
    on arr.Airport = t.Arr cross apply 
    (values (t.ID, dep.Airport, 0, arr.Airport, 0), 
      (t.ID, dep.City, 1, arr.City, 1), 
      (t.ID, dep.Country, 2, arr.Country, 2) 
    ) c(ID, Dep, DepType, Arr, ArrType); 

これは、あなたがやりたいことを行うための非常に効率的な方法のようです。それは良い性能を持っているはずです。

パフォーマンスを向上させる1つの要素は、Locadata(airport)のインデックスです。 citycountryの列を含めることもできます(includeまたは追加のキーにする)。私は(自動的にインデックスの最適なタイプを作成します)主キーとしてそれを使用してテーブルを定義します

CREATE TABLE LocData (
    Airport varchar(5) PRIMARY KEY, 
    City varchar(5), 
    Country varchar(5) 
); 

(それはNULLことはありませんし、重複したことがないという合理的な仮定を作る。)

を他でつまり、applyがパフォーマンスに影響することは間違いありません。 joinは、はるかに原因である可能性が高いです。

+0

あなたが正しいです、問題は十字適用とは関係ありませんでした。私がここに投稿した以上のさらなる操作に至りました。 3分後に40秒を挿入する(19分前)。幸せな日々、誤報。 – baileyswalk

関連する問題