我有搜索功能的查询。
基本上,搜索功能允许用户定义他们“拥有”和“想要”的内容。然后,此查询将过滤掉其他用户创建的所有可能结果。
例如,我有苹果(质量好),我想要橙色(质量差)。因此,结果将显示所有具有橙色(质量差)并且想要苹果(具有良好质量)的用户。
搜索查询有点长,我尝试简化如下:
此存储过程将接收用户定义的表(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。
有没有办法改进此查询?
答案 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