資源描述:
《SQL語句執(zhí)行效率及分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、1.關(guān)于SQL查詢效率,100w數(shù)據(jù),查詢只要1秒,與您分享:機器情況p4:2.4內(nèi)存:1Gos:windows2003數(shù)據(jù)庫:mssqlserver2000目的:查詢性能測試,比較兩種查詢的性能SQL查詢效率stepbystep--setp1.--建表createtablet_userinfo(useridintidentity(1,1)primarykeynonclustered,nickvarchar(50)notnulldefault'',classidintnotnulldefault0,writetimedatetimenotnulld
2、efaultgetdate())go--建索引createclusteredindexix_userinfo_classidont_userinfo(classid)go--step2.declare@iintdeclare@kintdeclare@nickvarchar(10)set@i=1while@i<1000000beginset@k=@i%10set@nick=convert(varchar,@i)insertintot_userinfo(nick,classid,writetime)values(@nick,@k,getdate())s
3、et@i=@i+1end--耗時08:27,需要耐心等待--step3.selecttop20userid,nick,classid,writetimefromt_userinfowhereuseridnotin(selecttop900000useridfromt_userinfoorderbyuseridasc)--耗時8秒,夠長的--step4.selecta.userid,b.nick,b.classid,b.writetimefrom(selecttop20a.useridfrom(selecttop900020useridfromt_u
4、serinfoorderbyuseridasc)aorderbya.useriddesc)ainnerjoint_userinfobona.userid=b.useridorderbya.useridasc--耗時1秒,太快了吧,不可以思議--step5where查詢selecttop20userid,nick,classid,writetimefromt_userinfowhereclassid=1anduseridnotin(selecttop90000useridfromt_userinfowhereclassid=1orderbyuseri
5、dasc)--耗時2秒--step6where查詢selecta.userid,b.nick,b.classid,b.writetimefrom(selecttop20a.useridfrom(selecttop90000useridfromt_userinfowhereclassid=1orderbyuseridasc)aorderbya.useriddesc)ainnerjoint_userinfobona.userid=b.useridorderbya.useridasc--查詢分析器顯示不到1秒.查詢效率分析:子查詢?yōu)榇_保消除重復(fù)值,必須為
6、外部查詢的每個結(jié)果都處理嵌套查詢。在這種情況下可以考慮用聯(lián)接查詢來取代。如果要用子查詢,那就用EXISTS替代IN、用NOTEXISTS替代NOTIN。因為EXISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOTIN都是最低效的。因為它對子查詢中的表執(zhí)行了一個全表遍歷。建立合理的索引,避免掃描多余數(shù)據(jù),避免表掃描!幾百萬條數(shù)據(jù),照樣幾十毫秒完成查詢.2.SQL提高查詢效率2008-05-1221:201.對查詢進行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。2.應(yīng)盡
7、量避免在where子句中對字段進行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:selectidfromtwherenumisnull可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:selectidfromtwherenum=03.應(yīng)盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。4.應(yīng)盡量避免在where子句中使用or來連接條件,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:selectidfromtwherenum=10ornum=20可以這樣查詢:selectid
8、fromtwherenum=10unionallselectidfromtwherenum=205.in和notin也要慎