亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

SQL Server與Oracle數據庫在查詢優化上的差異二
2008-08-13   IT專家網

     四、在SQL語句上的查詢優化。

  前臺的應用程序要在數據庫服務器上起作用,最終靠的都是應用程序中的一條條SQL語句。據不完全統計,SQL語句消耗了數據庫服務器80%左右的資源。所以,如何提高SQL語句的執行效率,是在數據庫查詢優化中必須要考慮的一個問題。

  但是,在實際工作中,許多程序員有個誤區,他們認為數據庫查詢優化不是他們的事情,而應該是數據庫管理系統的任務,這是很多程序員的一個錯誤認識。他們錯誤地認為,他們所開發的應用程序的性能,跟他們所編寫的SQL語句關系不大。一個好的查詢語句往往可以使得應用程序的性能提高數十倍,而且,隨著記錄量的增加,這個效果還會以幾何級數上升。

  另外,SQL語句是獨立于程序設計邏輯的,也就是說,無論你的業務邏輯是怎么設計的,最后分解成SQL語句,就是那么幾個語法,所以,相對于應用程序源代碼的優化,SQL查詢語句的優化在時間與風險上,都要低許多。

  對于SQL語句的優化,Oracle數據庫與SQL Server數據庫有類似的地方,也有一些差異。下面筆者就這兩者的差異與共同點做一個綜合介紹。

  1、 通過索引來提高SQL語句的執行效率。

  一般來說,對于一些經常需要查詢的表,如產品信息表,我們可以通過建立外鍵來提高查詢效率。但是,也不是說每個字段都要指定為外鍵。對于一些沒有指定外鍵的字段,我們可以為其建立索引,來提高數據表的查詢效率。

  一般情況,在以下幾種情況下,我們可以為表建立索引來提高SQL語句的執行效率。

  一是對于一些經常需要查詢的表,我們出于某種考慮,沒有設置外鍵,而是通過設置索引來提高對于表的查詢效率。在數據庫表中,外鍵的設置往往受到一些限制;而相對于外鍵來說,索引的限制則要小得多。所以,在一些不使用外鍵的情況下,我們可以采用索引來提高對于表的查詢效率。

  二是在需要頻繁進行排序或者分組的表上,建立索引,可以極大地提高查詢效率。如ERP系統在設計的時候,可能需要頻繁地查詢采購訂單明細,而且,這份報表是需要根據采購訂單的號碼進行排序。如此的話,在數據庫設計的時候,就可以把采購訂單的號碼設置為索引,在每次運行采購訂單明細作業的時候,前臺ERP程序的性能就會高許多。而有時候,可能需要按供應商來統計當天的進貨金額,此時,最好能夠在進貨明細表中,給供應商字段添加索引,這對于提高當天進貨匯總表作業的運行效率,會有非常大的幫助。總之,在分組查詢或者排序查詢的表上,設置索引對于提高應用程序的整體性能,具有不可忽視的作用。

  三是如果待排序的列有多個,則需要在這些列上建立復合索引。如前臺應用程序在生成當天的進貨明細表時,需要按供應商、采購訂單號、產品編號進行排序。此時,也就是說,在生成進貨明細表這份報表時,要按這三個字段進行排序。遇到這種情況時,對這些字段建立復合索引,提高查詢效率,是一個不錯的選擇。

  以上這些SQL語句優化,Oracle數據庫與SQL Server數據庫都可以實現。雖然具體的實現語句可能稍有區別,但都是換湯不換藥,沒有本質區別。

  2、 把索引與數據文件存放在不同的磁盤中。

  當索引或者數據庫文件比較龐大時,把他們放在同一個磁盤中會加大輸入輸出等競爭,從而抵消了索引的作用。為了解決過多的索引導致輸入輸出效率降低的問題,在數據庫設計的時候,最好把索引跟用戶的表空間建立在不同的磁盤中。如把數據庫的表空間建立在一塊硬盤中,而把索引建立在另外一塊硬盤中。如此的話,就可以明顯地降低輸入輸出競爭。也就是說,這樣設計,隨著索引的增加,不會導致輸入輸出效率的低下。

  不過,根據筆者的了解,索引與數據文件存放在不同的磁盤中,現在好像只有Oracle 數據庫可以做到,而微軟的SQL Server數據庫則無法實現這一點。

  這也許根他們的定位不同。甲骨文的數據庫系統是針對大型的數據庫應用而設計,所以,對于查詢的效率要求更加高。

  3、 合理利用群集索引來提高SQL語句的執行效率。

  在一些特殊情況下,我們需要用到群集索引。如在ERP系統中,采購部門經常需要按月來查詢采購訂單明細。如需要查詢2008年8月份的采購訂單明細,而且這份報表需要按照供應商、采購訂單號碼、產品品號、交貨期等進行排序,有時候還需要對供應商進行匯總。這一份簡單的報表,用到了范圍查詢、多個字段記錄排序、記錄匯總等技術。此時,若能夠建立群集索引的話,對于提高這份報表的查詢效率,具有非常明顯的效果,特別是在數據記錄比較多的情況下,效果特別明顯。

  所謂的群集索引與非群集索引的區別,主要是在于數據存放記錄上的差異。若我們采用群集索引的話,在存放記錄的時候,會按群集索引指定的規則存放。如對于采購訂單中的供應商ID字段采用群集索引,則在存放記錄的時候,會把相同的供應商存放在一起。如此的話,在查詢的時候,效率就會高得多。而若沒有采用群集索引的話,則記錄保存時就是按記錄保存的先后順序來進行記錄的存儲。

  在建立群集索引的時候,Oracle 數據庫有一個,就是必須在數據庫表建立的時候,數據還沒導入之前就建立群集索引。也就是說,若數據庫表中有記錄的話,則無法建立群集索引,這一點我們需要引起注意。

  同時,若給某個表中的字段建立了群集索引,在記錄保存時,為了能夠按照群集索引所指定的規則存儲數據,需要對數據表中的記錄進行一些調整,以符合原有的規則,如此的話,就會讓數據庫進行一些額外的動作,從而影響數據庫的性能。如在建立某個供應商的采購記錄時,為了把相同供應商的記錄保存在一起(如我們把供應商ID設置為群集索引),就需要調整原有的記錄存儲結構。雖然在保存的時候,犧牲一點效率,但是,這對于后續數據查詢,效率就會高許多。所以,對于群集索引的話,要讓其取得比較高的效果,有一個應用前提,就是這個表中的數據要是經常查詢的。如在ERP系統中,有一個庫存歷史交易報表,這個查詢就會經常用到,而且,在查詢的過程中,都需要用到范圍查詢、排序、匯總等功能。所以,用在庫存歷史交易等數據庫表中,則效果會好得多。

  若利用一句話來區分群集索引與非群集索引的區別,那就是群集索引“更新慢,查詢難快”。

  在實際應用中,如果利用SQL Server設計數據庫系統的過程中,很少用到群集索引技術(根據筆者的了解)。而在Oracle數據庫系統中,則應用的相對比較廣泛一點。

  不過,兩個數據庫在群集索引上都有一個共同點,就是要利用索引的話,必須在數據表建立的時候,就要設置群集索引。當數據庫中有記錄的話,是不能建立群集索引的。

  說起區別,具體的實現語法有點差異,但是沒有什么本質的區別。另外,對于甲骨文的數據庫來說,可以把群集索引跟數據庫文件存放在不同的磁盤中,從而提高輸入輸出效率。但是,微軟的SQL Server數據庫則不行。

  4、 使用Oracle數據庫自帶的優化器優化SQL語句。

  在Oracle數據庫中,自帶了一個SQL語句的優化工具,Oracle語句優化器。利用這個工具,可以提高SQL語句的執行效率。

  一方面,Oracle數據庫語句優化器是跟行鎖管理工具一起使用的,兩者往往需要配合使用,才能夠起到意想不到的作用。另一方面,對于“扶不起的阿斗”,Oracle語句優化器也無能為力。也就是說,對于一些實在寫得很糟糕的SQL語句,語句優化器對其也沒有絲毫辦法;只有對一些本來就比較合理的SQL語句,語句優化器與行鎖管理工具,才能夠在這個基礎之上,再找到一些可以改善的地方,然后提出可行的改善意見。

  具體來說,語句優化器,一方面確定SQL語句的最小代價執行計劃,同時,確定數據的訪問路徑,如是否采用索引或者表掃描;采用合理的表連接方式以及順序;判斷索引不可使用時是否需要進行排序等等。綜合以上因素,然后給我們提出一個改善的建議。

  在實際工作中,語句優化器可以給我們找出一個SQL語句優化過程中的盲點。而這個工具是微軟SQL Server數據庫所缺乏的,或者跟甲骨文的數據庫比起來,有差距的地方。

熱詞搜索:

上一篇:SQL Server與Oracle數據庫在查詢優化上的差異一
下一篇:面面俱到 數據中心網絡規劃要點

分享到: 收藏