Sql 优化内部连接

Sql 优化内部连接,sql,optimization,query-optimization,Sql,Optimization,Query Optimization,下面的查询需要很多时间,有人能建议我如何优化它吗。基本上,我想要序列id,其中列“标记名”是“Station Status”和“Leak Test Status”,两者都有列“Value”=“OK”。该表有两个相同的序列id和两个不同的(记录)标记名,即“标记名”是“Station Status”和“Leak Test Status” select table1."SerialID" from ( select "SerialID" fro

下面的查询需要很多时间,有人能建议我如何优化它吗。基本上,我想要序列id,其中列“标记名”是“Station Status”和“Leak Test Status”,两者都有列“Value”=“OK”。该表有两个相同的序列id和两个不同的(记录)标记名,即“标记名”是“Station Status”和“Leak Test Status”

select table1."SerialID" from (
        select "SerialID" from "XYZ" 
        where "StationID" IN ('01','02')
        and "TagName" = 'Station Status'
        and "TimeStamp" between '2021-05-03 09:00:00.000' and '2021-05-03 09:02:59.999'
        and "Value" = 'OK'
        ) table1
    inner join (
        select "SerialID" from "XYZ" 
        where "StationID" IN ('01','02')
        and "TagName" = 'Leak Test Status'
        and "TimeStamp" between '2021-05-03 09:00:00.000' and '2021-05-03 09:02:59.999'
        and "Value" = 'OK'
    ) table2 
on table1."SerialID" = table2."SerialID";

似乎您想这样做:

select "SerialID"
from "XYZ"
where "StationID" IN ('01', '02')
    and "TagName" IN ('Station Status', 'Leak Test Status')
    and "TimeStamp" between '2021-05-03 09:00:00.000' and '2021-05-03 09:02:59.999'
    and "Value" = 'OK'
group by "SerialID"
having count(distinct TagName) = 2
这个查询只命中表一次,所以应该快得多

但是,在列上添加索引(时间戳、标记名、StationID、值)应该有助于提高性能

CREATE INDEX X001 ON "XYZ" ("TimeStamp", "Value", "StationID", "TagName", "SerialID") 

似乎您想这样做:

select "SerialID"
from "XYZ"
where "StationID" IN ('01', '02')
    and "TagName" IN ('Station Status', 'Leak Test Status')
    and "TimeStamp" between '2021-05-03 09:00:00.000' and '2021-05-03 09:02:59.999'
    and "Value" = 'OK'
group by "SerialID"
having count(distinct TagName) = 2
这个查询只命中表一次,所以应该快得多

但是,在列上添加索引(时间戳、标记名、StationID、值)应该有助于提高性能

CREATE INDEX X001 ON "XYZ" ("TimeStamp", "Value", "StationID", "TagName", "SerialID") 

尝试1:跳过子查询。(至少有些数据库在优化此类查询时遇到问题。)您能给我们展示一下解释(分析、详细、缓冲区)对此查询的结果吗?您可以共享表和索引定义吗?只标记您正在使用的数据库。是mysql还是postgresql?我删除了不一致的数据库标记。请仅使用您真正使用的数据库进行标记。您还应该解释代码应该做什么。示例数据和所需结果帮助。尝试1:跳过子查询。(至少有些数据库在优化此类查询时遇到问题。)您能给我们展示一下解释(分析、详细、缓冲区)对此查询的结果吗?您可以共享表和索引定义吗?只标记您正在使用的数据库。是mysql还是postgresql?我删除了不一致的数据库标记。请仅使用您真正使用的数据库进行标记。您还应该解释代码应该做什么。示例数据和所需结果帮助。索引将更好地如下所示:在“XYZ”(“时间戳”、“值”、“StationID”、“标记名”、“SerialID”)上创建索引X001-->query@SQLpro,谢谢,我不是说按顺序排列,只是想提到需要索引的列,索引列的顺序更好:
(值、StationID、标记名、时间戳)
。也就是说,
=
列在前面,范围在后面。索引最好是这样:在“XYZ”(“时间戳”、“值”、“StationID”、“标记名”、“SerialID”)上创建索引X001-->更准确,涵盖query@SQLpro,谢谢,我不是说按那个顺序,只是想提到需要索引的列,索引列的更好顺序:
(值、StationID、标记名、时间戳)
。也就是说,
=
列在前;范围在后。