Oracle隐式分区修剪

时间:2018-06-12 15:30:22

标签: database oracle query-optimization

我正在尝试优化我公司的长期存储过程。通过检查查询计划,看起来我们可以通过编写查询以获得更好的分区修剪来获得一些好处。麻烦的是,似乎这样做会创建一个非常详细的查询。从本质上讲,我们有一堆表具有客户端的外键和"子客户端"。在许多情况下,客户端/子客户端之间不共享数据,因此我们对每个表的ID进行了分区。这是一个示例查询,用于显示我的意思:

SELECT ...
FROM CLIENT_PRODUCT cp
INNER JOIN ORDER o ON o.product_id = cp.id
INNER JOIN PRICE_HISTORY ph on ph.product_id = cp.id
WHERE cp.id = ?

所有表都有一个引用客户端和子客户端的外键。相同的客户端产品不能属于两个不同的客户端或子客户端(抱歉。这个例子使用的是组合表并且有点做作)

我可以通过执行以下操作来改进分区修剪:

SELECT ...
FROM CLIENT_PRODUCT cp
INNER JOIN ORDER o ON o.product_id = cp.id and o.client_id = l_client_id and o.sub_client_id = l_sub_client_id
INNER JOIN PRICE_HISTORY ph on ph.product_id = cp.id and ph.client_id = l_client_id and ph.sub_client_id = l_sub_client_id
WHERE cp.id = ? and cp.client_id = l_client_id and cp.sub_client_id = l_sub_client_id

通过此更改,我只是明确说明了Oracle可以为每个连接查看的分区。这感觉非常糟糕,因为我已经添加了一堆重复的SQL,它不会在功能上改变返回的内容。需要对许多连接应用相同的模式(大于示例)

我知道我们的应用程序具有一个不变量,即产品的任何订单必须属于同一客户端和子客户端。同样,任何Price-History项目必须与产品属于同一客户端和子客户端。同样的想法适用于许多表对。在理想的世界中,Oracle可以从连接中的其他表中推断出每个连接的客户端和子客户端,因为该不变量。它似乎没有这样做(我明白我的特定不变量并不适用于所有人)。有没有办法让Oracle进行隐式分区修剪而不需要添加所有这些附加条件?这似乎会在代码库中增加很多价值,并且不需要所有这些"不必要的"显式连接。

我还有可能完全过度思考/误解这一点,所以其他建议会很棒。

0 个答案:

没有答案