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()
ませんが、複雑さを加えたり、物事を台無しにしたりしたくありません。
私はどの道をたどるべきですか?私が探しているものを達成するための標準的な方法はありますか?