我遇到PeopleSoft查询问题(使用Oracle后端数据库):当用户启动涉及多个记录的相当复杂的查询时,PS执行安全记录的强制连接,从而生成如下SQL: / p>
从...中选择.... ps_job a,PS_EMPL_SRCQRY a1,ps_table2 b,ps_sec_rcd2 b1,ps_table3 c,ps_sec_rcd3 c1
其中(...安全加入a-> a1,b-> b1,c-> c1 ...)和(... a,b和c ...的连接)和
a.setid_dept ='XYZ';
(假设最后一个条件具有高选择性并且列上有索引)
显然,由于条件的排列,首先创建一个巨大的连接,写入临时段,并且当最后一个条件最终应用时,只选择一个小子集。以这种方式制定的查询很可能达到APPSRV的预设超时,甚至是QRYSRV的预设超时。在手动编写查询时,我宁愿将最具选择性的条件移动到开始,从而将处理的数据量限制在相当大的水平。
关于如何制作PS的任何想法都表现得像这样?实际上,已经将“Oracle样式”SQL重写为ANSI SQL似乎可以加速查询 - 但是,PS会编写Oracle样式的查询......
提前致谢
DBA
答案 0 :(得分:2)
除了Grant建议的内容之外,另一种方法是在用户查询和执行常规连接的表上创建视图。
对于上述情况,你必须 - 1.为将在查询中使用的每个记录创建视图。 2.将视图添加到查询安全性树。 3.使用PS查询中的视图。这将在视图上执行常规连接,并且连接中不会有安全记录。
要对数据实施用户级安全性,您可以拥有另一个安全视图并将其加入到最终查询中,并在where子句中检查当前登录用户的条件。
通过这种方式,您可以创建固定数量的视图,而不是每个用户查询的视图。
答案 1 :(得分:1)
我知道的唯一一个强制它以它应该的方式进行连接的修复,而不是它的方式(避免可怕的Merge Join Cartesian)是创建一个正确连接的视图。