2010-03-17 55 views
2

我遇到PeopleSoft查詢(使用Oracle後端數據庫)的問題:當涉及多個記錄的相當複雜的查詢由用戶設置時,PS執行強制連接的安全記錄,從而生成SQL像這樣:Peoplesoft查詢 - 性能

選擇....從
ps_job一個,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表現如此的任何想法?事實上,已經重寫「甲骨文風格的」 SQL到ANSI SQL似乎加快了查詢 - 然而,PS寫甲骨文樣式的查詢......

在此先感謝
DBA

+0

請添加不良執行查詢的計劃。 – 2010-03-19 22:15:08

+0

這裏有幾個笛卡爾連接,索引被FTS部分繞過......通常,這樣的計劃被顯示爲「不這樣做的一種方式」。它會真的超過可用的字符限制。 – DBa 2010-04-12 15:01:08

+0

全表掃描可能沒問題。如果您訪問的記錄超過一半,則幾乎總是好的。合併連接笛卡兒幾乎總是不好的。我會先看看那些,看看你能做些什麼(索引,額外的連接標準,改變表格順序)以便首先解決這些問題。 – 2010-05-05 16:14:23

回答

1

我所知道的唯一的解決方法強制它按照它應該的方式進行連接,而不是它的方式(並且避免可怕的Merge Join Cartesian)是創建一個正確執行連接的視圖。

  • 使用正確的字段創建記錄。
  • 使其鍵入SQL視圖。
  • 粘貼到您現在可以使用的SQL中。
  • 將其添加到查詢安全樹中。
  • 刷新安全緩存。
+0

這將不幸意味着爲每個複雜的用戶查詢創建一個視圖 - 這是絕對不受歡迎的。 – DBa 2010-04-12 14:58:59

+0

解決此問題的其他方法:將其設置爲「進程查詢」。這將刪除行級別的安全問題,只要沒有它的查詢結果可以公開就可以解決問題。 – 2012-08-09 20:01:53

2

除了格蘭特的建議之外,另一種方法是在表上創建用戶查詢和執行正常連接的視圖。

對於上述您將不得不 - 1.爲查詢中將使用的每個記錄創建視圖。 2.將查看添加到查詢安全樹。 3.使用PS查詢中的視圖。這將對視圖執行正常的連接,並且連接中不會有安全記錄。

爲了對數據執行用戶級安全性,您可以擁有另一個安全性視圖並將其加入到最終查詢中,並在where子句中檢查當前登錄用戶的條件。

這樣您將有固定數量的視圖來創建,而不是每個用戶查詢的視圖。