2009-05-06 5 views
0

は今、私は外に有効ですが、常に時代、このSQLクエリを持っている:このSQLクエリを最適化するにはどうすればよいですか?

SELECT 
(
SELECT (MAX(WP_ODOMETER) - MIN(WP_ODOMETER))/DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME)) 
FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
AND WP_VTDID = 'L088' 
) 
AS MAXD, 
(
SELECT MAX(WP_ODOMETER) 
FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
AND WP_VTDID = 'L088' 
) 
AS MD 

私は上記のSQLクエリに基づいてビューを作成したいです。このようなもの:

SELECT L_VTDID 
(
SELECT (MAX(WP_ODOMETER) - MIN(WP_ODOMETER))/DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME)) 
FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
AND WP_VTDID = LOCOMOTIVES.L_VTDID 
) 
AS MAXD, 
(
SELECT MAX(WP_ODOMETER) 
FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
AND WP_VTDID = LOCOMOTIVES.L_VTDID 
) 
AS MD 
FROM LOCOMOTIVES 
+1

これらの質問には、通常、実行計画を投稿することをお勧めします。 –

+0

私はそれを行う方法がわかりませんでした:D、私はクエリ - >推定見積もり計画を表示する、私のクラスタ化されたインデックス(クエリで使用される各フィールドで約34%)を探すと述べた – Dels

答えて

1

彼らはwhere句同じを持っているので、あなたはそれらを組み合わせることができ:

SELECT 
MAX(WP_ODOMETER), 
(MAX(WP_ODOMETER) - MIN(WP_ODOMETER))/
DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME)) 
FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
AND WP_VTDID = 'L088' 

WP_VTDIDのインデックス、WP_DATETIMEはこれをスピードアップすることができます。ブックマークの参照をインデックスからテーブル自体に保存するために、WP_ODOMETERをインデックスに含めることもできます。

タイムアウトは他の誰かがテーブルをロックしているので、への文から変更しよう発生した場合:クエリはNOLOCKと罰金実行している場合は、別のプロセスがテーブルを使用してからクエリを妨げている

FROM WAYPOINTS (NOLOCK) 

行をロックします。

+0

私もあなたのクエリを最初に使用していますが、速度が遅いようですので、高速化するために内部選択を使用しています(はい、私はすでに重要なフィールドをインデックスしています) – Dels

+0

クエリの実行計画を確認しましたか?メニュークエリ、実際または推定実行計画。そこでテーブルスキャンが表示された場合は、tineインデックスはおそらく使用されていません。 – Andomar

+0

NOLOCKとのこだわりはなぜですか? –

0

WAYPOINTSはWP_DATETIMEとWP_VTDIDでインデックスされていますか?

+0

はい、 indexed – Dels

+1

どのフィールドがインデックスに登録されているかを明確にすることができます。どのフィールドが重要であるかわからないことがあります。また、いくつかの列に複合インデックスがあるのか​​、それともすべて単一の列インデックスであるのでしょうか。テーブルのサイズ(行数、行幅(バイト数)、列数)。 –

3

それは私のところにあったが、私は(このバージョンは、トラブルを与える、特に以来)クエリを簡素化するだろう、そうなど、クライアントサイドの言語は、実際に減算と除算を行うための非常に能力があることを信じられないかもしれません:

SELECT MAX(WP_ODOMETER) AS MAX_ODO, 
     MIN(WP_ODOMETER) AS MIN_ODO, 
     MIN(WP_DATETIME) AS MIN_DATE, 
     MAX(WP_DATETIME) AS MAX_DARE 
    FROM WAYPOINTS 
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE() 
    AND WP_VTDID = 'L088' 

クライアント側で日付計算を処理する際に重大な問題がある場合は、サーバー上でMAX_DATEとMIN_DATEの差を生成する必要があるかもしれないと認めますが、ホスト言語を取得する方が良いかもしれません。日付の計算を行うことができます。

+0

サーバーからクライアントへの1つの部門をシフトすると、どのように低速なクエリがスピードアップしますか? – Andomar

+0

これは部門を動かすことではありません。 SELECTリストの2つのサブクエリをより簡単な式のセットに置き換えています。元のクエリは、2つの別々のサブクエリとして、 'MAX_ODO'と時間の経過に伴う式(大雑把には1日の平均移動距離)を計算します。私はそれらを単一の(非サブ)クエリに置き換えました。 –

関連する問題