如何加速sql查询?

yquaqz18  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(228)

我有一个sql查询,如下所示:

SELECT p.Id1,p.Id2,p.Id3 
FROM dataset1 p
WHERE p.Id2 IN (
    SELECT r.Id4 
    FROM dataset1 r 
    WHERE r.Id5=125 AND r.Id6>=100000000000000 AND r.Id6<1000000000000000
) 
ORDER BY p.Id1 DESC, p.Id2 DESC

然而,在这个范围内,id6似乎有大量的数据,因此,它需要相当长的时间来计算。但我只有一个小时来计算查询。因此,我想知道是否有人可以帮助我提高这个查询的性能。
谢谢。

uxhixvfz

uxhixvfz1#

因为过滤似乎是在 r ,安排首先查看:

SELECT  p.Id1, p.Id2, p.Id3
    FROM  ( SELECT id4
       FROM dataset1 AS r
       WHERE  r.id5 = 125
         AND  r.Id6 >= 100000000000000
         AND  r.Id6 <  100000000000000 ) AS x
    JOIN dataset1 AS p  ON p.id2 = x.id4
    ORDER BY  p.Id1 DESC, p.Id2 DESC;

因此,这些指标应该是有益的:

INDEX(id5, id6, id4)   -- covering
INDEX(id2, id1, id3)   -- covering

你有一个“范围”测试 id6 ,但范围为空。我想那是个错误。请不要过于简化查询;我们可能会给你不适用的建议。我假设这个范围真的是一个范围。

emeijp43

emeijp432#

IN 当子查询返回大量数据时,优化效果往往较差。你可以试着用 EXISTS 取而代之的是:

SELECT p.Id1, p.Id2, p.Id3 
FROM dataset1 p
WHERE EXISTS (
    SELECT 1
    FROM dataset1 r 
    WHERE 
        r.Id4 = p.Id2
        AND r.Id5 = 125 
        AND r.Id6 >= 100000000000000 
        AND r.Id6 <  100000000000000
) 
ORDER BY p.Id1 DESC, p.Id2 DESC

然后,考虑上的多列索引 (Id4, Id5, Id6) 加速子查询。我们的想法是把更严格的标准放在第一位——所以很明显你想要 Id6 最后,但您可能希望尝试反转前两列,以查看是否有任何组合的性能优于其他组合。
旁注:下界和上界 Id6 在查询中具有相同的值。我将此视为输入错误(否则您的查询将始终不返回任何行)。

f2uvfpb9

f2uvfpb93#

为了提高性能,不要使用内部查询。也可以通过使用内部联接来获得所需的结果:

SELECT 
    p.Id1, p.Id2, p.Id3 
FROM 
    dataset1 p 
INNER JOIN 
    dataset1 r ON p.Id2 = r.Id4 
               AND r.Id5 = 125 
               AND r.Id6 >= 100000000000000 
               AND r.Id6 < 100000000000000
ORDER BY 
    p.Id1 DESC, p.Id2 DESC

相关问题