一、SQLServer與Analysis Services排序規則的差異。
通常情況下數據庫管理員可以分別為數據庫引擎和Analysis Services分別設置排序規則。如在SQLServer2008服務器中,數據庫引擎支持兩組排序規則,分別為Windows排序規則與SQLServer服務器排序規則。默認情況下,如果在英文環境下部署SQLServre數據庫服務器的話,則其采用的是SQLServer排序規則。而如果采用其他版本的數據庫系統,如在中文環境下部署中文版本的數據庫系統,則這個排序規則就采用的是Windows排序規則,即由數據庫服務器操作系統的區域設置來決定具體的排序規則。而對於Analysis Services服務來說,其支持一組排序規則,即Windows排序規則。雖然說,數據庫管理員在數據庫安裝過程中,可以為這兩個服務器配置不同的排序規則。如SQLServer采用SQLServer排序規則,而Analysis Services采用Windows排序規則。這在技術上是允許的。但是這會造成一些不利的後果。由於兩者的排序規則不同,那麼最後顯示的結果很有可能因為排序規則的不同,而導致顯示內容的不同。為此在規劃數據庫應用的時候,如果需要同時安裝這個兩個應用服務,那麼筆者的建議是在安裝SQLServer數據庫時,為這個兩個服務設置相同的排序規則。由於Analysis Services只支持Windows排序規則,為此兩者都需要同時采用Windows排序規則。以確保數據庫引擎與Analysis Services之間顯示結果的一致性。
需要強調的是,這是一個柔性的規則。即即使同時部署這兩個應用服務,而他們采用不同的排序規則,在技術上來說是不會遇到問題的。主要是看用戶能否接受兩個服務顯示結構的不一致。如果可以接受的話,那麼就不需要遵守這個規則,可以從性能或者其他方面來綜合考慮所采用的排序規則。但是如果不可以接受的話,那麼就需要嚴格遵守這一規則,即為兩個服務都配置Windows排序規則。
二、決定排序規則的一些參考。
在符合上面這個基本的原則後,數據庫管理員就需要結合用戶的需求與數據庫性能方面的要求,來綜合考慮,最後決定需要采用的排序規則。這具有一定的難度,不過下面的這些規則數據庫管理員可以拿來參考。
參考規則一:能用二進制排序規則最好使用二進制排序規則。
二進制排序規則由於其處理簡單,為此如果采用二進制排序規則的話,可以在很大程度上提升數據庫的性能。特別是如果數據庫中本身就是以二進制的形式來存儲數據,那麼在利用二進制規則來排序的時候,相對來說,要比其他的排序規則速度更加的快。而且其也不怎麼會受到語言的影響。所以,在數據庫部署中,能夠使用二進制排序規則,就盡量使用二進制排序規則。或者說,這是數據庫管理員首選的選擇。除非這個二進制排序規則與用戶的需求相矛盾,或者跟其他需求有難以調和的沖突時,才采用其他的排序規則。特別是對於數據庫性能有比較高的要求時,這個二進制是一個首要的選擇。
但是並不是說在任何情況下采用二進制都會起到不錯的效果。如在數據庫中,既有二進制存儲的數據,又有其他格式存儲的數據。如字符型的數據,在SQLServer數據庫中分為nchar(二進制格式的數據)與char(ANSI格式的字符數據)兩種。如果采用二進制排序規則,對這兩種不同類型的數據采用的是不同的處理規則。為此即使兩張表中的記錄完全相同,但是其采用的字符格式不同,其最後的結果也有可能會不同。所以在遇到這種情況時,數據庫管理員要麼想方設法統一字符集,以達到統一排序結果的目的。要麼數據庫管理員就需要向用戶確認,是否允許這個不同排序結果的存在。如果允許的話,那麼采用二進制排序規則沒有問題。但是如果不允許的話,那麼之能夠放棄采用二進制排序規則,而需要采用SQLServer等其他的排序規則。
參考規則二:適合采用Windows排序規則的情況。
一般滿足以上三個條件的任何一個條件的情況下,適合采用Windows排序規則。
一是文章一開頭提到的那個基本原則。即在數據庫部署中同時存在Analysis Services與數據庫引擎(數據庫引擎是必須的,而Analysis Services是可選的),同時又不允許他們排序結果不一致的情況存在。此時最好能夠采用Windows排序規則。原因很簡單,因為Analysis Services只支持Windows排序規則,為了確保排序結果的一致性,也需要將數據庫引擎的排序結果設置為Windows排序規則。
二是在數據庫中同時存在nchar/nvarchar(二進制格式的數據)與char/varchar(ANSI格式的數據)的情況下,而且在應用程序中可能需要混合使用他們。在這種情況下最好采用Windwos排序規則,以便在各個數據類型之間進行一致的比較。如果采用二進制排序規則或者SQLServer排序規則,由於他們對這些不同的數據類型比較時會采用不同的機制,為此往往會有不同的排序結果。在遇到這種混合使用的情況,最好采用的是Windows排序規則,以統一最後的排序結果。
三是在應用程序中只使用char/varchar數據類型,並且在應用程序的SQL語句中,很少使用Like操作符號時,可以考慮采用Windows排序規則。此時可以在最大程度上消除排序結果的不同。
在考慮是否需要采用Windows排序規則的時候,只需要對以上的三條規則對號入座即可。如果可以對號入座的,那麼就采用這個Windows排序規則。如果不能夠對號入座的,那就考慮采用其他的排序規則。
參考規則三:適合采用SQLServer排序規則的情況。
在什麼情況下比較適用SQLServer排序規則呢?或許這個問題回答起來,婆說婆有理,公說公有理。很難有一個統一的答案。筆者認為,采用SQLServer排序規則,即有利,也有弊。數據庫管理員需要在這個利與弊之間旬的一個均衡點,以平衡各方面的需求。
之所以考慮采用SQLServer排序規則,筆者認為最大的好處就是可以提高LIKE等操作符的執行性能。也就是說,如果在查詢語句中使用了Like等類似的關鍵字,而且同時使用了Order BY排序子句時,如果采用SQLServer排序規則的話,那麼性能會比其他排序規則要高。而且滿足條件的記錄越多,這個排序效果會越好。所以,在數據庫設計中需要用到比較多的Like操作符,而且數據庫管理員又需要提升數據庫性能的時候,那麼就需要考慮是否需要采用這個SQLServer排序規則。注意如果在Where語句中使用了這個Like操作符,而且這個操作符所涉及到的字段設置了索引,其查詢效果並不會因為有了這個索引而提高多少。也就是說,Like等類似的操作符與索引之間的配合,並不能夠起到1+1大於2的效果,有時候甚至會起到反面效果。此時,如果更改這個排序規則,反而可以起到索引不能夠起到的效果。
不過采用SQLServer排序規則也有很多的缺陷。最大的缺陷就是數據庫的排序規則與操作系統或者其他應用程序的排序結果不一致。如現在數據庫中采用的是SQLServer排序規則,對某張表進行了排序。然後將這張表導入導了Excel表格中,並對其按相同的規則進行重新排序。此時兩張表記錄的顯示順序可能是不同的。這主要要是因為區域設置的不同而造成的。如果采用SQLServer排序規則的話,這種情況無法避免。除非企業中所有的電腦、數據庫系統都采用英文環境,並且配置相同的區域設置。為此,只有用戶可以允許數據庫系統與操作系統或者其他應用程序排序結果的不一致性的情況下,可以使用這個SQLServer排序規則。或者說,數據庫管理員不關系Windows排序規則中的語言比較語義的情況下,同時又存在不較多的Like操作符時,可以考慮采用SQLServer排序規則。
在以上的分析中可以看出,在考慮采用什麼樣的排序規則時,主要考慮的是兩個方面的因素,一是排序的結果,二是服務器的性能。也就是說,用戶是選擇在數據庫服務器與其它應用程序之間排序結果的一致性,還是選擇提升服務器的性能。數據據管理員確認完這個問題之後,那麼就可以做出符合用戶需求的判斷了。