2012-02-25 20 views
0

1つのテーブルのデカルト積を行う必要がありますが、同じ行はありません。今私は持っています:デカルト積を最適化する方法

select * 
From T_Car C1 
Join T_Car C2 On C1.CarID <> C2.CarID 

しかし、1300行のT_Carテーブルでは、ほぼ2分かかります。 OPTION(HASH JOIN)とOPTION(MERGE JOIN)を使用しようとしましたが、これでエラーが発生します。

このクエリでヒントが定義されているため、クエリプロセッサはクエリプランを生成できませんでした。ヒントを指定せずに、SET FORCEPLANを使用せずに照会を再実行依頼してください。

このクエリを最適化する可能性はありますか?

+3

多くの結果が返ってくるのを知っていますか? (もし私が間違っていなければ166万行。)明確な最適化は次のようになります。 – delnan

+0

@delnan、Where節がありますが、私はそれが1,687,400のみであると信じています:-)。なぜあなたはデカルト製品をしたいのですか?おそらくあなたの問題に対するよりよい解決策があります。 – Ben

+0

@Ben私はこれを元々説明しましたが、ほとんどの丸め方法では結果は同じです;) – delnan

答えて

0

すべての行に参加しない場合は、INNER JOINまたはLEFT JOINを使用できます。 Inner JOINは一致する行のみを返し、Left Joinは左のテーブルの空の行も返します。右結合は、右のテーブルの空の行も返します。

1

理由を詳しく教えてください。 あなたが言及したクエリは、(私の経験から)一般的なものではなく、高価なクエリプランが発生します。クエリのコンテキストをよりよく理解するためには、パフォーマンスが向上し、関連するデータを取得するためのいくつかの手順を実行するストアドプロシージャにクエリを実行する別のアプローチをとるかもしれませんが、それぞれに効率的な方法で実行しますステージ。

適切な例としては、関連IDを一時テーブルに分離してから(「<」の代わりに「=」を使用して)結合して結果を取得する手順があります。

+0

T_Carテーブルで同様の行を探したいと思います。だから私は他の行と比較する必要があります。 – PsCraft

+0

似たようなことを言うと、テーブルの他の列を比較したいと思うと思いますか?それは事実ですか? – itayw

+0

@ user927524 "類似"を定義してください - 他に誰もあなたが何を意味するかを知っている人はいません。 –

0

デカルト製品全体を生産するにはどのくらい時間がかかりますか?1,690,000行ありますか?

これが妥当な場合は、MINUS演算子を使用して、主キーが一致する行を削除することを検討してください。何かのようなもの。

select * From T_Car C1, T_Car C2 
MINUS 
select * From T_Car C1 Join T_Car C2 On C1.CarID = C2.CarID 

デカルト製品全体が生産に時間がかかる可能性があります。とにかくそのような結果が必要なのはなぜですか?おそらく、データをモデル化するためのより良い方法があります。

+1

誤解されていない限り、SQL ServerはMINUSの代わりにEXCEPT(Oracleのもの)を使用しています。 – itayw

関連する問題