資料庫優化 postgresql分割槽與繼承

2021-07-26 15:20:46 字數 2890 閱讀 2452

在實際專案開發中經常需要對各種操作日誌進行儲存,時間一久資料量就變得很大,所以當面臨對這些表直接查詢時,往往都會耗費較長的時間,從而影響使用者的體驗。由於這些表中都是會儲存時間序列,並且在具體業務中時間跨度比較小,所以可以通過按月或者按天的操作來進行分表,從而降低查詢的代價,提高查詢的速度。在postgresql中,可以利用內建的inherients機制來實現分割槽,降低整個代價。

在postgrelsql文件中,主要描述了以下幾個優點:

1)當分割槽之後,大多數對該錶的查詢都集中在乙個或者幾個分區內,查詢效能會得到大幅度的提公升。因為其降低了索引的大小,使得其索引結構在記憶體中的結構更合理。

ps:只是知道資料庫中的索引結構是b-tree或者b+tree,這個怎麼優化了不是很了解。

2)當查詢或者更新某個分割槽的大部分條目時,可以利用該分割槽的序列掃瞄而不用借助索引或者隨機訪問的方式來進行,因此也能改善該效能。

3)對某一塊(某段時間或者某個範圍內)資料的載入和刪除時,可以明顯改善效能

4)很少訪問,使用的資料可以移動到成本更低的低速儲存設施中。

1.1 建立主表
create

table operation_record(

id int notnull,

operate_date long notnull

);

1.2 建立繼承分割槽
create

table tablename _y2006m02(

check(operate_date >=date

'2006-02-01'

and operate_date '2006-03-01'))inherits(measurement);

在實際的開發中,博主是在插入資料時實時檢測分割槽是否存在,不存在則建立。

由於是在spring中進行開發,此處博主用的是jdbctemplate(可以通過@autowired和@qualifier來按bean名進行區分注入)來進行資料庫的ddl操作的。**如下:

private synchronized void checkexisttable(long operatetime) 

if(!i***ist)

}

1.3定義約束或者索引
create index measurement_y2006m02_opeatedate on table_y2006m02(operate_date);
1.4 定義規則或者(觸發器)
reateorreplacefunctionmeasurement_insert_trigger()returnstriggeras$$begin

if(new

.logdate>=

date

'2006-02-01'

andnew

.logdate<

date

'2006-03-01')then

insertintomeasurement_y2006m02values(new

.*);

elsif(new

.logdate>=

date

'2006-03-01'

andnew

.logdate<

date

'2006-04-01')then

insertintomeasurement_y2006m03values(new

.*);

...elsif(new

.logdate>=

date

'2008-01-01'

andnew

.logdate<

date

'2008-02-01')then

insertintomeasurement_y2008m01values(new

.*);

else

raiseexception'date out of range. fix the measurement_insert_trigger() function!';

endif;

returnnull;end;$$languageplpgsql;

createtriggerinsert_measurement_trigger

beforeinsertonmeasurement

foreachrowexecuteproceduremeasurement_insert_trigger();

定義規則:

create rule rule_operation_record_" + month + " as on insert to operation_record where (operation_time >=

" + startdate.gettime() + "

and operation_time<

" + enddate.gettime() + ") do instead insert into operation_record_" + month

+ "(id, target_type, reference_id, operation_type, content, remark, operation_user, operation_time) values (new

.id, new

.target_type, new

.reference_id, new

.operation_type, new

.content, new

.remark, new

.operation_user, new

.operation_time)");

existdate.add(month);

Postgresql之資料庫優化引數設定

比較常見的幾個資料庫引數配置 1.share buffer 大的shared buffers需要大的checkpoint segments,同時需要申請更多的system v共享記憶體資源.並且增加共享記憶體管理的開銷.這個值不需要設的太大,因為postgresql還依賴作業系統的檔案系統cache...

postgresql模板資料庫

template0和template1為postgresql資料庫的模板資料庫,新建的資料庫預設使用template1作為模板。template0和template1的區別在於template0無法修改,因此你可以修改template1資料庫以定製新建立的資料庫。template資料庫無法被刪除 d...

postgresql資料庫安裝

安裝並初始化 1 解壓資料庫並放到指定目錄 在opt目錄下 tar xvzf postgresql 10.1 1 linux x64 binaries.tar.gz 解壓出來之後目錄為pgsql 2 mv pgsql usr local pgsql 3 建立pgsql使用者並設定密碼 useradd...