2012-12-28 30 views
2

是否存在強制Oracle(在插入/更新/刪除時)利用row_num分析函數分配行號的方法,以後可以通過簡單調用rownumber = X?在Oracle數據庫中強制內部行號以匹配row_num分析函數

示例代碼來說明我的意思:

select foo,bar,baz 
    row_number() over (partition by bang order by some_date desc) rn 
from my_table 

上面的查詢將基於分區子句指定的行號。

現在,當我詢問,我想其中ROWNUMBER = XI可以這樣做:

select foo,bar,baz 
from my_table 
where rownumber=1 

這樣做的原因是爲了避免查詢開銷,並且將其推回發生遠不頻頻在DDL語句系統。所以我的問題,是這樣的可能嗎?

COMMENT

每一個新的插入/更新/刪除可能會更新表的每一個 行......這是一個潛在的大量日誌(和 鎖定)的。如果您的數據基本上是靜態的,那麼每次加載或更新時都要重新生成一個rownumber。

如果我們刪除了更新/刪除的約束條件,並且我不相信這個推理在特定時間對象驅動的情況下仍然存在。

+0

每一個新的插入/更新/刪除可能會更新表的每行......這是一個潛在的大量日誌(和鎖定)的。如果您的數據基本上是靜態的,那麼每次加載或更新時都會重新生成一個rownumber。 – Mat

+0

@Mat所以讓我們刪除更新和刪除的約束。如果我只是插入,其中驅動力實際上是時間戳/日期,那麼是什麼? – Woot4Moo

+0

那麼,你在做實際插入之前計算rownumber(對併發性有很多照顧)。 – Mat

回答

1

對於此方法的一個問題是,您只能有一個進程修改表或由partition-by子句定義的子集的一個子集。這是因爲修改表的多個會話在提交之前無法看到其他人所做的更改。

但是,如果你可以通過鎖定來解決這個限制,那麼沒有理由不能編碼。只要插入值總是遞增就會相對簡單,但其他情況當然會更復雜,而且沒有什麼是我能想到的自動化。儘管我會猶豫提供詳細的建議或編碼樣本。

+0

當然。按照我的說法,我將row_num函數的開銷抵消到物化視圖中。我正在考慮將這個過程強加給Oracle,以便數據庫完成更少的工作。 – Woot4Moo

1
SELECT ename, deptno, rownum, rno 
    FROM (SELECT ename, deptno, row_number() OVER (Order By deptno) rno 
      FROM scott.emp 
     ORDER BY deptno) 
/
ENAME   DEPTNO  ROWNUM  RNO 
---------- ---------- ---------- ---------- 
CLARK    10   1   1 
KING    10   2   2 
MILLER    10   3   3 
JONES    20   4   4 
FORD    20   5   5 
ADAMS    20   6   6 
.... 

您可以將全部或部分價值 - 從外部選擇部分刪除不需要的:

INSERT INTO emp_test2 
(
SELECT ename, deptno, rownum row_num, rno 
    FROM (SELECT ename, deptno, row_number() OVER (Order By deptno) rno 
     FROM scott.emp 
    ORDER BY deptno) 
); 
+0

現在我該如何強制Oracle對插入進行維護?所以我不需要執行row_number函數? – Woot4Moo

+0

不知道你在問什麼...... – Art

+0

我在插入時詢問數據是在oracle之前,是否可以強制row_number函數針對插入函數運行以生成由該函數維護的排序 – Woot4Moo