詳解優(yōu)化SQL Server數(shù)據(jù)庫的方法(4)_Mssql數(shù)據(jù)庫教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:解決SQL Server無法打開用戶默認數(shù)據(jù)庫的問題無法打開用戶默認數(shù)據(jù)庫,登錄失敗,這是SQL Server使用者熟悉的問題之一。在使用企業(yè)管理器、查詢分析器、各類工具和應(yīng)用軟件的時候,只要關(guān)系到連接SQL Server數(shù)據(jù)庫的時候,都有可能會碰到此問題,引起此錯誤發(fā)生的原因比較多,下面我們就來詳細分析引起此問
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 = ’號碼’)
分享:揭秘優(yōu)化SQL Server數(shù)據(jù)庫查詢的方法文中,abigale代表查詢字符串,ada代表數(shù)據(jù)表名,alice代表字段名。 技巧一: 問題類型:ACCESS數(shù)據(jù)庫字段中含有日文片假名或其它不明字符時查詢會提示內(nèi)存溢出。 解決方法:修改查詢語句 sql=select * from ada where alice like '%abigale%' 改為 sql=
相關(guān)Mssql數(shù)據(jù)庫教程:
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法
- sql刪除重復(fù)數(shù)據(jù)的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實例詳解
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-詳解優(yōu)化SQL Server數(shù)據(jù)庫的方法(4)
。