優化sql 語句的幾種方式
1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num is null 可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:select id from t where num=03.應盡量避免在 where 子句中使用!=或操作符,否則將引擎放棄使用索引而進行全表掃描。4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num=10 or num=20 可以這樣查詢:select id from t where num=10 union all select id from t where num=* 和 not in 也要慎用,否則會導致全表掃描,如:select id from t where num in(1,2,3) 對于連續的數值,能用 between 就不要用 in 了:select id from t where num between 1 and 36.下面的查詢也將導致全表掃描:select id from t where name like '%abc%'7.應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。
如:select id from t where num/2=100 應改為:select id from t where num=100*28.應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:select id from t where substring(name,1,3)='abc'--name以abc開頭的id 應改為:select id from t where name like 'abc%'9.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
10.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。11.不要寫一些沒有意義的查詢,如需要生成一個空表結構:select col1,col2 into #t from t where 1=0 這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:create table #t(。
)12.很多時候用 exists 代替 in 是一個好的選擇:select num from a where num in(select num from b) 用下面的語句替換:select num from a where exists(select 1 from b where num=*)13.并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。14.索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。
一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。15.盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。
這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。16.盡可能的使用 varchar 代替 char ,因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。
17.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。18.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。
19.臨時表并不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對于一次性事件,最好使用導出表。
20.在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。21.如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。
22.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。23.使用基于游標的方法或臨時表方法之前,應先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。
24.與臨時表一樣,游標并不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。
在結果集中包括“合計”的例程通常要比使用游標執行的速度快。如果開發時間允許,基于游標的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。
25.盡量避免大事務操作,提高系統并發能力。26.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
sql語句的優化
由于SQL優化起來比較復雜,并且還會受環境限制,在開發過程中,寫SQL必須必須要遵循以下幾點的原則: *采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. 例如: (低效) SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = 'MANAGER' AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=*); (高效) SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=*) AND SAL > 50000 AND JOB = 'MANAGER'; *子句中避免使用'*' 當在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用 ‘*’ 是一個方便的方法.可是,這是一個非常低效的方法. 實際上,ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間. 3.使用表的別名(Alias) 當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤. 注:Column歧義指的是由于SQL中不同的表具有相同的Column名,當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬。
SQLServer數據庫查詢優化的常用方法是什么
SQL Server數據庫查詢優化的常用方法總結: 本文中,abigale代表查詢字符串,ada代表數據表名,alice代表字段名。
技巧一: 問題類型:ACCESS數據庫字段中含有日文片假名或其它不明字符時查詢會提示內存溢出。 解決方法:修改查詢語句 sql="select * from ada where alice like '%"&abigale&"%'" 改為 sql="select * from ada" rs。
filter = "alice like '%"&abigale&"%'" 技巧二: 問題類型:如何用簡易的辦法實現類似百度的多關鍵詞查詢(多關鍵詞用空格或其它符號間隔)。 解決方法: '//用空格分割查詢字符串 ck=split(abigale," ") '//得到分割后的數量 sck=UBound(ck) sql="select * ada where" 在一個字段中查詢 For i = 0 To sck SQL = SQL & tempJoinWord & "(" & _ "alice like '"&ck(i)&"%')" tempJoinWord = " and " Next 在二個字段中同時查詢 For i = 0 To sck SQL = SQL & tempJoinWord & "(" & _ "alice like '"&ck(i)&"%' or " & _ "alice1 like '"&ck(i)&"%')" tempJoinabigale = " and " Next。
請問SQL語句優化的策略都有哪些
● 創建表的時候。
應盡量建立主鍵,根據主鍵查詢數據;● 大數據表刪除,用truncate table代替delete。● 合理使用索引,在OLTP應用中一張表的索引不要太多。
組合索引的列順序盡量與查詢條件列順序保持一致;對于數據操作頻繁的表,索引需要定期重建,以減少失效的索引和碎片。● 查詢盡量用確定的列名,少用*號。
盡量少嵌套子查詢,這種查詢會消耗大量的CPU資源;對于有比較多or運算的查詢,建議分成多個查詢,用union all聯結起來;多表查詢的查詢語句中,選擇最有效率的表名順序(基于規則的優化器中有效)。Oracle解析器對表解析從右到左,所以記錄少的表放在右邊。
● 盡量多用commit語句提交事務,可以及時釋放資源、解鎖、釋放日志空間、減少管理花費;在頻繁的、性能要求比較高的數據操作中,盡量避免遠程訪問,如數據庫鏈等,訪問頻繁的表可以常駐內存:alter table。cache;。
怎樣優化SQL語句提高效率
我們要做到不但會寫SQL,還要做到寫出性能優良的SQL語句。
(1)選擇最有效率的表名順序(只在基于規則的優化器中有效): Oracle的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最后的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,您必須選擇記錄條數最少的表作為基礎表。 假如有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表。
(2)WHERE子句中的連接順序: Oracle采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些能夠過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。 (3)SELECT子句中避免使用‘*’: Oracle在解析的過程中, 會將‘*’依次轉換成任何的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間。
(4)減少訪問數據庫的次數: Oracle在內部執行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數據塊等。 (5)在SQL*Plus , SQL*Forms和Pro*C中重新配置ARRAYSIZE參數, 能夠增加每次數據庫訪問的檢索數據量 ,建議值為200。
(6)使用DECODE函數來減少處理時間: 使用DECODE函數能夠避免重復掃描相同記錄或重復連接相同的表。 (7)整合簡單,無關聯的數據庫訪問: 假如您有幾個簡單的數據庫查詢語句,您能夠把他們整合到一個查詢中(即使他們之間沒有關系)。
(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會將數據恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時, 回滾段不再存放任何可被恢復的信息。
當命令運行后,數據不能被恢復。因此很少的資源被調用,執行時間也會很短。
(TRUNCATE只在刪除全表適用,TRUNCATE是DDL不是DML)。 以上是我對于這個問題的解答,希望能夠幫到大家。