9

これはよくある質問であることは知っていますが、他のいくつかの投稿や論文を読みましたが、インデックス付きフィールドと両方のクエリが返す可能性のあるレコードの量を考慮したものを見つけることができませんでした.

私の質問は本当に簡単です。ここでは、SQL に似た構文で (パフォーマンスの観点から) 記述された 2 つのどちらが推奨されますか。

最初のクエリ:

Select *
from someTable s
where s.someTable_id in
                    (Select someTable_id 
                     from otherTable o
                     where o.indexedField = 123)

2 番目のクエリ:

Select *
from someTable
where someTable_id in
                  (Select someTable_id 
                   from otherTable o
                   where o.someIndexedField = s.someIndexedField
                   and o.anotherIndexedField = 123)

私の理解では、2番目のクエリは、外側のクエリが返すすべてのタプルについてデータベースにクエリを実行し、最初のクエリは最初に内側の選択を評価し、次にフィルターを外側のクエリに適用します。

someIndexedField フィールドがインデックス化されていることを考えると、2 番目のクエリはデータベースを超高速でクエリできますが、数千または数百万のレコードがあると言うと、最初のクエリを使用する方が高速ではないでしょうか?

注: Oracle データベース内。

4

2 に答える 2

2

最初のクエリについて:

最初のクエリは最初に内側の選択を評価し、次にフィルターを外側のクエリに適用します。

それはそれほど単純ではありません。

SQL では、最初に実行されるものと後で実行されるものを区別することはほとんど不可能です。

SQL - 宣言型言語だからです。

あなたの「ネストされた選択」は、技術的にではなく、視覚的にのみです。

例 1 - 「someTable」には 10 行、「otherTable」には 10000 行あります。

ほとんどの場合、データベース オプティマイザーは最初に「someTable」を読み取り、次に otherTable が一致するかどうかをチェックします。そのため、状況に応じてインデックスを使用する場合と使用しない場合があります。その場合は、「indexedField」インデックスを使用します。

例 2 - 「someTable」には 10000 行、「otherTable」には 10 行あります。

ほとんどの場合、データベース オプティマイザーはメモリ内の「otherTable」からすべての行を読み取り、123 でフィルター処理してから、someTable PK(someTable_id) インデックスで一致を見つけます。その結果、「otherTable」からのインデックスは使用されません。

2 番目のクエリについて:

最初とは全然違う。だから、私はそれらを比較する方法がわかりません:

  • 最初のクエリは、2 つのテーブルを 1 組でリンクします: s.someTable_id = o.someTable_id
  • 2 番目のクエリは、2 つのテーブルを 2 つのペアでリンクします: s.someTable_id = o.someTable_id AND o.someIndexedField = s.someIndexedField。

2 つのテーブルをリンクする一般的な方法は、最初のクエリです。ただし、o.someTable_id はインデックス化する必要があります。

したがって、一般的なルールは次のとおりです。

  • すべての PK - インデックスを作成する必要があります (デフォルトでインデックスが作成されます)
  • フィルタリング用のすべての列 (WHERE 部分で使用されるようなもの) にインデックスを付ける必要があります
  • テーブル間の一致を提供するために使用されるすべての列 (IN、JOIN などを含む) - フィルター処理も行うため、インデックスを作成する必要があります。
  • DB エンジンは、最適な順序の操作を (または並行して) 自動的に選択します。ほとんどの場合、これを決定することはできません。
  • Oracle EXPLAIN PLAN (ほとんどの DB に同様のものがあります) を使用して、実際のデータに対するさまざまなクエリの実行計画を比較します。
于 2013-07-04T20:57:52.317 に答える