[英]SQL Server Query optimisation question
我有以下查詢,我很想找到一種更好的方法來執行此操作,因為它似乎不適合我的操作方式...
編輯
抱歉,我沒有指定我只想退回實際上與所有便利設施匹配的廣告!
SELECT TOP 50 Advert.Id
FROM Advert
WHERE Id in(SELECT Advert_id FROM AdvertsToAmenities WHERE Amenity_id = 1 AND Advert_Id = Id)
AND Id in(SELECT Advert_id FROM AdvertsToAmenities WHERE Amenity_id = 3 AND Advert_Id = Id)
AND Id in(SELECT Advert_id FROM AdvertsToAmenities WHERE Amenity_id = 5 AND Advert_Id = Id)
-- OR --
SELECT TOP 50 Advert.Id
FROM Advert
JOIN AdvertsToAmenities a on Advert.Id = a.Advert_id
JOIN AdvertsToAmenities b on Advert.Id = b.Advert_id
JOIN AdvertsToAmenities c on Advert.Id = c.Advert_id
WHERE a.Amenity_id = 1
AND b.Amenity_id = 3
AND c.Amenity_id = 5
我很想知道如何優化這些查詢!
您的查詢對我來說很好。 另一種選擇是使用類似這樣的東西:
SELECT TOP 50 Advert.Id
FROM Advert JOIN AdvertsToAmenities a ON Advert.Id = a.Advert_id
WHERE a.Amenity_id = 1
OR a.Amenity_id = 3
OR a.Amenity_id = 5
GROUP BY Advert.Id
HAVING COUNT(DISTINCT a.Amenity_id) = 3
如果(Advert_Id, Amenity_id)
對是唯一的,則可以刪除DISTINCT
。
查詢的以下重組如何使您可以簡單地創建一個逗號分隔的特定便利設施ID列表呢?
SELECT TOP 50
a.[ID]
FROM [Advert] a
INNER JOIN
(
SELECT ata.[Advert_ID]
FROM [AdvertsToAmenities] ata
WHERE ata.[Amenity_ID]
IN (1, 3, 4, 5) -- Your list of amenity IDs
) as ata
ON a.[ID] = ata.[Advert_ID]
這將使用動態表格語句在加入廣告列表之前僅對那些適用的便利設施進行預過濾。 注意,Sql Server將在執行之前對子查詢進行大量優化。 這應該意味着您將獲得Sql Server提供的所有優化的更可維護的語句。
*試試這個簡單*
SELECT TOP 50 a.Id
FROM Advert a, AdvertsToAmenities b
WHERE a.Amenity_id in ('1','3','5')
and a.Id = b.Amenity_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.