日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server数据库优化方案

發(fā)布時間:2023/12/9 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server数据库优化方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
SQL Server數(shù)據(jù)庫優(yōu)化方案 查詢速度慢的原因很多,常見如下幾種:

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

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

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

  4、內(nèi)存不足

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

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

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

  8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。

  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、升級硬件

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

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

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

  7、增加服務(wù)器?CPU個數(shù);但是必須明白并行處理串行處理更需要資源例如內(nèi)存。使用并行還是串行程是MsSQL自動評估選擇的。單個任務(wù)分解成多個任務(wù),就可以在處理器上運行。例如耽擱查詢的排序、連接、掃描和GROUP?BY字句同時執(zhí)行,SQL?SERVER根據(jù)系統(tǒng)的負載情況決定最優(yōu)的并行等級,復(fù)雜的需要消耗大量的CPU的查詢最適合并行處理。但是更新操作Update,Insert,?Delete還不能并行處理。

  8、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。?like?'a%'?使用索引?like?'%a'?不使用索引用?like?'%a%'?查詢時,查詢耗時和字段值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對于字段的值很長的建全文索引。

  9、DB?Server?和APPLication?Server?分離;OLTP和OLAP分離

  10、分布式分區(qū)視圖可用于實現(xiàn)數(shù)據(jù)庫服務(wù)器聯(lián)合體。聯(lián)合體是一組分開管理的服務(wù)器,但它們相互協(xié)作分擔(dān)系統(tǒng)的處理負荷。這種通過分區(qū)數(shù)據(jù)形成數(shù)據(jù)庫服務(wù)器聯(lián)合體的機制能夠擴大一組服務(wù)器,以支持大型的多層?Web?站點的處理需要。有關(guān)更多信息,參見設(shè)計聯(lián)合數(shù)據(jù)庫服務(wù)器。(參照SQL幫助文件'分區(qū)視圖')

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

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

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

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

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

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

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

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

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

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

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

  15、盡可能不使用光標,它占用大量的資源。如果需要row-by-row地執(zhí)行,盡量采用非光標技術(shù),如:在客戶端循環(huán),用臨時表,Table變量,用子查詢,用Case語句等等。游標可以按照它所支持的提取選項進行分類:?只進?必須按照從第一行到最后一行的順序提取行。FETCH?NEXT?是唯一允許的提取操作,也是默認方式。可滾動性可以在游標中任何地方隨機提取任意行。游標的技術(shù)在SQL2000下變得功能很強大,他的目的是支持循環(huán)。有四個并發(fā)選項?READ_ONLY:不允許通過游標定位更新(Update),且在組成結(jié)果集的行中沒有鎖。?OPTIMISTIC?WITH?valueS:樂觀并發(fā)控制是事務(wù)控制理論的一個標準部分。樂觀并發(fā)控制用于這樣的情形,即在打開游標及更新行的間隔中,只有很小的機會讓第二個用戶更新某一行。當(dāng)某個游標以此選項打開時,沒有鎖控制其中的行,這將有助于最大化其處理能力。如果用戶試圖修改某一行,則此行的當(dāng)前值會與最后一次提取此行時獲取的值進行比較。如果任何值發(fā)生改變,則服務(wù)器就會知道其他人已更新了此行,并會返回一個錯誤。如果值是一樣的,服務(wù)器就執(zhí)行修改。選擇這個并發(fā)選項OPTIMISTIC?WITH?ROW?VERSIONING:此樂觀并發(fā)控制選項基于行版本控制。使用行版本控制,其中的表必須具有某種版本標識符,服務(wù)器可用它來確定該行在讀入游標后是否有所更改。在?SQL?Server?中,這個性能由?timestamp?數(shù)據(jù)類型提供,它是一個二進制數(shù)字,表示數(shù)據(jù)庫中更改的相對順序。每個數(shù)據(jù)庫都有一個全局當(dāng)前時間戳值:@@DBTS。每次以任何方式更改帶有?timestamp?列的行時,SQL?Server?先在時間戳列中存儲當(dāng)前的?@@DBTS?值,然后增加?@@DBTS?的值。如果某?個表具有?timestamp?列,則時間戳?xí)挥浀叫屑墶7?wù)器就可以比較某行的當(dāng)前時間戳值和上次提取時所存儲的時間戳值,從而確定該行是否已更新。服務(wù)器不必比較所有列的值,只需比較?timestamp?列即可。如果應(yīng)用程序?qū)]有?timestamp?列的表要求基于行版本控制的樂觀并發(fā),則游標默認為基于數(shù)值的樂觀并發(fā)控制。?SCROLL?LOCKS?這個選項實現(xiàn)悲觀并發(fā)控制。在悲觀并發(fā)控制中,在把數(shù)據(jù)庫的行讀入游標結(jié)果集時,應(yīng)用程序?qū)⒃噲D鎖定數(shù)據(jù)庫行。在使用服務(wù)器游標時,將行讀入游標時會在其上放置一個更新鎖。如果在事務(wù)內(nèi)打開游標,則該事務(wù)更新鎖將一直保持到事務(wù)被提交或回滾;當(dāng)提取下一行時,將除去游標鎖。如果在事務(wù)外打開游標,則提取下一行時,鎖就被丟棄。因此,每當(dāng)用戶需要完全的悲觀并發(fā)控制時,游標都應(yīng)在事務(wù)內(nèi)打開。更新鎖將阻止任何其它任務(wù)獲取更新鎖或排它鎖,從而阻止其它任務(wù)更新該行。然而,更新鎖并不阻止共享鎖,所以它不會阻止其它任務(wù)讀取行,除非第二個任務(wù)也在要求帶更新鎖的讀取。滾動鎖根據(jù)在游標定義的?Select?語句中指定的鎖提示,這些游標并發(fā)選項可以生成滾動鎖。滾動鎖在提取時在每行上獲取,并保持到下次提取或者游標關(guān)閉,以先發(fā)生者為準。下次提取時,服務(wù)器為新提取中的行獲取滾動鎖,并釋放上次提取中行的滾動鎖。滾動鎖獨立于事務(wù)鎖,并可以保持到一個提交或回滾操作之后。如果提交時關(guān)閉游標的選項為關(guān),則?COMMIT?語句并不關(guān)閉任何打開的游標,而且滾動鎖被保留到提交之后,以維護對所提取數(shù)據(jù)的隔離。所獲取滾動鎖的類型取決于游標并發(fā)選項和游標?Select?語句中的鎖提示。鎖提示?只讀?樂觀數(shù)值?樂觀行版本控制?鎖定無提示?未鎖定?未鎖定?未鎖定?更新?NOLOCK?未鎖定?未鎖定未鎖定?未鎖定?HOLDLOCK?共享?共享?共享?更新?UPDLOCK?錯誤?更新?更新?更新?TABLOCKX?錯誤?未鎖定?未鎖定更新其它?未鎖定?未鎖定?未鎖定?更新?*指定?NOLOCK?提示將使指定了該提示的表在游標內(nèi)是只讀的。

  16、用Profiler來跟蹤查詢,得到查詢所需的時間,找出SQL的問題所在;用索引優(yōu)化器優(yōu)化索引

  17、注意UNion和UNion?all?的區(qū)別。UNION?all好

  18、注意使用DISTINCT,在沒有必要時不要用,它同UNION一樣會使查詢變慢。重復(fù)的記錄在查詢里是沒有問題的

  19、查詢時不要返回不需要的行、列

  20、用sp_configure?'query?governor?cost?limit'或者SET?QUERY_GOVERNOR_COST_LIMIT來限制查詢消耗的資源。當(dāng)評估查詢消耗的資源超出限制時,服務(wù)器自動取消查詢,在查詢之前就扼殺掉。?SET?LOCKTIME設(shè)置鎖的時間

  21、用select?top?100?/?10?Percent?來限制用戶返回的行數(shù)或者SET?ROWCOUNT來限制操作的行

  22、在SQL2000以前,一般不要用如下的字句:?"IS?NULL",?"<>",?"!=",?"!>",?"!<",?"NOT",?"NOT?EXISTS",?"NOT?IN",?"NOT?LIKE",?and?"LIKE?'%500'",因為他們不走索引全是表掃描。也不要在Where字句中的列名加函數(shù),如Convert,substring等,如果必須用函數(shù)的時候,創(chuàng)建計算列再創(chuàng)建索引來替代.還可以變通寫法:Where?SUBSTRING(firstname,1,1)?=?'m'改為Where?firstname?like?'m%'(索引掃描),一定要將函數(shù)和列名分開。并且索引不能建得太多和太大。NOT?IN會多次掃描表,使用EXISTS、NOT?EXISTS?,IN?,?LEFT?OUTER?JOIN?來替代,特別是左連接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,現(xiàn)在2000的優(yōu)化器能夠處理了。相同的是IS?NULL,"NOT",?"NOT?EXISTS",?"NOT?IN"能優(yōu)化她,而"<>"等還是不能優(yōu)化,用不到索引。

  23、使用Query?Analyzer,查看SQL語句的查詢計劃和評估分析是否是優(yōu)化的SQL。一般的20%的代碼占據(jù)了80%的資源,我們優(yōu)化的重點是這些慢的地方。

  24、如果使用了IN或者OR等時發(fā)現(xiàn)查詢沒有走索引,使用顯示申明指定索引:?Select?*?FROM?PersonMember?(INDEX?=?IX_Title)?Where?processid?IN?('男','女')

  25、將需要查詢的結(jié)果預(yù)先計算好放在表中,查詢的時候再Select。這在SQL7.0以前是最重要的手段。例如醫(yī)院的住院費計算。

  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是否)。因為這樣應(yīng)用程序首先將二進制值轉(zhuǎn)換成字符串(尺寸是它的兩倍),服務(wù)器受到字符后又將他轉(zhuǎn)換成二進制值.存儲過程就沒有這些動作:?方法: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?連接多個查詢。他們的速度只同是否使用索引有關(guān),如果查詢需要用到聯(lián)合索引,用UNION?all執(zhí)行的效率更高.多個OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個關(guān)鍵的問題是否用到索引。

  33、盡量少用視圖,它的效率低。對視圖操作比直接對表操作慢,可以用stored?procedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務(wù)器上的被優(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、當(dāng)用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í)行順序應(yīng)該如下最優(yōu):select?的Where字句選擇所有合適的行,Group?By用來分組個統(tǒng)計行,Having字句用來剔除多余的分組。這樣Group?By?個Having的開銷小,查詢快.對于大的數(shù)據(jù)行進行分組和Having十分消耗資源。如果Group?BY的目的不包括計算,只是分組,那么用Distinct更快

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

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

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

  a、計算字段的表達是確定的

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

  c、必須配制如下選項?ANSI_NULLS?=?ON,?ANSI_PADDINGS?=?ON,?…….

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

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

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

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

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

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

  Process:

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

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

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

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

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

  48、查詢的關(guān)聯(lián)同寫的順序

  ?  select?a.personMemberID,?*?from?chineseresume?a,personmember?b?where?personMemberID?=?b.referenceid?and?a.personMemberID?=?'JCNPRH39681'?(A?=?B?,B?=?'號碼')?
  
  select?a.personMemberID,?*?from?chineseresume?a,personmember?b?where?a.personMemberID?=?b.referenceid?and?a.personMemberID?=?'JCNPRH39681'?and?b.referenceid?=?'JCNPRH39681'?(A?=?B?,B?=?'號碼',?A?=?'號碼')?
  
  select?a.personMemberID,?*?from?chineseresume?a,personmember?b?where?b.referenceid?=?'JCNPRH39681'?and?a.personMemberID?=?'JCNPRH39681'?(B?=?'號碼',?A?=?'號碼')?


  49、

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

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

  50、關(guān)于JOBCN現(xiàn)在查詢分頁的新方法(如下),用性能優(yōu)化器分析性能的瓶頸,如果在I/O或者網(wǎng)絡(luò)的速度上,如下的方法優(yōu)化切實有效,如果在CPU或者內(nèi)存上,用現(xiàn)在的方法更好。請區(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?

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

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

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

  三、內(nèi)容:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  iii. 避免對大表查詢時進行table?scan,必要時考慮新建索引。

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

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

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

  i. 盡量避免使用distinct、order?by、group?by、having、join、cumpute,因為這些語句會加重tempdb的負擔(dān)。

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

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

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

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

  vi. 慎用大的臨時表與其他大表的連接查詢和修改,減低系統(tǒng)表負擔(dān),因為這種操作會在一條語句中多次使用tempdb的系統(tǒng)表。

  d)合理的算法使用:

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

轉(zhuǎn)載于:https://www.cnblogs.com/erichzhou/archive/2007/04/05/700855.html

總結(jié)

以上是生活随笔為你收集整理的SQL Server数据库优化方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。