程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server與Oracle數據庫在查詢優化上的差異(一)

SQL Server與Oracle數據庫在查詢優化上的差異(一)

編輯:關於SqlServer

一般來說,Oracle數據庫在大型數據環境下,其運行性能比SQL Server數據庫效率要高。單從查詢優化上講,兩者就有比較大的差異。下面,筆者將數據庫查詢優化的差異做一個描述,若有不准確的地方,還請大家批評指教。

一、 在數據庫排序查詢優化上的差異。

在講解這個內容之前,為了讀者能夠清楚我講的內容,我要先談一個概念。命中率,它是指從內存中取得數據而不從磁盤中取得數據的比率。我們在前幾篇文章中都提到過,當在數據庫中查詢數據時,數據庫服務器都是先從內存中尋找數據。只有在內存中數據不存在的情況下,才會去讀取數據庫文件的內容。而且,從內存中查詢數據要比在數據庫文件中查詢數據效率高得多。從這方面講,我們若能夠提高這個查詢的命中率,則顯然可以提高數據庫系統的查詢效率。

雖然SQL Server與Oracle在這方面都有所作為,但是,筆者認為,Oracle數據庫在這方面的優勢比較明顯。特別是Oracle數據庫采用了臨時段的管理機制,明顯提高了數據庫查詢的命中率。

那什麼叫作數據庫的臨時段呢?假設當我們剛查完員工信息表後,此時,員工信息表的內容就存在數據庫服務器的內存中。此時,我們需要對這個表進行排序查詢,如我們希望查詢出工齡超過兩年的員工,並且按工齡的長短進行排序。此時,Oracle數據庫服務器會設法在內存中排序區對所有行進行排序。而這個排序區的大小則有數據庫的初始化文件init.ora進行確定。當這個排序區不夠大,不能夠容納我們所查詢出來的員工信息記錄數時,數據庫就會在排序操作期間,在數據庫服務器中開辟臨時段。很明顯,在查詢操作過程中,若開辟臨時段的話,會減低數據庫的命中率,降低排序查詢的效率。我們現在希望這個排序能夠在內存中完成,而不需要開辟額外的臨時段,如此的話,就可以消除向臨時段寫數據的開銷,提高排序查詢的效率。所以,當我們數據庫中的數據比較龐大時,我們可以考慮增加這個排序區的長度,以避免臨時段的需要。正是這個臨時段的問題,如我們剛查詢完員工信息表,查詢完成之後,再對該表進行排序查詢,就覺得好像仍然是新的查詢一樣。其實,這個排序查詢的問題,我們可以通過一定的方法對此進行優化,以提高排序查詢的效率。

修改方法:

第一步:先利用查詢語句判斷,是否有臨時段需求的產生。

select * from v$sysstat where name='dtmfg(disk)' or name='dtmfg(memory)';

如我們可以定時利用以上語句,來查詢是否有臨時段需求的產生。這條語句中,dtmfg是具體的數據庫實例名,我們只需要修改這個名字,就可以查詢到我們需要的內容。若在查詢結果中,發現有臨時段需求產生的話,則就需要考慮修改相關的配置文件,以優化排序查詢性能。

第二步:修改參數配置文件。

我們需要修改inint.ora文件,修改裡面的SORT-AREA-SIZE的值。不過,修改這個配置文件之後,還必須重新啟動數據庫才會生效。一般情況下,數據庫管理員需要定時查詢這個臨時段需求,然後根據情況,不斷的進行調整,做好數據排序查詢優化功能。

而在微軟的SQL Server數據庫中,筆者沒有發現類似的功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved