3.db2性能和優化

db2中有分區、表空間、日誌空間等的概念,因此在操做db2數據庫時候,注意以上的設置,會大大提高sql的運行速度,也方便管理人員的管理和維護。瞭解其原理後,你會發現db2是典型的分佈式集羣算法

1.db2的存儲結構sql

假設倉庫主機如今有40個節點,節點號爲0-39升序排列,40個節點,即有40個分區,每一個分區大小一致,且每一個分區都有本身的表空間和日誌空間。數據庫

2.指定表空間分佈式

表空間是存儲表裏數據記錄的地方。性能

3.指定分區鍵  partitioning key大數據

分區鍵的做用:在向表裏面insert或者load數據時,是經過哈希算法根據分區鍵來計算出節點號,而後把分割的數據送往此節點,而後裝入數據。優化

分區鍵的指定:指定分區鍵時通常要指定那些此列數據內容有很大差別的那些列,好比手機號碼,id_no等,這樣計算出的節點號分佈比較均勻,數據才能均勻分佈存放在40個節點。操作系統

不指定分區鍵:若是建表的時候沒有指定分區鍵的話,系統默認使用表的第一個字段,分區鍵未指定或者分區鍵指定不恰當,會致使狀況。日誌

4.增長一個列blog

Alter table tab_tmp add column ph varchar(11)

說明:列增長後將不能刪除。DB2中列加上後數據類型也不能改變,惟一能改變的是增長varchar類型的長度,只能增大。

5.修改表名

Rename  bug.temp_tab  to temp_tab2;

說明:temp_tab2不存在,方可執行成功。而且temp_tab2不加前綴,修改爲功後表名爲:bug.temp_tab2。

6.建立視圖

create view  as select id_no,phone_no from com.com_result_tab where ...

說明:視圖惟一能修改的是引用類型列,改變列的範圍。其餘定義好了都不能修改。當視圖基於的基表drop後,視圖變爲無效。建立視圖,能夠修改字段名稱,對原表信息是一種保護。

7.表的左鏈接 left join。以及左表的選擇。

選擇1: 數據量小的表做爲左表(業務邏輯容許的狀況下)。

選擇2:將使用條件篩選的表做爲左表。

選擇3:具備索引選擇操做的表做爲左表,不然每掃描左表中的一行,就要掃描一遍整個表。

選擇4:重複記錄少的表更趨向於做左表。

選擇5:外關聯時,on後面僅僅存放關聯條件(也就是說必須是左右表的字段比較),對於關聯表內部的條件應當放在where子句中,除非你想保留全部沒有匹配上的記錄。

8.儘可能不使用in(select id_no from tabs...)

9.錶鏈接是必定注意兩個字段類型是否相同

好比A表,id_no 類型爲bigint; B表,id_no 類型爲varchar();  此時以id_no做爲鏈接條件,速度特別慢。

 

緣由1:當鏈接兩個不一樣類型的列時,其中一個列必須轉換成另外一個列的類型,級別低的會被轉換成高級別的類型,轉換操做會消耗必定的系統資源;

緣由2:若是你使用兩個不一樣類型的列來鏈接表,其中一個列本來可使用索引,但通過轉換後,優化器就不會使用它的索引了。

10.在查詢中儘可能不要使用or

使用union合併兩個不一樣的查詢結果集,這樣查詢性能會更好。

若是不是必需要不一樣的結果集,使用union all效果會更好,由於它不會對結果集排序,去重。88

11.更新表統計信息

Runstats的做用是從新更新數據庫系統對錶的統計信息,這些信息在數據庫生成執行計劃時將被使用。

12.整理表存儲碎片

若是一個表的數據量變化不少,與操做系統的文件系統同樣就會產生存儲碎片,須要從新收集數據碎片和分佈數據,從而提升數據訪問效率。

reorg table tab_name

另外能夠經過reorgchk on table…來檢查碎片是否須要整理

13.在大數據量插入操做

能夠採用不寫日誌方式,

通常狀況下插入數據時必須避免插入笛卡爾集

注意:但若是執行被中斷,表將損壞,沒法使用。

14.爲避免鎖衝突,能夠採用髒讀模式

前提對數據一致性要求不高

---------------------------------------------------------------------------------------------完美分割線----------------------------------------------具體操做。

1.當前庫鏈接其餘庫

 db2 connect to db_name user db_id using db_pwd

 說明:密碼得問相關的管理人員,咱們沒法查看。name和id經過鍵入conn就能夠顯示。

2.建立視圖

3.學會創建臨時表

       假設有三張或者三張以上的表進行鏈接,並且每張表的數據量都不小,此時就創建一張臨時表,將其中的兩張表關聯的結果插入臨時表(tab_temp1),以後再與其餘表進行關聯。

       說明:數據量小的時候,看不出臨時表的做用,可是數據量很到的時候,臨時表能夠避免讓你等的很焦灼。

3.大量數據的插入操做

大量數據插入臨時表中,採用不寫日誌的方式,避免日誌滿了。被force後,事務日誌回滾,形成i/o繁忙。

4.對數據表進行過更新操做後記得commit

eg:insert into ;merge into;delete;update

顯示提交事務,釋放事務日誌。

5.長時間不使用數據庫記得斷開數據庫鏈接。

6.本身創建的臨時表使用完以後記得刪除

第一步:清空表數據

第二步:刪除表

7.查詢數據進行限定,必定不要select * from 

8.初次遇見本身不知道的表,不要進行update 或者delete 操做,能夠本身創建臨時表玩。

相關文章
相關標籤/搜索