【问题标题】:SQL multiple tables - very slowSQL 多表 - 非常慢
【发布时间】:2018-07-04 15:58:05
【问题描述】:

我正在为我的销售部门准备一份关于 IBM OS/400 操作系统的 SQL Server 报告。

我的一位同事(离开公司)做了这份报告并使用了大量的子选择。

该报告通常需要大约 30 分钟的时间来处理,而且通常只是无法显示。我已经尝试删减一些表格/行,希望能加快进程但没有成功(所有这些都是销售部门需要的)。

它适用于所有相关数据(订单、客户、文章、我们在制造商处的订单、制造商等)。有什么想法吗?

由于 OS/400 系统,我无法索引它;猜想这对我们的承包商来说将是一项新的编程任务,这会导致成本。

我可以使用一些巧妙的连接吗?或者以某种方式减少子选择的数量?

【问题讨论】:

  • 编写正确的连接有助于提高查询性能。
  • 发布您的代码..
  • 根据答案下的对话,这需要对其进行 SQL 编辑。请立即这样做,以防止问题被搁置。

标签: sql database db2-400


【解决方案1】:

您是否在查询中使用了 4 个部分名称?这可能是你的问题...

从 SQL 服务器...

-- 将表中的所有行拉回 MS SQL 服务器并在 MS SQL 服务器本地执行 where
select * from LINKEDSVR.MYIBMI.MYLIB.MYTBL where locnbr = '00335';

-- 将语句发送到 IBM i 服务器进行处理,只返回结果..
select * from openquery(LINKEDSVR, 'select * from MYTBL where locnbr = ''00335''');

【讨论】:

    【解决方案2】:

    尝试先运行子选择,将每个子选择的输出发送到自己的表中。

    更新表的统计信息。然后运行其余的 SQL,将最初的子选择替换为第一步中创建的表。

    以同样的方式处理多层嵌套:每一层都是自己插入到另一个表中的。

    我发现查询优化器很难处理复杂的 SQL。将子查询分解为单独的步骤通常可以解决此问题。

    在运行之间,我的偏好是保留完整的数据作为参考,以防需要调试,然后在运行的第一步中截断表。

    响应橡皮擦的 cmets

    假设您的原始查询采用以下一般形式:

    select [columns] from 
    (-- subquery
        select [columns] from TableA
    ) as Subquery
    from TableB
    where mainquery_where_clause
    

    重写:

    -- Create a table to handle results for your subquery:
    Create Table A ;
    
    -- Update the data distribution statistics:
    update stats (TableA) ;
    
    -- Now run the subquery:
    insert into SubQTable select [columns] from TableA
    
    -- Now run the re-written main query:
    Select [columns]
    from TableA, TableB
    where TableA.joincol = TableB.joincol
    and mainquery_where_clause ;
    

    我注意到您发布的 SQL 存在一些语法问题。好像遗漏了什么。但我回答的原则还是一样的。请注意,应用我的建议可能无济于事,因为您的方案可能存在许多变量;你提到了子查询,所以我选择解决这个问题。

    Halfer 的建议很好:编辑您的原始问题,添加 SQL 代码,并将其放入文本编辑工具提供的“{}”中。

    我强烈建议您获取SQL execution plan 并发布结果。

    【讨论】:

    • 嗯,我对 sql 不是很流利,我想你能帮帮我吗?如果我发布代码以便每个人都知道问题所在,可能会有所帮助吗?如果子选择基于表(如客户和订单等),我如何首先运行子选择
    • 抱歉没有别的办法:(
    • @eraser51:请删除那些 SQL cmets 并将查询在格式化块中添加到您的问题中。
    • @eraser51:那个盒子在哪里?我看不到它。
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2016-07-31
    • 2010-10-24
    • 2013-04-10
    • 2018-05-18
    相关资源
    最近更新 更多