簡體   English   中英

Oracle 左外連接同一個表多次

[英]Oracle Left outer joining same tables multiple times

我有四個表,分別命名為ROLE,EMPLOYEE, HIERARCHY_UNIT, EMPLOYEE_CLASS ,它們都有一個不同的 nameid 列,它是STRING_TABLE STRING_TABLE有一列 stringtext 存儲確切的文本,或者我們可以說名稱。

所有這些表都是鏈接的,因為它們都有一個 empid 列。

現在我想 select 一些來自EMPLOYEE表的信息以及相應角色的名稱,hierarchy_unit,employeeclass。我的 select 查詢將類似於

SELECT EMPST.STRINGTEXT,EROLE.STRINGTEXT,EHIER.STRINGTEXT,EEMPCLASS.STRINGTEXT 
FROM EMPLOYEE EMP 
INNER JOIN ROLE RO ON ROLE.EMPID=EMP.EMPID
INNER JOIN EMPLOYEE_CLASS EC ON EC.EMPID = EMP.EMPID
INNER JOIN HIERARCHY_UNIT HU ON HU.EMPID=EMP.EMPID
LEFT OUTER JOIN STRING_TABLE EMPST ON EMPST.NAMEID=EMP.NAMEID
LEFT OUTER JOIN STRING_TABLE EROLE ON RO.NAMEID=EROLE.NAMEID
LEFT OUTER JOIN STRING_TABLE EHIER ON HU.NAMEID=EHIER.NAMEID
LEFT OUTER JOIN STRING_TABLE EEMPCLASS ON EEMPCLASS.NAMEID=EC.NAMEID

上面的查詢工作正常,但我有一個問題,是否對同一個表進行連接不會導致任何性能問題。 在上面的例子中,我已經進行了 3 次左外連接(實際上我有 26 個與字符串表連接的情況)。有沒有辦法優化上述 select 查詢 n 並且不多次使用同一個表連接?

如果沒有執行計划,就很難說查詢的性能。 猜測是目前唯一可能的事情。

因此,假設 STRING_TABLE.NAMEID 值得索引(有許多唯一值)並且您已經為該列建立了索引,那么這個查詢就可以了。

在查詢的選擇部分中,您指定了 4 個 STRING_TABLE 的列。 這意味着您要求數據庫從該表的 4 個不同行中查找不同 NAMEID 的值,並將結果查詢中的每一行都發布在一行中。

數據庫要做的就是為 output 中的每一行具有特定 nameid 的特定行查找 4 次(或在生產中查找 26 次)。 這就是為什么您需要加入 STRINGS_TABLE 4 次,而且只要列值得索引並且已經被索引,這也很好。

如果 NAMEID 列中有許多非唯一數據,您可能需要使用分區甚至更改數據庫結構以獲得更好的性能。 但是,再一次,查詢很好,我看不出有什么辦法讓它變得更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM