3.db2性能和優化


db2中有分區、表空間、日志空間等的概念,所以在操作db2數據庫時候,注意以上的設置,會大大提升sql的運行速度,也方便管理人員的管理和維護。了解其原理后,你會發現db2是典型的分布式集群

1.db2的存儲結構

假設倉庫主機現在有40個節點,節點號為0-39升序排列,40個節點,即有40個分區,每個分區大小一致,且每個分區都有自己的表空間和日志空間。

2.指定表空間

表空間是存儲表里數據記錄的地方。

3.指定分區鍵  partitioning key

分區鍵的作用:在向表里面insert或者load數據時,是通過哈希算法根據分區鍵來計算出節點號,然后把分割的數據送往此節點,然后裝入數據。

分區鍵的指定:指定分區鍵時一般要指定那些此列數據內容有很大差異的那些列,比如手機號碼,id_no等,這樣計算出的節點號分布比較均勻,數據才能均勻分布存放在40個節點。

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

4.增加一個列

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 操作,可以自己建立臨時表玩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM