2012-01-08 20 views
0

SELECTSELECTに追加のパフォーマンスが発生するか、またはデータベースがこれを最適化するのに十分スマートであるかどうかは疑問でした。例えばSELECTのSELECTの実行

、私は次のように私はいくつかの選択を持っている:

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

すべてこの特定のクエリではないグループは、日付によってDow30ですべての取引で、全量を合計。これはテーブルが1秒ごとにすべての取引を保存しているので、私はこれを使用します。これを1日単位でロールアップしたいのです。

これは完全なクエリではなく、単なる例です。 SELECTからSELECTSELECTを実行すると、パフォーマンスペナルティが発生するかどうか、またはすべてが魔法のように最適化されているかどうかは分かりませんでした。

私がクエリをこのように定式化する理由は、これがクエリを視覚化する方法であり、実際にはこのトップレベルのselectを別のテーブルに結合し、基底の列を選択するからです。SELECTクエリを視覚化する。しかし、正式なDBAのバックグラウンドを持たない私は、これが間違っているかどうか、私がクエリを書く良い方法を見つけ出す必要があるかどうかはわかりません。

+2

例について話しているあなたは、クエリプランのために見ていたことがありますか?私はSQL Serverのためにそれを得る方法を知らないが、おそらくあなたはそれをあなた自身で見つけることができます。 データベースにクエリがどのように表示されるかを表示します。 – fkerber

+0

私はSQL Serverのエキスパートではありませんが、サーバーの最適化を期待しています...これは推測ではなく、クエリーのクエリプランを確認することしか知りません - サーバーが何を作成するのかを見ることができます。インデックスが必要かどうかについてのヒント... – Yahia

答えて

3

このようなSELECTのネストは、オプティマイザの1つのステートメントとみなされます。

あなたがここにこれを見ることができます。これらの例ではWhy use Select Top 100 Percent?How can I query 'between' numeric data on a not numeric field?を、ネスティングここでは効果がありませんしない限り、一般的に派生テーブルまたはCTEは、おそらく非常に小さいが追加されますを使用して悪い考え

1

は、クエリウィンドウでこれらの2つのクエリを入れて

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by a.year, b.month, c.day 

SELECT DATEPART(year, transactionTime) as year, 
     DATEPART(month, transactionTime) as month, 
     DATEPART(day, transactionTime) as day, 
     SUM(volume) as totalVolume FROM DOW30 
     GROUP BY DATEPART(year, transactionTime), 
       DATEPART(month, transactionTime), 
       DATEPART(day, transactionTime)) a 
order by DATEPART(year, transactionTime), DATEPART(month, transactionTime), DATEPART(day, transactionTime) 

次に実際の実行計画を見て、

http://technet.microsoft.com/en-us/library/ms189562.aspx 

が、それはあなたの両方のクエリの実行プランに加えて、両方のための相対的なコストが表示されます私の推測では、両方とも同じコストであることを意味する50%という意味になります(ただし、間違っている可能性があります)。

+0

ありがとう、私はこれについて知らなかった、それは両方の50%として出てきた。 – steve8918

+1

@ steve8918私は疑問に思っているときにこれを常に使用しています。本当に重要なツールです。今は、推測することなく常に確実に知る方法があります –

0

彼は質問しますが、あなたが実際に選択しているものによって異なります。この場合、メインレベルの選択は何も空想的ではなく、必要でもありません。サーバーはおそらく、単一の選択であるかのようにこのクエリを最適化します。しかし、必ずしもそうであるとは限りません。クエリに依存します。データベース上にも。 MySQL、Oracle、SQL Serverにはすべて最適なオプティマイザが用意されていますが、最適化の種類はかなり異なります。

2

であることパージングステージ中のオーバーヘッド。私は読みやすさのためにむしろ無視したいと思う。

更新あなたが技術的に(あなたの質問のように)それを使用する必要がないとき、私は