2014-01-19 48 views
0

我有一個查詢功能。改進搜索查詢

基本上搜索功能允許用戶定義他們「有」和「想要」。然後這個查詢將過濾掉其他用戶創建的所有可能的結果。

例如,我有蘋果(質量好),我想桔子(質量差)。因此,結果將顯示所有橙色(質量差)的用戶,並希望蘋果(質量好)。

所述搜索查詢的位長和我嘗試如下簡化:

這個存儲過程將接收用戶定義的表(的ItemID &質量)作爲參數

@WantUdt AS HaveItemUdt READONLY, 
@HaveUdt AS HaveItemUdt READONLY 

搜索查詢(用戶可以定義不止一個項目和質量,所以我用IN):

SELECT * from tbl_Trade WHERE TradeID IN 

(SELECT TradeID from tbl_Want w INNER JOIN 

    (SELECT TradeID FROM tbl_Have 
    WHERE HaveID IN (SELECT ItemID FROM @HaveUdt) AND 
    Quality IN (SELECT QualityID FROM @HaveUdt)) as h --to filter [have], 

ON w.TradeID = h.TradeID 

    WHERE WantID IN (SELECT ItemID FROM @WantUdt) AND 
    Quality =IN (SELECT QualityID FROM @WantUdt) --to filter [want] 
) 

以上查詢按預期工作。但是,我有性能問題。我試圖通過執行特定的時間(幾秒鐘)內多次這個存儲過程做壓力測試,和我的數據庫(SQL Server 2008 Express的),似乎不能工作,並生成超時錯誤

超時過期。操作完成之前超時的時間或服務器沒有響應。

我想這是因爲上面的查詢使用了太多的IN CLAUSE。

有沒有什麼辦法可以改善這個查詢?

+0

這個問題很難回答,不知道表結構或有樣品數據。請考慮與你的表共享一個SQLFiddle(http://www.sqlfiddle.com),一些有代表性的數據和你的查詢來優化。 –

回答

0
Try this. I hope it will help. 

SELECT * -- select only those columns which are required 
FROM tbl_Trade AS tt (NOLOCK) 
INNER JOIN tbl_Want w(NOLOCK) ON tt.TradeId = w.TradeID 
INNER JOIN tbl_Have h (NOLOCK) ON h.TradeID = w.TradeID 
INNER JOIN @HaveUdt hu(NOLOCK) ON hu.itemId = h.HaveID AND hu.QualityId = h.Quality 
INNER JOIN @WantUdt wu (NOLOCK) ON wu.ItemId = w.WantID AND wu.QualityId = w.Quality 

Thanks