首页 > 解决方案 > 优化连接查询,需要“过滤”不同的

问题描述

我想知道我还能优化多少相对简单的查询。对于抽象,我只有 2 个表,albums分别是专辑 ID 和专辑标题,另一个是albums_genre专辑 ID 和专辑类型作为列。

我的查询如下:

SELECT DISTINCT album_title
from albums
INNER JOIN albums_genre
ON albums.album_id = albums_genre.album_id AND (genre = 'Metal' OR genre = 'Jazz')

对我来说问题是,在albums表 1 中,id 可能与多个专辑标题匹配,我试图找到一种方法来减少 distinct 所需的时间,因为它需要一半以上的总时间。我正在使用微软数据库。

提前感谢大家!

标签: sqlsql-servertsqlquery-optimization

解决方案


第一步是使用以下命令编写查询exists

SELECT a.album_title
FROM albums a
WHERE EXISTS (SELECT 1
              FROM albums_genre ag
              WHERE ag.album_id = a.album_id AND
                    ag.genre IN ('Metal', 'Jazz')
             );

然后为了性能,你需要一个关于albums_genre(album_id, genre). 并且 index on just(album_id)可能也足够好。

请注意,性能增益来自删除外部查询中的聚合/不同的删除。


推荐阅读