如何improve/speed向上SQL查询
How to improve/speed up SQL query
我有一个有效的查询,但需要很长时间才能完成 运行。有没有更有效的方法来完成这个?
基本上我想获取位置为 106 的所有行,purchase_date >= 今天 - 300,assigned_worker 包括 Alex 或 Carol。这会生成具有相同 cost_id 的行。每个 cost_id 我只想要一行,并且希望该行是 cost_num.
最高的那一行
select distinct t.cost_id, t.column_a, t.column_b
from mytable t
where t.location in (106) and t.purchase_date >= today - 300 and (t.assigned_worker like '%Alex%' or d.assigned_worker like '%Carol%' )
and t.cost_num in (select max(cost_num) from mytable where cost_id = t.cost_id
and location in (106));
如果不了解索引和解释计划(以及 - 在我个人的情况下 - Informix),很难找到缓慢的根本原因。很少(注意 - 可能会产生误导!)想法:
- 将
t.location in (106)
替换为t.location = 106
- 在
location
或 purchase_date
或 cost_id
上创建索引
- 尽可能避免
like '%...'
- 避免
or
- 替换为 union
- 如果 Informix 支持,则将 subselect 替换为 window 函数(提取
row_number() over (partition by location, cost_id order by cost_num desc)
等于 1 的行)
- 子选择中的别名table和列,至少为了可读性
我有一个有效的查询,但需要很长时间才能完成 运行。有没有更有效的方法来完成这个?
基本上我想获取位置为 106 的所有行,purchase_date >= 今天 - 300,assigned_worker 包括 Alex 或 Carol。这会生成具有相同 cost_id 的行。每个 cost_id 我只想要一行,并且希望该行是 cost_num.
最高的那一行select distinct t.cost_id, t.column_a, t.column_b
from mytable t
where t.location in (106) and t.purchase_date >= today - 300 and (t.assigned_worker like '%Alex%' or d.assigned_worker like '%Carol%' )
and t.cost_num in (select max(cost_num) from mytable where cost_id = t.cost_id
and location in (106));
如果不了解索引和解释计划(以及 - 在我个人的情况下 - Informix),很难找到缓慢的根本原因。很少(注意 - 可能会产生误导!)想法:
- 将
t.location in (106)
替换为t.location = 106
- 在
location
或purchase_date
或cost_id
上创建索引
- 尽可能避免
like '%...'
- 避免
or
- 替换为union
- 如果 Informix 支持,则将 subselect 替换为 window 函数(提取
row_number() over (partition by location, cost_id order by cost_num desc)
等于 1 的行) - 子选择中的别名table和列,至少为了可读性