4

そのため、Informix から Sql Server に移行しています。そして、Informix ではクエリが次のように記述されていることに気付きました。

select [col1],[col2],[col3],[col4],[col5]
from tableA, tableB
where tableA.[col1] = table.[gustavs_custom_chrome_id]

私が SQL Server で作成するすべてのクエリは、次のように記述されます。

select [col1],[col2],[col3],[col4],[col5]
from tableA 
inner join tableB on tableA.[col1] = table.[gustavs_custom_chrome_id]

さて、私の最初の考えは、最初のクエリが悪いということでした。おそらく、この巨大なレコード セットを作成し、Where 句を使用して実際のレコード セットに合わせます。したがって、パフォーマンスが悪いです。そしてそれはノンアンシです。だから二重に悪い。

ただし、グーグルで調べたところ、理論的にはどちらもほとんど同じようです。どちらも ANSI に準拠しています。

だから私の質問は:

  1. 両方のクエリは同じように実行されますか? すなわち。同じ速度で実行され、常に同じ答えが得られます。
  2. どちらも本当に ANSI に準拠していますか?
  3. あるスタイルを別のスタイルよりも推し進めるべき顕著な理由はありますか? それとも、十分に良いままにしておくべきですか?


    注: これらはクエリの単なる例です。一度に最大 5 つのテーブルを結合する (最初の種類の) いくつかのクエリを見てきました。
4

1 に答える 1

17

まあ、「より良い」は主観的です。ここにはいくつかのスタイルがあります。しかし、私はあなたの質問に直接答えます。

  1. どちらも同じように機能します
  2. どちらもANSIに準拠しています。
  3. 最初の例の問題は、

    • クロス積を誤って導出するのは非常に簡単です(結合基準を除外する方が簡単なため)

    • また、結合にテーブルを追加するにつれて、結合基準のデバッグが困難になります。

    • 古いスタイルの外部結合(* =)構文は非推奨になっているため(誤った結果を返すことが長い間文書化されています)、外部結合を導入する必要がある場合は、新しいスタイルと古いスタイルの結合を混在させる必要があります...なぜプロモートするのか矛盾?

    • これはベストプラクティスの権威ではありませんが、Microsoftは明示的なINNER /OUTERJOIN構文を推奨しています

    • 後者の方法では:

      • 内部/外部に関係なく、一貫した結合構文を使用しています
      • 誤って外積を導出することはより困難です(不可能ではありません)
      • 結合基準をフィルター基準から分離すると、デバッグが容易になります

私はケビンが指摘した投稿を書きました。

于 2012-06-28T19:47:04.730 に答える