sql - 更好的 sql 查询以提高性能
问题描述
我有一个看起来像这样的查询:
select *
from Franvaro f
inner join Anvandare a on a.id = f.anvandare_id
where (
f.friskskriven = 'Y'
and not exists (
select *
from sscpost
where franvaro_id = f.id
and friskskrivenpost = 'Y'
)
)
or (
f.startdatum <= '2020-04-05'
and not exists (
select *
from sscpost
where franvaro_id = f.id
and friskskrivenpost = 'Y'
)
)
and a.anstallningtyp = 'A'
;
我想知道是否可以使用相同的输出/结果以另一种方式编写此查询,以获得更好的性能或更好的结构。我也使用此查询进行了测试(见下文),但与其他查询。
select *
from Franvaro f
inner join Anvandare a on a.id = f.anvandare_id
where f.friskskriven = 'Y'
or f.startdatum <= '2020-04-05'
and not exists (
select *
from sscpost
where franvaro_id = f.id
and friskskrivenpost = 'Y'
)
and a.anstallningtyp = 'A'
;
解决方案
这对于现代优化器可能不再重要,但是在您的 EXISTS 子句中,您实际上不需要返回任何内容。因此,您可能会返回 1 或 NULL 或其他内容。我在暴露我的年龄。
归根结底,优化查询的最佳方法是学习如何阅读他们的解释计划。每个 SQL 系统的工作方式都不同,有时没有一种最佳方式。它还取决于这些表的大小和数据的样子。
但是您的代码本质上没有任何问题,它看起来很好。
select *
from Franvaro f
inner join Anvandare a on a.id = f.anvandare_id
where (
f.friskskriven = 'Y'
and not exists (
select 1
from sscpost
where franvaro_id = f.id
and friskskrivenpost = 'Y'
)
)
or (
f.startdatum <= '2020-04-05'
and not exists (
select 1
from sscpost
where franvaro_id = f.id
and friskskrivenpost = 'Y'
)
)
and a.anstallningtyp = 'A'
;
推荐阅读
- python - 在tkinter中忽略鼠标按钮事件?
- java - Android Studio:启动画面后应用程序崩溃
- php - 根据 Woocommerce 中选择的运输方式显示隐藏付款方式
- sql - 如何获取查询oracle sql返回的假设表的列名
- python - 如何让 python 输入“ß”
- python - 合并来自一个数据帧的具有相似数据的列
- wordpress - 仅为管理员副本将 PDF 添加到 WooCommerce 订单电子邮件
- nativescript - 在 TabView 中更改 selectedIndex 不会更改可见选项卡
- open-closed-principle - 做一个 Enthuware OCP 问题。完全看不懂这个
- php - PHP:在按下按钮之前按下按钮的效果