0

Sybase データベース クエリに関するいくつかの質問:

  1. 結合を実行し、where 句がある場合、実際の結合の前にフィルターが適用されますか? つまり、where 条件なしで join するよりも高速ですか?

  2. 私は3つのテーブルを含む例を持っています(列は以下にリストされています):

    A: O1,....
    B: E1,E2,...
    C: O1, E2, E2
    

したがって、私の結合は次のようになります。

select A.*, B* from B,C,A
where 
C.E1=B.E1 and C.E2=B.E2 and C.O1=A.O1 
and A.O2 in (...)
and B.E3 in (...)

C を削除し、代わりにテーブル B に O1 を追加した場合、結合は大幅に高速になりますか?

B:E1,E2,O1....
4

2 に答える 2

0

速度は通常、SQLServerが読み取らなければならない数または行によって異なります。

  1. where句または結合を使用しても違いはないと思います
  2. 削除されたテーブルの行数に依存します

これは、結合またはwhere句を追加する順序によって異なります。たとえば、Cに行が数行しかない場合、最初にテーブルまたはwhereとして追加すると、で可能な一致の数がすぐに削減されます。 。ただし、Cに数百万の行がある場合は、一致するものを見つけるために数百万を読み取る必要があります。

最新のオプティマイザは、クエリをより効率的に再配置できますが、それに依存しないでください。

読み取られる行数を実際に削減できるのは、結合列にインデックスを追加することです。A.O1とC.O1にインデックスがある場合は、読み取り数を大幅に削減できます。

于 2012-08-15T15:14:48.280 に答える
0

まず、適切な結合構文を使用する必要があります。

select A.*, B.*
from B join C
     on C.E1=B.E1 and C.E2=B.E2 join
     A
     on C.O1=A.O1
where B.E3 in (...)

「、」は交差結合を意味し、見逃されやすいため問題が発生しやすいです。「from BC, A」と言うと、クエリは大きく異なります。また、外部結合へのアクセスが可能になり、ステートメントがより読みやすくなります。

あなたの質問に対する答えは「はい」です。結合するテーブルが少ないほど、クエリは高速に実行されます。主キーで結合を行っていて、テーブルがメモリに収まる場合、結合は高価ではありません。ただし、B のレコード内のデータを検索するだけの方が高速です。

私が言っているように、一部のデータベースでは、これが必ずしも真実ではない境界ケースが存在する可能性があります。たとえば、列に値が 1 つしかなく、列が長い文字列の場合、その列をページに追加すると、B に必要なページ数が増える可能性があります。このような極端なケースはほとんどなく、パフォーマンスが向上するはずです。

于 2012-08-15T15:13:48.953 に答える