天天看點

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

排号鍵是SPL獨特的資料類型,适合替代多層次、各層不連續的鍵值,比如身份證号、合同編号、産品編号、組織機構代碼等。排号鍵定位速度快,常用于優化記憶體索引查詢和外鍵關聯計算。

記憶體索引查詢

cardNormal.btx是集檔案格式的身份證資訊表,資料量一百萬條,字段為:cardNo(身份證,主鍵),name(姓名),gender(性别),province(省份),email(電子郵件),mobile(行動電話),address(住址)。cardK.btx與cardNormal.btx在結構和資料上完全相同,唯一的差別在于cardNo字段是排号鍵。

本案例對cardNormal.btx和cardK.btx分别執行百萬次索引查詢,并比較兩者性能。

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

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

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

生日:取值為"1980-06-01"至"1981-01-01"。

流水:取值為1-100。

校驗:根據前15位計算出的備援校驗位,取值為0至10,其中10用x來表示。

将上述身份證轉為排号鍵,可采取如下思路:

1.      省、地區:排号鍵的每一層隻支援1-255的整數,是以将省和地區分别轉為整數,作為第1、2層排号鍵。

2.      生日:排号鍵以1為起始,可以取得更好的性能,是以算出原生日和1980-06-01的間隔天數,作為第3層排号鍵。

3.      流水:轉為整數,作為第4層的排号鍵。

4.      校驗位:備援資料,可删除。

具體轉換腳本如下:

k(int(mid(cardNo,1,2)),

int(mid(cardNo,3,2)),

interval("1980-06-01",date(mid(cardNo,5,8),"yyyyMMdd")),

int(mid(cardNo,13,3))

)

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

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

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的差異。

具體算法如下:

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

B2、B7、B13、B19:預周遊遊标,避免作業系統緩存的影響。周遊之後需用reset函數重置遊标,以便後續再次周遊。

B11、B23:用總時間減去周遊時間,獲得關關聯作消耗的時間。

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

繼續閱讀