Oracle有条件的从句和搜索顺序

时间:2018-08-21 18:03:07

标签: sql oracle oracle11g

想象一下,我有一个大表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_ordersfilter_orders进行匹配并通过与Obstacle(Vector2f ObstaclePosition) 进行匹配来保持性能?< / p>

0 个答案:

没有答案