日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

优化SQL查询:如何写出高性能SQL语句

發布時間:2024/9/20 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优化SQL查询:如何写出高性能SQL语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

2、 統一SQL語句的寫法

對于以下兩句SQL語句,程序員認為是相同的,數據庫查詢優化器認為是不同的。?

select*from?dual? select*From?dual

3、 不要把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语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。