4

最適化しようとしている非常に単純なクエリがあります。issues_notes は単純なテーブルですが、meta_users はビューを介してクエリを実行しているリモート データベース サーバー上のテーブルです。

注文せずにクエリを実行するとすぐに返されますが、追加すると返されるORDER BY dateまでに約4秒かかります。SQL Server に実行計画を表示してもらいましたがTable Spool、結合でのみ発生する操作で速度が低下しているようです。この「最適化」を防ぐ方法はありますか?

クエリ:

SELECT 
    [issues_notes].[date], 
    [meta_users].[firstname], 
    [meta_users].[lastname], 
    [issues_notes].[note] 
FROM 
    [issues_notes] 
    LEFT JOIN [issues_issue] 
        ON ([issues_notes].[issue_id] = [issues_issue].[id]) 
    LEFT OUTER JOIN [meta_users] 
        ON ([issues_notes].[author_id] = [meta_users].[userid]) 
WHERE 
    ([issues_issue].[issue_hash] = '%s' ) 

順序付けなしの実行計画:

ここに画像の説明を入力

次の順序での実行計画:

ここに画像の説明を入力

4

1 に答える 1

2

テーブルスプールは「レイジースプール」です。つまり、表示した行は記憶されますが、余分な作業は行われません。結合の左側にある行がソートされるようになったため、同じ値の繰り返し行が次々に表示されます。スプールを使用すると、リモートサーバーに再度アクセスする代わりに、それらを再利用できます。

ソート自体はブロッキング演算子です。つまり、並べ替えの前にすべての行を保持し、並べ替えが終了した後にのみそれらを返します。

ここで何行話しているのですか?両方のクエリの合計実行時間はどれくらいですか?

于 2012-10-10T16:02:05.167 に答える