改进搜索查询

时间:2014-01-19 10:06:14

标签: sql performance sql-server-2008

我有搜索功能的查询。

基本上,搜索功能允许用户定义他们“拥有”和“想要”的内容。然后,此查询将过滤掉其他用户创建的所有可能结果。

例如,我有苹果(质量好),我想要橙色(质量差)。因此,结果将显示所有具有橙色(质量差)并且想要苹果(具有良好质量)的用户。

搜索查询有点长,我尝试简化如下:

此存储过程将接收用户定义的表(ItemID& Quality)作为参数

@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]
)  

以上查询按预期工作。但是,我遇到了性能问题。我尝试通过在特定时间(几秒)内多次执行此存储过程来进行压力测试,并且我的db(SQL Server 2008 Express)似乎无法努力并生成超时错误

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

我想这是因为上面的查询使用了太多的IN CLAUSE。

有没有办法改进此查询?

1 个答案:

答案 0 :(得分: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