性能優化技巧 - 多層排號鍵

排號鍵是SPL獨特的數據類型,適合替代多層次、各層不連續的鍵值,好比身份證號、合同編號、產品編號、組織機構代碼等。排號鍵定位速度快,經常使用於優化內存索引查詢和外鍵關聯計算。算法

內存索引查詢

cardNormal.btx是集文件格式的身份證信息表,數據量一百萬條,字段爲:cardNo(身份證,主鍵),name(姓名),gender(性別),province(省份),email(電子郵件),mobile(移動電話),address(住址)。cardK.btx與cardNormal.btx在結構和數據上徹底相同,惟一的區別在於cardNo字段是排號鍵。緩存

本案例對cardNormal.btx和cardK.btx分別執行百萬次索引查詢,並比較二者性能。函數

其中cardNo是簡化後的身份證,格式以下:性能

image.png

省、地區:各自取值範圍爲1-10。fetch

生日:取值爲"1980-06-01"至"1981-01-01"。優化

流水:取值爲1-100。spa

校驗:根據前15位計算出的冗餘校驗位,取值爲0至10,其中10用x來表示。操作系統

將上述身份證轉爲排號鍵,可採起以下思路:orm

1.      省、地區:排號鍵的每一層只支持1-255的整數,所以將省和地區分別轉爲整數,做爲第一、2層排號鍵。對象

2.      生日:排號鍵以1爲起始,能夠取得更好的性能,所以算出原生日和1980-06-01的間隔天數,做爲第3層排號鍵。

3.      流水:轉爲整數,做爲第4層的排號鍵。

4.      校驗位:冗餘數據,可刪除。

具體轉換腳本以下:

image.png

下面對cardNormal.btx和cardK.btx分別執行百萬次索引查詢。

image.png

A8:對排號鍵創建內存哈希索引,需使用函數選項@s。

能夠看到,對字符串鍵創建索引,查詢需耗費5547毫秒,而排號鍵只需1977毫秒,後者明顯快。

 外鍵關聯查詢

taxNormal.btx是集文件格式的報稅信息表,數據量一千萬條,字段爲:serial(主鍵,流水號),cardNo(外鍵,身份證),tax(報稅額),area(所屬地區),declaretype(申報類型),unit(申報單位),declareTime(申報時間),network(辦理網點)。taxK.btx 與taxNormal.btx在結構和數據上徹底相同,惟一的區別在於cardNo字段是排號鍵。

本案例算法:

1.       對taxNormal.btx和cardNormal.btx進行外鍵關聯計算,排除操做系統緩存和硬盤IO的影響,只取關聯動做消耗的時間。

2.       對taxK.btx和cardK.btx進行外鍵關聯計算,排除操做系統緩存和硬盤IO的影響,只取關聯動做消耗的時間。

3.       比較1和2的差別。

具體算法以下:

image.png

image.png

B二、B七、B1三、B19:預遍歷遊標,避免操做系統緩存的影響。遍歷以後需用reset函數重置遊標,以便後續再次遍歷。

B十一、B23:用總時間減去遍歷時間,得到關聯動做消耗的時間。

能夠看到,用普通鍵作外鍵關聯計算,其關聯動做耗時7553ms;排號鍵作外鍵關聯計算時,只需耗時966ms,後者明顯快。並且能夠看出,使用排號鍵讀出記錄(fetch)的時間也少於使用字符串(其它字段和記錄行數都相同),說明排號鍵對象的生成性能更好。

相關文章
相關標籤/搜索