【问题标题】:Faster SQL statement - currently have a slow Subquery would JOIN be faster?更快的 SQL 语句 - 目前有一个缓慢的子查询 JOIN 会更快吗?
【发布时间】:2021-03-28 17:58:34
【问题描述】:

我有一个带有子查询的 SQL 语句。由于添加了子查询,现在执行语句需要大约 10 倍的时间。 我一直在阅读 JOIN 可能会更快,但我并不完全精通 SQL 以知道如何实现 JOIN 语句,或者甚至可以使用 JOIN 来解决我的问题。

我当前的 SQL 语句,子查询位于 IIF 语句中。

SELECT Brand, 
       DESCRIPTION AS Model, 
       SECONDDESCRIPTION AS Description, 
       PRODUCT AS [Product Code], 
       TYPE AS [Batch Type], 
       INACTIVE, CORE AS [Core Range], 
       BATCH,
       IIF(t.BATCH = 
              (SELECT TOP 1 t2.BATCH 
               FROM INVXLS AS t2 
               WHERE t2.TYPE = '' 
               AND t2.PRODUCT = t.PRODUCT),     
           t.ON_HAND - t.CUSTORD, t.ON_HAND) AS SOH 
FROM INVXLS as t

解释子查询在做什么有点冗长,所以如果需要更多解释,请发表评论。

我在 VB.NET 中工作,正在访问 MS ACCESS 数据库。

有没有办法将其切换为 JOIN 语句,如果有,该 JOIN 语句会是什么样子?

【问题讨论】:

    标签: sql database ms-access join


    【解决方案1】:

    是的,可以将其转换为JOINLEFT JOIN),它会比子查询更快,如下所示:

    SELECT DISTINCT T.Brand, 
           T.DESCRIPTION AS Model, 
           T.SECONDDESCRIPTION AS Description, 
           T.PRODUCT AS [Product Code], 
           T.TYPE AS [Batch Type], 
           T.INACTIVE, T.CORE AS [Core Range], 
           T.BATCH,
           Case when tt.batch is not null then t.ON_HAND - t.CUSTORD else t.ON_HAND end AS SOH 
    FROM INVXLS as t LEFT JOIN INVXLS as tt
      ON tt.product = t.product AND tt.TYPE = '' AND t.batch = tt.batch
    

    【讨论】:

    • 当我尝试运行此语句时收到一条错误消息。 IERRORinfo.getdescription failed with E_Fail
    • 您能否尝试解决列名或小语法问题?我已经给你方法了。或者分享正确的错误信息。
    • 我确实尝试了各种变体来修复它。不幸的是,我无法让它工作。 Gordon 添加索引的想法实际上不需要更改现有查询。
    • 如果连接不是您所期望的,左连接可能会导致重复计算。 distinct 还介绍了它自己的性能问题。
    • 查询中没有计数,DISTINCT的性能优于问题中的子查询。但感谢您提供详细的评论。
    【解决方案2】:

    在没有ORDER BY 的情况下使用SELECT TOP 是危险的。但这不是你的问题。

    为了性能,您需要在INVXLS(PRODUCT, TYPE, BATCH) 上建立索引:

    CREATE INDEX IDX_INVXLS_PRODUCT_TYPE_BATCH ON INVXLS(PRODUCT, TYPE, BATCH);
    

    【讨论】:

    • 创建索引是否会编辑现有数据库,或者它会在导入数据表时“选择”数据时单独为数据添加索引?
    • @AndyAndromeda 。 . . create index 是一种数据库操作,用于加快数据库中查询的处理速度。
    • 谢谢戈登! iv 刚刚学到了一些新东西,是的,添加索引实际上现在使 select 语句的工作速度比在它有子查询之前更快。所以目前我仍然拥有原来的子查询,唯一的修改是索引。不要太过分了,我对我的 IFF 声明还有另一个问题
    • 我当前的 IFF 语句获得 TOP 1 Batch,我将如何获得具有最大 ON_HAND 编号的 TOP 1 批次。 iv 试过 IIF(t.BATCH = (SELECT TOP 1 t2.BATCH FROM INVXLS AS t2 WHERE t2.TYPE = '' AND t2.PRODUCT = t.PRODUCT ORDER BY ON_HAND desc) t.ON_HAND - t.CUSTORD, t.ON_HAND) AS SOH while this query will run i don't get the desired results. with the maths thats outside the select statement / inside the iff statement. t.ON_HAND - t.CUSTORD, t.ON_HAND) AS SOH`
    • 我还建议转换为EXISTS。在某些情况下,这可能会提高性能(取决于查询计划器是否已经足够聪明,可以对此进行优化)
    猜你喜欢
    • 2013-02-11
    • 2011-06-13
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多