數(shù)據(jù)庫優(yōu)化的指導思路是首先寫出的SQL是優(yōu)化器喜歡的,然后在排除爛的SQL的情況下就是,找瓶頸,數(shù)據(jù)庫吞吐量上不去或者查詢慢都是因為某一瓶頸的存在,從非常大的粒度來看,瓶頸可以分為五類:io 內(nèi)存 CPU 網(wǎng)絡 鎖。
當卡在某一瓶頸時,其他的資源就會被閑置,解決瓶頸或者用非瓶頸的資源做trade off達到總和的最大才是優(yōu)化的正解,比如建索引就是以空間換時間的做法。
由于數(shù)據(jù)庫相對比較復雜,上下文有區(qū)別優(yōu)化思路也會不一樣,所以離開上下文談具體的優(yōu)化手段就是坑。
大部分開發(fā)人員會犯的錯誤是所謂的“錘子人”,也就是自己是錘子看什么都像釘子,比如覺得慢就說要分區(qū),覺得某種語句的寫法一定比另一種快而不考慮場景。
我們要做到不但會寫SQL,還要做到寫出性能優(yōu)良的SQL,以下為筆者學習、摘錄、并匯總部分資料與大家分享! (1) 選擇最有效率的表名順序(只在基于規(guī)則的優(yōu)化器中有效): ORACLE 的解析器按照從右到左的順序處理FROM子句中的表名,F(xiàn)ROM子句中寫在最后的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎表。
如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表. (2) WHERE子句中的連接順序.: ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的過程中, 會將'*' 依次轉(zhuǎn)換成所有的列名, 這個工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費更多的時間 (4) 減少訪問數(shù)據(jù)庫的次數(shù): ORACLE在內(nèi)部執(zhí)行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數(shù)據(jù)塊等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數(shù), 可以增加每次數(shù)據(jù)庫訪問的檢索數(shù)據(jù)量 ,建議值為200 (6) 使用DECODE函數(shù)來減少處理時間: 使用DECODE函數(shù)可以避免重復掃描相同記錄或重復連接相同的表. (7) 整合簡單,無關聯(lián)的數(shù)據(jù)庫訪問: 如果你有幾個簡單的數(shù)據(jù)庫查詢語句,你可以把它們整合到一個查詢中(即使它們之間沒有關系) (8) 刪除重復記錄: 最高效的刪除重復記錄方法 ( 因為使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); (9) 用TRUNCATE替代DELETE: 當刪除表中的記錄時,在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復的信息. 如果你沒有COMMIT事務,ORACLE會將數(shù)據(jù)恢復到刪除之前的狀態(tài)(準確地說是恢復到執(zhí)行刪除命令之前的狀況) 而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息.當命令運行后,數(shù)據(jù)不能被恢復.因此很少的資源被調(diào)用,執(zhí)行時間也會很短. (譯者按: TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML) (10) 盡量多使用COMMIT: 只要有可能,在程序中盡量多使用COMMIT, 這樣程序的性能得到提高,需求也會因為COMMIT所釋放的資源而減少: COMMIT所釋放的資源: a. 回滾段上用于恢復數(shù)據(jù)的信息. b. 被程序語句獲得的鎖 c. redo log buffer 中的空間 d. ORACLE為管理上述3種資源中的內(nèi)部花費 (11) 用Where子句替換HAVING子句: 避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷. (非oracle中)on、where、having這三個都可以加條件的子句中,on是最先執(zhí)行,where次之,having最后,因為on是先把不符合條件的記錄過濾后才進行統(tǒng)計,它就可以減少中間運算要處理的數(shù)據(jù),按理說應該速度是最快的,where也應該比having快點的,因為它過濾數(shù)據(jù)后才進行sum,在兩個表聯(lián)接時才用on的,所以在一個表的時候,就剩下where跟having比較了。在這單表查詢統(tǒng)計的情況下,如果要過濾的條件沒有涉及到要計算字段,那它們的結果是一樣的,只是where可以使用rushmore技術,而having就不能,在速度上后者要慢如果要涉及到計算的字段,就表示在沒計算之前,這個字段的值是不確定的,根據(jù)上篇寫的工作流程,where的作用時間是在計算之前就完成的,而having就是在計算后才起作用的,所以在這種情況下,兩者的結果會不同。
在多表聯(lián)接查詢時,on比where更早起作用。系統(tǒng)首先根據(jù)各個表之間的聯(lián)接條件,把多個表合成一個臨時表后,再由where進行過濾,然后再計算,計算完后再由having進行過濾。
由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什么時候起作用,然后再決定放在那里 (12) 減少對表的查詢: 在含有子查詢的SQL語句中,要特別注意減少對表的查詢.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) (13) 通過內(nèi)部函數(shù)提高SQL效率.: 復雜的SQL往往犧牲了執(zhí)行效率. 能夠掌握上面的運用函數(shù)解決問題的方法在實際工作中是非常有意義的 (14) 使用表的別名(Alias): 當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤. (15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 在許多基于基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯(lián)接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率. 在子查詢中,NOT IN子句將執(zhí)行一個內(nèi)部的排序和合并. 無論在哪種情況下,NOT IN都是最低效的 。
1、調(diào)整數(shù)據(jù)結構的設計。這一部分在開發(fā)信息系統(tǒng)之前完成,程序員需要考慮是否使用ORACLE數(shù)據(jù)庫的分區(qū)功能,對于經(jīng)常訪問的數(shù)據(jù)庫表是否需要建立索引等。
2、調(diào)整應用程序結構設計。這一部分也是在開發(fā)信息系統(tǒng)之前完成,程序員在這一步需要考慮應用程序使用什么樣的體系結構,是使用傳統(tǒng)的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的數(shù)據(jù)庫資源是不同的。
3、調(diào)整數(shù)據(jù)庫SQL語句。應用程序的執(zhí)行最終將歸結為數(shù)據(jù)庫中的SQL語句執(zhí)行,因此SQL語句的執(zhí)行效率最終決定了ORACLE數(shù)據(jù)庫的性能。ORACLE公司推薦使用ORACLE語句優(yōu)化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調(diào)整優(yōu)化SQL語句。
4、調(diào)整服務器內(nèi)存分配。內(nèi)存分配是在信息系統(tǒng)運行過程中優(yōu)化配置的,數(shù)據(jù)庫管理員可以根據(jù)數(shù)據(jù)庫運行狀況調(diào)整數(shù)據(jù)庫系統(tǒng)全局區(qū)(SGA區(qū))的數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)和共享池的大??;還可以調(diào)整程序全局區(qū)(PGA區(qū))的大小。需要注意的是,SGA區(qū)不是越大越好,SGA區(qū)過大會占用操作系統(tǒng)使用的內(nèi)存而引起虛擬內(nèi)存的頁面交換,這樣反而會降低系統(tǒng)。
5、調(diào)整硬盤I/O,這一步是在信息系統(tǒng)開發(fā)之前完成的。數(shù)據(jù)庫管理員可以將組成同一個表空間的數(shù)據(jù)文件放在不同的硬盤上,做到硬盤之間I/O負載均衡。
6、調(diào)整操作系統(tǒng)參數(shù),例如:運行在UNIX操作系統(tǒng)上的ORACLE數(shù)據(jù)庫,可以調(diào)整UNIX數(shù)據(jù)緩沖池的大小,每個進程所能使用的內(nèi)存大小等參數(shù)。
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結構來組織、存儲和管理數(shù)據(jù)的倉庫,它產(chǎn)生于距今六十多年前,隨著信息技術和市場的發(fā)展,特別是二十世紀九十年代以后,數(shù)據(jù)管理不再僅僅是存儲和管理數(shù)據(jù),而轉(zhuǎn)變成用戶所需要的各種數(shù)據(jù)管理的方式。數(shù)據(jù)庫有很多種類型,從最簡單的存儲有各種數(shù)據(jù)的表格到能夠進行海量數(shù)據(jù)存儲的大型數(shù)據(jù)庫系統(tǒng)都在各個方面得到了廣泛的應用。
在信息化社會,充分有效地管理和利用各類信息資源,是進行科學研究和決策管理的前提條件。數(shù)據(jù)庫技術是管理信息系統(tǒng)、辦公自動化系統(tǒng)、決策支持系統(tǒng)等各類信息系統(tǒng)的核心部分,是進行科學研究和決策管理的重要技術手段。
在經(jīng)濟管理的日常工作中,常常需要把某些相關的數(shù)據(jù)放進這樣的“倉庫”,并根據(jù)管理的需要進行相應的處理。
例如,企業(yè)或事業(yè)單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個數(shù)據(jù)庫。有了這個"數(shù)據(jù)倉庫"我們就可以根據(jù)需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內(nèi)的職工人數(shù)等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產(chǎn)管理中也需要建立眾多的這種"數(shù)據(jù)庫",使其可以利用計算機實現(xiàn)財務、倉庫、生產(chǎn)的自動化管理。
擴展資料
數(shù)據(jù)庫,簡單來說是本身可視為電子化的文件柜--存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進行新增、截取、更新、刪除等操作。
數(shù)據(jù)庫指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能小的冗余度的特點、是與應用程序彼此獨立的數(shù)據(jù)集合。
在經(jīng)濟管理的日常工作中,常常需要把某些相關的數(shù)據(jù)放進這樣的"倉庫",并根據(jù)管理的需要進行相應的處理。
例如,企業(yè)或事業(yè)單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個數(shù)據(jù)庫。有了這個"數(shù)據(jù)倉庫"我們就可以根據(jù)需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內(nèi)的職工人數(shù)等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產(chǎn)管理中也需要建立眾多的這種"數(shù)據(jù)庫",使其可以利用計算機實現(xiàn)財務、倉庫、生產(chǎn)的自動化管理。
參考資料:數(shù)據(jù)庫的百度百科
數(shù)據(jù)庫性能優(yōu)化有哪些措施
1、1、調(diào)整數(shù)據(jù)結構的設計。這一部分在開發(fā)信息系統(tǒng)之前完成,程序員需要考慮是否使用ORACLE數(shù)據(jù)庫的分區(qū)功能,對于經(jīng)常訪問的數(shù)據(jù)庫表是否需要建立索引等。
2、2、調(diào)整應用程序結構設計。這一部分也是在開發(fā)信息系統(tǒng)之前完成,程序員在這一步需要考慮應用程序使用什么樣的體系結構,是使用傳統(tǒng)的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的數(shù)據(jù)庫資源是不同的。
在數(shù)據(jù)庫應用系統(tǒng)中編寫可執(zhí)行的SQL語句可以有多種方式實現(xiàn),但哪一條是最佳方案卻難以確定。
為了解決這一問題,有必要對SQL實施優(yōu)化。簡單地說,SQL語句的優(yōu)化就是將性能低下的SQL語句轉(zhuǎn)換成達到同樣目的的性能更好的SQL語句。
優(yōu)化SQL語句的原因 數(shù)據(jù)庫系統(tǒng)的生命周期可以分成: 設計、開發(fā)和成品三個階段。在設計階段進行優(yōu)化的成本最低,收益最大。
在成品階段進行優(yōu)化的成本最高,收益最小。如果將一個數(shù)據(jù)庫系統(tǒng)比喻成一座樓房,在樓房建好后進行矯正往往成本很高而收效很?。ㄉ踔量赡芨緹o法矯正),而在樓房設計、生產(chǎn)階段控制好每塊磚瓦的質(zhì)量就能達到花費小而見效高的目的。
為了獲得最大效益,人們常需要對數(shù)據(jù)庫進行優(yōu)化。數(shù)據(jù)庫的優(yōu)化通??梢酝ㄟ^對網(wǎng)絡、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)和應用程序的優(yōu)化來進行。
根據(jù)統(tǒng)計,對網(wǎng)絡、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)進行優(yōu)化所獲得的性能提升全部加起來只占數(shù)據(jù)庫應用系統(tǒng)性能提升的40%左右,其余60%的系統(tǒng)性能提升全部來自對應用程序的優(yōu)化。許多優(yōu)化專家甚至認為對應用程序的優(yōu)化可以得到80%的系統(tǒng)性能提升。
因此可以肯定,通過優(yōu)化應用程序來對數(shù)據(jù)庫系統(tǒng)進行優(yōu)化能獲得更大的收益。 對應用程序的優(yōu)化通常可分為兩個方面: 源代碼的優(yōu)化和SQL語句的優(yōu)化。
由于涉及到對程序邏輯的改變,源代碼的優(yōu)化在時間成本和風險上代價很高(尤其是對正在使用中的系統(tǒng)進行優(yōu)化) 。另一方面,源代碼的優(yōu)化對數(shù)據(jù)庫系統(tǒng)性能的提升收效有限,因為應用程序?qū)?shù)據(jù)庫的操作最終要表現(xiàn)為SQL語句對數(shù)據(jù)庫的操作。
對SQL語句進行優(yōu)化有以下一些直接原因: 1. SQL語句是對數(shù)據(jù)庫(數(shù)據(jù)) 進行操作的惟一途徑,應用程序的執(zhí)行最終要歸結為SQL語句的執(zhí)行,SQL語句的效率對數(shù)據(jù)庫系統(tǒng)的性能起到了決定性的作用。 2. SQL語句消耗了70%~90%的數(shù)據(jù)庫資源。
3. SQL語句獨立于程序設計邏輯,對SQL語句進行優(yōu)化不會影響程序邏輯,相對于對程序源代碼的優(yōu)化,對SQL語句的優(yōu)化在時間成本和風險上的代價都很低。 4. SQL語句可以有不同的寫法,不同的寫法在性能上的差異可能很大。
5. SQL語句易學,難精通。SQL語句的性能往往同實際運行系統(tǒng)的數(shù)據(jù)庫結構、記錄數(shù)量等有關,不存在普遍適用的規(guī)律來提升性能。
傳統(tǒng)的優(yōu)化方法 SQL程序人員在傳統(tǒng)上采用手工重寫來對SQL語句進行優(yōu)化。這主要依靠DBA或資深程序員對SQL語句執(zhí)行計劃的分析,依靠經(jīng)驗,嘗試重寫SQL語句,然后對結果和性能進行比較以試圖找到性能較佳的SQL語句。
這種做法存在著以下不足: 1. 無法找出SQL語句的所有可能寫法。很可能花費了大量的時間也無法找到性能較佳的SQL語句。
即便找到了某個性能較佳的SQL語句也無法知道是否存在性能更好的寫法。 2. 非常依賴于人的經(jīng)驗,經(jīng)驗的多寡往往決定了優(yōu)化后SQL語句的性能。
3. 非常耗時間。重寫-->校驗正確性-->比較性能,這一循環(huán)過程需要大量的時間。
根據(jù)傳統(tǒng)的SQL優(yōu)化工具的功能,人們一般將優(yōu)化工具分為以下三代產(chǎn)品: 第一代的SQL優(yōu)化工具是執(zhí)行計劃分析工具。這類工具對輸入的SQL語句從數(shù)據(jù)庫提取執(zhí)行計劃,并解釋執(zhí)行計劃中關鍵字的含義。
第二代的SQL優(yōu)化工具只能提供增加索引的建議,它通過對輸入的SQL語句的執(zhí)行計劃的分析來產(chǎn)生是否要增加索引的建議。這類工具存在著致命的缺點——只分析了一條SQL語句就得出增加某個索引的結論,根本不理會(實際上也無法評估到)增加的索引對整體數(shù)據(jù)庫系統(tǒng)性能的影響。
第三代工具是利用人工智能實現(xiàn)自動SQL優(yōu)化。 人工智能自動SQL優(yōu)化 隨著人工智能技術的發(fā)展和在數(shù)據(jù)庫優(yōu)化領域應用的深入,在20世紀90年代末優(yōu)化技術取得了突破性的進展,出現(xiàn)了人工智能自動SQL優(yōu)化。
人工智能自動SQL優(yōu)化的本質(zhì)就是借助人工智能技術,自動對SQL語句進行重寫,找到性能最好的等效SQL語句。LECCO SQL Expert就采用了這種人工智能技術,其SQL Expert支持Oracle、Sybase、MS SQL Server和IBM DB2數(shù)據(jù)庫平臺。
其突出特點是自動優(yōu)化SQL語句。除此以外,還可以以人工智能知識庫“反饋式搜索引擎”來重寫SQL語句,并找出所有等效的SQL語句及可能的執(zhí)行計劃,通過測試運行為應用程序和數(shù)據(jù)庫自動找到性能最好的SQL語句,提供微秒級的計時; 能夠優(yōu)化Web應用程序和有大量用戶的在線事務處理中運行時間很短的SQL語句; 能通過比較源SQL和待選SQL的不同之處,為開發(fā)人員提供“邊做邊學式訓練”,迅速提高開發(fā)人員的SQL編程技能等等。
該工具針對數(shù)據(jù)庫應用的開發(fā)和維護階段提供了數(shù)個特別的模塊:SQL語法優(yōu)化器、PL/SQL集成化開發(fā)調(diào)試環(huán)境(IDE)、掃描器、數(shù)據(jù)庫監(jiān)視器等。其核心模塊之一“SQL 語法優(yōu)化器”的工作原理大致如下:輸入一條源SQL語句,“人工智能反饋式搜索引擎”對輸入的SQL語句結合檢測到的數(shù)據(jù)庫結構和索引進行重寫,產(chǎn)生N條等效的SQL語句輸出,產(chǎn)生的N條等效SQL語句再送入“人工智能反饋式搜索引擎”進行重寫,直至無法產(chǎn)生新的輸出或搜索限額滿,接下來對輸出的SQL語句進行過濾,選。
本文首先討論了基于第三范式的數(shù)據(jù)庫表的基本設計,著重論述了建立主鍵和索引的策略和方案,然后從數(shù)據(jù)庫表的擴展設計和庫表對象的放置等角度概述了數(shù)據(jù)庫管理系統(tǒng)的優(yōu)化方案。
關鍵詞: 優(yōu)化(Optimizing) 第三范式(3NF) 冗余數(shù)據(jù)(Redundant Data) 索引(Index) 數(shù)據(jù)分割(Data Partitioning) 對象放置(Object Placement) 1 引言 數(shù)據(jù)庫優(yōu)化的目標無非是避免磁盤I/O瓶頸、減少CPU利用率和減少資源競爭。為了便于讀者閱讀和理解,筆者參閱了Sybase、Informix和Oracle等大型數(shù)據(jù)庫系統(tǒng)參考資料,基于多年的工程實踐經(jīng)驗,從基本表設計、擴展設計和數(shù)據(jù)庫表對象放置等角度進行討論,著重討論了如何避免磁盤I/O瓶頸和減少資源競爭,相信讀者會一目了然。
2 基于第三范式的基本表設計 在基于表驅(qū)動的信息管理系統(tǒng)(MIS)中,基本表的設計規(guī)范是第三范式(3NF)。第三范式的基本特征是非主鍵屬性只依賴于主鍵屬性。
基于第三范式的數(shù)據(jù)庫表設計具有很多優(yōu)點:一是消除了冗余數(shù)據(jù),節(jié)省了磁盤存儲空間;二是有良好的數(shù)據(jù)完整性限制,即基于主外鍵的參照完整限制和基于主鍵的實體完整性限制,這使得數(shù)據(jù)容易維護,也容易移植和更新;三是數(shù)據(jù)的可逆性好,在做連接(Join)查詢或者合并表時不遺漏、也不重復;四是因消除了冗余數(shù)據(jù)(冗余列),在查詢(Select)時每個數(shù)據(jù)頁存的數(shù)據(jù)行就多,這樣就有效地減少了邏輯I/O,每個Cash存的頁面就多,也減少物理I/O;五是對大多數(shù)事務(Transaction)而言,運行性能好;六是物理設計(Physical Design)的機動性較大,能滿足日益增長的用戶需求。 在基本表設計中,表的主鍵、外鍵、索引設計占有非常重要的地位,但系統(tǒng)設計人員往往只注重于滿足用戶要求,而沒有從系統(tǒng)優(yōu)化的高度來認識和重視它們。
實際上,它們與系統(tǒng)的運行性能密切相關?,F(xiàn)在從系統(tǒng)數(shù)據(jù)庫優(yōu)化角度討論這些基本概念及其重要意義: (1)主鍵(Primary Key):主鍵被用于復雜的SQL語句時,頻繁地在數(shù)據(jù)訪問中被用到。
一個表只有一個主鍵。主鍵應該有固定值(不能為Null或缺省值,要有相對穩(wěn)定性),不含代碼信息,易訪問。
把常用(眾所周知)的列作為主鍵才有意義。短主鍵最佳(小于25bytes),主鍵的長短影響索引的大小,索引的大小影響索引頁的大小,從而影響磁盤I/O。
主鍵分為自然主鍵和人為主鍵。自然主鍵由實體的屬性構成,自然主鍵可以是復合性的,在形成復合主鍵時,主鍵列不能太多,復合主鍵使得Join*作復雜化、也增加了外鍵表的大小。
人為主鍵是,在沒有合適的自然屬性鍵、或自然屬性復雜或靈敏度高時,人為形成的。人為主鍵一般是整型值(滿足最小化要求),沒有實際意義,也略微增加了表的大??;但減少了把它作為外鍵的表的大小。
(2)外鍵(Foreign Key):外鍵的作用是建立關系型數(shù)據(jù)庫中表之間的關系(參照完整性),主鍵只能從獨立的實體遷移到非獨立的實體,成為后者的一個屬性,被稱為外鍵。 (3)索引(Index):利用索引優(yōu)化系統(tǒng)性能是顯而易見的,對所有常用于查詢中的Where子句的列和所有用于排序的列創(chuàng)建索引,可以避免整表掃描或訪問,在不改變表的物理結構的情況下,直接訪問特定的數(shù)據(jù)列,這樣減少數(shù)據(jù)存取時間;利用索引可以優(yōu)化或排除耗時的分類*作;把數(shù)據(jù)分散到不同的頁面上,就分散了插入的數(shù)據(jù);主鍵自動建立了唯一索引,因此唯一索引也能確保數(shù)據(jù)的唯一性(即實體完整性);索引碼越小,定位就越直接;新建的索引效能最好,因此定期更新索引非常必要。
索引也有代價:有空間開銷,建立它也要花費時間,在進行Insert、Delete和Update*作時,也有維護代價。索引有兩種:聚族索引和非聚族索引。
一個表只能有一個聚族索引,可有多個非聚族索引。使用聚族索引查詢數(shù)據(jù)要比使用非聚族索引快。
在建索引前,應利用數(shù)據(jù)庫系統(tǒng)函數(shù)估算索引的大小。 ① 聚族索引(Clustered Index):聚族索引的數(shù)據(jù)頁按物理有序儲存,占用空間小。
選擇策略是,被用于Where子句的列:包括范圍查詢、模糊查詢或高度重復的列(連續(xù)磁盤掃描);被用于連接Join*作的列;被用于Order by和Group by子句的列。聚族索引不利于插入*作,另外沒有必要用主鍵建聚族索引。
② 非聚族索引(Nonclustered Index):與聚族索引相比,占用空間大,而且效率低。選擇策略是,被用于Where子句的列:包括范圍查詢、模糊查詢(在沒有聚族索引時)、主鍵或外鍵列、點(指針類)或小范圍(返回的結果域小于整表數(shù)據(jù)的20%)查詢;被用于連接Join*作的列、主鍵列(范圍查詢);被用于Order by和Group by子句的列;需要被覆蓋的列。
對只讀表建多個非聚族索引有利。索引也有其弊端,一是創(chuàng)建索引要耗費時間,二是索引要占有大量磁盤空間,三是增加了維護代價(在修改帶索引的數(shù)據(jù)列時索引會減緩修改速度)。
那么,在哪種情況下不建索引呢?對于小表(數(shù)據(jù)小于5頁)、小到中表(不直接訪問單行數(shù)據(jù)或結果集不用排序)、單值域(返回值密集)、索引列值太長(大于20bitys)、容易變化的列、高度重復的列、Null值列,對沒有被用于Where子語句和Join查。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據(jù)《信息網(wǎng)絡傳播權保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:2.920秒