2017-01-04 4 views
0

このような単純な「冗長」クエリを使用しましょう。内部クエリを使用したクエリのパフォーマンスの差

SELECT * FROM 
(SELECT * FROM 
    (SELECT * FROM mytable) AS X) AS Y 

パフォーマンスが低下することなく最後に収束する(実行前の)最適化はありますか?どのデータベースエンジンがそれをしていますか?

として提案します。本当の質問を載せていきます。そして、各クエリでのパフォーマンス上の可能性賭け:)

ここでそれが行く...当然の

SELECT * FROM t1 JOIN t2 ON t1.chkId = t2.xchkId; 

SELECT * FROM 
(SELECT * FROM t1) AS X 
JOIN 
(SELECT * FROM t2) AS Y 
ON X.chkId = Y.xchkId; 

を私が最後にドメインを減らすこと(が、そのことはできません今の場合)。同じことを行う !パフォーマンスの違いはありますか?

+4

ほとんどの現代のDBMSは、単純な 'select * from mytable'として実行します(そして、DBMSがそうでなければ、私にとって"近代的 "なものではないでしょう) –

+2

私は少し怖いですそのような質問が発生しました。 –

+0

確かめてください:その2つの選択の句を使って "結合"から来た単純化された状況...それをより良く説明するために編集します – mvcorrea

答えて

2

SQLServer 2012でクエリプランを調べると、1回のスキャンでコンパイルされることがわかります。ほとんどすべての深刻なデータベースは、同じ動作を示すはずです。

Query plan

2

あなたが話しているデータベースは非常に重要です。

コメントで述べたように

は、ほとんどすべての合理的なデータベースは、サブクエリを無視して、同じ基本コードにクエリをコンパイルします。これを理解する簡単な方法は、SQLは手続き型言語ではないということです。 SQLクエリは、出力の構造を指定し、出力の構造を指定しません。一般に

は、基礎となるエンジンは、このような、テーブルの結合インデックスを使用して、凝集などの異なるタスクのためのアルゴリズムの束が含まれているデータフローエンジンです。実行される内容は、SQL文自体からかなり離れています。

すべてのことは、すべてのデータベースが「合理的」であるとは限りません。特に、MySQL(とMariaDB)はサブクエリを実現します。したがって、構造は異なる。他の単純なデータベースもこれを行うかもしれません。

0

例のように2つのサブクエリを組み合わせると、かなり一般的なSQLパターンになります。概念的には、各サブ問合せは一時表です。クエリプランでは、インデックスのシークやスキャンのようなテーブル演算子として表示されます。

サブクエリの複雑さに応じて: 1.最善をすることができ、あなたの例のようにサブクエリを使用して。 2.サブクエリの結果を実際の一時テーブルまたはテーブル変数に配置するのが最適です。

質問の具体的な内容を明確にし、クエリプランに重点を置くと便利です。

関連する問題