亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

sql語句的優化分析

2024-07-21 02:50:19
字體:
來源:轉載
供稿:網友
sql語句的優化分析開門見山,問題所在

sql語句性能達不到你的要求,執行效率讓你忍無可忍,一般會時下面幾種情況。

  • 網速不給力,不穩定。
  • 服務器內存不夠,或者SQL 被分配的內存不夠。
  • sql語句設計不合理
  • 沒有相應的索引,索引不合理
  • 沒有有效的索引視圖
  • 表數據過大沒有有效的分區設計
  • 數據庫設計太2,存在大量的數據冗余
  • 索引列上缺少相應的統計信息,或者統計信息過期
  • ....

那么我們如何給找出來導致性能慢的的原因呢?

  • 首先你要知道是否跟sql語句有關,確保不是機器開不開機,服務器硬件配置太差,沒網你說p啊
  • 接著你使用我上一篇文章中提到的2柯南sql性能檢測工具--sql server PRofiler,分析出sql慢的相關語句,就是執行時間過長,占用系統資源,cpu過多的
  • 然后是這篇文章要說的,sql優化方法跟技巧,避免一些不合理的sql語句,取暫優sql
  • 再然后判斷是否使用啦,合理的統計信息。sql server中可以自動統計表中的數據分布信息,定時根據數據情況,更新統計信息,是很有必要的
  • 確認表中使用啦合理的索引,這個索引我前面博客中也有提過,不過那篇博客之后,還要進一步對索引寫篇文章
  • 數據太多的表,要分區,縮小查找范圍
分析比較執行時間計劃讀取情況
select * from dbo.Product

執行上面語句一般情況下只給你返回結果和執行行數,那么你怎么分析呢,怎么知道你優化之后跟沒有優化的區別呢。

下面給你說幾種方法。

1.查看執行時間和cpu占用時間

set statistics time onselect * from dbo.Productset statistics time off

打開你查詢之后的消息里面就能看到啦。

2.查看查詢對I/0的操作情況

set statistics io onselect * from dbo.Productset statistics io off

執行之后

掃描計數:索引或表掃描次數

邏輯讀?。簲祿彺嬷凶x取的頁數

物理讀?。簭拇疟P中讀取的頁數

預讀:查詢過程中,從磁盤放入緩存的頁數

lob邏輯讀取:從數據緩存中讀取,image,text,ntext或大型數據的頁數

lob物理讀取:從磁盤中讀取,image,text,ntext或大型數據的頁數

lob預讀:查詢過程中,從磁盤放入緩存的image,text,ntext或大型數據的頁數

如果物理讀取次數和預讀次說比較多,可以使用索引進行優化。

如果你不想使用sql語句命令來查看這些內容,方法也是有的,哥教你更簡單的。

查詢--->>查詢選項--->>高級

被紅圈套上的2個選上,去掉sql語句中的set statistics io/time on/off 試試效果。哦也,你成功啦。。

3.查看執行計劃

選中查詢語句,點擊然后看消息里面,會出現下面的圖例

首先我這個例子的語句太過簡單,你整個復雜的,包涵啊。

分析:鼠標放在圖標上會顯示此步驟執行的詳細內容,每個表下面都顯示一個開銷百分比,分析站百分比多的的一塊,可以根據重新設計數據結構,或這重寫sql語句,來對此進行優化。如果存在掃描表,或者掃描聚集索引,這表示在當前查詢中你的索引是不合適的,是沒有起到作用的,那么你就要修改完善優化你的索引,具體怎么做,你可以根據我上一篇文章中的sql優化利器--數據庫引擎優化顧問對索引進行分析優化。

select查詢藝術

1.保證不查詢多余的列與行。

  • 盡量避免select * 的存在,使用具體的列代替*,避免多余的列
  • 使用where限定具體要查詢的數據,避免多余的行
  • 使用top,distinct關鍵字減少多余重復的行

2.慎用distinct關鍵字

distinct在查詢一個字段或者很少字段的情況下使用,會避免重復數據的出現,給查詢帶來優化效果。

但是查詢字段很多的情況下使用,則會大大降低查詢效率。

由這個圖,分析下:

很明顯帶distinct的語句cpu時間和占用時間都高于不帶distinct的語句。原因是當查詢很多字段時,如果使用distinct,數據庫引擎就會對數據進行比較,過濾掉重復數據,然而這個比較,過濾的過程則會毫不客氣的占用系統資源,cpu時間。

3.慎用union關鍵字

此關鍵字主要功能是把各個查詢語句的結果集合并到一個結果集中返回給你。用法

<select 語句1>union<select 語句2>union<select 語句3>...

滿足union的語句必須滿足:1.列數相同。 2.對應列數的數據類型要保持兼容。

執行過程:

依次執行select語句-->>合并結果集--->>對結果集進行排序,過濾重復記錄。

select * from (( orde o  left join orderproduct op on o.orderNum=op.orderNum )inner join product p on op.proNum=p.productnum)  where p.id<10000unionselect * from (( orde o  left join orderproduct op on o.orderNum=op.orderNum )inner join product p on op.proNum=p.productnum)  where p.id<20000 and p.id>=10000unionselect * from (( orde o  left join orderproduct op on o.orderNum=op.orderNum )inner join product p on op.proNum=p.productnum)  where p.id>20000   ---這里可以寫p.id>100 結果一樣,因為他篩選過啦----------------------------------對比上下兩個語句-----------------------------------------select * from (( orde o  left join orderproduct op on o.orderNum=op.orderNum )inner join product p on op.proNum=p.productnum) 

由此可見效率確實低,所以不是在必要情況下避免使用。其實有他執行的第三部:對結果集進行排序,過濾重復記錄。就能看出不是什么好鳥。然而不對結果集排序過濾,顯然效率是比union高的,那么不排序過濾的關鍵字有嗎?答,有,他是union all,使用union all能對union進行一定的優化。。

4.判斷表中是否存在數據

select count(*) from product select top(1) id from product

很顯然下面完勝

5.連接查詢的優化

首先你要弄明白你想要的數據是什么樣子的,然后再做出決定使用哪一種連接,這很重要。

各種連接的取值大小為:

  • 內連接結果集大小取決于左右表滿足條件的數量
  • 左連接取決與左表大小,右相反。
  • 完全連接和交叉連接取決與左右兩個表的數據總數量
select * from ( (select * from orde where OrderId>10000) o  left join orderproduct op on o.orderNum=op.orderNum )select * from ( orde o left join orderproduct op on o.orderNum=op.orderNum ) where o.OrderId>10000

由此可見減少連接表的數據數量可以提高效率。

insert插入優化
--創建臨時表create table #tb1( id int, name nvarchar(30), createTime datetime)declare @i intdeclare @sql varchar(1000)set @i=0while (@i<100000)  --循環插入10w條數據begin  set @i=@i+1  set @sql=' insert into #tb1 values('+convert(varchar(10),@i)+',''erzi'+convert(nvarchar(30),@i)+''','''+convert(nvarchar(30),getdate())+''')'  exec(@sql)end

我這里運行時間是51秒

--創建臨時表create table #tb2( id int, name nvarchar(30), createTime datetime)declare @i intdeclare @sql varchar(8000)declare @j intset @i=0while (@i<10000)  --循環插入10w條數據begin  set @j=0 set @sql=' insert into #tb2 select '+convert(varchar(10),@i*100+@j)+',''erzi'+convert(nvarchar(30),@i*100+@j)+''','''+convert(varchar(50),getdate())+'''' set @i=@i+1 while(@j<10) begin      set @sql=@sql+' union all select '+convert(varchar(10),@i*100+@j)+',''erzi'+convert(nvarchar(30),@i*100+@j)+''','''+convert(varchar(50),getdate())+''''   set @j=@j+1 end  exec(@sql)enddrop table #tb2select count(1) from #tb2

我這里運行時間大概是20秒

分析說明:insert into select批量插入,明顯提升效率。所以以后盡量避免一個個循環插入。

優化修改刪除語句

如果你同時修改或刪除過多數據,會造成cpu利用率過高從而影響別人對數據庫的訪問。

如果你刪除或修改過多數據,采用單一循環操作,那么會是效率很低,也就是操作時間過程會很漫長。

這樣你該怎么做呢?

折中的辦法就是,分批操作數據。

delete product where id<1000delete product where id>=1000 and id<2000delete product where id>=2000 and id<3000.....

當然這樣的優化方式不一定是最優的選擇,其實這三種方式都是可以的,這要根據你系統的訪問熱度來定奪,關鍵你要明白什么樣的語句是什么樣的效果。

總結:優化,最重要的是在于你平時設計語句,數據庫的習慣,方式。如果你平時不在意,匯總到一塊再做優化,你就需要耐心的分析,然而分析的過程就看你的悟性,需求,知識水平啦。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频在线观看免费| 日韩一区二区福利| 国产丝袜高跟一区| 亚洲美女在线观看| 欧美极品在线视频| 国产亚洲欧美aaaa| 欧洲s码亚洲m码精品一区| 91美女片黄在线观看游戏| 欧美激情亚洲另类| 高清欧美性猛交| 国产成人综合精品在线| 欧日韩不卡在线视频| 日日狠狠久久偷偷四色综合免费| 亚洲a级在线播放观看| 亚洲日韩中文字幕在线播放| 国产视频久久久久久久| 国产剧情久久久久久| 欧美激情视频免费观看| 精品视频—区二区三区免费| 亚洲男女性事视频| 国产精品一区二区久久久| 久久久精品在线| 色av中文字幕一区| 久久综合网hezyo| 热门国产精品亚洲第一区在线| 国产亚洲精品va在线观看| 国产精品视频999| 国产一区欧美二区三区| 亚洲精品久久久久久久久久久久| 国产视频亚洲视频| 中文字幕av日韩| 欧美另类老女人| 51精品在线观看| 午夜精品久久久久久久白皮肤| 欧美多人爱爱视频网站| 成人激情黄色网| 欧美亚洲另类制服自拍| 久久精品成人一区二区三区| 日韩精品视频在线观看网址| 国产91精品视频在线观看| 国产精品欧美激情| 日韩欧美一区二区在线| 8090成年在线看片午夜| 欧美午夜片在线免费观看| 亚洲国产精品99久久| 国产精品日韩在线观看| 成人黄色短视频在线观看| 亚洲成色777777在线观看影院| 久久精品久久久久久| 亚洲天堂成人在线| 69久久夜色精品国产7777| 中文字幕成人在线| 国产精品福利在线观看| 中文字幕成人精品久久不卡| 97超级碰在线看视频免费在线看| 中文字幕欧美精品在线| 久久伊人91精品综合网站| 成人亚洲综合色就1024| 国产精品自产拍在线观看中文| 中文在线资源观看视频网站免费不卡| 亚洲最大av网站| 久久久久久久久久亚洲| 久久97精品久久久久久久不卡| 97在线日本国产| 精品亚洲一区二区三区四区五区| 欧美久久精品一级黑人c片| 亚洲精品wwww| 九九热精品在线| 综合136福利视频在线| 国产999精品| 亚洲高清在线观看| 国产日韩精品电影| 欧美日韩国产精品一区二区不卡中文| 久久视频在线视频| 91精品国产综合久久香蕉的用户体验| 国产一区二区三区在线| 日韩精品视频在线免费观看| 亚洲精品欧美极品| 久久久av免费| 久久精品视频网站| 国产福利精品在线| 久久69精品久久久久久久电影好| 亚洲国产精品小视频| 久久精品99无色码中文字幕| 国产这里只有精品| 国产午夜精品美女视频明星a级| 性金发美女69hd大尺寸| 国产亚洲精品美女久久久| 欧美成人精品三级在线观看| 久久天天躁夜夜躁狠狠躁2022| 久久伊人色综合| 欧美激情精品久久久| 国产成人在线精品| 亚洲国产精品热久久| 亚洲激情自拍图| 欧美一区二粉嫩精品国产一线天| 久久频这里精品99香蕉| 欧美专区在线观看| 国产欧美日韩精品专区| 国产日韩欧美自拍| 久久影视免费观看| 成人h片在线播放免费网站| 91精品久久久久久久久中文字幕| 欧美黑人巨大xxx极品| 亚洲aⅴ日韩av电影在线观看| 久久视频这里只有精品| 亚洲乱码国产乱码精品精| 日韩大胆人体377p| 成人在线免费观看视视频| 成人黄色在线免费| 精品久久久国产| 久久久久久久一| 一区二区三区美女xx视频| 亚洲女人天堂成人av在线| 亚洲资源在线看| 亚洲视频一区二区三区| 久久综合久中文字幕青草| 欧美香蕉大胸在线视频观看| 国产做受69高潮| 色噜噜狠狠狠综合曰曰曰| 国产国语videosex另类| 国产欧美婷婷中文| 亚洲国产成人久久综合| 亚洲精品中文字幕有码专区| 欧美老女人在线视频| 欧美一区二区色| 欧美精品一区在线播放| 国产精品午夜一区二区欲梦| 日韩精品视频在线| 日韩中文字幕国产精品| 久久免费视频网站| 97成人在线视频| www.99久久热国产日韩欧美.com| 日韩欧美大尺度| 九九视频这里只有精品| 国产日韩综合一区二区性色av| 亚洲一区二区三区四区视频| 亚洲天堂av在线免费| 日韩免费av一区二区| 国产91精品青草社区| 97精品久久久中文字幕免费| 国产成人久久久| 欧美激情第99页| 日韩h在线观看| 538国产精品一区二区免费视频| 欧美片一区二区三区| 欧美成人一二三| 欧美极品美女视频网站在线观看免费| 人人澡人人澡人人看欧美| 久久躁日日躁aaaaxxxx| 精品国产欧美一区二区五十路| 97视频在线观看亚洲| 在线观看亚洲视频| 欧美小视频在线观看| 久久亚洲精品国产亚洲老地址| 成人欧美一区二区三区在线湿哒哒| 中文字幕精品av| 久久久视频精品| 亚洲а∨天堂久久精品9966| 日本精品免费一区二区三区| 亚洲综合色av| 人体精品一二三区| 欧美巨大黑人极品精男| 日韩在线观看免费高清完整版|