請複製並粘貼以下腳本。使查詢變慢的子查詢
DECLARE @MainTable TABLE(MainTablePkId int)
INSERT INTO @MainTable SELECT 1
INSERT INTO @MainTable SELECT 2
DECLARE @SomeTable TABLE(SomeIdPk int, MainTablePkId int, ViewedTime1 datetime)
INSERT INTO @SomeTable SELECT 1, 1, DATEADD(dd, -10, getdate())
INSERT INTO @SomeTable SELECT 2, 1, DATEADD(dd, -9, getdate())
INSERT INTO @SomeTable SELECT 3, 2, DATEADD(dd, -6, getdate())
DECLARE @SomeTableDetail TABLE(DetailIdPk int, SomeIdPk int, Viewed INT, ViewedTimeDetail datetime)
INSERT INTO @SomeTableDetail SELECT 1, 1, 1, DATEADD(dd, -7, getdate())
INSERT INTO @SomeTableDetail SELECT 2, 2, NULL, DATEADD(dd, -6, getdate())
INSERT INTO @SomeTableDetail SELECT 3, 2, 2, DATEADD(dd, -8, getdate())
INSERT INTO @SomeTableDetail SELECT 4, 3, 1, DATEADD(dd, -6, getdate())
SELECT m.MainTablePkId,
(SELECT COUNT(Viewed) FROM @SomeTableDetail),
(SELECT TOP 1 s2.ViewedTimeDetail FROM @SomeTableDetail s2
INNER JOIN @SomeTable s1 ON s2.SomeIdPk = s1.SomeIdPk
WHERE s1.MainTablePkId = m.MainTablePkId)
FROM @MainTable m
此腳本只是一個示例。我有很長的列表SELECT
列和子列表中的約12列。在我的From
子句中有大約8個表。
要獲取2000條記錄完整查詢需要21秒,如果我刪除子查詢它只需要4秒。
我試圖使用'數據庫引擎優化顧問'來優化查詢,並添加新建議的索引和統計信息,但這些更改使查詢時間更糟糕。
注:
正如我剛纔所說,這是測試數據來解釋我的問題的真實數據有很多表的連接列,但沒有子查詢的結果我們的罰款。
任何幫助謝謝。
不應該SELECT COUNT(查看)FROM @SomeTableDetail需要與表@s的id關聯嗎? – Lamak 2011-01-12 15:44:38
沒有`ORDER BY'的'TOP 1'意味着你會得到任意一行。此外,是否與@MainTable關聯的COUNT()子查詢? – 2011-01-12 15:46:27
在你的第二個子查詢中,你使用了沒有ORDER BY的TOP。你真的想要返回哪個ViewingTimeDetail?最早的?最新的? – 2011-01-12 15:46:39