如何在不使用火鸟的情况下改进选择

Posted

技术标签:

【中文标题】如何在不使用火鸟的情况下改进选择【英文标题】:How to improve select with not in on firebird 【发布时间】:2015-07-23 20:08:17 【问题描述】:
select mid from aplicacao
where mid not in
(
select distinct mid from aplicacao
inner join prod_app on prod_app.mid=aplicacao.mid
where prod_app.coditem=1
)

我尝试在 firebird 上搜索解决方案以改进此查询,但不幸的是没有成功。请问有人可以帮我吗?

【问题讨论】:

简化您的表结构并将其添加到您的问题中。这样一来,别人就可以帮助您解决问题,而不必猜测。 【参考方案1】:

IN(和NOT IN)性能问题的最常见解决方案是改用EXISTS(或NOT EXISTS):

select mid from aplicacao
where not exists (
  select 1 from prod_app
  where prod_app.mid = aplicacao.mid and prod_app.coditem=1
)

另一种解决方案是使用LEFT JOIN 并过滤不存在​​的右侧:

select mid from aplicacao
left join prod_app
  on prod_app.mid = aplicacao.mid and prod_app.coditem=1
where prod.app.coditem is null

请注意,prod_app(如 prod_app.coditem=1)上的其他过滤条件需要成为连接条件的一部分,而不是 where 子句的一部分。

【讨论】:

小心! “where not exists()”中的查询将被完全执行很多次,因为第一个查询中有记录。可能需要很长时间才能完成。 @Andrei 是的,但它仍然明显比使用IN(或NOT IN)便宜,尤其是因为可以使用索引。 可能。但是现在我正在等待我的同事来并在测试服务器上重新启动 firebird,在那里我在两个大型查询中运行了“不存在的地方”:) 我认为“左连接”在这件事上可能更安全。 @Andrei 您也可以从mon$statements 中删除该语句以取消它。此外,如果需要很长时间,这可能表明使用了不相关的子查询,或者没有相关索引。

以上是关于如何在不使用火鸟的情况下改进选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 iOS 中的 UITableViewDelegate 方法的情况下获取选择的 UITableViewCell

如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量

如何在不使用多个子查询的情况下使用多列选择多行

如何在不使用索引的情况下选择列

如何在不使用全局变量的情况下构建这个程序?

如何在不使用提交的情况下从下拉列表中选择值