oracle proc 插入操作效能優化實踐

2022-07-21 00:42:25 字數 3420 閱讀 1990

student 表中 10萬條資料。

從 student 表中取出所有資料,插入到 student_his 表中

1.批量插入(效果明顯)

2.批量查詢(效果不明顯)

3.批量提交(效果不明顯)

4.預編譯 sql 語句(效果不明顯)

10萬條資料,普通方法 27 秒,優化後 8 秒

create

table

student

(student_id

integer

,student_name

varchar2(20

),salary

float(126));

create

unique

index index_student_id on

student(student_id);

insert

into student (student_id, student_name, salary) values (1, '

test

', 2

);create

table

student_his

(student_id

integer

,student_name

varchar2(20

),salary

float(126));

create

unique

index index_student_his_id on student_his(student_id);

insert.pc 插入 10萬條資料

vim insert.pc

#include #include 

/*插入條數

*/#define countnum 100000

/*陣列大小

*/#define recordnum 1000exec sql include sqlca;

void

sqlerror();

typedef

struct

record

record;

intmain()

/*使用陣列方式一次插入多條紀錄

*/exec sql insert into student(student_id,student_name,salary) values (:records);

}notfound:

/*提交

*/exec sql commit work release;

printf(

"ok\n");

return0;

}void

sqlerror()

編譯執行指令碼:

vim runin.sh

proc insert.pc

cc -g -o insert insert.c -l$oracle_home/lib -l$oracle_home/rdbms/lib -l/usr/lib64 -lclntsh -lm -lc

time ./insert

common.pc 使用一般游標方式

#include #include 

#include

exec sql include sqlca;

void

sqlerror();

typedef

struct

record

record;

intmain()

exec sql declare sel_cursor cursor

forsql_stmt;

if(sqlca.sqlcode)

exec sql open sel_cursor;

if(sqlca.sqlcode)

int flag = 1

;

while

(flag)

notfound:

/*提交

*/exec sql commit work release;

printf(

"ok\n");

return0;

}void

sqlerror()

編譯執行指令碼:

vim runco.sh

proc common.pc

cc -g -o common common.c -l$oracle_home/lib -l$oracle_home/rdbms/lib -l/usr/lib64 -lclntsh -lm -lc

time ./common

fast.pc 使用游標+結構體陣列方式

#include #include 

#include

/*陣列大小

*/#define recordnum 1000exec sql include sqlca;

void

sqlerror();

typedef

struct

record

record;

intmain()

exec sql declare sel_cursor cursor

forsql_stmt;

if(sqlca.sqlcode)

exec sql open sel_cursor;

if(sqlca.sqlcode)

int flag = 1

;

while

(flag)

else

}else

}/*一次插入多條資料

*/exec sql insert into student_his values(:records);

exec sql commit;

}notfound:

/*提交

*/exec sql commit work release;

printf(

"ok\n");

return0;

}void

sqlerror()

編譯執行指令碼:

vim runfa.sh

proc fast.pc

cc -g -o fast fast.c -l$oracle_home/lib -l$oracle_home/rdbms/lib -l/usr/lib64 -lclntsh -lm -lc

time ./fast

fast.pc 中呼叫 memset() 清空陣列的操作,這個操作在10萬次插入過程中會增加2-3秒的時間。

經過測試,陣列大小 recordnum 設定為 1000 左右效率比較高,沒有進行更細緻範圍的測試。

C 互操作性

互操作性使您能夠保留和利用在現有非託管 中的投入。託管 執行在公共語言執行庫 clr 的控制之下的 非託管 執行在 clr 之外的 稱為 非託管 com com c 元件 activex 元件 和 win32 api 都是非託管 的示例。為什麼要使用互操作性呢?net 是建立在作業系統的之上的乙個開...

物聯網互操作性的意義

迄今為止的討論都是在雙應用場景中的框圖架構中。這種布置的物理實施,涉及來自不同 商的硬體和軟體。如果解決方案負責人希望更改閘道器,使用來自不同 商的閘道器,那麼會評估閘道器到中介軟體 和閘道器到感測器 的互操作性,以最大限度地減少自定義系統整合工作。這種互操作性類似於計算機連線到網際網路,或能夠國際...

pymysql中不同插入操作效能比較

我們測試下3種插入操作方式的效能情況 以10000次為例 coding utf 8 import time import pymysql from settings import con pymysql.connect host mysql host,username mysql user,pass...