非叢集索引解決大資料尋找死結問題,

來源:互聯網
上載者:User

非叢集索引解決大資料尋找死結問題,

               前兩天看了李遊的一篇部落格,關於SQL Server死結的問題。原文連結:http://blog.csdn.net/senior_lee/article/details/42275565。

     一、主題描述

     先看看問題描述:當機房人數達到上限時,評教過程中就遇到了無法提交的情況。遇到問題後大家第一時間發現了是由於死結造成的。

     再來看出現這個問題的原因:這次造成死結的原因是:使用SqlServer的時候發現在高並發情況下,頻繁更新和頻繁查詢引發死結。

     好吧,原文章說在被頻繁操作的那張表上的預存程序中添加非叢集索引就OK了,到底什麼是非叢集索引?為什麼添加它就能解決?下面就為大家補充一下。

     二、聚集/非叢集索引介紹

     既然有非叢集索引,就一定有聚集的,接著我們來看看它們都是什麼。

     叢集索引:索引中鍵值的邏輯順序決定了表中相應行的物理順序。就像我們寫文檔,文檔的目錄決定了具體內容的順序。

     由於叢集索引規定資料在表中的實體儲存體順序,因此一個表只能包含一個叢集索引。但該索引可以包含多個列(複合式索引),就像文檔可以按內容標題和重要性進行組織編排一樣。

     根據叢集索引的這個特點,我們就可以分析出,它在查詢範圍值的時候效率比較高。例如,我們要查按日期排列的一組資料,利用叢集索引就可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。

     非叢集索引:索引中鍵值的邏輯順序不同於表中相應行的物理順序。

     索引是通過二叉樹的資料結構來描述的,我們可以這麼理解叢集索引:索引的分葉節點就是資料節點。而非集索引的分葉節點仍然是索引節點,只不過有一個指標指向對應的資料區塊。稍微接觸過資料結構的同學應該很容易就能理解。 

     非叢集索引很像我們按照部首查字典,字典編排是按照拼音順序的,但我們仍可以用部首進行定位查詢。

     三、問題解決與應用

     下面這幅圖片介紹了我們應該什麼時候用什麼類型的索引。

                    

     在叢集索引被使用時,每次資料的變化,都可能導致表中的資料按照叢集索引重新調整順序。這樣也就合理的解釋了上邊“在大批量資料、高並發的情況下頻繁更新和查詢”引起的死結問題。 

     去掉叢集索引、改成非叢集索引或修改索引填滿因數這三種方法理論上都能解決上述問題,只是推測,筆者並沒有測試。

     關於死結,還可能是填滿因數設定不合理引起的,這裡就不仔細講解了,想詳細瞭解的推薦參考:http://www.cnblogs.com/hanmos/archive/2011/03/28/1998054.html 。

     四、小結

     類似資料庫中的知識還有許多不為我們所知,在項目中遇到的新問題後要知其然,知其所以然,這樣才能獲得寶貴的項目經驗。

     

     

     

     

     

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.