次の形式で、ビューに対して実行されている SQL Server でかなり複雑なクエリがあります。
SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]
ORDER BY sortcode;
Sort
上記のクエリ プランは、 final の直前の操作を示していますSELECT
。これは私が期待するものです。一致するレコードは 35 件のみで、クエリにかかる時間は 2 秒未満です。
しかし、 を追加するTOP 30
と、クエリに約 3 分かかります。使用SET ROWCOUNT
は同じくらい遅いです。
クエリ プランを見ると、結合とフィルターのmyview
前に200 万件以上のレコードがすべて並べ替えられているように見えます。
この "並べ替え" は、クエリ プランで、インデックスのインデックス スキャンsortcode
、メイン テーブルのクラスター化インデックス シーク、およびそれらの間の入れ子になったループとして表示されます。これらはすべて、結合とフィルターの前に行われます。
指定されていない場合のように、 SQL Server をSORT
の直前 に強制するにはどうすればよいですか?TOP
TOP
の構造が問題だとは思いませんが、念のためmyview
、次のようなものです。
CREATE VIEW myview AS
SELECT columns..., sortcode, 0 as shared FROM mytable
UNION ALL
SELECT columns..., sortcode, 1 as shared FROM [anotherdb].dbo.mytable
ローカルmytable
には数千のレコードがありmytable
、同じ MSSQL インスタンスの他のデータベースには数百万のレコードがあります。両方のテーブルには、それぞれの列にインデックスがあります。sortcode