50種方法巧妙優(yōu)化你的SQLServer數(shù)據(jù)庫(二)

字號:

26、MIN() 和 MAX()能使用到合適的索引。
     27、數(shù)據(jù)庫有一個原則是代碼離數(shù)據(jù)越近越好,所以優(yōu)先選擇Default,依次為Rules,Triggers, Constraint(約束如外健主健CheckUNIQUE……,數(shù)據(jù)類型的長度等等都是約束),Procedure.這樣不僅維護工作小,編寫程序質(zhì)量高,并且執(zhí)行的速度快。
     28、如果要插入大的二進制值到Image列,使用存儲過程,千萬不要用內(nèi)嵌INsert來插入(不知JAVA是否)。因為這樣應用程序首先將二進制值轉換成字符串(尺寸是它的兩倍),服務器受到字符后又將他轉換成二進制值.存儲過程就沒有這些動作: 方法:
     Create procedure p_insert as insert into table(Fimage) values (@image)
     在前臺調(diào)用這個存儲過程傳入二進制參數(shù),這樣處理速度明顯改善。
     29、Between在某些時候比IN速度更快,Between能夠更快地根據(jù)索引找到范圍。用查詢優(yōu)化器可見到差別。
     select * from chineseresume where title in ('男','女') Select * from chineseresume where between
     '男' and '女' 是一樣的。由于in會在比較多次,所以有時會慢些。
     30、在必要是對全局或者局部臨時表創(chuàng)建索引,有時能夠提高速度,但不是一定會這樣,因為索引也耗費大量的資源。他的創(chuàng)建同是實際表一樣。
     31、不要建沒有作用的事物例如產(chǎn)生報表時,浪費資源。只有在必要使用事物時使用它。
     32、用OR的字句可以分解成多個查詢,并且通過UNION 連接多個查詢。他們的速度只同是否使用索引有關,如果查詢需要用到聯(lián)合索引,用UNION all執(zhí)行的效率更高.多個OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個關鍵的問題是否用到索引。
     33、盡量少用視圖,它的效率低。對視圖操作比直接對表操作慢,可以用stored procedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務器上的被優(yōu)化好了的已經(jīng)產(chǎn)生了查詢規(guī)劃的SQL。對單個表檢索數(shù)據(jù)時,不要使用指向多個表的視圖,直接從表檢索或者僅僅包含這個表的視圖上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快視圖的查詢,MsSQL增加了視圖索引的功能。
     34、沒有必要時不要用DISTINCT和ORDER BY,這些動作可以改在客戶端執(zhí)行。它們增加了額外的開銷。這同UNION 和UNION ALL一樣的道理。
     select top 20 ad.companyname,comid,position,ad.referenceid,worklocation,
     convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM
     jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
     'JCNAD00333138','JCNAD00303570','JCNAD00303569',
     'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
     'JCNAD00254567','JCNAD00254585','JCNAD00254608',
     'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
     'JCNAD00279196','JCNAD00268613') order by postdate desc
     35、在IN后面值的列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。
     36、當用SELECT INTO時,它會鎖住系統(tǒng)表(sysobjects,sysindexes等等),阻塞其他的連接的存取。創(chuàng)建臨時表時用顯示申明語句,而不是
     select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume
     where name = 'XYZ' --commit
     在另一個連接中SELECT * from sysobjects可以看到 SELECT INTO 會鎖住系統(tǒng)表,Create table 也會鎖系統(tǒng)表(不管是臨時表還是系統(tǒng)表)。所以千萬不要在事物內(nèi)使用它?。?!這樣的話如果是經(jīng)常要用的臨時表請使用實表,或者臨時表變量。
     37、一般在GROUP BY 個HAVING字句之前就能剔除多余的行,所以盡量不要用它們來做剔除行的工作。他們的執(zhí)行順序應該如下:select 的Where字句選擇所有合適的行,Group By用來分組個統(tǒng)計行,Having字句用來剔除多余的分組。這樣Group By 個Having的開銷小,查詢快.對于大的數(shù)據(jù)行進行分組和Having十分消耗資源。如果Group BY的目的不包括計算,只是分組,那么用Distinct更快
     38、一次更新多條記錄比分多次更新每次一條快,就是說批處理好
     39、少用臨時表,盡量用結果集和Table類性的變量來代替它,Table 類型的變量比臨時表好
     40、在SQL2000下,計算字段是可以索引的,需要滿足的條件如下:
     a、計算字段的表達是確定的
     b、不能用在TEXT,Ntext,Image數(shù)據(jù)類型
     c、必須配制如下選項 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….