【问题标题】:Performance required on select query选择查询所需的性能
【发布时间】:2013-07-01 05:32:57
【问题描述】:

考虑下面的 Table_A 和 Table_B:

Table_A
ID  |A_Field_1
1   |10
2   |11
3   |12

表_B:

ID  |B_Field_1
1   |500
1   |510
1   |520
2   |550
3   |530

我需要编写一个查询,以获取 Table_B 中没有 B_Field_1 值 520 或 530 的值的 IDA_Field_1

输出:

ID  |A_FIELD_1
2   |11

我目前的查询如下:

SELECT ID,A_Field_1 
from Table_A
where ID not in (select ID from Table_B where B_Field_1 in (520,530))

这可行,但有人可以提供更好的基于性能的查询吗?和上面的查询一样,select ID from Table_B where B_Field_1 in (520,530) 内部查询很大,对应一个不断增长的表。

【问题讨论】:

  • @AmitSingh 在标签中:[tag:informix]
  • 这两张表有什么索引?
  • @AmitSingh 是的,它是 informix

标签: sql performance select optimization informix


【解决方案1】:

你也可以这样试试

SELECT
      Id
    , A_Field_1
FROM TABLE_A A
INNER JOIN
(
     SELECT
           Id
         , COUNT(CASE WHEN B_Field_1 IN (520, 530) THEN 1 END) AS ValidId
     FROM Table_B
     GROUP BY Id
) b ON A.Id = b.Id AND b.ValidId < 1

【讨论】:

  • @Devart 感谢您的编辑,使我的答案看起来不错...@Devart 你能教我如何分析查询,如 numberofscan 和操作次数以及需要多少 mcuh 时间
  • 为了让您的查询看起来更简洁,我建议使用我们的免费在线 SQL 格式化服务 - SQL Format。关于查询的优化和分析,有很多书。我建议你熟悉Itzik Ben-Gan's books
【解决方案2】:

试试这个 -

SELECT
      Id
    , A_Field_1
FROM Table_A a
WHERE EXISTS(
          SELECT 1
          FROM Table_B b
          WHERE B_Field_1 NOT IN (520, 530)
               AND b.Id = a.Id
     )


SELECT
      Id
    , A_Field_1
FROM Table_A a
WHERE NOT EXISTS(
          SELECT 1
          FROM Table_B b
          WHERE B_Field_1 IN (520, 530)
               AND b.Id = a.Id
     )

【讨论】:

  • 是的,这是正确的,我没有正确阅读问题。将删除我的答案,以免引起混淆。两列上的 TABLE_B 上的索引也将有助于子查询的性能。
  • @Devart:这并不等同于 OP 的查询。例如,它将返回 id=1NOT EXISTS 将是。
  • @ypercube,这个查询是相等的。
  • 您能否确认第一个查询是否有效。根据示例,
    1|500
    1|510
    将被视为候选对象,ID 1 可能是非预期的输出
  • @JMJ,这些请求是等价的,但我更喜欢第一种查询方式。
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2012-08-12
  • 2016-01-09
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多