我有一个存储过程,它根据p_qds_startTime和p_qds_endTime参数返回数据,这些参数通常设置为365天的报告周期,但是可以将报告周期设置为1天。该过程查询的表有数百万行,其中包含一个包含xml数据的列。
优化器选择对sys_start使用索引,这在365天的报告期内效率非常低。对于较大的报告期,我希望优化器使用与策略状态相关的xml索引,因为只有300,000条记录的策略状态为“Application”。
策略状态索引设置正确,如果我运行底层查询,将输入参数替换为时间戳,则解释计划显示,如果报告周期超过10天,优化器将使用此索引。如果报告期不到10天,它将使用同样需要的sys_start索引。
我的问题是:有没有一种方法可以确保优化器检查输入值并重新评估每次运行时将使用的计划?这是一个每天一次的批处理作业,因此执行此操作的开销并不是一个真正的问题。
将其置于上下文中,批处理作业最多需要10个小时才能运行,而当我在本地运行底层查询时,命中策略状态索引时,它只需要几分钟就能运行。
以下是SP中的底层查询
select
policy_number
,year_1_commission_amount
from(
select
xml_policy.policy_number,
t002.SYS_START,
xml_policy.policy_status,
xml_policy.year_1_commission_amount,
ROW_NUMBER() over (partition by xml_policy.POLICY_NUMBER order by t002.SYS_START DESC) RN
from
DB.t002
,xmltable
(
'$i/*:AddProtQuoteResponse/*:plan[1]/*:policy[*:policyStatus = "Application"]' passing t002.QDS_XML AS "i"
columns
policy_number varchar(30) path '*:policyNumber',
policy_status varchar(12) path '*:policyStatus',
year_1_commission_amount decimal(11,2) path ''
) as xml_policy
where
sys_start > CAST(p_qds_startTime AS TIMESTAMP(12))
and sys_start <= CAST(p_qds_endTime AS TIMESTAMP(12))
and t002.QDS_XML_TYPE_ID = 3
)
where rn = 1;发布于 2020-04-23 20:01:01
尝试使用REOPT ALWAYS选项重新绑定例程包:
CALL SYSPROC.REBIND_ROUTINE_PACKAGE ('SP', 'SP_SCHEMA.SP_SPECIFICNAME', 'REOPT ALWAYS');其中,第2个参数是以下结果:
SELECT RTRIM(ROUTINESCHEMA)||'.'||SPECIFICNAME
--, PARM_COUNT
FROM SYSCAT.ROUTINES R
WHERE ROUTINESCHEMA='SP_SCHEMA' AND ROUTINENAME='SP_NAME';SP_SCHEMA & SP_NAME -过程的模式和名称。在上面的查询的输出中可能有许多行(如果您有许多例程具有相同的这对),并且您必须选择具有相应特定名称的正确例程。
https://stackoverflow.com/questions/61386461
复制相似问题