【问题标题】:DB2 SQL Optimization suggestion [closed]DB2 SQL 优化建议 [关闭]
【发布时间】:2014-02-12 16:34:39
【问题描述】:

请帮我查一下sql,有什么问题吗?可以优化吗?执行需要很长时间,但并非总是如此。

SELECT count(*) 
FROM DB2INST3.VWQueue1_119 
WHERE inbasketName is not null
 AND userid1 is not null 
 AND nItemIndex is not null 
 AND string1 is not null 
 AND (F_BoundUser = ? OR F_BoundUser = ? )
 AND (F_Locked < 2) 
 AND ((inbasketName='PSIQUEUE1Index') AND (inbasketName='PSIQUEUE1Index'))

截图如下:

执行次数 = 12942 编译次数
= 1 最差准备时间 (ms) = 6 最佳准备时间 (ms) = 6 删除内部行 = 0 内部 插入的行 = 0 读取的行 = 1399262666 总执行时间 (sec.microsec)= 3600.704315 总计 用户 cpu 时间 (sec.microsec) = 2538.101110 总系统 cpu 时间 (sec.microsec)= 0.191321

【问题讨论】:

  • 喜欢架构/表命名约定
  • 这个语句看起来很简单,没有太多优化可以做(F_Bounduser 在那里两次?)。从您的表名来看,您正在从一个视图中进行选择……您的性能问题可能就在那里。 @MitchWheat - 图有一个 VWQueue1_001 到 VWQueue1_99999?
  • 这是一张物理表。

标签: sql optimization db2


【解决方案1】:

这是您的查询的简化:

SELECT count(*) 
FROM DB2INST3.VWQueue1_119 
WHERE userid1 is not null and
      nItemIndex is not null and
      string1 is not null and
      (F_BoundUser in (?, ?) and
      (F_Locked < 2) and
      (inbasketName = 'PSIQUEUE1Index') 

以下是更改:

  • 条件inbasketName='PSIQUEUE1Index' 被提及两次。需要 Npt。
  • 条件inbasketName is not null 是多余的,因为正在将值与字符串进行比较。

最有帮助的唯一索引是:VWQueue1_119(inbasketName, F_BoundUser, F_Locked)。如果表中有大量其他列,则添加userid1nItemIndexstring1 将创建覆盖索引,因此不会触及原始数据页。

【讨论】:

    【解决方案2】:

    在索引列上使用 OR 的条件因导致索引不被使用而臭名昭著。幸运的是,有一个简单的解决方法。

    改变这个:

    AND (F_BoundUser = ? OR F_BoundUser = ? )
    

    到这里:

    AND F_BoundUser IN (?, ?)
    

    虽然两者实现完全相同的东西,但优化器将(倾向于)使用带有 IN() 的索引,而不是 OR。

    此外,它更优雅。

    这是我多次成功使用的东西。

    【讨论】:

    • 需要多少开销?有时它需要大约 200 毫秒才能执行,这有意义吗?
    • 不,这没有意义。 null 是其中一个值还是两个值?表会被另一个进程锁定吗?
    • 我检查了锁,没有问题。
    • 您尝试更改了吗?您是否检查过您是否有时会向查询发送空值?
    【解决方案3】:

    你可以指望0:

    SELECT COUNT(0)
    ...
    

    如果优化器不在更高级别,DB2 将预取列只是为了对它们进行计数。如果为 0,DB2 将使用其他方式,例如仅使用索引或统计信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多