SQL優化非常有用的34條建議

2021-06-21 13:33:33 字數 3413 閱讀 4651

select tab_name from tables where (tab_name,db_ver) = ( select tab_name,db_ver from tab_columns where version = 604)

(13) 通過內部函式提高sql效率.:

複雜的sql往往犧牲了執行效率. 能夠掌握上面的運用函式解決問題的方法在實際工作中是非常有意義的

(14) 使用表的別名(alias):

當在sql語句中連線多個表時, 請使用表的別名並把別名字首於每個column上.這樣一來,就可以減少解析的時間並減少那些由column歧義引起的語法錯誤.

(15) 用exists替代in、用not exists替代not in:

在許多基於基礎表的查詢中,為了滿足乙個條件,往往需要對另乙個表進行聯接.在這種情況下, 使用exists(或not exists)通常將提高查詢的效率. 在子查詢中,not in子句將執行乙個內部的排序和合併. 無論在哪種情況下,not in都是最低效的 (因為它對子查詢中的表執行了乙個全表遍歷). 為了避免使用not in ,我們可以把它改寫成外連線(outer joins)或not exists.

例子:

(高效)select * from emp (基礎表) where empno > 0 and exists (select 『x' from dept where dept.deptno = emp.deptno and loc = 『melb') (低效)select * from emp (基礎表) where empno > 0 and deptno in(select deptno from dept where loc = 『melb')

(16) 識別'低效執行'的sql語句:

雖然目前各種關於sql優化的圖形化工具層出不窮,但是寫出自己的sql工具來解決問題始終是乙個最好的方法:

select executions , disk_reads, buffer_gets, round((buffer_gets-disk_reads)/buffer_gets,2) hit_radio, round(disk_reads/executions,2) reads_per_run, sql_text from v$sqlarea where executions>0 and buffer_gets > 0 and (buffer_gets-disk_reads)/buffer_gets < 0.8 order by 4 desc; (17) 用索引提高效率:

索引是表的乙個概念部分,用來提高檢索資料的效率,oracle使用了乙個複雜的自平衡b-tree結構. 通常,通過索引查詢資料比全表掃瞄要快. 當oracle找出執行查詢和update語句的最佳路徑時, oracle優化器將使用索引. 同樣在聯結多個表時使用索引也可以提高效率. 另乙個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證.。那些long或long raw資料型別, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當然,你也會發現, 在掃瞄小表時,使用索引同樣能提高效率. 雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價. 索引需要空間來儲存,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的insert , delete , update將為此多付出4 , 5 次的磁碟i/o . 因為索引需要額外的儲存空間和處理,那些不必要的索引反而會使查詢反應時間變慢.。定期的重構索引是有必要的.:

alter index rebuild

select tab_name from tables where (tab_name,db_ver) = ( select tab_name,db_ver from tab_columns where version = 604)

(13) 通過內部函式提高sql效率.:

複雜的sql往往犧牲了執行效率. 能夠掌握上面的運用函式解決問題的方法在實際工作中是非常有意義的

(14) 使用表的別名(alias):

當在sql語句中連線多個表時, 請使用表的別名並把別名字首於每個column上.這樣一來,就可以減少解析的時間並減少那些由column歧義引起的語法錯誤.

(15) 用exists替代in、用not exists替代not in:

在許多基於基礎表的查詢中,為了滿足乙個條件,往往需要對另乙個表進行聯接.在這種情況下, 使用exists(或not exists)通常將提高查詢的效率. 在子查詢中,not in子句將執行乙個內部的排序和合併. 無論在哪種情況下,not in都是最低效的 (因為它對子查詢中的表執行了乙個全表遍歷). 為了避免使用not in ,我們可以把它改寫成外連線(outer joins)或not exists.

例子:

(高效)select * from emp (基礎表) where empno > 0 and exists (select 『x' from dept where dept.deptno = emp.deptno and loc = 『melb') (低效)select * from emp (基礎表) where empno > 0 and deptno in(select deptno from dept where loc = 『melb')

(16) 識別'低效執行'的sql語句:

雖然目前各種關於sql優化的圖形化工具層出不窮,但是寫出自己的sql工具來解決問題始終是乙個最好的方法:

select executions , disk_reads, buffer_gets, round((buffer_gets-disk_reads)/buffer_gets,2) hit_radio, round(disk_reads/executions,2) reads_per_run, sql_text from v$sqlarea where executions>0 and buffer_gets > 0 and (buffer_gets-disk_reads)/buffer_gets < 0.8 order by 4 desc; (17) 用索引提高效率:

索引是表的乙個概念部分,用來提高檢索資料的效率,oracle使用了乙個複雜的自平衡b-tree結構. 通常,通過索引查詢資料比全表掃瞄要快. 當oracle找出執行查詢和update語句的最佳路徑時, oracle優化器將使用索引. 同樣在聯結多個表時使用索引也可以提高效率. 另乙個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證.。那些long或long raw資料型別, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當然,你也會發現, 在掃瞄小表時,使用索引同樣能提高效率. 雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價. 索引需要空間來儲存,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的insert , delete , update將為此多付出4 , 5 次的磁碟i/o . 因為索引需要額外的儲存空間和處理,那些不必要的索引反而會使查詢反應時間變慢.。定期的重構索引是有必要的.:

alter index rebuild

非常有用的CChineseCode類

class cchinesecode void cchinesecode utf 8tounicode wchar t pout,char ptext void cchinesecode unicodetoutf 8 char pout,wchar t ptext void cchinesecode...

別人的隨筆(非常有用)

1 xp系統修改許可權防止病毒或木馬等破壞系統,cmd下,cacls c windows system32 g hqw20 r 思是給hqw20這個使用者只能讀取system32目錄,但不能進行修改或寫入 恢復方法 c cacls c windows system32 g hqw20 f 2 用mi...

mysql的sql執行計畫詳解(非常有用)

引言 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃瞄表 怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千萬 億的時候,我們運 行同樣的...