简体   繁体   English

SQL Server查询优化问题

[英]SQL Server Query optimisation question

I have the following queries, and I would love to find a better way to do this as it doesn't seem right the way I am doing it... 我有以下查询,我很想找到一种更好的方法来执行此操作,因为它似乎不适合我的操作方式...

EDIT 编辑

Sorry I did not specify that I only want to return adverts that actually match all amenities! 抱歉,我没有指定我只想退回实际上与所有便利设施匹配的广告!

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

I would love to find out how to optimize these queries! 我很想知道如何优化这些查询!

Your queries look fine to me. 您的查询对我来说很好。 Another alternative would be to use something like this: 另一种选择是使用类似这样的东西:

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

If the (Advert_Id, Amenity_id) pairs are unique, you can drop the DISTINCT . 如果(Advert_Id, Amenity_id)对是唯一的,则可以删除DISTINCT

How about the following restructure of your query which allows you to simply create a comma seperated list of specific amenity IDs? 查询的以下重组如何使您可以简单地创建一个逗号分隔的特定便利设施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]

This uses a dynamic table statement to prefilter only those applicable amenities before joining back against the list of adverts. 这将使用动态表格语句在加入广告列表之前仅对那些适用的便利设施进行预过滤。 Note, Sql Server will heavily optimise the sub query before execution. 注意,Sql Server将在执行之前对子查询进行大量优化。 This should mean that you'll get the benefit of a more maintainable statement with all the optimisations that Sql Server provides. 这应该意味着您将获得Sql Server提供的所有优化的更可维护的语句。

* Try this simple * *试试这个简单*

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM