在[實現小資料量和海量資料的通用分頁顯示儲存過程]一文中,筆者寫的是:實現小資料量和海量資料的通用分頁顯示儲存過程。這是因為在將本儲存過程應用於「辦公自動化」系統的實踐中時,筆者發現這第三種儲存過程在小資料量的情況下,有如下現象:
1、分頁速度一般維持在1秒和3秒之間。
2、在查詢最後一頁時,速度一般為5秒至8秒,哪怕分頁總數只有3頁或30萬頁。
雖然在超大容量情況下,這個分頁的實現過程是很快的,但在分前幾頁時,這個1-3秒的速度比起第一種甚至沒有經過優化的分頁方法速度還要慢,借使用者的話說就是「還沒有access資料庫速度快」,這個認識足以導致使用者放棄使用您開發的系統。
筆者就此分析了一下,原來產生這種現象的癥結是如此的簡單,但又如此的重要:排序的字段不是聚集索引!
本篇文章的題目是:「查詢優化及分頁演算法方案」。筆者只所以把「查詢優化」和「分頁演算法」這兩個聯絡不是很大的論題放在一起,就是因為二者都需要乙個非常重要的東西――聚集索引。在前面的討論中我們已經提到了,聚集索引有兩個最大的優勢:
1、以最快的速度縮小查詢範圍。
2、以最快的速度進行字段排序。
第1條多用在查詢優化時,而第2條多用在進行分頁時的資料排序。
而聚集索引在每個表內又只能建立乙個,這使得聚集索引顯得更加的重要。聚集索引的挑選可以說是實現「查詢優化」和「高效分頁」的最關鍵因素。
但要既使聚集索引列既符合查詢列的需要,又符合排序列的需要,這通常是乙個矛盾。筆者前面「索引」的討論中,將fariqi,即使用者發文日期作為了聚集索引的起始列,日期的精確度為「日」。這種作法的優點,前面已經提到了,在進行劃時間段的快速查詢中,比用id主鍵列有很大的優勢。
但在分頁時,由於這個聚集索引列存在著重覆記錄,所以無法使用max或min來最為分頁的參照物,進而無法實現更為高效的排序。而如果將id主鍵列作為聚集索引,那麼聚集索引除了用以排序之外,沒有任何用處,實際上是浪費了聚集索引這個寶貴的資源。
為解決這個矛盾,筆者後來又新增了乙個日期列,其預設值為getdate()。使用者在寫入記錄時,這個列自動寫入當時的時間,時間精確到毫秒。即使這樣,為了避免可能性很小的重合,還要在此列上建立unique約束。將此日期列作為聚集索引列。
有了這個時間型聚集索引列之後,使用者就既可以用這個列查詢使用者在插入資料時的某個時間段的查詢,又可以作為唯一列來實現max或min,成為分頁演算法的參照物。
經過這樣的優化,筆者發現,無論是大資料量的情況下還是小資料量的情況下,分頁速度一般都是幾十毫秒,甚至0毫秒。而用日期段縮小範圍的查詢速度比原來也沒有任何遲鈍。聚集索引是如此的重要和珍貴,所以筆者總結了一下,一定要將聚集索引建立在:
1、您最頻繁使用的、用以縮小查詢範圍的字段上;
2、您最頻繁使用的、需要排序的字段上。
聚集索引的重要性和如何選擇聚集索引
聚集索引的重要性和如何選擇聚集索引 在上一節的標題中,筆者寫的是 實現小資料量和海量資料的通用分頁顯示儲存過程。這是因為在將本儲存過程應用於 辦公自動化 系統的實踐中時,筆者發現這第三種儲存過程在小資料量的情況下,有如下現象 1 分頁速度一般維持在1秒和3秒之間。2 在查詢最後一頁時,速度一般為5秒...
聚集索引和非聚集索引的區別
暫且摘錄如下 摘錄1 前者加在不常更新的表,後者加在經常更新的表 摘錄2 使用聚集索引 聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣...
聚集索引和非聚集索引的特點
索引分類 按照維護與管理索引角度分為 唯一索引 復合索引和系統自動建立的索引 按照儲存方式分為 聚集與非聚集索引 1 聚集索引 表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高,索引占用硬碟 儲存空間小 1 左右 但對資料新增 修改 刪除的速度影響比較大 降低 特點 1 無索引,資料無序 2 ...