日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

關于SQL SERVER建立索引需要注意的問題

瀏覽:190日期:2023-10-29 07:31:13
---- 人們在使用SQL時往往會陷入一個誤區,即太關注于所得的結果是否正確,而忽略了不同的實現方法之間可能存在的性能差異,這種性能差異在大型的或是復雜的數據庫環境中(如聯機事務處理OLTP或決策支持系統DSS)中表現得尤為明顯。筆者在工作實踐中發現,不良的SQL往往來自于不恰當的索引設計、不充份的連接條件和不可優化的where子句。在對它們進行適當的優化后,其運行速度有了明顯地提高!下面我將從這三個方面分別進行總結:---- 為了更直觀地說明問題,所有實例中的SQL運行時間均經過測試,不超過1秒的均表示為(< 1秒)。---- 測試環境------ 主機:HP LH II---- 主頻:330MHZ---- 內存:128兆---- 操作系統:Operserver5.0.4----數據庫:Sybase11.0.3一、不合理的索引設計----例:表record有620000行,試看在不同的索引下,下面幾個 SQL的運行情況:---- 1.在date上建有一個非群集索引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上有大量的重復值,在非群集索引下,數據在物理上隨機存放在數據頁上,在范圍查找時,必須執行一次表掃描才能找到這一范圍內的全部行。---- 2.在date上的一個群集索引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秒)---- 分析:---- 在群集索引下,數據在物理上按順序在數據頁上,重復值也排列在一起,因而在范圍查找時,可以先找到這個范圍的起末點,且只在這個范圍內掃描數據頁,避免了大范圍掃描,提高了查詢速度。---- 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秒)---- 分析:---- 這是一個不很合理的組合索引,因為它的前導列是place,第一和第二條SQL沒有引用place,因此也沒有利用上索引;第三個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秒)---- 分析:---- 這是一個合理的組合索引。它將date作為前導列,使每個SQL都可以利用索引,并且在第一和第三個SQL中形成了索引覆蓋,因而性能達到了最優。---- 5.總結:---- 缺省情況下建立的索引是非群集索引,但有時它并不是最佳的;合理的索引設計要建立在對各種查詢的分析和預測上。一般來說:---- ①.有大量重復值、且經常有范圍查詢(between, >,< ,>=,< =)和order by、group by發生的列,可考慮建立群集索引;---- ②.經常同時存取多列,且每列都含有重復值可考慮建立組合索引;---- ③.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。二、不充份的連接條件:---- 例:表card有7896行,在card_no上有一個非聚集索引,表account有191122行,在 account_no上有一個非聚集索引,試看在不同的表連接條件下,兩個SQL的執行情況: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秒)---- 分析:---- 在第一個連接條件下,最佳查詢方案是將account作外層表,card作內層表,利用card上的索引,其I/O次數可由以下公式估算為:---- 外層表account上的22541頁+(外層表account的191122行*內層表card上對應外層表第一行所要查找的3頁)=595907次I/O---- 在第二個連接條件下,最佳查詢方案是將card作外層表,account作內層表,利用account上的索引,其I/O次數可由以下公式估算為:---- 外層表card上的1944頁+(外層表card的7896行*內層表account上對應外層表每一行所要查找的4頁)= 33528次I/O---- 可見,只有充份的連接條件,真正的最佳方案才會被執行。---- 總結:---- 1.多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案并從中找出系統開銷最小的最佳方案。連接條件要充份考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案。---- 2.查看執行方案的方法-- 用set showplanon,打開showplan選項,就可以看到連接順序、使用何種索引的信息;想看更詳細的信息,需用sa角色執行dbcc(3604,310,302)。三、不可優化的where子句---- 1.例:下列SQL條件語句中的列都建有恰當的索引,但執行速度卻非常慢: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子句中對列的任何操作結果都是在SQL運行時逐列計算得到的,因此它不得不進行表搜索,而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到,那么就可以被SQL優化器優化,使用索引,避免表搜索,因此將SQL重寫成下面這樣: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秒)---- 你會發現SQL明顯快起來!---- 2.例:表stuff有200000行,id_no上有非群集索引,請看下面這個SQL:select count(*) from stuff where id_no in('0','1')(23秒)---- 分析:---- where條件中的'in'在邏輯上相當于'or',所以語法分析器會將in ('0','1')轉化為id_no ='0' or id_no='1'來執行。我們期望它會根據每個or子句分別查找,再將結果相加,這樣可以利用id_no上的索引;但實際上(根據showplan),它卻采用了"OR策略",即先取出滿足每個or子句的行,存入臨時數據庫的工作表中,再建立唯一索引以去掉重復行,最后從這個臨時表中計算結果。因此,實際過程沒有利用id_no上索引,并且完成時間還要受tempdb數據庫性能的影響。---- 實踐證明,表的行數越多,工作表的性能就越差,當stuff有620000行時,執行時間竟達到220秒!還不如將or子句分開:select count(*) from stuff where id_no='0'select count(*) from stuff where id_no='1'---- 得到兩個結果,再作一次加法合算。因為每句都使用了索引,執行時間只有3秒,在620000行下,時間也只有4秒。或者,用更好的方法,寫一個簡單的存儲過程:create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(10),@c)print @d---- 直接算出結果,執行時間同上面一樣快!---- 總結:---- 可見,所謂優化即where子句利用了索引,不可優化即發生了表掃描或額外開銷。---- 1.任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。---- 2.in、or子句常會使用工作表,使索引失效;如果不產生大量重復值,可以考慮把子句拆開;拆開的子句中應該包含索引。---- 3.要善于使用存儲過程,它使SQL變得更加靈活和高效。---- 從以上這些例子可以看出,SQL優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充份利用索引,減少表掃描的I/O次數,盡量避免表搜索的發生。其實SQL的性能優化是一個復雜的過程,上述這些只是在應用層次的一種體現,深入研究還會涉及數據庫層的資源配置、網絡層的流量控制以及操作系統層的總體設計。
標簽: Sql Server 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜国产一区二区| 日韩视频久久| 日韩精品一区二区三区免费视频| 亚洲1234区| 99精品综合| 午夜日本精品| 亚洲视频电影在线| 欧美亚洲tv| 麻豆91精品视频| 国产91在线播放精品| 亚洲三级欧美| 极品日韩av| 亚洲深夜影院| 亚洲精品大片| 国产毛片一区二区三区| 国产日韩一区二区三免费高清| 国产美女久久| 水蜜桃精品av一区二区| 国产夫妻在线| 久久人人99| 午夜在线视频一区二区区别| 亚洲精品日韩久久| 国产精品2023| 日韩视频网站在线观看| 不卡中文字幕| 婷婷综合电影| 久久精品国产999大香线蕉| а√天堂8资源在线| 欧洲激情综合| 日韩av网站在线观看| 国产一区 二区| 欧美xxxx中国| 中文在线不卡| 91九色综合| 亚洲毛片在线免费| 国产一区二区三区黄网站| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲ab电影| 欧美韩一区二区| 精品国模一区二区三区| 香蕉久久夜色精品国产| 欧美日韩精品一区二区三区在线观看| 国产精品久久久久久久免费观看 | 婷婷五月色综合香五月| 国产精品一区三区在线观看| 黑森林国产精品av| 免费高清在线一区| 欧美激情在线精品一区二区三区| 久久婷婷久久| 日韩av字幕| 另类专区亚洲| 日韩精品中文字幕吗一区二区| 激情不卡一区二区三区视频在线| 激情五月综合| 久久gogo国模啪啪裸体| 香蕉国产精品| 久久精品国产999大香线蕉 | 久久久久99| 亚洲精品乱码久久久久久蜜桃麻豆| 精品国产不卡一区二区| 午夜在线视频一区二区区别| 精品久久久网| 亚洲三级网址| 欧产日产国产精品视频| 日韩精品一级| 欧美.日韩.国产.一区.二区 | 免费人成在线不卡| 首页国产精品| 亚洲精品乱码| 欧洲一级精品| 国产欧美日韩精品高清二区综合区| 亚洲国内欧美| 国产精品男女| 先锋影音国产一区| 亚洲天堂1区| 18国产精品| 中文亚洲欧美| 国产成人精品亚洲日本在线观看| 日韩国产欧美一区二区三区| 美女久久久久| 国产精品黄色| 日韩中出av| 中文国产一区| 中文在线免费视频| 国产欧美自拍| 首页欧美精品中文字幕| 播放一区二区| 国产91在线播放精品| 国产日韩在线观看视频| 丝袜美腿亚洲色图| 激情自拍一区| 国产一区二区三区日韩精品| 免费成人在线影院| 美女久久久久| 日韩在线综合| 精品国产亚洲一区二区三区大结局 | 国产劲爆久久| 亚洲精品伊人| 美女精品在线| 免费国产自久久久久三四区久久| 成人黄色av| 精品丝袜久久| 精品伊人久久久| 国产精品99精品一区二区三区∴ | 国产一区 二区| 亚洲精品在线国产| 亚洲免费影视| 国产日韩专区| 婷婷综合激情| 亚洲午夜在线| 香蕉久久99| 99视频精品全国免费| av综合电影网站| sm久久捆绑调教精品一区| 久久香蕉精品香蕉| 美女视频网站久久| 免费在线日韩av| 国产精品任我爽爆在线播放| 日韩欧美久久| 日韩激情综合| 国产日韩欧美三区| 国产精品主播在线观看| 国产日本精品| 国产精品chinese| 精品国产午夜肉伦伦影院| 麻豆一区二区在线| 久久久国产精品网站| 精品久久美女| av在线日韩| 亚洲黄色中文字幕| 久久久久国产| 亚洲激情另类| 香蕉久久久久久久av网站| 亚洲欧美综合| 丝袜诱惑制服诱惑色一区在线观看| 综合视频一区| 日韩福利视频网| 久久不见久久见免费视频7| 国产一区二区亚洲| 日韩欧美不卡| 亚洲成人精选| 伊人国产精品| 国产精品一线天粉嫩av| 成人午夜毛片| 免费成人网www| 亚洲欧洲美洲国产香蕉| 国产精品激情电影| 视频二区不卡| 亚洲天堂久久| 蜜桃视频第一区免费观看| 日本成人精品| 国产一区二区三区四区大秀| 天堂日韩电影| 蜜臀精品一区二区三区在线观看 | 中文精品电影| 国产精品蜜月aⅴ在线| 日韩成人精品一区| 91精品综合| 亚洲精品九九| 国产精品成久久久久| 亚洲国产不卡| 欧美亚洲三级| av综合电影网站| 久久午夜精品一区二区| 国产探花一区| 亚洲天堂1区| 亚洲va久久久噜噜噜久久| 你懂的亚洲视频| 午夜欧美在线| 国产欧美日韩在线一区二区| 国产乱码午夜在线视频| 亚洲欧美日韩视频二区| 日本亚洲视频在线| 91欧美国产| 美日韩精品视频| 精品高清久久| 午夜亚洲福利在线老司机| 国产精品嫩模av在线| 成人久久久久| 日韩高清欧美激情| 久久天堂精品| 欧美在线91| 91精品一区二区三区综合在线爱| 日韩在线一区二区| 久久久久久自在自线| 天堂成人免费av电影一区| 精品中文在线| 亚洲一区日韩在线| 精品精品久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产va免费精品观看精品视频| 男人的天堂亚洲一区| 91视频精品| 久久精品99国产精品| 欧美综合另类| 久久精品资源| 婷婷视频一区二区三区| 亚洲天堂1区| 国产精品久一| 亚洲深夜影院|