• 海量過車數據查詢優化總結
    2014-07-04 10:15:05   來源:tranbbs.com   評論:0 點擊:

    【摘要】

    隨著各地智能交通信息系統工程的持續建設和投入,交通設施設備大量增加,尤其是卡口數量快速增長,導致接入系統的過車數據迅速膨脹。對于發達地區的中等城市而言,每天產生的過車記錄有數百萬之多,一年就能達到10億量級,形成海量過車數據。

    此前的系統設計中,未曾考慮到海量數據情形,導致查詢效率低下,嚴重影響用戶體驗。當查詢涉及的記錄數過億時,查詢時間長達幾千秒,頁面動輒超時,測試部對此問題進行了復現。

    過車查詢的重要性不言而喻,在公安刑事偵查方面尤為有用,為了徹底解決海量數據查詢問題,研究院組織人力對數據庫和軟件進行了深度優化,經過兩天兩夜的努力,取得了不俗的成績,將海量數據查詢時間從幾千秒縮短到1秒左右。相關技術有望在類似產品中進行推廣。

    【關鍵詞】

    海量數據;查詢;優化;索引;過車數據;卡口

    一、問題的提出

    卡口系統中,用戶經常需要對車牌號進行精確和模糊查找,由于涉及上億過車記錄,查詢時間非常長,頁面頻繁超時,用戶投訴不斷。鑒于此,系統開發部提供了一份數據庫優化方案。該方案的思路是建立oracle雙機模式,使用一套Dell的FC存儲,包括6塊2T硬盤,形成Raid5結構。

    測試部在新版本數據庫(簡稱新庫)上進行測試,并與老版本數據庫(簡稱老庫)進行對比,結果顯示優化后查詢效率并未得到提升,反而略有下降,所以新庫僅測試了兩組數據。對比結果如下:

    從表中還可以看出,無論是新庫還是老庫,在海量數據查詢方面,其效率之低已經遠遠超出了用戶能夠接受的正常范圍,改進已經刻不容緩。

    考慮到新庫優化方向主要是系統穩定性及并發處理能力,未能緩解當前查詢效率低下的問題,研究院決定組織人力,從大數據角度出發對系統進行整體優化,希望從根本上改善海量數據查詢效率。

    在數據庫找到期望的數據集后,如果數據集比較大,例如在幾十萬的量級(模糊查詢),則前端展示時需要進行分頁處理。按照現有分頁算法,從過車表提取第100萬行記錄之前的20行記錄,耗用時間長達700多秒:

    可見分頁算法也存在缺陷,需要設計更為合理的分頁算法。

    二、解決思路

    根據優化對象的不同,優化技術通常千差萬別,但核心思想是一致的,那就是找到性能瓶頸,分析瓶頸產生的原因,利用合理的設計避開瓶頸,改善系統性能。

    我們知道,對于海量數據查詢而言,查詢效率嚴重依賴于查詢時所使用的索引,而不同索引對海量數據查詢的影響有天壤之別。要建立合適的索引,就必須對數據進行深度分析,結合數據特征,針對不同應用場景使用不同索引,才能實現快速高效的目標。

    對于我們的過車數據,其特征如下:

    每天產生的過車記錄數為數百萬至數千萬量級,每年產生記錄數為10億至100億量級;

    每條過車記錄會存儲過車時間、卡口ID、車牌號等信息;

    大型城市的卡口數量為幾百、幾千的量級;

    大型城市的車輛數量為幾百萬的量級。

    在決定使用哪一個索引最為合理時,有一條很重要的規則,那就是選定的索引要能夠迅速縮小需要處理的數據集規模,例如從100億或10億量級快速收縮到100萬或10萬以里。只要數據規模縮小到100萬或10萬這樣的量級上,數據庫就能夠從容應對。

    回到具體問題上,對于車牌號查詢,此前使用了基于“過車時間”的索引,利用“過車時間”索引,數據庫能夠快速定位到符合指定時間范圍的數據集,但是這個數據集太大了,僅一天的數據規模就超過了百萬,一年的數據規模則數以億計,在如此龐大的數據集中,數據庫需要逐條掃描,以查看是否滿足指定的車牌號條件,這就好比大海撈針,談何容易。

       考慮到之前總結的數據特征,在一個大型城市中,雖然一年的過車數據規模高達10億以至100億量級,但真正的車輛數目,也就是幾百萬的量級。以天津為例,機動車保有量超過240萬輛,在路面上經常行駛的車輛數量,可按100萬輛計算,則每輛車一年內的平均過車記錄數在1萬量級。由此可見,如果我們能夠使用車牌號上建立的索引,對車牌號精確查詢而言,就能夠迅速將數據規模縮小到一萬量級,在這個很小的數據集上,再查看時間是否滿足設定的條件,這樣的計算量對數據庫而言,尤其是性能優異的oracle,近乎于用導彈打蚊子,可在瞬息之間(秒級)得到期望的結果。在orcale中,可通過在查詢語句中增加“提示(hint)”來告知oracle使用我們推薦的索引,而不是oracle自行采用的索引,即可實現上述目標,如圖 2所示。

     

    相對而言,車牌號精確查詢很容易,但模糊查詢就復雜多了,用戶的輸入千差萬別,導致普通索引無法正常使用,為此需要建立一些非常規索引,以應對各種復雜的模糊查詢條件。

       對于分頁查詢,現有算法的缺陷較為明顯,尤其是處理大數據量時,在多層次的查詢語句中,對大數據量做了若干函數調用,其實最終只需要一頁的數據,導致數據庫做了很多無用功。改進措施也很簡單:調整內層循環,通過rowid定位單頁記錄,只在最外層執行必須的函數計算。

    三、實踐情況

    對于車牌號精確查詢,通過在查詢語句中強制使用車牌號字段上建立的索引,避免oracle采用“過車時間”索引,將數億過車記錄的查詢時間從數千秒迅速縮短到秒級,大幅度提高了海量數據查詢效率,有效改善了用戶體驗。在新版本數據庫上,與原有軟件的對比測試結果如下:

           表 2 優化前后車牌號精確查詢效率對比

    對于車牌號模糊查詢,我們建立了若干非常規索引,根據用戶的輸入情況,運行時決定使用哪一個索引,有效提高了查詢效率。在新的設計中,當用戶不確定的車牌號越少,查詢時間就越短,反之則查詢時間變長,這是由計算機原理決定的,也符合人類對現實的感受。在新版本數據庫上,與原有軟件的對比測試結果如下:

    表 3 優化前后車牌號模糊查詢效率對比

    針對模糊查詢優化時,引入了6個新索引,為了檢查增加索引后對數據庫的寫入性能是否有影響,我們執行了大批量寫入測試,結果顯示新增索引對寫入性能的影響很有限,幾乎可以忽略。

    對于數據分頁顯示,經過優化后,抓取100萬條記錄前的20行記錄,耗時降到1秒左右,如下所示:

    四、效果評價

    由查詢結果對比可知:

    優化之后,車牌號精確查詢速度得到了極大的提升。在2年1億的數據集中執行精確查詢,用時僅2s左右。

    優化之后,車牌號模糊查詢速度也得到了大幅提升。僅在模糊4位車牌號(只知道3位連續車牌號)的情況下,才出現了查詢時間過百秒的結果,而且還是在2年1億的數據集中執行查詢。

    關于oracle,有兩種常見看法,一是認為oracle只有在數據集為千萬級別時才能取得較好的查詢效率;二是認為增加幾個索引會導致數據庫性能迅速下降。通過此次測試,證明了當前增加的索引對數據庫性能幾乎沒有影響;從數據庫原理出發,結合當前測試結果,經過簡單推算,對于過車數據而言,事實上在100億量級,oracle完全可以取得不錯的效果。

    本文展示了在海量數據查詢優化中使用的分析方法和優化技術,有助于今后遇到類似問題時,盡快完成性能優化,提升產品性能。

    本文優化的主導思想包括以下幾點:分析數據集特征,建立恰當的索引;分析用戶操作,針對不同操作采用不同索引,提升查詢效率,改善用戶體驗。

    五、推廣建議

    在給定條件下使用哪些技巧,對于一個應用程序的性能來說非常重要。一個錯誤的選擇可能會引發數據庫啟動大海撈針式掃描,并導致數據庫性能急劇下降。而如果做出正確的選擇,就可以合理使用資源,使那些已經運行了幾個小時,甚至幾天的進程,在幾分鐘甚至幾秒內得以迅速完成。

    產品性能是個永恒話題,好的產品質量,總是伴以優異的產品性能。設計產品時,應從用戶角度出發,站在用戶角度看待問題。只有過硬的產品性能,才能獲得用戶的青睞,才能在市場上占有一席之地。

    海量數據查詢性能優化的方法很多,但都殊途同歸,本文可以作為其它產品性能優化的參考,起到拋磚引玉的作用。


    中央研究院

    吳明遠、李禹霆、曹海毛、李曉光

    責任編輯:佚名

    相關熱詞搜索: 數據查詢

    上一篇:用發展的眼光看我們當下的程序員
    下一篇:企業知識產權風險管理及易華錄知識產權工作啟示

    [內刊文章:42 篇]刊物介紹
      中央研究院介紹:由易華錄中央研究院負責建設、管理的自媒體運營項目——《易華錄中央研究院》微信公眾號,正式上線。利用新媒體網絡傳播平臺,開展智能交通與智慧城市領域的技術、產品和方案交流與傳播。
    聯系方式
    • 白先生:010--53396817
    重庆时时彩开奖视频直播 捕鱼大亨系统笔趣阁 怎么利用对公账户去赚钱 彩金捕鱼ol 赚钱社交电商 英雄杀 伯乐彩票首页 担保公司工作赚钱吗 没有目标就想赚钱 微视可以赚钱吗 江苏什么团最赚钱 梦幻西游代练咋赚钱 0170棋牌金蟾捕鱼 什么行业销售最赚钱 玩呗斗牌手游赚钱吗 66江苏麻将作弊软件下载 2018什么手游能赚钱人民币