1

ネストされたクエリが次のようになっているとします。

SELECT * 
FROM Table1 
WHERE Table1.val in 
(
   Select Table2.val 
   from Table2 
   where Table2.val>3
)

だから私の質問は、実際のクエリプロセッサがこれをどのように評価するかです-

  • 最初に最も内側のクエリを評価し、結果を一時的に保存してから上位レベルのクエリで使用しますか? 【サブクエリの結果が大きい場合、一時保存では足りなくなる場合があります】
  • または、外部クエリの各結果に対して外部クエリを評価しますか[外部クエリの評価が多すぎます]

私は何かが欠けていますか?それは実際にどのように実装されていますか?

4

3 に答える 3

3

場合によります。内側の外側のクエリから値を参照できます。これを行うと、相関サブクエリまたは相関派生テーブルと呼ばれるものができます。この場合、親クエリの可能なすべての行についてクエリを再計算する必要があります。これを行わないと、インライン ビューまたはインライン派生テーブルと呼ばれるものができ、ほとんどのデータベース エンジンは、ビューを 1 回だけ計算するほどスマートです。

于 2013-10-02T16:23:10.833 に答える
1

これはあなたを助けるかもしれません

かなり大きなクエリを実行するのに十分なメモリがあり、クエリの複雑さによってタイムアウトが発生する可能性はほとんどありません。ネストされたクエリには、クエリを実行するために必要なメモリの量が SQL Server に割り当てられた物理メモリの "フットプリント" を超えない限り、速度のためにほぼ排他的に物理メモリで実行されるという利点があります。

また、ネストされたクエリの構造により、SQL Server クエリ オプティマイザーは、クエリから結果を取得するための最適な方法を見つけようとします。(つまり、オプティマイザーはそれをマイクロオペレーションに変換し、効率的に実行するために再編成します) [出典]

並べ替えのため、どのクエリが最初に実行されるかはわかりません。ただし、最適化の後、おそらく内部クエリの形式が実行されます (ほとんどの場合、その結果なしでは実際には何もできません)。

SQL クエリは、皆さんが考えているようにスタック呼び出しのようには実行されません。それらは、マシン用に理解および翻訳される1行の命令です。

于 2013-10-02T16:22:55.950 に答える
0

EXPLAIN次のように実行計画に関する情報を取得するために使用できます。

EXPLAIN SELECT * 
 FROM Table1 
 WHERE Table1.val in 
(
  Select Table2.val 
  from Table2 
  where Table2.val>3
)

たとえば、クエリの場合、次のようになります ここに画像の説明を入力

ドキュメントに記載されているように:

DEPENDENT SUBQUERY の評価は、UNCACHEABLE SUBQUERY の評価とは異なります。DEPENDENT SUBQUERY の場合、サブクエリは、外部コンテキストからの変数の異なる値のセットごとに 1 回だけ再評価されます。UNCACHEABLE SUBQUERY の場合、サブクエリは外部コンテキストの行ごとに再評価されます。

したがって、最初の推測は正しいものでした。

詳細については、http EXPLAIN: //dev.mysql.com/doc/refman/5.0/en/explain.htmlを参照してください。

于 2013-10-02T16:33:48.273 に答える