資料庫優化 空間換時間優化

2022-03-31 22:18:13 字數 2419 閱讀 9822

在查詢優化中,有乙個重要的概念:空間換取查詢時間

這一理論最好的應用就是:資料倉儲(olap):在海量資料庫裡(一般是tb級)分析資料,通過對資料的etl和計算彙總,得到有用的資料,並通過不同維度檢視統計資料(一般比較少),實現上鑽和下鑽分析資料。

現在討論一下在oltp系統中空間換取查詢時間常用的幾個方法:

1,增加冗餘表(計算彙總表)

2,增加冗餘字段(包括計算字段)

3,  增加索引(包括計算索引)

4,增加索引檢視(物化檢視)

5,資料快取

5.1,資料庫快取(如換成64位的系統和資料庫):

5.2,程式快取(如:hibernate中的快取)

我們在開發系統中或多或少的使用了以上的方法,這次結合實際,討論一下這些方法的具體使用和目的:

案例一:

我們優化乙個系統,原來的開發人員,由於資料量比較大,為保證查詢效能,對於辦事處和分公司是實時計算,片區和總公司是非實時統計,開發人員就使用統計片區和總公司統計彙總靜態表,每天晚上凌晨1點計算上一天的的彙總資料。並存放到了靜態表。統計時,片區和總公司是統計靜態表資料,統計速度很快。

但後來發現總公司彙總資料和分公司彙總資料不對。原來這個系統的網路管理員可以在系統裡直接去改資料。這樣我們的統計靜態資料就不對。為何要改這個資料,因為系統bug和下面業務人員的操作不對,就直接修改資料庫資料。

為了保證總公司資料和分公司彙總資料一致,後來取消了這個計算冗餘表,直接實時統計。

總結:這個例子說明冗餘表的利和弊,假如我們的系統資料可能更改,這時冗餘表的資料就不準確了,這點要注意的。這

也是計算冗餘表的乙個主要問題:資料的更改,統計資料不准。

目的: 減少查詢資料量(彙總欄位和表)

2,增加冗餘字段(包括計算字段)

案例一:

系統的乙個模組,業務要求是使用者輸入一段日期(時間段)的投入總金額,由於業務要求計算每天的金額,這時如果沒有每天的資料,則只有去查詢出總數,在通過時間相減得到總天數,在計算出每天的金額。

如果資料量比較大,計算時間比較長,這時我們就在程式裡做乙個計算功能,把這個資料算好自己放到表裡,這時就不需要統計時計算了。

總結:我們增加冗餘字段,目的就是為了將後期通過資料庫計算的時間細化,分散到每次插入資料時的時間,這點時間是很少的。但積累起來卻是很多,特別是在後面統計和分析時就很明顯。當然,我們可以細化時間和先期彙總資料,如總數。可以插入資料時,把總數計算出來,有利於減少彙總資料量。

目的:減少業務邏輯計算和彙總時間

3,  增加索引(包括計算索引)

索引是資料冗餘的一種,也是將表中列的資料冗餘出來,這樣查詢時就可以不用去查詢表,同時可以使用索引資料結構快速搜尋seek。

我們說的索引覆蓋,就是查詢中將需要的列全部冗餘,通過索引來查詢,而不需要去表中查詢資料。

目的:查詢索引,而不掃瞄表(儘管掃瞄表有時是最優的)

4,增加索引檢視(物化檢視)

我們說的索引檢視(物化檢視),就是對需要查詢關聯的資料或彙總資料,預先通過實體表存放起來。這樣查詢時可以不去關聯的表(表有時可能很多,資料量比較大),去直接去查詢索引檢視(物化檢視)。

這裡,如上面「增加冗餘表」,提到資料可能更改的問題,就可以用索引檢視(物化檢視)來實現。

當然索引檢視(物化檢視)有條件限制,不是所有查詢都可以使用的。如sql server索引檢視就只能用inner join關聯,同時要有唯一的聚集索引。由於索引檢視(物化檢視)成本較高,一般在oltp系統中使用較少(以大量犧牲dml時間為代價),在olap中使用較多。

目的:減少查詢資料量

5,資料快取

一,資料庫快取,也是一種優化方式,如將經常訪問的表放到記憶體裡,這樣在記憶體中查詢速度要比在硬碟速度快很多。一般的方法如下:

1,將32位作業系統和資料庫改成64位的,提高記憶體使用和cpu定址能力

2,在oracle裡可以把使用頻繁但資料量比較少的表(keep cache)起來,啟動時就一直放到記憶體中。

二,程式快取

目前有一些快取框架,如jboss cache,hibernate快取,ehcache等快取框架,可以減少查詢資料庫,提高速度。

三,靜態變數             

案例一:

我們以前做乙個系統,由於沒有用快取框架,一般使用的靜態基本的資料(如查詢機構,車輛,人員等),啟動程式時,去資料庫去查詢資料,放到乙個list裡面,然後封裝了一些靜態方法,這些基本資訊就放到靜態list裡。這時可以做一些的查詢,如取一些資料,不用去查詢資料庫了,直接呼叫靜態方法,減少和資料庫互動次數。

資料快取目的:1,減少和資料庫的互動次數

2,盡可能使用記憶體(資料庫伺服器和應用伺服器)

資料庫優化 資料庫設計優化

一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...

sql優化,資料庫優化

1.sql的執行順序 from 表名 where 條件 執行順序是從後往前,where條件後面的語句盡可能縮短where 資料執行的範圍。先group by 後order by select 查詢 2.避免過多的聯查,設計合理的表關係 3.遵守常見sql規範,盡可能減少 4.如果表字段過多,經常展示...

sql優化 資料庫優化

資料庫優化 資料庫優化吧我覺應該從硬碟 記憶體和網路頻寬考慮,提高硬碟的讀寫速度,增大頻寬提高吞吐量,增大伺服器記憶體,可以採用讀寫分離,降低單台資料庫的訪問壓力,查詢的時候控制資料量的大小,返回更少資料,減少互動次數,減少cpu及記憶體的開銷,sql優化 如果乙個表中資料量過大我們可以採用橫切割,...