“從序號中找到最小的未使用序號”演算法的改進
看到有網友juogkl的“從序號中找到最小的未使用序號”(http://space.itpub.net/24156512/viewspace-719687),其用迴圈來檢索未使用的序號,效率較低,現用ORACLE的OVER分析函式加以改進:
先看結果:
SQL> create table t_num as select rownum rn from dba_objects t;
Table created
SQL> select max(rn) from t_num;
MAX(RN)
----------
72278
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
3 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
3 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
3 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
1 row deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
2 rows deleted
SQL> delete t_num where rn=round(dbms_random.value()*72278);
0 rows deleted
SQL> delete t_num where rn=65084;
1 row deleted
SQL> delete t_num where rn between 65994 and 65994+10;
11 rows deleted
SQL> commit;
Commit complete
SQL> set timing on
SQL> select pkg_test.f_get_bh1('t_num','rn') from dual;
PKG_TEST.F_GET_BH1('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:03.24
SQL> /
PKG_TEST.F_GET_BH1('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.58
SQL> /
PKG_TEST.F_GET_BH1('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.58
SQL> select pkg_test.f_get_bh2('t_num','rn') from dual;
PKG_TEST.F_GET_BH2('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.03
SQL> /
PKG_TEST.F_GET_BH2('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.01
SQL> /
PKG_TEST.F_GET_BH2('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.01
SQL> /
PKG_TEST.F_GET_BH2('T_NUM','RN')
--------------------------------
361
Elapsed: 00:00:00.01
最後看一下兩個演算法:
create or replace package body pkg_test is
function f_get_bh1(v_tablename varchar2, v_col varchar2) return int as
nb_flag1 number(10);
nb_flag2 number(10);
nb_flag3 number(10);
l_bh number(10);
bh_return number(10);
begin
execute immediate 'select min(' || v_col || ') from ' || v_tablename
into nb_flag1;
nb_flag2 := 100000000;
l_bh := nb_flag1;
for l_bh in nb_flag1 .. nb_flag2 loop
execute immediate 'select count(1) from ' || v_tablename || ' where ' ||
v_col || '=' || l_bh
into nb_flag3;
exit when nb_flag3 = 0;
bh_return := l_bh + 1;
end loop;
return bh_return;
end f_get_bh1;
function f_get_bh2(v_tablename varchar2, v_col varchar2) return int as
nb_flag1 number(10);
nb_flag2 number(10);
begin
execute immediate 'select max(' || v_col || ') from ' || v_tablename
into nb_flag1;
execute immediate 'select ' || v_col || ' from (select ' || v_col ||
',last_value(' || v_col || ') over(order by ' ||
v_col ||
' ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING) lv from ' ||
v_tablename || ') where lv-' || v_col ||
'>1 and rownum=1'
into nb_flag2;
return nb_flag2 + 1;
end f_get_bh2;
begin
null;
end pkg_test;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-719797/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- “從序號中找到最小的未使用序號”演算法的改進(續)演算法
- leedcode Excel 表列序號Excel
- 序號產生器合集
- JN專案-序號問題
- [CareerCup] 9.3 Magic Index 魔法序號Index
- [轉]GridView自動序號View
- JAVA中取順序號 (轉)Java
- iReport中序號自增的實現
- 【原創】FileRecoveryAngel 演算法分析+序號產生器演算法
- Myeclipse 6.5 序號產生器Eclipse
- 每日一練(42):Excel表序號Excel
- Excel Sheet Column Number Excel表列序號Excel
- 將git版本號編譯程式序Git編譯
- 《淺談利用RSA演算法防止非法序號產生器的製作》演算法
- VB家庭課堂 v2.0的演算法和序號產生器演算法
- 進位專家註冊演算法分析及序號產生器C原始碼演算法原始碼
- 【效能技巧】使用DataReader[列序號]的方法讀取DataReader物件物件
- Navicat Premiumx64 使用序號產生器啟用REM
- SAP CRM One Order的事件序號產生器制事件
- winzip的通用序號產生器 (2千字)
- leetcode:171. Excel表列序號LeetCodeExcel
- 分享一個navicat序號產生器
- 全國電話通1.18 演算法分析+序號產生器演算法
- Windows系統切換工具 演算法分析+序號產生器Windows演算法
- QuickCD V1.0.4演算法分析+序號產生器原始碼UI演算法原始碼
- win10如何執行序號產生器_win10怎麼執行序號產生器Win10
- CmailServer3.2序號產生器改進版。序列號應是12位16進位制數字(0--9,a--f)。 (1千字)AIServer
- el-table翻頁序號不從1開始(已解決)
- 製作mIRC6.02序號產生器(給別人寫的初學者序號產生器教材) (14千字)
- SAP CRM呼叫中心裡的事件序號產生器制事件
- 給Repeater控制元件裡新增序號的5種方法控制元件
- 貼彩虹狗破解工具的序號產生器 (727字)
- 臨時檔案的順序和絕對檔案號
- dataTable.js使用總結(包含序號生成,懸浮框使用等)JS
- AddRemove 4GOOD 註冊演算法+序號產生器REMGo演算法
- 蒼鷹象棋1.0 註冊演算法分析和序號產生器演算法
- eBook Edit Pro 3.21 演算法分析及序號產生器原始碼演算法原始碼
- PEbundle V2.3脫殼 - 某演算法序號產生器演算法