-
首先, 解釋一下出入數(shù)據(jù)時(shí)的執(zhí)行過程
- 當(dāng)SQL調(diào)用執(zhí)行一個(gè)語句的時(shí)候, 都會(huì)開啟一個(gè)稱謂
事務(wù): transaction
的東西, 并且在執(zhí)行完畢之后, 提交事務(wù)- 開啟事務(wù):
begin transaction
- 提交事務(wù):
commit transaction
- 開啟事務(wù):
- 當(dāng)SQL調(diào)用執(zhí)行一個(gè)語句的時(shí)候, 都會(huì)開啟一個(gè)稱謂
-
首先來測試: 使用普通的sql語句來插入10000條數(shù)據(jù)
耗時(shí): 37.504418秒(一般來說不應(yīng)該這么慢的, 不知道這次測試為什么會(huì)這樣)
-
如果在你的APP中, 提交一些10000條數(shù)據(jù), 需要讓用戶等待37秒的話, 那么用戶肯定是很不樂意的
// 1. 編寫sql語句 insert into t_stu(name, age, score) values ('\(name)', \(age), \(score)) NSString *sql = [NSString stringWithFormat:@"insert into T_human(name, age, height) values('%@', %li, %f)", self.name, self.age, self.height]; // 2. 執(zhí)行SQL [[SQLiteTool shareInstance] excuteSQL:sql];
-
使用參數(shù)綁定, 來插入數(shù)據(jù)
耗時(shí): 耗時(shí)13.305384秒, 相比上面的方法有很大的提升
-
準(zhǔn)備語句會(huì)在一定程度上優(yōu)化數(shù)據(jù)的插入, 他不會(huì)因?yàn)榉磸?fù)的編譯準(zhǔn)備語句而導(dǎo)致性能的降低
// 插入數(shù)據(jù) - (void)insertHumanBind { // 1. 留給準(zhǔn)備語句用的語句 NSString *sql = @"insert into T_human(name, age, height) values(?, ?, ?)"; // 2. 創(chuàng)建準(zhǔn)備語句 sqlite3 *db = [SQLiteTool shareInstance].db; sqlite3_stmt *stmt = nil; // 準(zhǔn)備語句的引用指針 if (sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil) != SQLITE_OK) { NSLog(@"編譯失敗"); return; } // 3. 綁定參數(shù) sqlite3_bind_text(stmt, 1, @"lilchunjiang".UTF8String, -1, SQLITE_TRANSIENT); sqlite3_bind_int(stmt, 2, 16); sqlite3_bind_double(stmt, 3, 99); // 4. 執(zhí)行, 這里要判斷執(zhí)行是否完成 if (sqlite3_step(stmt) != SQLITE_DONE) { NSLog(@"執(zhí)行失敗"); return; } // 5. 重置, 將綁定的值清空 sqlite3_reset(stmt); // 6. 銷毀 sqlite3_finalize(stmt); }
-
盡管經(jīng)過上面的優(yōu)化, 我們?nèi)匀贿_(dá)不到預(yù)期的效果, 這主要是由于
如果執(zhí)行10000次SQL語句, 那么就會(huì)經(jīng)歷10000次
開啟事務(wù) -> 執(zhí)行語句 -> 提交事務(wù)
, 這樣會(huì)嚴(yán)重影響存儲(chǔ)的性能因此我們的解決方案為: 手動(dòng)開啟事務(wù), 然后重復(fù)10000次的執(zhí)行, 最后手動(dòng)提交事務(wù)
-
這時(shí)我們得到的耗時(shí)為: 0.040238秒, 這絕對(duì)是驚人的效率提升, 這主要是由于我們避免了重復(fù)的開啟/提交事務(wù)以及處理語句這些執(zhí)行的切換, 而是專注于語句的執(zhí)行
// 開啟事務(wù) - (void)beginTransaction { NSString *sql = @"begin transaction"; [self excuteSQL:sql]; } // 提交事務(wù) - (void)commitTransaction { NSString *sql = @"commit transaction"; [self excuteSQL:sql]; } // 插入1w條數(shù)據(jù) - (void)insertBind10000 { // 1. 語句 NSString *sql = @"insert into T_human(name, age, height) values(?, ?, ?)"; // 2. 創(chuàng)建準(zhǔn)備語句 sqlite3 *db = [SQLiteTool shareInstance].db; sqlite3_stmt *stmt = nil; if (sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil) != SQLITE_OK) { NSLog(@"編譯失敗"); return; } // 3. 開啟事務(wù) [[SQLiteTool shareInstance] beginTransaction]; for (int i = 0; i < 10000; i++) { // 4. 綁定參數(shù) sqlite3_bind_text(stmt, 1, @"lilchunjiang".UTF8String, -1, SQLITE_TRANSIENT); sqlite3_bind_int(stmt, 2, 16); sqlite3_bind_double(stmt, 3, 99); // 5. 執(zhí)行 if (sqlite3_step(stmt) != SQLITE_DONE) { NSLog(@"執(zhí)行失敗"); return; } // 6. 重置, 將綁定的值清空 sqlite3_reset(stmt); } // 7. 提交事務(wù) [[SQLiteTool shareInstance] commitTransaction]; // 8. 銷毀準(zhǔn)備語句 sqlite3_finalize(stmt); }
-
小結(jié)
- 如果我們只需要插入幾條語句的話, 那么就直接使用單條語句即可, 因?yàn)檫@樣很簡單
- 但是如果需要數(shù)據(jù)的大批量插入, 就一定要使用最后一種方法, 這樣會(huì)讓數(shù)據(jù)存儲(chǔ)有極大的性能提升
8. 探究SQL插入(insert)大量數(shù)據(jù)時(shí)的效率問題
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門好港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人米罚,你說我怎么就攤上這事钧汹。” “怎么了录择?”我有些...
- 文/不壞的土叔 我叫張陵拔莱,是天一觀的道長。 經(jīng)常有香客問我隘竭,道長塘秦,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任动看,我火速辦了婚禮尊剔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菱皆。我一直安慰自己须误,他們只是感情好挨稿,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著京痢,像睡著了一般奶甘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上历造,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邑蒋!你這毒婦竟也來了姓蜂?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對(duì)情侶失蹤医吊,失蹤者是張志新(化名)和其女友劉穎钱慢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿堂,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡束莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了草描。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片览绿。...
- 正文 年R本政府宣布怀各,位于F島的核電站,受9級(jí)特大地震影響术浪,放射性物質(zhì)發(fā)生泄漏瓢对。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一添吗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧份名,春花似錦碟联、人聲如沸妓美。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽壶栋。三九已至,卻和暖如春普监,著一層夾襖步出監(jiān)牢的瞬間贵试,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓廊散,卻偏偏與公主長得像桑滩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子允睹,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- YYKVStorage 上一篇介紹了操作文件的api运准,接下來介紹數(shù)據(jù)庫。 - (BOOL)_dbOpen { i...
- 什么是SQLite?數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)的步驟 ●SQLite是一款輕型的嵌入式數(shù)據(jù)庫,它占用資源非常的低,在嵌入式設(shè)備...
- iOS H5 PHP 數(shù)據(jù)庫管理系統(tǒng) SQL: SQL 是Structured Query Language(結(jié)構(gòu)...
- 使用的過程根據(jù)使用的函數(shù)大致分為如下幾個(gè)過程: sqlite3_open() sqlite3_prepare() ...