Postgre數(shù)據(jù)庫(kù)Insert 、Query性能優(yōu)化詳解
一、前言
以前的系統(tǒng)由于表設(shè)計(jì)比較復(fù)雜(多張表,表與表直接有主從關(guān)系),這個(gè)是業(yè)務(wù)邏輯決定的。 插入效率簡(jiǎn)直實(shí)在無(wú)法忍受,必須優(yōu)化。在了解了Postgre的Copy,unlogged table 特性
之后,決定一探究竟。
二、測(cè)試用例
1.數(shù)據(jù)表結(jié)構(gòu):表示一個(gè)員工工作績(jī)效的表(work_test):共15個(gè)字段
id,no,name,sex,tel,address,provice,city,post,mobile,department,work,start_time,end_time,score
索引(b-tree的集群索引或者叫聚集索引):id,no,name,sex,tel,address,provice,city,post,mobile,department,work
2.測(cè)試環(huán)境:win7,四核,2GB內(nèi)存;postgre版本9.3;Npgsql連接Postgre數(shù)據(jù)庫(kù)。
三、insert/ transaction/ copy/unlogged table
1.insert 一個(gè)10W數(shù)據(jù)大概需要120s,雖然已經(jīng)提升“不少”,但是還是不盡如人意。以前用SQLite時(shí)發(fā)現(xiàn)Transaction可以大幅提升性能,于是在Postgre中試試,發(fā)現(xiàn)并沒(méi)有明顯變
化。不知何故。
2. copy可以將文件(csv)中的數(shù)據(jù)復(fù)制進(jìn)數(shù)據(jù)庫(kù)中,當(dāng)然數(shù)據(jù)表的結(jié)構(gòu)和要數(shù)據(jù)類型要與文件一一對(duì)應(yīng)。據(jù)說(shuō)可以大幅提升插入性能。
COPY 'work_test' from 'c:\temp.csv' WITH DELIMITER AS ','
使用Copy后發(fā)現(xiàn)插入的性能立馬提升至30s,相當(dāng)于1s插入3300條記錄。這中間還包含生成csv文件的時(shí)間。
3.unlogged table
unlogged table,網(wǎng)上的文章說(shuō)可以10倍于insert。使用方法也很簡(jiǎn)單:Create unlogged table ...
但是unlogged table 在遇到Postgre服務(wù)器異常重啟后會(huì)丟失全部數(shù)據(jù),所以如果你的數(shù)據(jù)不允許丟失,請(qǐng)不要使用。
使用后發(fā)現(xiàn),大概20s,1s插入5000條記錄。
下面是三種插入方式的走勢(shì)圖:
說(shuō)明:x軸表示數(shù)據(jù)庫(kù)中已有的記錄數(shù),單位百萬(wàn),每個(gè)點(diǎn)是10W.Y軸表示每次插入所耗時(shí)間,單位秒。
藍(lán)色線:insert;之所以后面比較穩(wěn)定是因?yàn)殡娔X沒(méi)有運(yùn)行其他程序。所以說(shuō),電腦工作狀態(tài)對(duì)Postgre效率有一定的影響。
粉紅色:copy;
黃色線:copy+unlogged
雖然建了索引,并且表中的數(shù)據(jù)一直累加進(jìn)來(lái),對(duì)于后續(xù)插入數(shù)據(jù)性能并沒(méi)有任何影響,這個(gè)結(jié)果就是我想看到的。
四、查詢測(cè)試
按name字段搜索:
select * from work_test where name='1'

說(shuō)明:x軸表示數(shù)據(jù)庫(kù)中已有的記錄數(shù),單位百萬(wàn),每個(gè)點(diǎn)是10W.Y軸表示每次查詢所耗時(shí)間,單位毫秒。
藍(lán)色線:insert;
粉紅色:copy;
黃色線:copy+unlogged
由于三種插入方式結(jié)果都是一樣的,所以對(duì)比并沒(méi)有意義,這里主要看查詢耗時(shí)。平均下來(lái):500ms,并且隨著Row count的增加,查詢效率并沒(méi)有降低。這主要得益于良好的索引。
另外發(fā)現(xiàn):條件越多,查詢效率越高,因?yàn)閽呙璧男袛?shù)在減少,后面的圖就不貼出來(lái)了。
- 海量數(shù)據(jù)庫(kù)的查詢優(yōu)化及分頁(yè)算法方案
- SQL Server 數(shù)據(jù)庫(kù)優(yōu)化
- mysql 數(shù)據(jù)庫(kù)中my.ini的優(yōu)化 2G內(nèi)存針對(duì)站多 抗壓型的設(shè)置
- 開(kāi)啟SQLSERVER數(shù)據(jù)庫(kù)緩存依賴優(yōu)化網(wǎng)站性能
- MySQL 聯(lián)合索引與Where子句的優(yōu)化 提高數(shù)據(jù)庫(kù)運(yùn)行效率
- asp.net程序優(yōu)化 盡量減少數(shù)據(jù)庫(kù)連接操作
- 服務(wù)器維護(hù)小常識(shí)(硬盤內(nèi)容增加、數(shù)據(jù)庫(kù)優(yōu)化等)
- 數(shù)據(jù)庫(kù)性能優(yōu)化二:數(shù)據(jù)庫(kù)表優(yōu)化提升性能
- 數(shù)據(jù)庫(kù)性能優(yōu)化一:數(shù)據(jù)庫(kù)自身優(yōu)化提升性能
- Oracle SQL tuning 數(shù)據(jù)庫(kù)優(yōu)化步驟分享(圖文教程)
- oracle數(shù)據(jù)庫(kù)sql的優(yōu)化總結(jié)
- 優(yōu)化Mysql數(shù)據(jù)庫(kù)的8個(gè)方法
- mysql中優(yōu)化和修復(fù)數(shù)據(jù)庫(kù)工具mysqlcheck詳細(xì)介紹
- Codeigniter操作數(shù)據(jù)庫(kù)表的優(yōu)化寫法總結(jié)
- MySQL數(shù)據(jù)庫(kù)優(yōu)化詳解
- 用實(shí)例詳解Python中的Django框架中prefetch_related()函數(shù)對(duì)數(shù)據(jù)庫(kù)查詢的優(yōu)化
- 數(shù)據(jù)庫(kù)學(xué)習(xí)建議之提高數(shù)據(jù)庫(kù)速度的十條建議
相關(guān)文章
淺談PostgreSQL消耗的內(nèi)存計(jì)算方法
這篇文章主要介紹了淺談PostgreSQL消耗的內(nèi)存計(jì)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01postgresql 實(shí)現(xiàn)查詢出的數(shù)據(jù)為空,則設(shè)為0的操作
這篇文章主要介紹了postgresql 實(shí)現(xiàn)查詢出的數(shù)據(jù)為空,則設(shè)為0的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Abp.NHibernate連接PostgreSQl數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了Abp.NHibernate連接PostgreSQl數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01windows PostgreSQL 9.1 安裝詳細(xì)步驟
這篇文章主要介紹了windows PostgreSQL 9.1 安裝詳細(xì)步驟,需要的朋友可以參考下2016-11-11Postgresql psql文件執(zhí)行與批處理多個(gè)sql文件操作
這篇文章主要介紹了Postgresql psql文件執(zhí)行與批處理多個(gè)sql文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01postgresql數(shù)據(jù)添加兩個(gè)字段聯(lián)合唯一的操作
這篇文章主要介紹了postgresql數(shù)據(jù)添加兩個(gè)字段聯(lián)合唯一的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02postgresql高級(jí)應(yīng)用之合并單元格的思路詳解
這篇文章主要介紹了postgresql高級(jí)應(yīng)用之合并單元格,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05