我的家園

          我的家園

          查詢速度慢的原因很多,常見如下幾種:

            1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設(shè)計(jì)的缺陷)

            2、I/O吞吐量小,形成了瓶頸效應(yīng)

            3、沒有創(chuàng)建計(jì)算列導(dǎo)致查詢不優(yōu)化。

            4、內(nèi)存不足

            5、網(wǎng)絡(luò)速度慢

            6、查詢出的數(shù)據(jù)量過大(可以采用多次查詢,其他的方法降低數(shù)據(jù)量)

            7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設(shè)計(jì)的缺陷)

            8、sp_lock,sp_who,活動(dòng)的用戶查看,原因是讀寫競(jìng)爭(zhēng)資源。

            9、返回了不必要的行和列

            10、查詢語句不好,沒有優(yōu)化

            可以通過如下方法來優(yōu)化查詢?:

            1、把數(shù)據(jù)、日志、索引放到不同的I/O設(shè)備上,增加讀取速度,以前可以將Tempdb應(yīng)放在RAID0上,SQL2000不在支持。數(shù)據(jù)量(尺寸)越大,提高I/O越重要.

            2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)

            3、升級(jí)硬件

            4、根據(jù)查詢條件,建立索引,優(yōu)化索引、優(yōu)化訪問方式,限制結(jié)果集的數(shù)據(jù)量。注意填充因子要適當(dāng)(最好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小的列建索引好(參照索引的創(chuàng)建),不要對(duì)有限的幾個(gè)值的字段建單一索引如性別字段

            5、提高網(wǎng)速;

            6、擴(kuò)大服務(wù)器的內(nèi)存,Windows?2000和SQL?server?2000能支持4-8G的內(nèi)存。配置虛擬內(nèi)存:虛擬內(nèi)存大小應(yīng)基于計(jì)算機(jī)上并發(fā)運(yùn)行的服務(wù)進(jìn)行配置。運(yùn)行?Microsoft SQL?Server??2000 時(shí),可考慮將虛擬內(nèi)存大小設(shè)置為計(jì)算機(jī)中安裝的物理內(nèi)存的 1.5?倍。如果另外安裝了全文檢索功能,并打算運(yùn)行?Microsoft?搜索服務(wù)以便執(zhí)行全文索引和查詢,可考慮:將虛擬內(nèi)存大小配置為至少是計(jì)算機(jī)中安裝的物理內(nèi)存的?3?倍。將?SQL&nb

            a、在實(shí)現(xiàn)分區(qū)視圖之前,必須先水平分區(qū)表

            b、在創(chuàng)建成員表后,在每個(gè)成員服務(wù)器上定義一個(gè)分布式分區(qū)視圖,并且每個(gè)視圖具有相同的名稱。這樣,引用分布式分區(qū)視圖名的查詢可以在任何一個(gè)成員服務(wù)器上運(yùn)行。系統(tǒng)操作如同每個(gè)成員服務(wù)器上都有一個(gè)原始表的復(fù)本一樣,但其實(shí)每個(gè)服務(wù)器上只有一個(gè)成員表和一個(gè)分布式分區(qū)視圖。數(shù)據(jù)的位置對(duì)應(yīng)用程序是透明的。

            11、重建索引?DBCC?REINDEX?,DBCC?INDEXDEFRAG,收縮數(shù)據(jù)和日志?DBCC?SHRINKDB,DBCC?SHRINKFILE.?設(shè)置自動(dòng)收縮日志.對(duì)于大的數(shù)據(jù)庫不要設(shè)置數(shù)據(jù)庫自動(dòng)增長(zhǎng),它會(huì)降低服務(wù)器的性能。在T-sql的寫法上有很大的講究,下面列出常見的要點(diǎn):首先,DBMS處理查詢計(jì)劃的過程是這樣的:

            1、?查詢語句的詞法、語法檢查

            2、?將語句提交給DBMS的查詢優(yōu)化器

            3、?優(yōu)化器做代數(shù)優(yōu)化和存取路徑的優(yōu)化

            4、?由預(yù)編譯模塊生成查詢規(guī)劃

            5、?然后在合適的時(shí)間提交給系統(tǒng)處理執(zhí)行

            6、?最后將執(zhí)行結(jié)果返回給用戶其次,看一下SQL?SERVER的數(shù)據(jù)存放的結(jié)構(gòu):一個(gè)頁面的大小為8K(8060)字節(jié),8個(gè)頁面為一個(gè)盤區(qū),按照B樹存放。
          12、Commit和rollback的區(qū)別?Rollback:回滾所有的事物。?Commit:提交當(dāng)前的事物.?沒有必要在動(dòng)態(tài)SQL里寫事物,如果要寫請(qǐng)寫在外面如:?begin?tran?exec(@s)?commit?trans?或者將動(dòng)態(tài)SQL?寫成函數(shù)或者存儲(chǔ)過程。

            13、在查詢Select語句中用Where字句限制返回的行數(shù),避免表掃描,如果返回不必要的數(shù)據(jù),浪費(fèi)了服務(wù)器的I/O資源,加重了網(wǎng)絡(luò)的負(fù)擔(dān)降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯(lián)接訪問表,后果嚴(yán)重。

            14、SQL的注釋申明對(duì)執(zhí)行沒有任何影響

          15、盡可能不使用光標(biāo),它占用大量的資源。如果需要row-by-row地執(zhí)行,盡量采用非光標(biāo)技術(shù),如:在客戶端循環(huán),用臨時(shí)表,Table變量,用子查詢,用Case語句等等。游標(biāo)可以按照它所支持的提取選項(xiàng)進(jìn)行分類:?只進(jìn)?必須按照從第一行到最后一行的順序提取行。FETCH?NEXT?是唯一允許的提取操作,也是默認(rèn)方式。可滾動(dòng)性可以在游標(biāo)中任何地方隨機(jī)提取任意行。游標(biāo)的技術(shù)在SQL2000下變得功能很強(qiáng)大,他的目的是支持循環(huán)。有四個(gè)并發(fā)選項(xiàng)?READ_ONLY:不允許通過游標(biāo)定位更新(Update),且在組成結(jié)果集的行中沒有鎖。?OPTIMISTIC?WITH?valueS:樂觀并發(fā)控制是事務(wù)控制理論的一個(gè)標(biāo)準(zhǔn)部分。樂觀并發(fā)控制用于這樣的情形,即在打開游標(biāo)及更新行的間隔中,只有很小的機(jī)會(huì)讓第二個(gè)用戶更新某一行。當(dāng)某個(gè)游標(biāo)以此選項(xiàng)打開時(shí),沒有鎖控制其中的行,這將有助于最大化其處理能力。如果用戶試圖修改某一行,則此行的當(dāng)前值會(huì)與最后一次提取此行時(shí)獲取的值進(jìn)行比較。如果任何值發(fā)生改變,則服務(wù)器就會(huì)知道其他人已更新了此行,并會(huì)返回一個(gè)錯(cuò)誤。如果值是一樣的,服務(wù)器就執(zhí)行修改。選擇這個(gè)并發(fā)選項(xiàng)OPTIMISTIC?WITH?ROW?VERSIONING:此樂觀并發(fā)控制選項(xiàng)基于行版本控制。使用行版本控制,其中的表必須具有某種版本標(biāo)識(shí)符,服務(wù)器可用它來確定該行在讀入游標(biāo)后是否有所更改。在?SQL?Server?中,這個(gè)性能由?timestamp?數(shù)據(jù)類型提供,它是一個(gè)二進(jìn)制數(shù)字,表示數(shù)據(jù)庫中更改的相對(duì)順序。每個(gè)數(shù)據(jù)庫都有一個(gè)全局當(dāng)前時(shí)間戳值:@@DBTS。每次以任何方式更改帶有?timestamp?列的行時(shí),SQL?Server?先在時(shí)間戳列中存儲(chǔ)當(dāng)前的?@@DBTS?值,然后增加?@@DBTS?的值。如果某?個(gè)表具有?timestamp?列,則時(shí)間戳?xí)挥浀叫屑?jí)。服務(wù)器就可以比較某行的當(dāng)前時(shí)間戳值和上次提取時(shí)所存儲(chǔ)的時(shí)間戳值,從而確定該行是否已更新。服務(wù)器不必比較所有列的值,只需比較?timestamp?列即可。如果應(yīng)用

          30、在必要是對(duì)全局或者局部臨時(shí)表創(chuàng)建索引,有時(shí)能夠提高速度,但不是一定會(huì)這樣,因?yàn)?/span>索引也耗費(fèi)大量的資源。他的創(chuàng)建同是實(shí)際表一樣。
           31、不要建沒有作用的事物例如產(chǎn)生報(bào)表時(shí),浪費(fèi)資源。只有在必要使用事物時(shí)使用它。

            32、用OR的字句可以分解成多個(gè)查詢,并且通過UNION?連接多個(gè)查詢。他們的速度只同是否使用索引有關(guān),如果查詢需要用到聯(lián)合索引,用UNION?all執(zhí)行的效率更高.多個(gè)OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個(gè)關(guān)鍵的問題是否用到索引。

            33、盡量少用視圖,它的效率低。對(duì)視圖操作比直接對(duì)表操作慢,可以用stored?procedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務(wù)器上的被優(yōu)化好了的已經(jīng)產(chǎn)生了查詢規(guī)劃的SQL。對(duì)單個(gè)表檢索數(shù)據(jù)時(shí),不要使用指向多個(gè)表的視圖,直接從表檢索或者僅僅包含這個(gè)表的視圖上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快視圖的查詢,MsSQL增加了視圖索引的功能。

            34、沒有必要時(shí)不要用DISTINCT和ORDER?BY,這些動(dòng)作可以改在客戶端執(zhí)行。它們?cè)黾恿祟~外的開銷。這同UNION?和UNION?ALL一樣的道理。

            ?  select?top?20?ad.companyname,comid,position,ad.referenceid,worklocation,?convert(varchar(10),ad.postDate,120)?

            35、在IN后面值的
          列表中,將出現(xiàn)最頻繁的值放在最前面,出現(xiàn)得最少的放在最后面,減少判斷的次數(shù)。

            36、當(dāng)用Select?INTO時(shí),它會(huì)鎖住系統(tǒng)表(sysobjects,sysindexes等等),阻塞其他的連接的存取。創(chuàng)建臨時(shí)表時(shí)用顯示申明語句,而不是?select?INTO.?drop?table?t_lxh?begin?tran?連接中Select?*?from?sysobjects可以看到?Select?INTO?會(huì)鎖住系統(tǒng)表,Create?table?也會(huì)鎖系統(tǒng)表(不管是臨時(shí)表還是系統(tǒng)表)。所以千萬不要在事物內(nèi)使用它!!!這樣的話如果是經(jīng)常要用的臨時(shí)表請(qǐng)使用實(shí)表,或者臨時(shí)表變量。

            37、一般在GROUP?BY?個(gè)HAVING字句之前就能剔除多余的行,所以盡量不要用它們來做剔除行的工作。他們的執(zhí)行順序應(yīng)該如下最優(yōu):select?的Where字句選擇所有合適的行,Group?By用來分組個(gè)統(tǒng)計(jì)行,Having字句用來剔除多余的分組。這樣Group?By?個(gè)Having的開銷小,查詢快.對(duì)于大的數(shù)據(jù)行進(jìn)行分組和Having十分消耗資源。如果Group?BY的目的不包括計(jì)算,只是分組,那么用Distinct更快

            38、一次更新多條記錄比分多次更新每次一條快,就是說批處理好

            39、少用臨時(shí)表,盡量用結(jié)果集和Table類性的變量來代替它,Table?類型的變量比臨時(shí)表好

            40、在SQL2000下,計(jì)算字段是可以索引的,需要滿足的條件如下:

            a、計(jì)算字段的表達(dá)是確定的

            b、不能用在TEXT,Ntext,Image數(shù)據(jù)類型

            c、必須配制如下選項(xiàng)?ANSI_NULLS?=?ON,?ANSI_PADDINGS?=?ON,?…….

            41、盡量將數(shù)據(jù)的處理工作放在服務(wù)器上,減少網(wǎng)絡(luò)的開銷,如使用存儲(chǔ)過程。存儲(chǔ)過程是編譯好、優(yōu)化過、并且被組織到一個(gè)執(zhí)行規(guī)劃里、且存儲(chǔ)在數(shù)據(jù)庫中的SQL語句,是控制流語言的集合,速度當(dāng)然快。反復(fù)執(zhí)行的動(dòng)態(tài)SQL,可以使用臨時(shí)存儲(chǔ)過程,該過程(臨時(shí)表)被放在Tempdb中。以前由于SQL?SERVER對(duì)復(fù)雜的數(shù)學(xué)計(jì)算不支持,所以不得不將這個(gè)工作放在其他的層上而增加網(wǎng)絡(luò)的開銷。SQL2000支持UDFs,現(xiàn)在支持復(fù)雜的數(shù)學(xué)計(jì)算,函數(shù)的返回值不要太大,這樣的開銷很大。用戶自定義函數(shù)象光標(biāo)一樣執(zhí)行的消耗大量的資源,如果返回大的結(jié)果采用存儲(chǔ)過程

            42、不要在一句話里再三的使用相同的函數(shù),浪費(fèi)資源,將結(jié)果放在變量里再調(diào)用更快

            43、Select?COUNT(*)的效率教低,盡量變通他的寫法,而EXISTS快.同時(shí)請(qǐng)注意區(qū)別:?select?count(Field?of?null)?from?Table?和?select?count(Field?of?NOT?null)?from?Table?的返回值是不同的!!!

            44、當(dāng)服務(wù)器的內(nèi)存夠多時(shí),配制線程數(shù)量?=?最大連接數(shù)+5,這樣能發(fā)揮最大的效率;否則使用?配制線程數(shù)量<最大連接數(shù)啟用SQL?SERVER的線程池來解決,如果還是數(shù)量?=?最大連接數(shù)+5,嚴(yán)重的損害服務(wù)器的性能。

            45、按照一定的次序來訪問你的表。如果你先鎖住表A,再鎖住表B,那么在所有的存儲(chǔ)過程中都要按照這個(gè)順序來鎖定它們。如果你(不經(jīng)意的)某個(gè)存儲(chǔ)過程中先鎖定表B,再鎖定表A,這可能就會(huì)導(dǎo)致一個(gè)死鎖。如果鎖定順序沒有被預(yù)先詳細(xì)的設(shè)計(jì)好,死鎖很難被發(fā)現(xiàn)

            46、通過SQL?Server?Performance?Monitor監(jiān)視相應(yīng)硬件的負(fù)載?Memory:?Page?Faults?/?sec計(jì)數(shù)器如果該值偶爾走高,表明當(dāng)時(shí)有線程競(jìng)爭(zhēng)內(nèi)存。如果持續(xù)很高,則內(nèi)存可能是瓶頸。

            Process:

            1、%?DPC?Time?指在范例間隔期間處理器用在緩延程序調(diào)用(DPC)接收和提供服務(wù)的百分比。(DPC?正在運(yùn)行的為比標(biāo)準(zhǔn)間隔優(yōu)先權(quán)低的間隔)。?由于?DPC?是以特權(quán)模式執(zhí)行的,DPC?時(shí)間的百分比為特權(quán)時(shí)間百分比的一部分。這些時(shí)間單獨(dú)計(jì)算并且不屬于間隔計(jì)算總數(shù)的一部?分。這個(gè)總數(shù)顯示了作為實(shí)例時(shí)間百分比的平均忙時(shí)。

            2、%Processor?Time計(jì)數(shù)器 如果該參數(shù)值持續(xù)超過95%,表明瓶頸是CPU。可以考慮增加一個(gè)處理器或換一個(gè)更快的處理器。

            3、%?Privileged?Time?指非閑置處理器時(shí)間用于特權(quán)模式的百分比。(特權(quán)模式是為操作系統(tǒng)組件和操縱硬件驅(qū)動(dòng)程序而設(shè)計(jì)的一種處理模式。它允許直接訪問硬件和所有內(nèi)存。另一種模式為用戶模式,它是一種為應(yīng)用程序、環(huán)境分系統(tǒng)和整數(shù)分系統(tǒng)設(shè)計(jì)的一種有限處理模式。操作系統(tǒng)將應(yīng)用程序線程轉(zhuǎn)換成特權(quán)模式以訪問操作系統(tǒng)服務(wù))。特權(quán)時(shí)間的?%?包括為間斷和?DPC?提供服務(wù)的時(shí)間。特權(quán)時(shí)間比率高可能是由于失敗設(shè)備產(chǎn)生的大數(shù)量的間隔而引起的。這個(gè)計(jì)數(shù)器將平均忙時(shí)作為樣本時(shí)間的一部分顯示。

            4、%?User?Time表示耗費(fèi)CPU的數(shù)據(jù)庫操作,如排序,執(zhí)行aggregate?functions等。如果該值很高,可考慮增加索引,盡量使用簡(jiǎn)單的表聯(lián)接,水平分割大表格等方法來降低該值。?Physical?Disk:?Curretn?Disk?Queue?Length計(jì)數(shù)器該值應(yīng)不超過磁盤數(shù)的1.5~2倍。要提高性能,可增加磁盤。?SQLServer:Cache?Hit?Ratio計(jì)數(shù)器該值越高越好。如果持續(xù)低于80%,應(yīng)考慮增加內(nèi)存。?注意該參數(shù)值是從SQL?Server啟動(dòng)后,就一直累加記數(shù),所以運(yùn)行經(jīng)過一段時(shí)間后,該值將不能反映系統(tǒng)當(dāng)前值。

           47、分析select?emp_name?form?employee?where?salary?>?3000?在此語句中若salary是Float類型的,則優(yōu)化器對(duì)其進(jìn)行優(yōu)化為Convert(float,3000),因?yàn)?000是個(gè)整數(shù),我們應(yīng)在編程時(shí)使用3000.0而不要等運(yùn)行時(shí)讓DBMS進(jìn)行轉(zhuǎn)化。同樣字符和整型數(shù)據(jù)的轉(zhuǎn)換。

          48、
           


            49、

            (1)IF?沒有
          輸入負(fù)責(zé)人代碼?THEN?code1=0?code2=9999?ELSE?code1=code2=負(fù)責(zé)人代碼?END?IF?執(zhí)行SQL語句為:?Select?負(fù)責(zé)人名?FROM?P2000?Where?負(fù)責(zé)人代碼>=:code1?AND負(fù)責(zé)人代碼?<=:code2

            (2)IF?沒有輸入負(fù)責(zé)人代碼?THEN? Select?負(fù)責(zé)人名?FROM?P2000?ELSE?code=?負(fù)責(zé)人代碼?Select?負(fù)責(zé)人代碼?FROM?P2000?Where?負(fù)責(zé)人代碼=:code?END?IF?第一種方法只用了一條SQL語句,第二種方法用了兩條SQL語句。在沒有輸入負(fù)責(zé)人代碼時(shí),第二種方法顯然比第一種方法執(zhí)行效率高,因?yàn)樗鼪]有限制條件;?在輸入了負(fù)責(zé)人代碼時(shí),第二種方法仍然比第一種方法效率高,不僅是少了一個(gè)限制條件,還因相等運(yùn)算是最快的查詢運(yùn)算。我們寫程序不要怕麻煩

            50、關(guān)于JOBCN現(xiàn)在查詢分頁的新方法(如下),用性能優(yōu)化器分析性能的瓶頸,如果在I/O或者網(wǎng)絡(luò)的速度上,如下的方法優(yōu)化切實(shí)有效,如果在CPU或者內(nèi)存上,用現(xiàn)在的方法更好。請(qǐng)區(qū)分如下的方法,說明索引越小越好。

            ?  begin?
            
            DECLARE?@local_variable?table?(FID?int?identity(1,1),ReferenceID?varchar(20))?
            
            insert?into?@local_variable?(ReferenceID)?
            
            select?top?100000?ReferenceID?from?chineseresume?order?by?ReferenceID?
            
            select?*?from?@local_variable?where?Fid?>?40?and?fid?<=?60?
            
            end?和?
            
            begin?
            
            DECLARE?@local_variable?table?(FID?int?identity(1,1),ReferenceID?varchar(20))?
            
            insert?into?@local_variable?(ReferenceID)?
            
            select?top?100000?ReferenceID?from?chineseresume?order?by?updatedate?
            
            select?*?from?@local_variable?where?Fid?>?40?and?fid?<=?60?
            
            end?的不同?
            
            begin?
            
            create?table?#temp?(FID?int?identity(1,1),ReferenceID?varchar(20))?
            
            insert?into?#temp?(ReferenceID)?
            
            select?top?100000?ReferenceID?from?chineseresume?order?by?updatedate?
            
            select?*?from?#temp?where?Fid?>?40?and?fid?<=?60?drop?table?#temp?
            
            end?

           另附:存儲(chǔ)過程編寫經(jīng)驗(yàn)和優(yōu)化措施?From:網(wǎng)頁教學(xué)網(wǎng)

            一、適合讀者對(duì)象:數(shù)據(jù)庫開發(fā)程序員,數(shù)據(jù)庫的數(shù)據(jù)量很多,涉及到對(duì)SP(存儲(chǔ)過程)的優(yōu)化的項(xiàng)目開發(fā)人員,對(duì)數(shù)據(jù)庫有濃厚興趣的人。

            二、介紹:在數(shù)據(jù)庫的開發(fā)過程中,經(jīng)常會(huì)遇到復(fù)雜的業(yè)務(wù)邏輯和對(duì)數(shù)據(jù)庫的操作,這個(gè)時(shí)候就會(huì)用SP來封裝數(shù)據(jù)庫操作。如果項(xiàng)目的SP較多,書寫又沒有一定的規(guī)范,將會(huì)影響以后的系統(tǒng)維護(hù)困難和大SP邏輯的難以理解,另外如果數(shù)據(jù)庫的數(shù)據(jù)量大或者項(xiàng)目對(duì)SP的性能要求很,就會(huì)遇到優(yōu)化的問題,否則速度有可能很慢,經(jīng)過親身經(jīng)驗(yàn),一個(gè)經(jīng)過優(yōu)化過的SP要比一個(gè)性能差的SP的效率甚至高幾百倍。

            三、內(nèi)容:

            1、開發(fā)人員如果用到其他庫的Table或View,務(wù)必在當(dāng)前庫中建立View來實(shí)現(xiàn)跨庫操作,最好不要直接使用“databse.dbo.table_name”,因?yàn)閟p_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗(yàn)。

            2、開發(fā)人員在提交SP前,必須已經(jīng)使用set?showplan?on分析過查詢計(jì)劃,做過自身的查詢優(yōu)化檢查。

            3、高程序運(yùn)行效率,優(yōu)化應(yīng)用程序,在SP編寫過程中應(yīng)該注意以下幾點(diǎn):

            a)SQL的使用規(guī)范:

            i. 盡量避免大事務(wù)操作,慎用holdlock子句,提高系統(tǒng)并發(fā)能力。

            ii. 盡量避免反復(fù)訪問同一張或幾張表,尤其是數(shù)據(jù)量較大的表,可以考慮先根據(jù)條件提取數(shù)據(jù)到臨時(shí)表中,然后再做連接。

            iii. 盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過1萬行,那么就應(yīng)該改寫;如果使用了游標(biāo),就要盡量避免在游標(biāo)循環(huán)中再進(jìn)行表連接的操作。

            iv. 注意where字句寫法,必須考慮語句順序,應(yīng)該根據(jù)索引順序、范圍大小來確定條件子句的前后順序,盡可能的讓字段順序與索引順序相一致,范圍從大到小。

            v. 不要在where子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無法正確使用索引。

            vi. 盡量使用exists代替select?count(1)來判斷是否存在記錄,count函數(shù)只有在統(tǒng)計(jì)表中所有行數(shù)時(shí)使用,而且count(1)比count(*)更有效率。

            vii. 盡量使用“>=”,不要使用“>”。

            viii. 注意一些or子句和union子句之間的替換

            ix. 注意表之間連接的數(shù)據(jù)類型,避免不同類型數(shù)據(jù)之間的連接。

            x. 注意存儲(chǔ)過程中參數(shù)和數(shù)據(jù)類型的關(guān)系。

            xi. 注意insert、update操作的數(shù)據(jù)量,防止與其他應(yīng)用沖突。如果數(shù)據(jù)量超過200個(gè)數(shù)據(jù)頁面(400k),那么系統(tǒng)將會(huì)進(jìn)行鎖升級(jí),頁級(jí)鎖會(huì)升級(jí)成表級(jí)鎖。

            b)索引的使用規(guī)范:

            i. 索引的創(chuàng)建要與應(yīng)用結(jié)合考慮,建議大的OLTP表不要超過6個(gè)索引。

            ii. 盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時(shí)可以通過index?index_name來強(qiáng)制指定索引

            iii. 避免對(duì)大表查詢時(shí)進(jìn)行table?scan,必要時(shí)考慮新建索引。

            iv. 在使用索引字段作為條件時(shí),如果該索引是聯(lián)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會(huì)被使用。

            v. 要注意索引的維護(hù),周期性重建索引,重新編譯存儲(chǔ)過程。

            c)tempdb的使用規(guī)范:

            i. 盡量避免使用distinct、order?by、group?by、having、join、cumpute,因?yàn)檫@些語句會(huì)加重tempdb的負(fù)擔(dān)。

            ii. 避免頻繁創(chuàng)建和刪除臨時(shí)表,減少系統(tǒng)表資源的消耗。

            iii. 在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用select?into代替create?table,避免log,提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,建議先create?table,然后insert。

            iv. 如果臨時(shí)表的數(shù)據(jù)量較大,需要建立索引,那么應(yīng)該將創(chuàng)建臨時(shí)表和建立索引的過程放在單獨(dú)一個(gè)子存儲(chǔ)過程中,這樣才能保證系統(tǒng)能夠很好的使用到該臨時(shí)表的索引。

            v. 如果使用到了臨時(shí)表,在存儲(chǔ)過程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先truncate?table,然后drop?table,這樣可以避免系統(tǒng)表的較長(zhǎng)時(shí)間鎖定。

            vi. 慎用大的臨時(shí)表與其他大表的連接查詢和修改,減低系統(tǒng)表負(fù)擔(dān),因?yàn)檫@種操作會(huì)在一條語句中多次使用tempdb的系統(tǒng)表。

            d)合理的算法使用:

            根據(jù)上面已提到的SQL優(yōu)化技術(shù)和ASE?Tuning手冊(cè)中的SQL優(yōu)化內(nèi)容,結(jié)合實(shí)際應(yīng)用,采用多種算法進(jìn)行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調(diào)優(yōu)命令:set?statistics?io?on,?set?statistics?time?on?,?set?showplan?on?等。?

          ?

          ?






          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 皋兰县| 赣榆县| 津南区| 航空| 大港区| 衡南县| 宁河县| 富锦市| 望城县| 平江县| 慈利县| 张家界市| 民丰县| 云龙县| 阳西县| 邓州市| 黑河市| 特克斯县| 榆树市| 天水市| 麟游县| 潮州市| 根河市| 图木舒克市| 安阳市| 上杭县| 彩票| 华宁县| 定陶县| 阜城县| 灵台县| 凌海市| 泸溪县| 昌都县| 峡江县| 罗定市| 乐山市| 毕节市| 台湾省| 神木县| 巩留县|