2

我遇到了 PeopleSoft 查询的问题(使用 Oracle 后端数据库):当用户发起涉及多个记录的相当复杂的查询时,PS 会强制连接安全记录,从而产生如下 SQL:

select .... from
ps_job a, PS_EMPL_SRCQRY a1, ps_table2 b, ps_sec_rcd2 b1, ps_table3 c, ps_sec_rcd3 c1
where (...security joins a->a1, b->b1, c->c1...) 和 ( ...连接 a、b 和 c...) 和
a.setid_dept = 'XYZ';

(假设last条件选择性高,列上有索引)显然,由于条件的排列,首先创建了一个巨大的join,写入temp段,最后应用last条件的时候,只选择了一小部分。这样制定的查询很可能会达到APPSRV,甚至QRYSRV的预设超时。在手动编写查询时,我宁愿将最具选择性的条件移到开头,从而将正在处理的数据量限制在相当大的水平。
关于如何使 PS 表现得像这样的任何想法?实际上,已经将“Oracle 风格”的 SQL 重写为 ANSI SQL 似乎加速了查询——然而,PS 编写了 Oracle 风格的查询......

在此先感谢
DBa

4

2 回答 2

2

除了格兰特所建议的之外,另一种方法是在用户将查询和执行正常连接的表上创建视图。

对于上述情况,您必须 - 1. 为查询中使用的每条记录创建视图。2. 将视图添加到查询安全树中。3. 使用 PS 查询中的视图。这将对视图执行正常连接,并且连接中不会有安全记录。

要对数据强制执行用户级别的安全性,您可以拥有另一个安全视图并将其加入最终查询,并在 where 子句中设置一个条件来检查当前登录的用户。

这样,您将创建固定数量的视图,而不是每个用户查询的视图。

于 2012-05-12T09:46:38.770 回答
1

我所知道的唯一解决方法是强制它以应有的方式进行连接,而不是按照它的方式(并避免可怕的 Merge Join Cartesian)是创建一个正确执行连接的视图。

  • 使用正确的字段创建记录。
  • 使其键入 SQL 视图。
  • 粘贴您现在可以使用的 SQL。
  • 将其添加到查询安全树中。
  • 刷新安全缓存。
于 2010-03-19T22:17:42.493 回答