次の形式で、ビューに対して実行されている 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 の直前 に強制するにはどうすればよいですか?TOPTOP
の構造が問題だとは思いませんが、念のため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