排號鍵是SPL獨特的數據類型,適合替代多層次、各層不連續的鍵值,好比身份證號、合同編號、產品編號、組織機構代碼等。排號鍵定位速度快,經常使用於優化內存索引查詢和外鍵關聯計算。算法
cardNormal.btx是集文件格式的身份證信息表,數據量一百萬條,字段爲:cardNo(身份證,主鍵),name(姓名),gender(性別),province(省份),email(電子郵件),mobile(移動電話),address(住址)。cardK.btx與cardNormal.btx在結構和數據上徹底相同,惟一的區別在於cardNo字段是排號鍵。緩存
本案例對cardNormal.btx和cardK.btx分別執行百萬次索引查詢,並比較二者性能。函數
其中cardNo是簡化後的身份證,格式以下:性能
省、地區:各自取值範圍爲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. 校驗位:冗餘數據,可刪除。
具體轉換腳本以下:
下面對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的差別。
具體算法以下:
B二、B七、B1三、B19:預遍歷遊標,避免操做系統緩存的影響。遍歷以後需用reset函數重置遊標,以便後續再次遍歷。
B十一、B23:用總時間減去遍歷時間,得到關聯動做消耗的時間。
能夠看到,用普通鍵作外鍵關聯計算,其關聯動做耗時7553ms;排號鍵作外鍵關聯計算時,只需耗時966ms,後者明顯快。並且能夠看出,使用排號鍵讀出記錄(fetch)的時間也少於使用字符串(其它字段和記錄行數都相同),說明排號鍵對象的生成性能更好。