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

首頁(yè) > 數(shù)據(jù)庫(kù) > 文庫(kù) > 正文

如何讓你的SQL運(yùn)行得更快

2020-10-29 21:56:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
人們?cè)谑褂肧QL時(shí)往往會(huì)陷入一個(gè)誤區(qū),即太關(guān)注于所得的結(jié)果是否正確,而忽略了不同的實(shí)現(xiàn)方法之間可能存在的性能差異,這種性能差異在大型的或是復(fù)雜的數(shù)據(jù)庫(kù)環(huán)境中(如聯(lián)機(jī)事務(wù)處理OLTP或決策支持系統(tǒng)DSS)中表現(xiàn)得尤為明顯。筆者在工作實(shí)踐中發(fā)現(xiàn),不良的SQL往往來(lái)自于不恰當(dāng)?shù)乃饕O(shè)計(jì)、不充份的連接條件和不可優(yōu)化的where子句。在對(duì)它們進(jìn)行適當(dāng)?shù)膬?yōu)化后,其運(yùn)行速度有了明顯地提高!下面我將從這三個(gè)方面分別進(jìn)行總結(jié):

---- 為了更直觀地說(shuō)明問(wèn)題,所有實(shí)例中的SQL運(yùn)行時(shí)間均經(jīng)過(guò)測(cè)試,不超過(guò)1秒的均表示為(< 1秒)。

---- 測(cè)試環(huán)境--
---- 主機(jī):HP LH II
---- 主頻:330MHZ
---- 內(nèi)存:128兆
---- 操作系統(tǒng):Operserver5.0.4
----數(shù)據(jù)庫(kù):Sybase11.0.3

一、不合理的索引設(shè)計(jì)
----例:表record有620000行,試看在不同的索引下,下面幾個(gè) SQL的運(yùn)行情況:
---- 1.在date上建有一非個(gè)群集索引

select count(*) from record where date >
'19991201' and date < '19991214'and amount >
2000 (25秒)
select date,sum(amount) from record group by date
(55秒)
select count(*) from record where date >
'19990901' and place in ('BJ','SH') (27秒)

---- 分析:
----date上有大量的重復(fù)值,在非群集索引下,數(shù)據(jù)在物理上隨機(jī)存放在數(shù)據(jù)頁(yè)上,在范圍查找時(shí),必須執(zhí)行一次表掃描才能找到這一范圍內(nèi)的全部行。

---- 2.在date上的一個(gè)群集索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000 (14秒)
select date,sum(amount) from record group by date
(28秒)
select count(*) from record where date >
'19990901' and place in ('BJ','SH')(14秒)

---- 分析:
---- 在群集索引下,數(shù)據(jù)在物理上按順序在數(shù)據(jù)頁(yè)上,重復(fù)值也排列在一起,因而在范圍查找時(shí),可以先找到這個(gè)范圍的起末點(diǎn),且只在這個(gè)范圍內(nèi)掃描數(shù)據(jù)頁(yè),避免了大范圍掃描,提高了查詢(xún)速度。

---- 3.在place,date,amount上的組合索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000 (26秒)
select date,sum(amount) from record group by date
(27秒)
select count(*) from record where date >
'19990901' and place in ('BJ, 'SH')(< 1秒)

---- 分析:
---- 這是一個(gè)不很合理的組合索引,因?yàn)樗那皩?dǎo)列是place,第一和第二條SQL沒(méi)有引用place,因此也沒(méi)有利用上索引;第三個(gè)SQL使用了place,且引用的所有列都包含在組合索引中,形成了索引覆蓋,所以它的速度是非??斓?。

---- 4.在date,place,amount上的組合索引

select count(*) from record where date >
'19991201' and date < '19991214' and amount >
2000(< 1秒)
select date,sum(amount) from record group by date
(11秒)
select count(*) from record where date >
'19990901' and place in ('BJ','SH')(< 1秒)

---- 分析:
---- 這是一個(gè)合理的組合索引。它將date作為前導(dǎo)列,使每個(gè)SQL都可以利用索引,并且在第一和第三個(gè)SQL中形成了索引覆蓋,因而性能達(dá)到了最優(yōu)。

---- 5.總結(jié):

---- 缺省情況下建立的索引是非群集索引,但有時(shí)它并不是最佳的;合理的索引設(shè)計(jì)要建立在對(duì)各種查詢(xún)的分析和預(yù)測(cè)上。一般來(lái)說(shuō):

---- ①.有大量重復(fù)值、且經(jīng)常有范圍查詢(xún)

(between, >,< ,>=,< =)和order by
、group by發(fā)生的列,可考慮建立群集索引;

---- ②.經(jīng)常同時(shí)存取多列,且每列都含有重復(fù)值可考慮建立組合索引;

---- ③.組合索引要盡量使關(guān)鍵查詢(xún)形成索引覆蓋,其前導(dǎo)列一定是使用最頻繁的列。

二、不充份的連接條件:
---- 例:表card有7896行,在card_no上有一個(gè)非聚集索引,表account有191122行,在 account_no上有一個(gè)非聚集索引,試看在不同的表連接條件下,兩個(gè)SQL的執(zhí)行情況:

select sum(a.amount) from account a,
card b where a.card_no = b.card_no(20秒)

---- 將SQL改為:
select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
account_no=b.account_no(< 1秒)

---- 分析:
---- 在第一個(gè)連接條件下,最佳查詢(xún)方案是將account作外層表,card作內(nèi)層表,利用card上的索引,其I/O次數(shù)可由以下公式估算為:

---- 外層表account上的22541頁(yè)+(外層表account的191122行*內(nèi)層表card上對(duì)應(yīng)外層表第一行所要查找的3頁(yè))=595907次I/O

---- 在第二個(gè)連接條件下,最佳查詢(xún)方案是將card作外層表,account作內(nèi)層表,利用account上的索引,其I/O次數(shù)可由以下公式估算為:

---- 外層表card上的1944頁(yè)+(外層表card的7896行*內(nèi)層表account上對(duì)應(yīng)外層表每一行所要查找的4頁(yè))= 33528次I/O

---- 可見(jiàn),只有充份的連接條件,真正的最佳方案才會(huì)被執(zhí)行。

---- 總結(jié):

---- 1.多表操作在被實(shí)際執(zhí)行前,查詢(xún)優(yōu)化器會(huì)根據(jù)連接條件,列出幾組可能的連接方案并從中找出系統(tǒng)開(kāi)銷(xiāo)最小的最佳方案。連接條件要充份考慮帶有索引的表、行數(shù)多的表;內(nèi)外表的選擇可由公式:外層表中的匹配行數(shù)*內(nèi)層表中每一次查找的次數(shù)確定,乘積最小為最佳方案。

---- 2.查看執(zhí)行方案的方法-- 用set showplanon,打開(kāi)showplan選項(xiàng),就可以看到連接順序、使用何種索引的信息;想看更詳細(xì)的信息,需用sa角色執(zhí)行dbcc(3604,310,302)。

三、不可優(yōu)化的where子句
---- 1.例:下列SQL條件語(yǔ)句中的列都建有恰當(dāng)?shù)乃饕?,但?zhí)行速度卻非常慢:

select * from record where
substring(card_no,1,4)='5378'(13秒)
select * from record where
amount/30< 1000(11秒)
select * from record where
convert(char(10),date,112)='19991201'(10秒)

---- 分析:
---- where子句中對(duì)列的任何操作結(jié)果都是在SQL運(yùn)行時(shí)逐列計(jì)算得到的,因此它不得不進(jìn)行表搜索,而沒(méi)有使用該列上面的索引;如果這些結(jié)果在查詢(xún)編譯時(shí)就能得到,那么就可以被SQL優(yōu)化器優(yōu)化,使用索引,避免表搜索,因此將SQL重寫(xiě)成下面這樣:

select * from record where card_no like
'5378%'(< 1秒)
select * from record where amount
< 1000*30(< 1秒)
select * from record where date= '1999/12/01'
(< 1秒)

---- 你會(huì)發(fā)現(xiàn)SQL明顯快起來(lái)!

---- 2.例:表stuff有200000行,id_no上有非群集索引,請(qǐng)看下面這個(gè)SQL:

select count(*) from stuff where id_no in('0','1')
(23秒)

---- 分析:
---- where條件中的'in'在邏輯上相當(dāng)于'or',所以語(yǔ)法分析器會(huì)將in ('0','1')轉(zhuǎn)化為id_no ='0' or id_no='1'來(lái)執(zhí)行。我們期望它會(huì)根據(jù)每個(gè)or子句分別查找,再將結(jié)果相加,這樣可以利用id_no上的索引;但實(shí)際上(根據(jù)showplan),它卻采用了"OR策略",即先取出滿(mǎn)足每個(gè)or子句的行,存入臨時(shí)數(shù)據(jù)庫(kù)的工作表中,再建立唯一索引以去掉重復(fù)行,最后從這個(gè)臨時(shí)表中計(jì)算結(jié)果。因此,實(shí)際過(guò)程沒(méi)有利用id_no上索引,并且完成時(shí)間還要受tempdb數(shù)據(jù)庫(kù)性能的影響。

---- 實(shí)踐證明,表的行數(shù)越多,工作表的性能就越差,當(dāng)stuff有620000行時(shí),執(zhí)行時(shí)間竟達(dá)到220秒!還不如將or子句分開(kāi):

select count(*) from stuff where id_no='0'
select count(*) from stuff where id_no='1'

---- 得到兩個(gè)結(jié)果,再作一次加法合算。因?yàn)槊烤涠际褂昧怂饕?,?zhí)行時(shí)間只有3秒,在620000行下,時(shí)間也只有4秒?;蛘撸酶玫姆椒?,寫(xiě)一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程:
create proc count_stuff as
declare @a int
declare @b int
declare @c int
declare @d char(10)
begin
select @a=count(*) from stuff where id_no='0'
select @b=count(*) from stuff where id_no='1'
end
select @c=@a+@b
select @d=convert(char(10),@c)
print @d

---- 直接算出結(jié)果,執(zhí)行時(shí)間同上面一樣快!
---- 總結(jié):

---- 可見(jiàn),所謂優(yōu)化即where子句利用了索引,不可優(yōu)化即發(fā)生了表掃描或額外開(kāi)銷(xiāo)。

---- 1.任何對(duì)列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫(kù)函數(shù)、計(jì)算表達(dá)式等等,查詢(xún)時(shí)要盡可能將操作移至等號(hào)右邊。

---- 2.in、or子句常會(huì)使用工作表,使索引失效;如果不產(chǎn)生大量重復(fù)值,可以考慮把子句拆開(kāi);拆開(kāi)的子句中應(yīng)該包含索引。

---- 3.要善于使用存儲(chǔ)過(guò)程,它使SQL變得更加靈活和高效。

---- 從以上這些例子可以看出,SQL優(yōu)化的實(shí)質(zhì)就是在結(jié)果正確的前提下,用優(yōu)化器可以識(shí)別的語(yǔ)句,充份利用索引,減少表掃描的I/O次數(shù),盡量避免表搜索的發(fā)生。其實(shí)SQL的性能優(yōu)化是一個(gè)復(fù)雜的過(guò)程,上述這些只是在應(yīng)用層次的一種體現(xiàn),深入研究還會(huì)涉及數(shù)據(jù)庫(kù)層的資源配置、網(wǎng)絡(luò)層的流量控制以及操作系統(tǒng)層的總體設(shè)計(jì)。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
无遮挡爽大片在线观看视频| a级免费在线观看| 中文字幕在线视频一区| www.日本xxxx| 久久er99精品| 在线播放高清视频www| 久久久久久久久久久久久久| 国产精品一区二区久激情瑜伽| 91在线三级| 免费播放片a高清在线观看| 天天干在线影院| av成人老司机| 性猛交富婆╳xxx乱大交一| 97超碰在线免费观看| 欧美日韩国产一区二区三区地区| 亚洲第一黄网| 手机在线成人av| 日本福利视频导航| 精品黑人一区二区三区观看时间| 99久久精品国产色欲| 战狼4完整免费观看在线播放版| 一级黄色高清视频| 高h震动喷水双性1v1| 色呦呦免费观看| 91九色最新地址| 久久久久久一区二区三区四区别墅| 成人高h视频在线| 激情欧美一区二区三区| 亚洲精品天堂在线观看| 91精品国产91久久久久| 中文综合在线观看| jizz在线免费观看| 色婷婷久久99综合精品jk白丝| 最新69国产成人精品视频免费| 高清日韩电视剧大全免费| 国产精品秘入口| 欧美日韩国产精品自在自线| 琪琪久久久久日韩精品| 91美女片黄在线观看91美女| 国产精品网站大全| 久久精品美女视频| 在线观看中文字幕av| 亚洲九九精品| 欧美一区二区视频免费观看| 亚洲高清在线一区| 在线播放日韩欧美| 四虎永久在线观看| 中文字幕第一页av| 国产精品日韩在线播放| 99久久99久久免费精品蜜臀| 欧美在线综合| 亚洲欧美自拍偷拍| 另类激情视频| 激情五月综合| 成人污视频在线观看| 国产精品一区在线看| 在线观看成人av| 日本乱理伦在线| 日韩精品一区二区三区老鸭窝| 国产精品区一区二区三在线播放| 午夜剧场高清版免费观看| 午夜精品久久久久久久久久久| 欧美精品入口蜜桃| 日本免费久久| 亚洲日韩欧美视频一区| 尤物九九久久国产精品的特点| 成人在线免费看视频| 极品av少妇一区二区| 亚洲精品在线观| 在线观看免费黄色小视频| 亚洲精品一区二区三区不| 国产精品xxxx喷水欧美| 少妇人妻互换不带套| 姝姝窝人体www聚色窝| 国模一区二区三区私拍视频| 九义人在线观看完整免费版电视剧| 成人春色在线观看免费网站| 久久久久久9| 成人性免费视频| av色综合久久天堂av综合| 精品国产a一区二区三区v免费| av三级影院| 美女色狠狠久久| 日韩成人性视频| 亚洲男人的天堂在线观看| 蜜桃视频在线观看www| 99热这里只有精品首页| 欧美日韩在线精品成人综合网| 国产亚洲福利一区| 精品国产av一区二区三区| 蜜桃视频无码区在线观看| 青青草国产免费| 人人澡人一摸人人添| 日本一区二区三区四区五区| 久久久精品午夜少妇| 宅男在线精品国产免费观看| 91精品国偷自产在线电影| 国产免费拔擦拔擦8x在线播放| 精品久久对白| 不卡一区二区中文字幕| 香蕉在线观看视频| 欧美日韩国产综合草草| 亚洲欧美日韩精品永久在线| 日韩免费观看高清完整版| 国产又粗又猛又爽又黄的视频小说| 777视频在线观看| 99精品桃花视频在线观看| 亚洲精品**中文毛片| 午夜精品aaa| 亚洲精品天堂成人片av在线播放| 国产女人被狂躁到高潮小说| 久久久久久国产三级电影| 大黑人xxx| 亚洲va欧美va天堂v国产综合| www.四虎在线| 九九热国产视频| 精品国产91乱码一区二区三区| 精品国产av鲁一鲁一区| 奇米一区二区三区av| 97成人在线| 亚洲做受高潮无遮挡| 伊伊综合在线| 国产99久久久国产精品免费看| 人妻妺妺窝人体色www聚色窝| 亚洲电影在线一区二区三区| 免费看日韩毛片| 亚洲尤物在线| 黄频免费在线观看| 91在线播放网址| 午夜一区在线| 欧美男人天堂| 日本电影二区| 日本少妇激三级做爰在线| 日韩精品a在线观看91| 亚洲最新在线| 久久欧美肥婆一二区| 亚洲网站情趣视频| 好操啊在线观看免费视频| 最新亚洲国产精品| 精品一区二区三区亚洲| 色婷婷国产精品综合在线观看| 国产精品美女视频网站| 一区二区三区精彩视频| 九色自拍视频在线观看| 中文字幕国产一区| jizz欧美性20| 日韩av字幕| 中文字幕视频在线免费| 老熟妇高潮一区二区高清视频| 一区二区中文视频| 9i精品一二三区| 四虎影视免费看电影| 亚洲色图欧美| 日本天堂中文字幕| 91丝袜美腿美女视频网站| 久久xxxx精品视频| 日韩在线视频播放| 99riav国产| 公侵犯人妻一区二区三区| 免费电影网站在线视频观看福利| jizz免费看| 四虎影视国产在线视频| 成年人在线免费观看| 91av中文字幕| 久久精品无码中文字幕| 99精品国产一区二区三区| 国产亚洲污的网站| 久久精品超碰| 日韩激情久久| 五月激情丁香一区二区三区| 精品成av人一区二区三区| 国产精品系列视频| 欧美一区二区视频在线观看| 国产传媒av在线| 性色视频在线观看| 国产精品资源在线| 国产一区二区0| 久久人妻少妇嫩草av无码专区| 欧美激情图片区| 无颜之月在线看| 国内成人在线| 国产日本视频| 看全色黄大色大片免费久久久| 日韩亚洲欧美在线观看| 经典三级一区二区三区视频| 中文在线最新版天堂8| 粉嫩虎白女毛片人体| 男人的天堂成人在线| 国产亚洲短视频| 亚洲视频第二页| eeuss影院www免费影院| 亚洲的天堂在线中文字幕| 中文字幕99页| 麻豆成人精品| 91精品国产99久久久久久红楼| 日韩精品一区二区三区视频播放| 久久久久亚洲av成人毛片韩| 成人一区二区三区视频| 日韩视频中午一区| 国模人体一区二区| 欧美一级淫片007| 西西大胆午夜视频| 欧美精品首页| 国产精品流白浆视频| 亚洲同志网站入口| 亚洲人成网站在线观看播放| 日韩精品另类天天更新| 国语自产精品视频在线看8查询8| 91沈先生在线观看| 老司机深夜福利在线观看| 青青青草视频| 精品伦精品一区二区三区视频密桃| 亚洲欧洲闷骚av少妇影院| www.操.com| av大片在线免费观看| 国产精品成人一区二区三区电影毛片| 亚洲午夜极品| 欧美精品久久久久久久多人混战| 国产黄色免费大片| 午夜精品视频一区| 另类专区欧美| 免费电影网站在线视频观看福利| 欧美在线观看视频网站| 麻豆国产入口在线观看免费| 日韩毛片网站| 久久精品国产亚洲AV无码麻豆| 污视频在线免费观看| 特级黄色片视频| 激情亚洲色图| 精品乱码一区| 亚洲精品成人无限看| 欧美乱妇15p| 青青草国产在线| 久久久久久久中文字幕| 国产精品亲子伦对白| 久久365资源| 亚洲午夜久久久久久尤物| 国产精品视频免费观看| 影音先锋中文字幕在线| 欧美第一淫aaasss性| 黑人精品xxx一区一二区| 奇米影视一区二区三区小说| 欧美精品久久久久久久自慰| 免费在线观看的av| zzjj国产精品一区二区| 欧美大交乱xxxxbbbb| 99精彩视频| 久久人人爽爽人人爽人人片av| 欧美三日本三级少妇三99| 黄色高清视频| 日韩一级片免费| 两个人的视频www国产精品| 国产视频在线看| 天堂av资源在线| 一区二区三区四区不卡视频| 天天爱天天操天天干| 免费在线观看日韩av| 色视频在线观看在线播放| 精品久久久久一区二区| 99热只有这里有精品| 日韩一区在线免费观看| jlzzjlzz亚洲女人| 欧美裸体男粗大视频在线观看| 日韩精品视频在线观看一区二区三区| 第四色在线视频| 日韩经典一区| 国产破处视频在线观看| 免费精品国产自产拍在| 中文字幕一区二区三区色视频| 国产日韩一区二区三免费高清| 亚洲色婷婷综合开心网| 91国拍精品国产粉嫩亚洲一区| 日韩一区二区三区四区在线| 日韩三级免费看| 精品卡一卡二卡三卡四在线| 日本精品久久久久中文| 国产麻豆一区二区三区在线观看| 毛片在线播放网址| а√天堂8资源中文在线| 久久福利精品| 视频在线观看入口黄最新永久免费国产| 亚洲高清在线免费观看| 一区二区三区精品视频在线观看| 不卡视频在线观看| 一级特黄aaa大片| 在线观看免费国产成人软件| 久久久久高清精品| 国模无码大尺度一区二区三区| 国产美女免费观看| 欧美亚洲激情| 国产在视频线精品视频www666| 国产一区二区三区在线播放免费观看| 性伦欧美刺激片在线观看| 国产日韩综合| 日韩欧美在线字幕| 超碰在线观看av| 久久亚洲一区二区三区四区五区高| 日韩脚交footjobhdboots| 一级淫片在线观看| 成人午夜激情视频| 国产麻豆一区二区三区精品| 国产一级一级国产| 97婷婷大伊香蕉精品视频| 丰满熟妇人妻中文字幕| 写真福利精品福利在线观看| 中文亚洲视频在线| 国产91精品对白在线播放| 91av在线看| 国产精品色眯眯| 国产污视频在线播放| 欧美激情亚洲视频| 国产精品另类一区| 日韩av电影免费观看| 蜜臀久久99精品久久久画质超高清| 二区三区在线播放| 欧美激情国产日韩精品一区18| 一级片在线观看| 好操啊在线观看免费视频| 欧美中文字幕一区二区三区亚洲| 亚洲女人18毛片水真多| 亚洲欧美视频在线观看| 国产一线在线观看| 国产精品yjizz视频网一二区| 99亚偷拍自图区亚洲| 99这里只有久久精品视频| 欧美怡红院在线| 日韩电影大全网站| 中文在线аv在线|