快消品貨源批發(fā)市場
快消品貨源分銷平臺
 
 
當(dāng)前位置: 貨源批發(fā)網(wǎng) » 網(wǎng)商學(xué)院 » 獨(dú)立商城 » 提高asp程序訪問速度的方法及SQL Server數(shù)據(jù)庫查詢速度慢的原因和解決方法

提高asp程序訪問速度的方法及SQL Server數(shù)據(jù)庫查詢速度慢的原因和解決方法

放大字體  縮小字體 發(fā)布日期:2024-11-20 07:20:16  來源:電商聯(lián)盟  作者:樂發(fā)網(wǎng)  瀏覽次數(shù):4

這是由于access對于數(shù)據(jù)的處理已經(jīng)過加工和優(yōu)化。
轉(zhuǎn)換成SQL后,速度變慢很可能時(shí)因?yàn)闆]有很好的處理分頁問題引起的,即每次讀取的數(shù)據(jù)量過大。每頁需顯示多少,則只從數(shù)據(jù)庫讀取多少條記錄,而不是一次讀取20W+的數(shù)據(jù)量。
比如每頁顯示100條數(shù)據(jù),按ID降序排列顯示,則:

第1頁的SQL語句select top 100 * from TABLE order by ID DESC

第2頁的SQL語句select top 200 * from TABLE where ID NOT IN(select top 100 * from TABLE order by ID DESC) order by ID DESC

第3頁的SQL語句select top 300 * from TABLE where ID NOT IN(select top 200 * from TABLE order by ID DESC) order by ID DESC
...
第N頁的SQL語句select top 100*N * from TABLE where ID NOT IN(select top (N-1)*100 * from TABLE order by ID DESC) order by ID DESC

如果寫成存儲過程,性能更佳。

用asp程序進(jìn)行網(wǎng)頁制作,大多因?yàn)樾枰L問數(shù)據(jù)庫,然后再將數(shù)據(jù)顯示到頁面,如果數(shù)據(jù)很多的話,頁面的訪問速度也就變慢了,為了解決這個(gè)問題,可以用以下技巧來提高頁面訪問速度。
技巧之一:提高使用Request集合的效率
訪問一個(gè)ASP集合來提取一個(gè)值是費(fèi)時(shí)的、占用計(jì)算資源的過程。因?yàn)檫@個(gè)操作包含了一系列對相關(guān)集合的搜索,這比訪問一個(gè)局部變量要慢得多。因此,如果打算在頁面中多次使用Request集合中的一個(gè)值,應(yīng)該考慮將其存貯為一個(gè)局部變量。
例如將代碼寫成下面的形式以加快腳本引擎處理速度:
strTitle=Request.Form("Title")
strFirstName=Request.Form("FirstName")
strLastName=Request.Form("LastName")
If Len(strTitle) Then strTitle=strTitle & " "
If strFirstName="" Then strFullName=strTitle & " " & strLastName
Elseif Len(strFirstName)=1 Then
strFullName=strTitle & strFirstName & ". " & strLastName
Else
strFullName=strTitle & strFirstName & " " & strLastName
End If

技巧之二:直接訪問適當(dāng)?shù)募?br /> 如果不是別無選擇,否則不要使用strPage=Request("page")的這樣的形式來獲取參數(shù),因?yàn)檫@將按順序搜索全部的集合—QueryString、Form、cookies、ClientCertificate、ServerVarible直到發(fā)現(xiàn)第一個(gè)匹配值的名稱。這樣做比直接訪問適當(dāng)?shù)募闲实?,并且是不安全的,除非能絕對保證這個(gè)值不會出現(xiàn)在另外一個(gè)集合中。
例如,可能希望搜索滿足客戶請求的WEB服務(wù)器名稱,這通過出現(xiàn)在每個(gè)查詢中的Request.ServerVarables集合中尋找“SERVER_NAME”來實(shí)現(xiàn)。然而,假如其他的集合也包含名為“SERVER_NAME”的值(鍵名不區(qū)分大小寫),當(dāng)使用Request("server_Name")時(shí),就會得到錯(cuò)誤的結(jié)果??偠灾瑧?yīng)盡可能直接訪問適當(dāng)?shù)募稀?

技巧之三:在費(fèi)時(shí)操作前使用Response.IsClientConnected屬性
使用Response.IsClientConnected是觀察用戶是否仍連到服務(wù)器并正在載入ASP創(chuàng)建的網(wǎng)頁的有用方式。如果用戶斷開連接或停止下載,我們就不用再浪費(fèi)服務(wù)器的資源創(chuàng)建網(wǎng)頁,因?yàn)榫彌_區(qū)內(nèi)容將被IIS丟棄。所以,對那些需要大量時(shí)間計(jì)算或資源使用較多的網(wǎng)頁來說,值得在每一階段都檢查游覽者是否已離線:

If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If

技巧之四:優(yōu)化ASP中的ADO操作
通常面言,數(shù)據(jù)構(gòu)成了WEB站點(diǎn)的實(shí)際內(nèi)容。所以,優(yōu)化ADO操作以加速ASP代碼執(zhí)行,十分有用:
a. 僅選擇所需的列:當(dāng)打開ADO記錄集時(shí),除非需要獲得所有的列,否則不應(yīng)自動地使用表名(即SELECt *)。使用單獨(dú)的列意味著將減少發(fā)送到服務(wù)器或從服務(wù)器取出的數(shù)據(jù)量。即使需要使用全部列,單獨(dú)地命名每個(gè)列也會獲得最佳的性能,因?yàn)榉?wù)器不必再解釋這些列的名字。
b. 盡可能的使用存儲過程。存儲過程是預(yù)先編譯的程序,含有一個(gè)已經(jīng)準(zhǔn)備好的執(zhí)行計(jì)劃,所以比SQL語句執(zhí)行更快。
c. 使用適當(dāng)?shù)墓鈽?biāo)和鎖定模式。如果所做的全部工作只是從記錄集中讀取數(shù)據(jù),并將其顯示在屏幕上,那么就使用缺省的只能前移、只讀的記錄集。ADO用來維護(hù)記錄和鎖定的細(xì)節(jié)的工作越少,執(zhí)行的性能就越高。
d. 使用對象變量。當(dāng)遍歷記錄集時(shí)一個(gè)肯定能提高性能的方法是使用對象變量指向集合中的成員。例如:

While Not RsGc.EOF
Response.Write "工程名稱:" & RsGc("GcMC") & "(工程代碼:" & RsGc("GcCode") & ")
"
RsGc.MoveNext
Wend

可以用改寫為下面的代碼以加快執(zhí)行:

set GcMc=RsGc("GcMc")
set GcCode=RsGc("GcCode")
While Not rsGc.EOF Response.Write "工程名稱:" & GcMc & "(工程代碼:" & GcCode & ")
" RsGc.MoveNext
Wend

新的代碼建立了對象變量的引用,所以可以使用對象變量而不是實(shí)際的變量,這意味著腳本引擎的工作減少了,因?yàn)樵诩现羞M(jìn)行索引的次數(shù)變少了。
技巧五:不要混用腳本引擎

我們知道,ASP頁面中既可以使用VBscript,也可以使用Jscript。但是在同一個(gè)頁面上同時(shí)使用Jscript和VBscript則是不可取的。因?yàn)榉?wù)器必須實(shí)例化并嘗試緩存兩個(gè)(而不是一個(gè))腳本引擎,這在一定程度上增加了系統(tǒng)負(fù)擔(dān)。因此,從性能上考慮,不應(yīng)在同一頁面中混用多種腳本引擎。
大家可以試試,通過以上方法可有效提高ASP頁面的打開速度。

SQL Server數(shù)據(jù)庫查詢速度慢的原因有很多,常見的有以下幾種:
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,活動的用戶查看,原因是讀寫競爭資源。
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)(最好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小的列建索引好(參照索引的創(chuàng)建),不要對有限的幾個(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 Server max server memory服務(wù)器配置選項(xiàng)配置為物理內(nèi)存的1.5倍(虛擬內(nèi)存大小設(shè)置的一半)。
7、增加服務(wù)器CPU個(gè)數(shù);但是必須明白并行處理串行處理更需要資源例如內(nèi)存。使用并行還是串行程是MsSQL自動評估選擇的。單個(gè)任務(wù)分解成多個(gè)任務(wù),就可以在處理器上運(yùn)行。例如耽擱查詢的排序、連接、掃描和GROUP BY字句同時(shí)執(zhí)行,SQL SERVER根據(jù)系統(tǒng)的負(fù)載情況決定最優(yōu)的并行等級,復(fù)雜的需要消耗大量的CPU的查詢最適合并行處理。但是更新操作 UPDATE,INSERT,DELETE還不能并行處理。
8、如果是使用like進(jìn)行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查詢時(shí),查詢耗時(shí)和字段值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對于字段的值很長的建全文索引。
9、DB Server和APPLication Server 分離;OLTP和OLAP分離
10、分布式分區(qū)視圖可用于實(shí)現(xiàn)數(shù)據(jù)庫服務(wù)器聯(lián)合體。
聯(lián)合體是一組分開管理的服務(wù)器,但它們相互協(xié)作分擔(dān)系統(tǒng)的處理負(fù)荷。這種通過分區(qū)數(shù)據(jù)形成數(shù)據(jù)庫服務(wù)器聯(lián)合體的機(jī)制能夠擴(kuò)大一組服務(wù)器,以支持大型的多層 Web 站點(diǎn)的處理需要。有關(guān)更多信息,參見設(shè)計(jì)聯(lián)合數(shù)據(jù)庫服務(wù)器。
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ù)的位置對應(yīng)用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收縮數(shù)據(jù)和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 設(shè)置自動收縮日志.對于大的數(shù)據(jù)庫不要設(shè)置數(shù)據(jù)庫自動增長,它會降低服務(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)前的事物,沒有必要在動態(tài)SQL里寫事物,如果要寫請寫在外面如:begin tran exec(@s) commit trans或者將動態(tài)SQL 寫成函數(shù)或者存儲過程。
13、在查詢Select語句中用Where字句限制返回的行數(shù),避免表掃描,如果返回不必要的數(shù)據(jù),浪費(fèi)了服務(wù)器的I/O資源,加重了網(wǎng)絡(luò)的負(fù)擔(dān)降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯(lián)接訪問表,后果嚴(yán)重。
14、SQL的注釋申明對執(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)方式??蓾L動性可以在游標(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ī)會讓第二個(gè)用戶更新某一行。當(dāng)某個(gè)游標(biāo)以此選項(xiàng)打開時(shí),沒有鎖控制其中的行,這將有助于最大化其處理能力。如果用戶試圖修改某一行,則此行的當(dāng)前值會與最后一次提取此行時(shí)獲取的值進(jìn)行比較。如果任何值發(fā)生改變,則服務(wù)器就會知道其他人已更新了此行,并會返回一個(gè)錯(cuò)誤。如果值是一樣的,服務(wù)器就執(zhí)行修改。
16、用Profiler來跟蹤查詢,得到查詢所需的時(shí)間,找出SQL的問題所在;用索引優(yōu)化器優(yōu)化索引

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

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

19、查詢時(shí)不要返回不需要的行、列

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

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

22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE 'P0'",因?yàn)樗麄儾蛔咚饕潜頀呙?。也不要在Where字句中的列名加函數(shù),如Convert,substring等,如果必須用函數(shù)的時(shí)候,創(chuàng)建計(jì)算列再創(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語句的查詢計(jì)劃和評估分析是否是優(yōu)化的SQL。一般的20%的代碼占據(jù)了80%的資源,我們優(yōu)化的重點(diǎn)是這些慢的地方。

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

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

26、MIN() 和 MAX()能使用到合適的索引。

27、數(shù)據(jù)庫有一個(gè)原則是代碼離數(shù)據(jù)越近越好,所以優(yōu)先選擇Default,依次為Rules,Triggers, Constraint(約束如外健主健CheckUNIQUE……,數(shù)據(jù)類型的最大長度等等都是約束),Procedure.這樣不僅維護(hù)工作小,編寫程序質(zhì)量高,并且執(zhí)行的速度快。

28、如果要插入大的二進(jìn)制值到Image列,使用存儲過程,千萬不要用內(nèi)嵌Insert來插入(不知JAVA是否)。因?yàn)檫@樣應(yīng)用程序首先將二進(jìn)制值轉(zhuǎn)換成字符串(尺寸是它的兩倍),服務(wù)器受到字符后又將他轉(zhuǎn)換成二進(jìn)制值.存儲過程就沒有這些動作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前臺調(diào)用這個(gè)存儲過程傳入二進(jìn)制參數(shù),這樣處理速度明顯改善。

29、Between在某些時(shí)候比IN 速度更快,Between能夠更快地根據(jù)索引找到范圍。用查詢優(yōu)化器可見到差別。 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是一樣的。由于in會在比較多次,所以有時(shí)會慢些。

30、在必要是對全局或者局部臨時(shí)表創(chuàng)建索引,有時(shí)能夠提高速度,但不是一定會這樣,因?yàn)樗饕埠馁M(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、盡量少用視圖,它的效率低。對視圖操作比直接對表操作慢,可以用stored procedure來代替她。特別的是不要用視圖嵌套,嵌套視圖增加了尋找原始資料的難度。我們看視圖的本質(zhì):它是存放在服務(wù)器上的被優(yōu)化好了的已經(jīng)產(chǎn)生了查詢規(guī)劃的SQL。對單個(gè)表檢索數(shù)據(jù)時(shí),不要使用指向多個(gè)表的視圖,直接從表檢索或者僅僅包含這個(gè)表的視圖上讀,否則增加了不必要的開銷,查詢受到干擾.為了加快視圖的查詢,MsSQL增加了視圖索引的功能。

34、沒有必要時(shí)不要用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時(shí),它會鎖住系統(tǒng)表(sysobjects,sysindexes等等),阻塞其他的連接的存取。創(chuàng)建臨時(shí)表時(shí)用顯示申明語句,而不是 select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume where name = 'XYZ' --commit 在另一個(gè)連接中Select * from sysobjects可以看到 Select INTO 會鎖住系統(tǒng)表,Create table 也會鎖系統(tǒng)表(不管是臨時(shí)表還是系統(tǒng)表)。所以千萬不要在事物內(nèi)使用它?。?!這樣的話如果是經(jīng)常要用的臨時(shí)表請使用實(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的開銷小,查詢快.對于大的數(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ò)的開銷,如使用存儲過程。存儲過程是編譯好、優(yōu)化過、并且被組織到一個(gè)執(zhí)行規(guī)劃里、且存儲在數(shù)據(jù)庫中的SQL語句,是控制流語言的集合,速度當(dāng)然快。反復(fù)執(zhí)行的動態(tài)SQL,可以使用臨時(shí)存儲過程,該過程(臨時(shí)表)被放在Tempdb中。以前由于SQL SERVER對復(fù)雜的數(shù)學(xué)計(jì)算不支持,所以不得不將這個(gè)工作放在其他的層上而增加網(wǎng)絡(luò)的開銷。SQL2000支持UDFs,現(xiàn)在支持復(fù)雜的數(shù)學(xué)計(jì)算,函數(shù)的返回值不要太大,這樣的開銷很大。用戶自定義函數(shù)象光標(biāo)一樣執(zhí)行的消耗大量的資源,如果返回大的結(jié)果采用存儲過程

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

43、Select COUNT(*)的效率教低,盡量變通他的寫法,而EXISTS快.同時(shí)請注意區(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,那么在所有的存儲過程中都要按照這個(gè)順序來鎖定它們。如果你(不經(jīng)意的)某個(gè)存儲過程中先鎖定表B,再鎖定表A,這可能就會導(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í)有線程競爭內(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ū)動程序而設(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等。如果該值很高,可考慮增加索引,盡量使用簡單的表聯(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啟動后,就一直累加記數(shù),所以運(yùn)行經(jīng)過一段時(shí)間后,該值將不能反映系統(tǒng)當(dāng)前值。

47、分析select emp_name form employee where salary > 3000 在此語句中若salary是Float類型的,則優(yōu)化器對其進(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、查詢的關(guān)聯(lián)同寫的順序

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

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

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

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ū)分如下的方法,說明索引越小越好。

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àn)和優(yōu)化措施 From:網(wǎng)頁教學(xué)網(wǎng)
一、適合讀者對象:數(shù)據(jù)庫開發(fā)程序員,數(shù)據(jù)庫的數(shù)據(jù)量很多,涉及到對SP(存儲過程)的優(yōu)化的項(xiàng)目開發(fā)人員,對數(shù)據(jù)庫有濃厚興趣的人?!?br /> 二、介紹:在數(shù)據(jù)庫的開發(fā)過程中,經(jīng)常會遇到復(fù)雜的業(yè)務(wù)邏輯和對數(shù)據(jù)庫的操作,這個(gè)時(shí)候就會用SP來封裝數(shù)據(jù)庫操作。如果項(xiàng)目的SP較多,書寫又沒有一定的規(guī)范,將會影響以后的系統(tǒng)維護(hù)困難和大SP邏輯的難以理解,另外如果數(shù)據(jù)庫的數(shù)據(jù)量大或者項(xiàng)目對SP的性能要求很,就會遇到優(yōu)化的問題,否則速度有可能很慢,經(jīng)過親身經(jīng)驗(yàn),一個(gè)經(jīng)過優(yōu)化過的SP要比一個(gè)性能差的SP的效率甚至高幾百倍?!?br /> 三、內(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)?! ?br /> 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. 注意存儲過程中參數(shù)和數(shù)據(jù)類型的關(guān)系。
xi. 注意insert、update操作的數(shù)據(jù)量,防止與其他應(yīng)用沖突。如果數(shù)據(jù)量超過200個(gè)數(shù)據(jù)頁面(400k),那么系統(tǒng)將會進(jìn)行鎖升級,頁級鎖會升級成表級鎖。  
b)索引的使用規(guī)范:
i. 索引的創(chuàng)建要與應(yīng)用結(jié)合考慮,建議大的OLTP表不要超過6個(gè)索引。
ii. 盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時(shí)可以通過index index_name來強(qiáng)制指定索引
iii. 避免對大表查詢時(shí)進(jìn)行table scan,必要時(shí)考慮新建索引。
iv. 在使用索引字段作為條件時(shí),如果該索引是聯(lián)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護(hù),周期性重建索引,重新編譯存儲過程?! ?br /> c)tempdb的使用規(guī)范:
i. 盡量避免使用distinct、order by、group by、having、join、cumpute,因?yàn)檫@些語句會加重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è)子存儲過程中,這樣才能保證系統(tǒng)能夠很好的使用到該臨時(shí)表的索引。
v. 如果使用到了臨時(shí)表,在存儲過程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先truncate table,然后drop table,這樣可以避免系統(tǒng)表的較長時(shí)間鎖定。
vi. 慎用大的臨時(shí)表與其他大表的連接查詢和修改,減低系統(tǒng)表負(fù)擔(dān),因?yàn)檫@種操作會在一條語句中多次使用tempdb的系統(tǒng)表?! ?br /> d)合理的算法使用:   
根據(jù)上面已提到的SQL優(yōu)化技術(shù)和ASE Tuning手冊中的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 等。

樂發(fā)網(wǎng)超市批發(fā)網(wǎng)提供超市貨源信息,超市采購進(jìn)貨渠道。超市進(jìn)貨網(wǎng)提供成都食品批發(fā),日用百貨批發(fā)信息、微信淘寶網(wǎng)店超市采購信息和超市加盟信息.打造國內(nèi)超市采購商與批發(fā)市場供應(yīng)廠商搭建網(wǎng)上批發(fā)市場平臺,是全國批發(fā)市場行業(yè)中電子商務(wù)權(quán)威性網(wǎng)站。

本文內(nèi)容整合網(wǎng)站:百度百科、知乎淘寶平臺規(guī)則

本文來源: 提高asp程序訪問速度的方法及SQL Server數(shù)據(jù)庫查詢速度慢的原因和解決方法

分享與收藏:  網(wǎng)商學(xué)院搜索  告訴好友  關(guān)閉窗口  打印本文 本文關(guān)鍵字:
 
更多..資源下載
獨(dú)立商城圖文
獨(dú)立商城網(wǎng)商學(xué)院推薦
獨(dú)立商城點(diǎn)擊排行
 
手機(jī)版 手機(jī)掃描訪問
亚洲一级av,黑白配精品在线视频,欧美亚洲综合网站,高清在线无码不卡69 www.sucaiwu.net