如何在不使用火鸟的情况下改进选择
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