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 を使用せずに、クエリを再サブミットしてください。

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

4

3 に答える 3

1

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

これの良い例 (シナリオを使用) は、関連する ID を一時テーブルに分離し、('<>' の代わりに '=' を使用して) 結合して結果を取得するプロシージャを作成することです。

于 2012-02-25T12:54:10.297 に答える
0

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

于 2012-02-25T12:51:09.897 に答える
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 

デカルト積全体を生成するには時間がかかりすぎる可能性があります。とにかく、なぜそのような結果が必要なのですか?データをモデル化するためのより良い方法があるかもしれません。

于 2012-02-25T13:03:33.780 に答える