【发布时间】:2010-03-17 16:11:51
【问题描述】:
我遇到了 PeopleSoft 查询的问题(使用 Oracle 后端数据库):当一个涉及多个记录的相当复杂的查询被用户触发时,PS 会强制连接安全记录,从而生成如下 SQL:
选择 .... 来自
ps_job a, PS_EMPL_SRCQRY a1, ps_table2 b, ps_sec_rcd2 b1, ps_table3 c, ps_sec_rcd3 c1
其中 (...security join a->a1, b->b1, c->c1...) and (...joins of a, b and c...) and
a.setid_dept = 'XYZ';
(假设最后一个条件具有高选择性并且列上有索引)
显然,由于条件的安排,首先创建了一个巨大的连接,写入临时段,当最后应用最后一个条件时,只选择了一个小的子集。以这种方式制定的查询很可能会达到 APPSRV 甚至 QRYSRV 的预设超时。在手动编写查询时,我宁愿将最具选择性的条件移到开头,从而将正在处理的数据量限制在相当大的水平。
关于如何使 PS 表现得像这样的任何想法?实际上,已经将“Oracle 风格”的 SQL 重写为 ANSI SQL 似乎加速了查询 - 但是,PS 编写了 Oracle 风格的查询......
提前致谢
DBa
【问题讨论】:
-
请添加执行不良查询的计划。
-
那里有几个笛卡尔连接,索引被部分绕过以支持 FTS...通常,这样的计划显示为“不这样做的方法”。而且它真的会超过可用的字符数限制。
-
全表扫描可能没问题。如果您要访问超过一半的记录,那几乎总是好的。合并连接笛卡尔几乎总是不好的。我会先看看这些,然后看看你能做些什么(索引、附加连接条件、更改表顺序)来首先解决这些问题。
-
在像 ps_job 这样的表上执行 FTS 几乎总是很糟糕,因为行长(166 列)。不幸的是,PeopleSoft 中的查询管理器以非常糟糕的方式强制加入安全记录 - 是否有可能影响这种行为?
标签: oracle peoplesoft