想象一下,我有一个大表t_order_items,其中每个记录都有一个t_order记录。 因此,这些列如下:
t_order_item:order_item_id,order_id,item_name t_order:order_id,order_name
order_id和order_name都是唯一的,item_name在t_order_items中通常具有很多非唯一值。
假设我有一个查询,该查询使我可以按多个项目名称搜索订单,并可以选择将搜索范围限制为特定的订单名称(取决于是否将任何内容传递给filter_orders表)。
with search_item_names as (select * from table (?)),
filter_orders as (select * from table (?))
select order_id, order_name
from t_order_item oi
join t_order o on (oi.order_id = o.order_id)
join search_item_names sv on (sv.column_value = oi.item_name)
where (
o.order_name in (select column_value from filter_orders)
or not exists(select 1 from filter_orders)
)
如您所见,添加了此复杂的where子句(以处理空filter_orders
和非空where (o.order_name in (select column_value from filter_orders)
or not exists(select 1 from filter_orders))
)
filter_orders
因为我事先不知道在where (o.order_name in (select column_value from filter_orders))
中是否会传递任何值。
问题在于,在如此复杂的子句中,它运行缓慢(因为t_order_items非常巨大): *首先搜索名称为search_item_names的所有订单商品 *然后按filter_orders中的值过滤出结果
如果我简化这样的条款:
filter_orders
查询的执行速度更快(这是我的性能目标),因为它仅搜索属于search_item_names
中定义的特定订单的order_items(在其他工作区中,在加入之前先检查订单名称) filter_orders
的所有order_items)。但是,当我简化where-clause时,新问题是:如果o.order_name
为空,查询将找不到任何内容。
在filter_orders
不为空的情况下,我是否还有其他选择可以有条件地将filter_orders
与filter_orders
进行匹配并通过与Obstacle(Vector2f ObstaclePosition)
进行匹配来保持性能?< / p>