首页 > 解决方案 > 更好的 sql 查询以提高性能

问题描述

我有一个看起来像这样的查询:

    select *
      from Franvaro f 
inner join Anvandare a on a.id = f.anvandare_id
     where (
                f.friskskriven = 'Y'
            and not exists (
                    select * 
                      from sscpost
                     where franvaro_id = f.id
                       and friskskrivenpost = 'Y'
                )
           )
        or (
                f.startdatum <= '2020-04-05' 
            and not exists ( 
                    select *
                      from sscpost
                     where franvaro_id = f.id
                       and friskskrivenpost = 'Y'
                )
           )
       and a.anstallningtyp = 'A'
         ;

我想知道是否可以使用相同的输出/结果以另一种方式编写此查询,以获得更好的性能或更好的结构。我也使用此查询进行了测试(见下文),但与其他查询。

    select * 
      from Franvaro f 
inner join Anvandare a on a.id = f.anvandare_id
     where f.friskskriven = 'Y' 
        or f.startdatum <= '2020-04-05'
       and not exists ( 
               select * 
                 from sscpost 
                where franvaro_id = f.id
                  and friskskrivenpost = 'Y'
           )
       and a.anstallningtyp = 'A'
         ;

标签: sql

解决方案


这对于现代优化器可能不再重要,但是在您的 EXISTS 子句中,您实际上不需要返回任何内容。因此,您可能会返回 1 或 NULL 或其他内容。我在暴露我的年龄。

归根结底,优化查询的最佳方法是学习如何阅读他们的解释计划。每个 SQL 系统的工作方式都不同,有时没有一种最佳方式。它还取决于这些表的大小和数据的样子。

但是您的代码本质上没有任何问题,它看起来很好。

    select *
      from Franvaro f 
inner join Anvandare a on a.id = f.anvandare_id
     where (
                f.friskskriven = 'Y'
            and not exists (
                    select 1 
                      from sscpost
                     where franvaro_id = f.id
                       and friskskrivenpost = 'Y'
                )
           )
        or (
                f.startdatum <= '2020-04-05' 
            and not exists ( 
                    select 1
                      from sscpost
                     where franvaro_id = f.id
                       and friskskrivenpost = 'Y'
                )
           )
       and a.anstallningtyp = 'A'
         ;

推荐阅读