2009-05-26 17 views
1

私は、ストアドプロシージャとして、このクエリを持っています。Microsoft SQL Server Management StudioのExpressでこのストアドプロシージャは、なぜアプリケーションではなく、Management Studioですばやく実行されますか?

SELECT  ID 
    FROM   dbo.tblRentalUnit 
    WHERE  (NOT EXISTS 
     (SELECT  1 AS Expr1 
     FROM   dbo.tblTenant 
     WHERE  (dbo.tblRentalUnit.ID = UnitID))) 

、それが16ミリ秒で実行されます。 Visual Studio 2008で自動生成された型指定されたデータセットに64,453ミリ秒で実行されます。 1分以上。

推定

と実行計画は、このようなものです:

 
Select [0%] <- Filter [1%] <- Merge Join (Left Outer Join) [28%] <- Index Scan [16%] 
                   <- Sort [43%] <- Clustered Index Scan [12%] 

なぜこの違いはここにある、そしてどのように私はそれを修正することができますか?

+0

セットアップに関する詳細が必要な場合は、お知らせください。 – Malfist

+0

これはなぜ投票されていますか? – Malfist

+0

おそらく、青い空、緑の草、そして東に浮かぶ太陽が関係しています。 – TheTXI

答えて

2

誤ってキャッシュされたクエリプランのようです。

インデックスと統計情報は最新のものですか?あなたは(クライアントのいずれかから)各テストの前にバッファをフラッシュしました

SELECT ru.ID  
FROM   
    dbo.tblRentalUnit ru 
    LEFT JOIN dbo.tblTenant t ON ru.ID = t.UnitID 
WHERE 
    t.UnitID IS NULL 
+0

インデックスと統計情報が最新であることを確認して確認するにはどうすればよいですか?データベースのプロパティに応じて、自動更新されます – Malfist

+0

このクエリに切り替えてARITHABORTをONに設定します。実行時間をアプリケーションで5859ミリ秒に落としましたが、それでも管理スタジオでの実行方法と同じではありません – Malfist

+0

SSMSでは差異の推定と実際の実行計画を見ています –

0

:tblTenant.UnitIdはtblRentalUnit.ID にForiegnキーであれば

ところで、その後、あなたのクエリがように書き換えることができますか?各テストの間にDBCC DROPCLEANBUFFERSとDBCC FREEPROCCACHEを実行していることを確認してください。

+0

それが生産の箱でないことを確認してください! ;) –

+0

私はそれをしました、それは生産箱でもありません:) – Malfist

0

tblRentalUnit.IDは適切にインデックスされていますか?

+0

はいです。すべてが索引付けされています。この問合せのすべては索引でのみ機能します。 – Malfist

+0

「すべて」が索引付けされていると、問題の一部になる可能性があります。インデックスをどのように調整しましたか? – andrewbadera

関連する問題