本文主要介紹數(shù)據(jù)庫百萬級數(shù)據(jù)優(yōu)化(千萬級數(shù)據(jù)庫優(yōu)化),下面一起看看數(shù)據(jù)庫百萬級數(shù)據(jù)優(yōu)化(千萬級數(shù)據(jù)庫優(yōu)化)相關(guān)資訊。
網(wǎng)上有很多關(guān)于sql優(yōu)化的教程,但是都很混亂。他們已經(jīng)安排好幾天了。把它們寫出來和大家分享。如有錯誤和不足,請指正。(1)選擇最有效的序列(表名只基于有效規(guī)則seo/target = ;_ blank optimizer):oracle解析器從右到左依次處理from子句中的表,寫在表末的from子句(基于表驅(qū)動的表)會先處理,from子句包含多個表,你必須選擇的記錄數(shù)是基表。如果有三個以上的表連接到query,需要選擇crosstab(交叉表)的下載地址作為基表,交叉表引用其他表引用的表。(2)在where子句中加入順序。:oracle序列分析的where子句是自下而上的。根據(jù)這個原則,表與表之間的連接必須寫在另一端的條件中,可以篩選出最大數(shù)量的記錄,必須寫在where子句中。(3)使用*避免選擇子句:在解析過程中,oracle將*轉(zhuǎn)換為所有名稱,這是通過查詢數(shù)據(jù)字典來完成的,這意味著需要更多的時間。(4)減少收購= _blank數(shù)據(jù)庫:oracle在內(nèi)部執(zhí)行很多任務(wù):解析sql語句、使用估算指標(biāo)、組合變量、讀取數(shù)據(jù)塊等。(5) sql,sql * form和arraysize參數(shù)配置,提高檢索數(shù)據(jù)量=每次獲取 _空白數(shù)據(jù)庫訪問。建議值為200。(6)使用解碼功能減少處理時間:使用解碼功能避免掃描同一條記錄或同一張表的重復(fù)操作。(7)變得簡單和不相關(guān) _blank =數(shù)據(jù)庫訪問:如果您有幾個簡單的get = _blank數(shù)據(jù)庫查詢語句,您可以將它們集成到一個查詢中(即使它們不相關(guān))。(8)刪除重復(fù)記錄:刪除重復(fù)記錄最有效的方法(因為數(shù)據(jù)使用):從e.rowid中的emp中刪除(從emp x中選擇min(x . rowid));(9)當(dāng)使用截斷代替刪除時,表中的記錄被刪除。正常情況下,回滾段(rollback segment)用于存儲可以恢復(fù)的信息。如果事務(wù)未提交,oracle會將數(shù)據(jù)刪除回返回前的狀態(tài)(準(zhǔn)確地說是在使用截斷條件之前恢復(fù)delete命令),并且沒有回滾段存儲來恢復(fù)任何信息。命令運(yùn)行時,數(shù)據(jù)無法恢復(fù)。調(diào)用的資源很少,執(zhí)行時間會很短。(如果截斷只是在一個滿表中,截斷不刪除,ddl dml) (10)盡可能使用提交:在程序中盡可能使用提交,這個程序的性能得到提升,因為需求會釋放提交資源,減少提交的釋放:用于恢復(fù)數(shù)據(jù)信息的資源。b是c重做鎖程序語句日志緩沖區(qū)d. oracle管理空間中三種資源的開銷。(11)將where子句中的子句替換為子句:避免使用子句with子句,只有在檢索到結(jié)果集中的所有記錄后才進(jìn)行篩選。這個過程需要排序和總運(yùn)算。如果where子句限制了記錄的數(shù)量,則可以減少開銷(非oracle)子句。是的,在那里,有三個條件可以添加,這是第一個實現(xiàn)的地方。最后,因為是第一個不過濾統(tǒng)計后只滿足條件的記錄,所以可以減少中間操作數(shù)進(jìn)行處理,據(jù)說速度最快?,F(xiàn)在它應(yīng)該比having速度快,因為過濾后的數(shù)據(jù)和是在兩個表連接時使用的,所以它與表相比有左側(cè)。在這個單表查詢統(tǒng)計中,如果沒有字段參與過濾條件的計算,結(jié)果也是一樣的,只是在可以使用rushmore技術(shù)的時候,而且后者并不慢。如果需要計算字段,就意味著之前沒有計算的字段的值是不確定的。根據(jù)編寫的程序,時間是在計算之前完成的,但是在計算之后才起作用,所以在這種情況下結(jié)果是不一樣的。在多表連接查詢中,比這里更早。首先,系統(tǒng)根據(jù)不同表之間的連接條件,先從多個表中形成一個臨時表,然后篩選通過的地方,再計算,再篩選通過。所以要想在過濾條件中起到正確的作用,首先要了解條件什么時候起作用,然后再決定放在那里。(12)減少查詢表:包含子查詢的sql語句,要特別注意減少表的查詢。select tab _ name from table(tab _ name,db_ver)= (select tab_name,tab_columns = 604 db_ver) (13)通過內(nèi)部函數(shù)提高sql效率。復(fù)雜的sql經(jīng)常犧牲執(zhí)行效率。掌握上述函數(shù)方法在實際工作中的應(yīng)用具有重要的現(xiàn)實意義。(14)使用表別名(aliases):在一條sql語句中連接多個表時,請使用表的別名,并在每一列上添加別名,這樣可以減少分析時間,減少列歧義導(dǎo)致的語法錯誤。(15)使用existenc:(高)select * from emp(基本類型)0和exist(select x ;from dept.deptno = emp.deptno和loc)。= company(select)from empno(select the department loc = ;公司和。;)(16) from empno(基表)0。雖然各種圖形工具sqlseo/target = endless ;_blank優(yōu)化,它永遠(yuǎn)是編寫sql工具解決問題的最佳。select execute,disk_reads,buffer_gets,circle((buffer _ gets-disk _ reads)/buffer _ gets,2)hit_radio,circle (disk_reads/execute,2)reads_per_run,在執(zhí)行0和buffer _ gets和(buffer _ gets-disk _ reads)0/buffer _ gets lt;0.8;(17)提高效率指數(shù)是一個概念,也是表的一部分。為了提高數(shù)據(jù)檢索的效率,oracle使用了復(fù)雜的自平衡樹結(jié)構(gòu)。一般來說,索引查詢數(shù)據(jù)比全表掃描快。當(dāng)oracle找到最佳路徑并且update語句執(zhí)行查詢時,oracle seo/target = ;_blank優(yōu)化程序?qū)⑹褂孟嗤乃饕?。在多表連接中使用索引也可以提高效率。另一個優(yōu)點(diǎn)是使用索引,它提供主鍵的唯一驗證。對于long或long基本數(shù)據(jù)類型,幾乎可以索引所有列。特殊索引通常在大型表中有效使用。當(dāng)然,你也會發(fā)現(xiàn),在小型掃描表中,使用索引也可以提高效率。雖然可以利用指數(shù)查詢效率,但是也要注意價格指數(shù)。它需要存儲空間和定期維護(hù)。每當(dāng)表、索引或列中的記錄被修改時,索引本身也會被修改。這意味著每條記錄的插入、刪除和更新都要比磁盤io多花費(fèi)4、5倍,因為索引需要存儲空間,多余的、不必要的索引會拖慢查詢響應(yīng)時間,所以需要定期重新配置索引。alterindexrebuild replace with existence(18):提交包含一對多表信息的查詢時(比如部門表和表),避免使用obvious。在select子句中,可以認(rèn)為存在替換,使得搜索更快,因為rdbms核心模塊滿足子查詢條件一次,立即返回結(jié)果。例:(低):選擇不同的dept_no,dept_name從屬于d,emp在d.dept_no = e.dept_no _ no(效率高):有很多優(yōu)點(diǎn)。(19)server/target = ;_blank是大寫的,因為oracle總是解析server/target = ;_ blank優(yōu)先,并將小寫字母轉(zhuǎn)換為大寫字母。(20)減少java代碼連接器的數(shù)量連接字符串的使用!(21)避免使用索引列。通常,我們應(yīng)該避免使用索引列。對索引列上的函數(shù)沒有相同的影響。當(dāng)oracle不滿意時,它將停止使用索引來執(zhí)行全表掃描。(22)避免使用computed.where子句來索引列。如果索引列是函數(shù),部分,seo/target = ;_blank優(yōu)化器將不使用索引,而使用全表掃描。比如:效率低:選擇..* 12個25000個部門;高效率:從… 25000 12中選擇;(23)效率高:select * =而不是emp at deptno = 4 from emp at low:選擇表3的區(qū)別在于,前者dbms會直接跳轉(zhuǎn)到第一條等于4的記錄,后者會查找表3中第一條已掃描超過3條記錄的記錄。(24)通常用replace或merge(用于索引列)替換where子句中的or,用union效果會更好。使用或?qū)?dǎo)致對索引列進(jìn)行全表掃描。請注意,上述規(guī)則僅對多個索引列有效。如果該列沒有索引,查詢效率可能會因為你別無選擇,只能減少或。在下面的示例中,loc_id和region基于高索引。loc_desc,地區(qū):select loc_id,from location loc _ id alliance select = 10 loc _ id,loc_desc,from location area =墨爾本select area: loc_id,loc_desc,location or area of low area loc _ id = 10 =墨爾本。如果堅持使用,至少需要寫回索引列的記錄。(25)通過替換or來記憶規(guī)則是一種簡單的方法,和測試、oracle8i數(shù)據(jù)庫的實際實現(xiàn)效果,以及執(zhí)行路徑好像是一樣的。低效率:從地點(diǎn)的選擇...…loc_id = 10或loc_id = 20或loc_id = 30,請高效選擇...從loc _ in (10,20,30)的位置;(26)避免使用空列索引,索引中的空值可以避免使用任何空列,oracle將無法使用該索引。對于單個索引,如果列包含空值,則記錄沒有索引。對于復(fù)合索引,如果每一列都為空,則該索引也有記錄。如果至少有一列不為空,則索引中的記錄。例如,如果唯一索引基于表的a列和b列,并且表中有一個值為b (123,null)的記錄,則oracle不會接受(插入)b(123,null)記錄的相同值a。但是,如果索引列都是空的,oracle會認(rèn)為鍵是空的,空的就不是空的。因此,您可以使用插入1000個文件鍵值相同的記錄,當(dāng)然是空的!該值在索引列中不存在,因此在where子句中與索引列的null值進(jìn)行比較會導(dǎo)致oracle禁用該索引。無效:(索引失敗)select…from dept _ code;生效:(指標(biāo)生效)部門在dept_code = 0中選擇;(27)第一列總是使用索引:如果索引基于多列,并且只在其第一列(第一列)的where子句中被引用,則seo/target = ;_blank優(yōu)化程序?qū)⑦x擇使用索引。這是一個簡單而重要的規(guī)則。當(dāng)引用索引中只有兩列時,seo/target = ;_blank optimizer使用全表和union-all掃描并忽略的索引(28)替換union(如果可能):當(dāng)sql語句需要聯(lián)合兩個查詢結(jié)果集時,兩組結(jié)果將合并union-all,然后在最終輸出結(jié)果中進(jìn)行排名。如果用共同所有權(quán)代替共同所有權(quán),那么這是不必要的。所以它的分類效率會提高。注意,聯(lián)合所有者將在同一個記錄集中重復(fù)輸出兩個結(jié)果。因此,您應(yīng)該從業(yè)務(wù)需求出發(fā),分析使用聯(lián)合的可行性。聯(lián)盟將對結(jié)果進(jìn)行排序,排序結(jié)果將用于sort_area_size內(nèi)存。這對于seo/target = ;_內(nèi)存優(yōu)化后空白??梢杂胹ql查詢消費(fèi)排名。低效率:選擇賬戶數(shù)量,從借方交易中選擇acct數(shù)量余額數(shù)量,交易日期= 95年12月31日 聯(lián)盟,并選擇聯(lián)盟。高效率:選擇acct_num,從debit_transactions中選擇balanc:表包含以下各列:dept_code pk不為空,dept_desc dept_type為空且無效:(不使用索引)select dept _ type dept _ code efficiency:(使用索引)select dept_type of dept_code (30)避免更改索引列的類型。在比較不同數(shù)據(jù)類型的數(shù)據(jù)時,oracle會自動對列執(zhí)行簡單的類型轉(zhuǎn)換。假設(shè)empno是一個數(shù)字類型的索引列。select…from where empmpempno = 123 is。事實上,經(jīng)過oracle類型轉(zhuǎn)換后,該語句轉(zhuǎn)換為:select…from emp in empno = to _ number( ;123).幸運(yùn)的是,索引列上沒有類型轉(zhuǎn)換,索引的使用也沒有改變?,F(xiàn)在,假設(shè)emp_type是字符類型的索引列。select … from emp at emp_type = 123。此語句從oracle轉(zhuǎn)換為:select…from emp where to _ number(emp _ type)= 123。由于轉(zhuǎn)換后的本地類型,索引將不會被用來避免oracle的類型!sql的隱式轉(zhuǎn)換,最好使用顯式類型轉(zhuǎn)換性能。請注意,在比較字符和值時,oracle將優(yōu)先考慮字符類型的數(shù)字轉(zhuǎn)換。(31) to where子句:注意,select語句中的where子句不使用某些索引。這里有一些例子。在下面的例子中,(1)!=不使用索引。記住,索引只能告訴你表中有什么,但它可以 i don’我不會告訴你表中沒有的內(nèi)容。(2)是| | 連接功能。像其他字符一樣禁用索引。(3)它是一個數(shù)學(xué)函數(shù)。就像其他禁用索引的數(shù)學(xué)函數(shù)一樣。(4)相同的索引列不能相互比較,這將啟用完整的表掃描。(32) a .如果記錄的數(shù)量超過30%,數(shù)據(jù)檢索表的數(shù)量。使用索引并不會顯著提高b的效率,在某些情況下,使用索引可能會比全表掃描慢很多,但這是同一個數(shù)量級的差別。一般來說,防止使用索引時間幾次甚至上千次比使用全表掃描要好得多!(33)避免使用消耗資源的操作:clear、joint、減號、交集和sql序列語句會啟動sql引擎進(jìn)行資源密集型排序(sorting)。區(qū)分需要排序操作,而其他的至少需要執(zhí)行兩次排序。通常情況下,使用并集、減號和sql的cross語句還可以有其他用法。如果你重寫= _blank數(shù)據(jù)庫部署sort_area_size并使用并集減法和交集,可以考慮一下,畢竟它們是可讀的(34)seo/goal = ;_blank優(yōu)化組:提高報表組效率。它可以過濾掉組中沒有的記錄。;以前不需要。以下兩個查詢返回相同的結(jié)果,但是第二個查詢顯然更快。無效率:從emp集團(tuán)選擇工作,avg (sal)有效率:從工作或工作或經(jīng)理或經(jīng)理(avg)中選擇工作。
了解更多數(shù)據(jù)庫百萬級數(shù)據(jù)優(yōu)化(千萬級數(shù)據(jù)庫優(yōu)化)相關(guān)內(nèi)容請關(guān)注本站點(diǎn)。