以下のスクリプトをコピーして貼り付けてください。サブクエリー作成クエリースロー
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(表示されていない)から@SomeTableDetailをテーブル@SomeTableのIDに関連付ける必要がありますか? – Lamak
'TOP 1'は' ORDER BY'なしでランダムな行を得ることを意味します。また、 'COUNT()'サブクエリは@MainTableと相関関係がありますか? –
2番目のサブクエリでは、ORDER BYなしでTOPを使用しています。どのViewedTimeDetailが本当に返されますか?最古の?最新の? –