1

同じデータを取得するための 2 つの選択肢があると思われるものから選択しようとしています。

対象の ID を持つ 1 つのテーブルと、それらの ID のデータを持つ互いに類似した 4 つのテーブルのセットがあります。各 ID の行を取得したら、それらを使用して最大のステータス フィールドや最小の日付フィールドなどを (4 つのテーブルにわたって) 取得します。

このクエリは、4 つのテーブルの結合に対する 1 つの結合、または 4 つの結合の結合として構造化されていることがわかります。どちらがより効率的ですか? FWIW、最初のほうが理解しやすく、おそらく維持しやすいと思います。

2 つの選択肢のスペルアウト:

UNION 結合された 4 つのテーブルのサブセレクトに対して idTable を結合します。

select ss.id, ss.study, ss.status, ss.date
from ( -- subselect ss
        select tx.id, tx.study, tx.status, tx.date
      from table_tx tx
    UNION  
    select cfu.id, cfu.study, cfu.status, cfu.date
      from table_cfu cfu
    UNION  
    select sfu.id, sfu.study, sfu.status, sfu.date
      from table_sfu sfu
    UNION  
    select bsl.id, bsl.study, bsl.status, bsl.date
      from table_bsl bsl
  ) ss
inner join 
idTable id on id.id = ss.id AND id.study = ss.study

4 つのそれぞれに対して結合された idTable の共用体:

select tx.id, tx.study, tx.status, tx.date
  from table_tx tx
  inner join 
  idTable id on id.id = tx.id AND id.study = tx.study
UNION  
select cfu.id, cfu.study, cfu.status, cfu.date
  from table_cfu cfu
  inner join 
  idTable id on id.id = cfu.id AND id.study = cfu.study
UNION  
select sfu.id, sfu.study, sfu.status, sfu.date
  from table_sfu sfu
  inner join 
  idTable id on id.id = sfu.id AND id.study = sfu.study
UNION  
select bsl.id, bsl.study, bsl.status, bsl.date
  from table_bsl bsl
  inner join 
  idTable id on id.id = bsl.id AND id.study = bsl.study

または、これら以外のより良い選択肢はありますか?

4

2 に答える 2

0

各テーブルの行数に関してデータがどのように見えるかに依存するため、最善の策は両方のアプローチを試して、どちらかが優れているかどうかを確認することです.

ただし、テーブル tx、cfu、sfu、および bsl のそれぞれに 100 万行が含まれていると仮定すると、4 を作成するのではなく、結合する前にこれら 4 つの大きなセットを 1 つの行に制限する方が高速であると予想されます。 -100 万行を設定し、それを結合します。

于 2012-09-10T17:49:18.473 に答える
0

SQL Server は最初のものを 2 番目のものに変換できますが、その逆はできません。

とはいえ、多くのこと (行数、フィルターの選択性など) に依存するため、どちらが優れているかを知る方法はありません。唯一の適切な答えは、計画および/またはテストを確認することです。

于 2012-10-06T13:00:20.863 に答える