在SQL Server 2008 R2中,有沒有一種方法可以使用一些提示來強制執行這個查詢,該查詢在連接中使用OR,其運行速度與下面的代碼一樣快,它將UN替換爲OR。我可以在不使用聯合的情況下使用OR更快地進行聯接嗎?
慢查詢:
select <stuff> from
UPCs u
JOIN Ingredients i on
(u.UPCID = i.UPCID) or (u.CategoryID = i.CategoryID and u.Quality = i.Quality) or (u.ManufacturerID = i.ManufacturerID and u.Quality = i.Quality)
更快的查詢做同樣的事情,但單獨應用標準並串聯與工會的結果:
select <stuff> from UPCs u join Ingredients i on
(u.UPCID = i.UPCID)
UNION ALL
select <stuff> from UPCs u join Ingredients i on u.CategoryID = i.CategoryID and u.Quality = i.Quality)
UNION ALL
select <stuff> from UPCs u join Ingredients i on u.ManufacturerID = i.ManufacturerID and u.Quality = i.Quality
與工會,它在做什麼UPC上的循環連接和2個散列連接,然後將連接的結果連接在一起。 UPC ID是一個集羣主鍵,其他字段是非索引的,並且這兩個表都非常大。
編輯:請注意,我做了隨後的成分加入,所以我很樂意將它分成多個成分上的連接,但只有它比聯盟更快。真實世界的查詢是這樣的:
Select <stuff> from #UnknownPoursForThisEvent up
JOIN UPCs u on up.UPCID = u.UPCID
JOIN Tags t on t.TagNumber = up.TagNumber
JOIN Ingredients i on (i.UPCID = u.UPCID) or (u.CategoryID = i.CategoryID and u.Quality = i.Quality) or (u.ManufacturerID = i.ManufacturerID and u.Quality = i.Quality)
join Recipe r on i.RecipeID = r.RecipeID
join TicketItemAliases tia on tia.RecipeID = tia.RecipeID
<... Join, left join, and apply lots of other criteria>
EDIT2:執行計劃。 http://imgur.com/eMzqPvL&zqQ6snz#1
你檢查了缺失的索引嗎?即審查了實際執行計劃? – 2014-10-30 20:33:43
這兩個問題的答案都可以在原始文章中找到;然而,我並不是在尋找數據庫體系結構的建議,只是想讓SQL Server不採用愚蠢的方式來獲得結果而不使用聯合。 – John 2014-10-30 20:50:18