优化SQL查询:如何写出高性能SQL语句
2019獨角獸企業重金招聘Python工程師標準>>>
2、 統一SQL語句的寫法
對于以下兩句SQL語句,程序員認為是相同的,數據庫查詢優化器認為是不同的。?
select*from?dual? select*From?dual3、 不要把SQL語句寫得太復雜
我經??吹?#xff0c;從數據庫中捕捉到的一條SQL語句打印出來有2張A4紙這么長。一般來說這么復雜的語句通常都是有問題的。我拿著這2頁長的SQL語句去請教原作者,結果他說時間太長,他一時也看不懂了??上攵?#xff0c;連原作者都有可能看糊涂的SQL語句,數據庫也一樣會看糊涂。
一般,將一個Select語句的結果作為子集,然后從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。因為它被繞暈了。像這種類似人工智能的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證數據庫也會暈的。
另外,執行計劃是可以被重用的,越簡單的SQL語句被重用的可能性越高。而復雜的SQL語句只要有一個字符發生變化就必須重新解析,然后再把這一大堆垃圾塞在內存里??上攵?#xff0c;數據庫的效率會何等低下。
4、 使用“臨時表”暫存中間結果
簡化SQL語句的重要方法就是采用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,后面的查詢就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了并發性能。
5、 OLTP系統SQL語句必須采用綁定變量?
select*from?orderheader?where?changetime?>'2010-10-20?00:00:01'? select*from?orderheader?where?changetime?>'2010-09-22?00:00:01'以上兩句語句,查詢優化器認為是不同的SQL語句,需要解析兩次。如果采用綁定變量
select*from?orderheader?where?changetime?>@chgtime@chgtime變量可以傳入任何值,這樣大量的類似查詢可以重用該執行計劃了,這可以大大降低數據庫解析SQL語句的負擔。一次解析,多次重用,是提高數據庫效率的原則。
8、 一些SQL查詢語句應加上nolock
在SQL語句中加nolock是提高SQL Server并發性能的重要手段,在oracle中并不需要這樣做,因為oracle的結構更為合理,有undo表空間保存“數據前影”,該數據如果在修改中還未commit,那么你讀到的是它修改之前的副本,該副本放在undo表空間中。這樣,oracle的讀、寫可以做到互不影響,這也是oracle 廣受稱贊的地方。SQL Server 的讀、寫是會相互阻塞的,為了提高并發性能,對于一些查詢,可以加上nolock,這樣讀的時候可以允許寫,但缺點是可能讀到未提交的臟數據。使用 nolock有3條原則。
(1) ? ?查詢的結果用于“插、刪、改”的不能加nolock !
(2) ? ?查詢的表屬于頻繁發生頁分裂的,慎用nolock !
(3) ? ?使用臨時表一樣可以保存“數據前影”,起到類似oracle的undo表空間的功能,
能采用臨時表提高并發性能的,不要用nolock 。
轉載于:https://my.oschina.net/u/2308739/blog/523335
總結
以上是生活随笔為你收集整理的优化SQL查询:如何写出高性能SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 5131 Song Jiang#
- 下一篇: Corosync+Pacemaker+D