久久精品国产91精品亚洲_欧美日韩性视频在线_欧美私人啪啪vps_亚洲精品乱码久久久久久按摩观_99热这里只有精品8_黑丝一区二区三区_国产美女精品免费电影_亚洲图片在线观看_久久不见久久见免费视频1_亚洲欧美在线免费观看_欧美一区二区私人影院日本_国产精品美女视频网站_一区二区三区精品国产_亚洲美女免费精品视频在线观看_国产午夜精品久久_久久国产精品久久久久久久久久

 
您現在的位置:首頁 ? 知識庫 ? 系統集成 ? 數據庫維護 數據庫維護
優化SQL查詢:如何寫出高性能SQL語句
發布日期:2018-04-03

執行計劃是數據庫根據SQL語句和相關表的統計信息作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如果用來從一個 10萬條記錄的表中查1條記錄,那查詢優化器會選擇“索引查找”方式,如果該表進行了歸檔,當前只剩下5000條記錄了,那查詢優化器就會改變方案,采用 “全表掃描”方式。

1、 首先要搞明白什么叫執行計劃?

執行計劃是數據庫根據SQL語句和相關表的統計信息作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如果用來從一個 10萬條記錄的表中查1條記錄,那查詢優化器會選擇“索引查找”方式,如果該表進行了歸檔,當前只剩下5000條記錄了,那查詢優化器就會改變方案,采用 “全表掃描”方式。

可見,執行計劃并不是固定的,它是“個性化的”。產生一個正確的“執行計劃”有兩點很重要:

(1) SQL語句是否清晰地告訴查詢優化器它想干什么?

(2) 查詢優化器得到的數據庫統計信息是否是最新的、正確的?

2、 統一SQL語句的寫法

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

select*from dual

select*From dual

其實就是大小寫不同,查詢分析器就認為是兩句不同的SQL語句,必須進行兩次解析。生成2個執行計劃。所以作為程序員,應該保證相同的查詢語句在任何地方都一致,多一個空格都不行!

3、 不要把SQL語句寫得太復雜

我經常看到,從數據庫中捕捉到的一條SQL語句打印出來有2張A4紙這么長。一般來說這么復雜的語句通常都是有問題的。我拿著這2頁長的SQL語句去請教原作者,結果他說時間太長,他一時也看不懂了??上攵?,連原作者都有可能看糊涂的SQL語句,數據庫也一樣會看糊涂。

一般,將一個Select語句的結果作為子集,然后從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。因為它被繞暈了。像這種類似人工智能的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證數據庫也會暈的。

另外,執行計劃是可以被重用的,越簡單的SQL語句被重用的可能性越高。而復雜的SQL語句只要有一個字符發生變化就必須重新解析,然后再把這一大堆垃圾塞在內存里??上攵瑪祿斓男蕰蔚鹊拖?。

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

6、 綁定變量窺測

事物都存在兩面性,綁定變量對大多數OLTP處理是適用的,但是也有例外。比如在where條件中的字段是“傾斜字段”的時候。

“傾斜字段”指該列中的絕大多數的值都是相同的,比如一張人口調查表,其中“民族”這列,90%以上都是漢族。那么如果一個SQL語句要查詢30歲的漢族人口有多少,那“民族”這列必然要被放在where條件中。這個時候如果采用綁定變量@nation會存在很大問題。

試想如果@nation傳入的第一個值是“漢族”,那整個執行計劃必然會選擇表掃描。然后,第二個值傳入的是“布依族”,按理說“布依族”占的比例可能只有萬分之一,應該采用索引查找。但是,由于重用了第一次解析的“漢族”的那個執行計劃,那么第二次也將采用表掃描方式。這個問題就是著名的“綁定變量窺測”,建議對于“傾斜字段”不要采用綁定變量。

7、 只在必要的情況下才使用begin tran

SQL Server中一句SQL語句默認就是一個事務,在該語句執行完成后也是默認commit的。其實,這就是begin tran的一個最小化的形式,好比在每句語句開頭隱含了一個begin tran,結束時隱含了一個commit。

有些情況下,我們需要顯式聲明begin tran,比如做“插、刪、改”操作需要同時修改幾個表,要求要么幾個表都修改成功,要么都不成功。begin tran 可以起到這樣的作用,它可以把若干SQL語句套在一起執行,最后再一起commit。好處是保證了數據的一致性,但任何事情都不是完美無缺的。Begin tran付出的代價是在提交之前,所有SQL語句鎖住的資源都不能釋放,直到commit掉。

可見,如果Begin tran套住的SQL語句太多,那數據庫的性能就糟糕了。在該大事務提交之前,必然會阻塞別的語句,造成block很多。

Begin tran使用的原則是,在保證數據一致性的前提下,begin tran 套住的SQL語句越少越好!有些情況下可以采用觸發器同步數據,不一定要用begin tran。

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 。

9、 聚集索引沒有建在表的順序字段上,該表容易發生頁分裂

比如訂單表,有訂單編號orderid,也有客戶編號contactid,那么聚集索引應該加在哪個字段上呢?對于該表,訂單編號是順序添加的,如果在orderid上加聚集索引,新增的行都是添加在末尾,這樣不容易經常產生頁分裂。然而,由于大多數查詢都是根據客戶編號來查的,因此,將聚集索引加在contactid上才有意義。而contactid對于訂單表而言,并非順序字段。

比如“張三”的“contactid”是001,那么“張三”的訂單信息必須都放在這張表的第一個數據頁上,如果今天“張三”新下了一個訂單,那該訂單信息不能放在表的最后一頁,而是第一頁!如果第一頁放滿了呢?很抱歉,該表所有數據都要往后移動為這條記錄騰地方。

SQL Server的索引和Oracle的索引是不同的,SQL Server的聚集索引實際上是對表按照聚集索引字段的順序進行了排序,相當于oracle的索引組織表。SQL Server的聚集索引就是表本身的一種組織形式,所以它的效率是非常高的。也正因為此,插入一條記錄,它的位置不是隨便放的,而是要按照順序放在該放的數據頁,如果那個數據頁沒有空間了,就引起了頁分裂。所以很顯然,聚集索引沒有建在表的順序字段上,該表容易發生頁分裂。

曾經碰到過一個情況,一位哥們的某張表重建索引后,插入的效率大幅下降了。估計情況大概是這樣的。該表的聚集索引可能沒有建在表的順序字段上,該表經常被歸檔,所以該表的數據是以一種稀疏狀態存在的。比如張三下過20張訂單,而最近3個月的訂單只有5張,歸檔策略是保留3個月數據,那么張三過去的 15張訂單已經被歸檔,留下15個空位,可以在insert發生時重新被利用。在這種情況下由于有空位可以利用,就不會發生頁分裂。但是查詢性能會比較低,因為查詢時必須掃描那些沒有數據的空位。

重建聚集索引后情況改變了,因為重建聚集索引就是把表中的數據重新排列一遍,原來的空位沒有了,而頁的填充率又很高,插入數據經常要發生頁分裂,所以性能大幅下降。

對于聚集索引沒有建在順序字段上的表,是否要給與比較低的頁填充率?是否要避免重建聚集索引?是一個值得考慮的問題!

10、加nolock后查詢經常發生頁分裂的表,容易產生跳讀或重復讀

加nolock后可以在“插、刪、改”的同時進行查詢,但是由于同時發生“插、刪、改”,在某些情況下,一旦該數據頁滿了,那么頁分裂不可避免,而此時nolock的查詢正在發生,比如在第100頁已經讀過的記錄,可能會因為頁分裂而分到第101頁,這有可能使得nolock查詢在讀101頁時重復讀到該條數據,產生“重復讀”。同理,如果在100頁上的數據還沒被讀到就分到99頁去了,那nolock查詢有可能會漏過該記錄,產生“跳讀”。

上面提到的哥們,在加了nolock后一些操作出現報錯,估計有可能因為nolock查詢產生了重復讀,2條相同的記錄去插入別的表,當然會發生主鍵沖突。

11、使用like進行模糊查詢時應注意

有的時候會需要進行一些模糊查詢比如

select*from contact where username like ‘%yue%’

關鍵詞%yue%,由于yue前面用到了“%”,因此該查詢必然走全表掃描,除非必要,否則不要在關鍵詞前加%,

12、數據類型的隱式轉換對查詢效率的影響

sql server2000的數據庫,我們的程序在提交sql語句的時候,沒有使用強類型提交這個字段的值,由sql server 2000自動轉換數據類型,會導致傳入的參數與主鍵字段類型不一致,這個時候sql server 2000可能就會使用全表掃描。Sql2005上沒有發現這種問題,但是還是應該注意一下。

13、SQL Server 表連接的三種方式

(1) Merge Join

(2) Nested Loop Join

(3) Hash Join

SQL Server 2000只有一種join方式——Nested Loop Join,如果A結果集較小,那就默認作為外表,A中每條記錄都要去B中掃描一遍,實際掃過的行數相當于A結果集行數x B結果集行數。所以如果兩個結果集都很大,那Join的結果很糟糕。

SQL Server 2005新增了Merge Join,如果A表和B表的連接字段正好是聚集索引所在字段,那么表的順序已經排好,只要兩邊拼上去就行了,這種join的開銷相當于A表的結果集行數加上B表的結果集行數,一個是加,一個是乘,可見merge join 的效果要比Nested Loop Join好多了。

如果連接的字段上沒有索引,那SQL2000的效率是相當低的,而SQL2005提供了Hash join,相當于臨時給A,B表的結果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我認為,這是一個重要的原因。

總結一下,在表連接時要注意以下幾點:

(1) 連接字段盡量選擇聚集索引所在的字段

(2) 仔細考慮where條件,盡量減小A、B表的結果集

(3) 如果很多join的連接字段都缺少索引,而你還在用SQL Server 2000,趕緊升級吧。

  • 1.公司登記注冊于2003年1月27日,清遠市桑達電子網絡媒體有限公司
    2.公司2006年起成為清遠市政府定點協議供貨商,電子采購供貨商
    3.公司2007年被清遠市相關政府部門評為安防行業狀元
    4.公司2007年起成為長城電腦清遠如意服務站(SP368)
    5.公司2007年承建清遠市橫河路口電子警察工程,開創清遠電子警察先河。
  • 6.公司2007年起成為IBM合作伙伴、公司2010年底成為金蝶軟件清遠金牌代理(伙伴編號:30030013)
    7.公司組團隊參加南方都市報組織的創富評選,獲廣東80強。公司申請多項軟件著作權、專利權
    8.2016年起公司成為粵東西北地區為數不多的雙軟企業,確立“讓軟件驅動世界,讓智能改變生活!"企業理想
    9.2016-01-29更名為廣東互動電子網絡媒體有限公司
    10.2021-01-13更名為廣東互動電子有限公司
  • 投資合作咨詢熱線電話:0763-3391888 3323588
  • 做一個負責任的百年企業! 天行健,君子以自強不息;地勢坤,君子以厚德載物;
    為用戶創造價值! 讓軟件驅動世界; 讓智能改變生活; 超越顧客期望,幫助顧客成功;
    對客戶負責,對員工負責,對企業命運負責!幫助支持公司的客戶成功;幫助忠誠于公司的員工成功!
  • 聯系電話:0763-3391888 3323588 3318977
    服務熱線:18023314222 QQ:529623964
  • 工作QQ:2501204690 商務QQ: 602045550
    投資及業務投訴QQ: 529623964
    微信:小米哥 微信號:qysed3391888
    騰訊微博:桑達網絡-基石與起點
  • E-MAIL:222#QYSED.CN ok3391888#163.com (請用@替換#)
在線客服
  • 系統集成咨詢
    點擊這里給我發消息
  • 網站\微信\軟件咨詢
    點擊這里給我發消息
  • 售后服務
    點擊這里給我發消息
  • 投資合作
    點擊這里給我發消息
久久精品国产91精品亚洲_欧美日韩性视频在线_欧美私人啪啪vps_亚洲精品乱码久久久久久按摩观_99热这里只有精品8_黑丝一区二区三区_国产美女精品免费电影_亚洲图片在线观看_久久不见久久见免费视频1_亚洲欧美在线免费观看_欧美一区二区私人影院日本_国产精品美女视频网站_一区二区三区精品国产_亚洲美女免费精品视频在线观看_国产午夜精品久久_久久国产精品久久久久久久久久
久久激情五月婷婷| 99热这里只有成人精品国产| 久久精品中文字幕一区| 一区二区久久久久| 在线观看日韩精品| 国产一区二区黄色| 欧美在线网站| 欧美成人四级电影| 国产精品国产馆在线真实露脸| 欧美激情影音先锋| 欧美高清一区| 久久综合九色九九| 美女视频黄a大片欧美| 欧美一级大片在线观看| 国产九九视频一区二区三区| 欧美成人午夜激情在线| 鲁大师成人一区二区三区| 国产一区二区三区电影在线观看| 中日韩视频在线观看| 国产日本欧美视频| 欧美日韩蜜桃| 亚洲伦理在线| 亚洲欧美日本视频在线观看| 久久综合久色欧美综合狠狠| 国产精品实拍| 亚洲国产精品一区二区www在线| 极品日韩av| 国产九色精品成人porny| 亚洲精品一区在线观看香蕉| 国产午夜一区二区三区| 国产日韩精品视频一区二区三区| 国产精品入口日韩视频大尺度| 国内精品伊人久久久久av影院| 欧美精品三级日韩久久| 一区二区欧美在线| 欧美日本三级| 亚洲精品一区二区三区99| 久久伊人一区二区| 欧美日韩成人在线视频| 亚洲欧美国产日韩中文字幕| 尤物yw午夜国产精品视频明星| 国产欧美一区二区三区久久人妖| 久久精品99久久香蕉国产色戒| 欧美成年网站| 久久国产精品一区二区三区四区| 麻豆精品国产91久久久久久| 午夜精品一区二区三区在线播放| 国产精品日韩欧美一区二区| 国产午夜精品久久久久久免费视| 欧美精品一区二区三区很污很色的| 亚洲精品免费看| 欧美精品久久久久久久| 一区二区三区欧美亚洲| 一区二区三区在线视频播放| 国产一区二区日韩| 国产人成精品一区二区三| 欧美激情亚洲综合一区| 久久成人免费| 99在线观看免费视频精品观看| 亚洲电影观看| 极品日韩av| 欧美精品日韩综合在线| 日韩午夜av| 国产综合色一区二区三区| 欧美福利电影网| 欧美激情精品久久久久久变态| 久久久久久夜精品精品免费| 亚洲网站在线| 国产一区二区精品久久99| 欧美午夜久久久| 欧美精品v日韩精品v韩国精品v| 欧美日韩综合不卡| 国产精品视频99| 欧美日韩视频在线| 99www免费人成精品| 欧美日本一区二区三区| 国产精品久久久久7777婷婷| 美女视频黄a大片欧美| 久久久夜色精品亚洲| 亚洲成人直播| 欧美一区二区三区在线免费观看| 欧美成人一二三| 欧美日韩国产综合网| 欧美成人性网| 国产欧美日韩亚洲| 国产精品一区二区视频| 久久成人免费电影| 麻豆成人精品| 香蕉av777xxx色综合一区| 欧美国产激情| 久久精品在线观看| 欧美日韩成人综合天天影院| 日韩系列欧美系列| 在线电影欧美日韩一区二区私密| 羞羞视频在线观看欧美| 宅男66日本亚洲欧美视频| 亚洲自拍偷拍麻豆| 国产精品igao视频网网址不卡日韩| 国产日韩欧美不卡| 亚洲一区不卡| 国产精品入口66mio| 亚洲人成网站精品片在线观看| 日韩视频在线一区二区| 国内精品久久国产| 国产日韩一区在线| 国产伦精品一区二区三区视频黑人| 亚洲视频一二| 欧美一区二区三区视频免费播放| 国产精品美女xx| 性欧美xxxx大乳国产app| 欧美日产国产成人免费图片| 亚洲高清视频在线| 久久精彩免费视频| 午夜激情久久久| 欧美激情在线有限公司| 国产伦精品一区二区三区视频黑人| 欧美一区二区三区免费大片| 欧美视频一区二区三区四区| 欧美成人在线免费观看| 亚洲精品日韩激情在线电影| 国产精品日韩精品欧美在线| 男女av一区三区二区色多| 久久蜜桃精品| 欧美视频在线播放| 欧美午夜不卡| 欧美午夜三级| 亚洲福利小视频| 亚洲视频免费在线观看| 国产欧美韩国高清| 欧美一区二区三区四区在线观看地址| 久久久爽爽爽美女图片| 亚洲性线免费观看视频成熟| 欧美一区二区在线看| 国产精品成人一区| 国产真实久久| 欧美国产亚洲另类动漫| 国产一区二区三区不卡在线观看| 蜜桃av久久久亚洲精品| 欧美四级伦理在线| 久久久久久日产精品| 黄色一区二区三区| 国产伦精品一区二区三区免费| 国产精品爱久久久久久久| 亚洲欧美一区二区三区在线| 伊人精品成人久久综合软件| 亚洲高清免费| 国产精品视频yy9299一区| 欧美体内she精视频在线观看| 国产女同一区二区| 欧美中文字幕在线视频| 蜜臀久久99精品久久久画质超高清| 亚洲精品精选| 欧美日韩亚洲国产一区| 在线亚洲欧美专区二区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美中文字幕久久| 一区二区三区免费网站| 牛人盗摄一区二区三区视频| 亚洲第一福利在线观看| 亚洲欧美日韩综合一区| 99热精品在线观看| 国产丝袜美腿一区二区三区| 激情视频一区二区三区| 久久精品免视看|