排号鍵是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)的時間也少于使用字元串(其它字段和記錄行數都相同),說明排号鍵對象的生成性能更好。