優化SQL查詢:如何寫出高性能SQL語句

二、 統一SQL語句的寫法html

對於如下兩句SQL語句,程序員認爲是相同的,數據庫查詢優化器認爲是不一樣的。 程序員

select*from dual 
select*From dual

三、 不要把SQL語句寫得太複雜sql

我常常看到,從數據庫中捕捉到的一條SQL語句打印出來有2張A4紙這麼長。通常來講這麼複雜的語句一般都是有問題的。我拿着這2頁長的SQL語句去請教原做者,結果他說時間太長,他一時也看不懂了。可想而知,連原做者都有可能看糊塗的SQL語句,數據庫也同樣會看糊塗。數據庫

通常,將一個Select語句的結果做爲子集,而後從該子集中再進行查詢,這種一層嵌套語句仍是比較常見的,可是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。由於它被繞暈了。像這種相似人工智能的東西,終究比人的分辨力要差些,若是人都看暈了,我能夠保證數據庫也會暈的。併發

另外,執行計劃是能夠被重用的,越簡單的SQL語句被重用的可能性越高。而複雜的SQL語句只要有一個字符發生變化就必須從新解析,而後再把這一大堆垃圾塞在內存裏。可想而知,數據庫的效率會何等低下。oracle

四、 使用「臨時表」暫存中間結果高併發

簡化SQL語句的重要方法就是採用臨時表暫存中間結果,可是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這能夠避免程序中屢次掃描主表,也大大減小了程序執行中「共享鎖」阻塞「更新鎖」,減小了阻塞,提升了併發性能。性能

五、 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語句的負擔。一次解析,屢次重用,是提升數據庫效率的原則。

八、 一些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 。

相關文章
相關標籤/搜索