4

SQL Server で明らかに最適化されていないビューを実行しました。

SELECT     ID, T_ID, SRNB, P_DATETIME,
                      (SELECT     TOP (1) COL_A
                        FROM          dbo.T_DETAIL AS T
                        WHERE      (T_ID = a.T_ID) AND (COL_A IS NOT NULL) AND (P_DATETIME <= a.P_DATETIME)
                        ORDER BY P_DATETIME DESC) AS COL_A, COL_A_MU,
                      (SELECT     TOP (1) COL_B
                        FROM          dbo.T_DETAIL AS T
                        WHERE      (T_ID = a.T_ID) AND (COL_B IS NOT NULL) AND (P_DATETIME <= a.P_DATETIME)
                        ORDER BY P_DATETIME DESC) AS COL_B, COL_B_MU,
--...for several columns
                      (SELECT     TOP (1) COL_Z
                        FROM          dbo.T_DETAIL AS T
                        WHERE      (T_ID = a.T_ID) AND (COL_Z > 0) AND (P_DATETIME <= a.P_DATETIME)
                        ORDER BY P_DATETIME DESC) AS COL_Z
FROM         dbo.T_DETAIL AS a

このビューの目的は、テーブル T_DETAIL から最新の値 NOT NULL (場合によっては NOT 0) を取得することです。

例: T_DETAIL は

+-----+------+------+----------------+-------+-------+-------+
| ID  | T_ID | SRNB |   P_DATETIME   | COL_A | COL_B | COL_Z |
+-----+------+------+----------------+-------+-------+-------+
| xxx | aaa  | aaa  | 20131205 20:15 | 5     | NULL  | 10    |
| xxx | aaa  | aaa  | 20131205 20:16 | NULL  | 10    | NULL  |
| xxx | aaa  | aaa  | 20131205 20:17 | NULL  | 5     | 5     |
| xxx | aaa  | aaa  | 20131205 20:18 | 5     | NULL  | NULL  |
| xxx | aaa  | aaa  | 20131205 20:19 | NULL  | NULL  | 11    |
| xxx | aaa  | aaa  | 20131205 20:20 | 7     | NULL  | 10    |
+-----+------+------+----------------+-------+-------+-------+

ビューでは次のようになります。

+-----+------+------+----------------+-------+-------+-------+
| ID  | T_ID | SRNB |   P_DATETIME   | COL_A | COL_B | COL_Z |
+-----+------+------+----------------+-------+-------+-------+
| xxx | aaa  | aaa  | 20131205 20:15 | 5     | NULL  | 10    |
| xxx | aaa  | aaa  | 20131205 20:16 | 5     | 10    | 10    |
| xxx | aaa  | aaa  | 20131205 20:17 | 5     | 5     | 5     |
| xxx | aaa  | aaa  | 20131205 20:18 | 5     | 5     | 5     |
| xxx | aaa  | aaa  | 20131205 20:19 | 5     | 5     | 11    |
| xxx | aaa  | aaa  | 20131205 20:20 | 7     | 5     | 10    |
+-----+------+------+----------------+-------+-------+-------+

ビューは機能しますが、非常に遅いです。どこから最適化を開始すればよいですか? インデックス付きビューにしようとしましたが、SQL Server Manager は、最新の値を取得するためにORDER BYのみ使用されると警告しました。TOP 1そこから始めるべきだと思いますが、どうすればいいですか?どこかで使用する方が良い選択かもしれMAX()ませんが、複雑さを加えたり、物事を台無しにしたりしたくありません。

私はどの道をたどるべきですか?私が探しているものを達成するための標準的な方法はありますか?

4

2 に答える 2

1

COL_Xサブクエリごとに、次の代わりに:

(SELECT     TOP (1) COL_A
 FROM          dbo.T_DETAIL AS T
 WHERE      (T_ID = a.T_ID) AND (COL_A IS NOT NULL) AND (P_DATETIME <= a.P_DATETIME)
 ORDER BY P_DATETIME DESC) AS COL_A, COL_A_MU

これを試して:

  (SELECT     COL_A
   FROM       dbo.T_DETAIL AS T
   WHERE      T_ID = a.T_ID
   AND        P_DATETIME =    
     (select  max(P_DATETIME) 
      FROM    dbo.T_DETAIL AS T2
      WHERE   T_ID = a.T_ID AND COL_A IS NOT NULL
      AND     P_DATETIME <= a.P_DATETIME
     )
   ) AS COL_A, 

私はそれをテストすることはできませんが、これが何かの助けになることを願っています.

パフォーマンスを向上させるには、インデックスT_ID(および結合で使用されている場合は他のキー列) とP_DATETIME同じインデックス内にインデックスを作成すると役立つ場合があります。

于 2013-11-13T22:19:06.373 に答える
0

「最新の値」

作成された日時を格納するために日時列(デフォルト値付き)を導入することは可能ですか?

はいの場合は、この日時を使用してインデックスを作成し (並べ替え順序で試行)、"最近の値" をすばやく並べ替えてから、インデックス内の ABZ 列を追跡できます。クエリでこのインデックスを使用します

于 2013-11-13T05:41:05.910 に答える