在咱們軟件開發過程當中,項目的優化是必不可少的部分,那麼具體要怎麼優化呢?今天小編就來把個人我的經驗跟你們分享一下,若是有不對的地方或者說得很差的地方,還但願你們不吝賜教。javascript
項目的優化主要分爲三個部分的優化:1.程序的優化 ,程序的優化又包括(1).算法的優化 (2).頁面的優化css
2.IIS的優化html
3.配置文件java
4.數據庫的優化,數據庫的優化又包括(1)數據結構的優化(2)sql語句的優化jquery
咱們首先來講程序的優化:程序員
一、使用值類型的ToString方法
在鏈接字符串時,常用"+"號直接將數字添加到字符串中。這種方法雖然簡單,也能夠獲得正確結果,可是因爲涉及到不一樣的數據類型,數字須要經過裝箱操做轉化爲引用類型才能夠添加到字符串中。可是裝箱操做對性能影響較大,由於在進行這類處理時,將在託管堆中分配一個新的對象,原有的值複製到新建立的對象中。
使用值類型的ToString方法能夠避免裝箱操做,從而提升應用程序性能。
int num=1;
string
str="go"+num.ToString(); web
二、運用StringBuilder類
String類對象是不可改變的,對於String對象的從新賦值在本質上是從新建立了一個String對象並將新值賦予該對象,其方法ToString對性能的提升並不是很顯著。
在處理字符串時,最好使用StringBuilder類,其.NET 命名空間是System.Text。該類並不是建立新的對象,而是經過Append,Remove,Insert等方法直接對字符串進行操做,經過ToString方法返回操做結果。
其定義及操做語句以下所示:
int num;
System.Text.StringBuilder str = new
System.Text.StringBuilder(); //建立字符串
str.Append(num.ToString()); //添加數值num
Response.Write(str.ToString); //顯示操做結果 ajax
三、使用 HttpServerUtility.Transfer 方法在同一應用程序的頁面間重定向
採用 Server.Transfer 語法,在頁面中使用該方法可避免沒必要要的客戶端重定向(Response.Redirect)。 算法
四、避免使用ArrayList。
由於任何對象添加到ArrayList都要封箱爲System.Object類型,從ArrayList取出數據時,要拆箱回實際的類型。建議使用自定義的集合類型代替ArrayList。asp.net
2.0提供了一個新的類型,叫泛型,這是一個強類型,使用泛型集合就能夠避免了封箱和拆箱的發生,提升了性能。sql
五、使用HashTale代替其餘字典集合類型
(如StringDictionary,NameValueCollection,HybridCollection),存放少許數據的時候可使用HashTable.
六、爲字符串容器聲明常量,不要直接把字符封裝在雙引號" "裏面。
//避免
MyObject obj =
new MyObject();
obj.Status = "ACTIVE";
//推薦
const string C_STATUS =
"ACTIVE";
MyObject obj = new MyObject();
obj.Status = C_STATUS;
七、不要用ToUpper(),ToLower()轉換字符串進行比較,用String.Compare代替,它能夠忽略大小寫進行比較.
例:
const string C_VALUE = "COMPARE";
if (String.Compare(sVariable,
C_VALUE, true) == 0)
{
Console.Write( "相同");
}
也能夠用str ==
String.Empty或者str.Length == 0判斷是否爲空。(注意判斷輸入數據的長度,可防止sql注入式攻擊)
將String對象的Length屬性與0比較是最快的方法,避免沒必要要的調用 ToUpper 或 ToLower 方法。
八、類型轉化Int32.TryParse()優於Int32.Parse()優於Convert.ToInt32()。
建議.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
由於:
Convert.ToInt32 會把最終的解析工做代理給 Int32.Parse;
Int32.Parse
會把最終的解析工做代理給Number.ParseInt32;
Int32.TryParse
會把最終的解析工做代理給Number.TryParseInt32。
九、若是隻是從XML對象讀取數據,用只讀的XPathDocument代替XMLDocument,能夠提升性能
//避免
XmlDocument xmld = new XmlDocument();
xmld.LoadXml(sXML);
txtName.Text = xmld.SelectSingleNode( "/packet/child").InnerText;
//推薦
XPathDocument xmldContext = new XPathDocument(new
StringReader(oContext.Value));
XPathNavigator xnav =
xmldContext.CreateNavigator();
XPathNodeIterator xpNodeIter = xnav.Select(
"packet/child");
iCount = xpNodeIter.Count;
xpNodeIter =
xnav.SelectDescendants(XPathNodeType.Element, false);
while(xpNodeIter.MoveNext())
{
sCurrValues +=
xpNodeIter.Current.Value+ ",";
}
十、避免在循環體裏聲明變量,應該在循環體外聲明變量,在循環體裏初始化。
C#程序開發要遵循的一個基本原則就是避免沒必要要的對象建立
//避免
for(int i=0; i<10; i++)
{
SomeClass objSC = new SomeClass();
}
//推薦
SomeClass objSC =
null;
for(int i=0; i <10; i++)
{
objSC = new SomeClass();
}
十一、捕獲指定的異常,不要使用通用的System.Exception.
//避免
try
{
<some logic>
}
catch(Exception exc)
{
<Error
handling>
}
//推薦
try
{
<some logic>
}
catch(System.NullReferenceException exc)
{
<Error handling>
}
catch(System.ArgumentOutOfRangeException exc)
{
<Error
handling>
}
catch(System.InvalidCastException exc)
{
<Error handling>
}
十二、使用Try...catch...finally時, 要在finally裏釋放佔用的資源如鏈接,文件流等
否則在Catch到錯誤後佔用的資源不能釋放。
try
{}
catch
{}
finally
{
conntion.close();
}
1三、避免使用遞歸調用和嵌套循環,使用他們會嚴重影響性能,在不得不用的時候才使用。
1四、禁用VB.net和Jscript動態數據類型
應當始終顯示地申明變量數據類型,這可以節約程序的執行時間。以往,開發人員喜歡使用 Visual Basic、VBScript 和
JScript
的緣由之一就是它們所謂「無類型」的性質。變量不須要顯式類型聲明,並可以簡單地經過使用來建立它們。當從一個類型到另外一個類型進行分配時,轉換將自動執行。不過,這種便利會大大損害應用程序的性能。
如:
爲了得到最佳的性能,當聲明 JScript .NET 變量時,請爲其分配一個類型。例如,var A : String;
頁面的優化最主要的仍是緩存,這一點咱們留着後面着重介紹,接下來先介紹另外幾種頁面優化的方法
1 避免到服務器的沒必要要的往返行程 在某些狀況下沒必要使用 ASP.NET 服務器控件和執行回發事件處理。例如,在 ASP.NET 網頁中驗證用戶輸入常常可在數據提交到服務器以前在客戶端進行。一般,若是不須要將信息傳遞到服務器以進行驗證或將其寫入數據存儲區,請避免使用致使到服務器的往返行程的代碼,這樣能夠提升頁的性能並改善用戶體驗。您也能夠不執行整個往返行程,而是使用客戶端回調從服務器中讀取數據。 頁面類實現ICallbackEventHandler接口,註冊GetCallbackEventReference方法,也就是ajax的回調實現。 針對一次須要載入不少控件的頁面(載入比較耗時的頁面),咱們可使用ajax技術來達到必定的頁面訪問性能提高。
二、使用 Page 對象的 IsPostBack 屬性來避免對往返行程執行沒必要要的處理 若是您編寫處理服務器控件回發處理的代碼,有時可能須要代碼僅在首次請求頁時執行,而不是每次回發時都執行。根據該頁是不是響應服務器控件事件生成的,使用 IsPostBack 屬性有條件地執行代碼。 將僅須要首次請求頁面時執行的代碼放在IsPostBack條件中運行。
三、只在必要時保存服務器控件視圖狀態 自動視圖狀態管理使服務器控件能夠在往返行程中從新填充它們的屬性值,而您不須要編寫任何代碼。可是,由於服務器控件的視圖狀態在隱藏的窗體字段中往返於服務器,因此該功能影響性能。瞭解在哪些狀況下視圖狀態會有所幫助,在哪些狀況下它影響頁的性能,這樣是有幫助的。例如,若是您將服務器控件綁定到每一個往返行程上的數據,由於控件的值會在數據綁按期間用新值替換,因此保存的視圖狀態沒有用處。在這種狀況下,禁用視圖狀態能夠節省處理時間並減小頁的大小。 默認狀況下,爲全部服務器控件啓用視圖狀態。若要禁用它,請將控件的 EnableViewState 屬性設置爲 false。
還可使用 @ Page 指令禁用整個頁的視圖狀態。當您不從頁回發到服務器時,這將十分有用。 @ Control 指令中還支持 EnableViewState 屬性以指定是否爲用戶控件啓用視圖狀態。 查看視圖狀態的方法: 若要分析服務器控件在頁中使用的視圖狀態的大小,請經過將 trace="true" 屬性包含在 @ Page 指令中啓用對該頁的跟蹤。而後在跟蹤輸出中,查看「控件層次結構」表的「Viewstate」列。
下面狀況基本上能夠禁用viewstate:
(1)頁面控件 (.ascx)
(2)頁面不回調
4.配置OutputCache,用緩存來優化網站性能的方法,估計是無人不知的。 ASP.NET提供了HttpRuntime.Cache對象來緩存數據,也提供了OutputCache指令來緩存整個頁面輸出。雖然OutputCache指令使用起來更方便,也有很是好的效果,不過,它須要咱們在那些頁面中添加這樣一個指令。
對於設置過OutputCache的頁面來講,瀏覽器在收到這類頁面的響應後,會將頁面響應內容緩存起來。只要在指定的緩存時間以內,且用戶沒有強制刷新的操做,那麼就根本不會再次請求服務端,而對於來自其它的瀏覽器發起的請求,若是緩存頁已生成,那麼就能夠直接從緩存中響應請求,加快響應速度。所以,OutputCache指令對於性能優化來講,是頗有意義的(除非全部頁面頁面都在頻繁更新)。
在網站的優化階段,咱們能夠用Fiddler之類的工具找出一些內容幾乎不會改變的頁面,給它們設置OutputCache,可是,按照傳統的開發流程,咱們須要針對每一個頁面文件執行如下操做:
1. 簽出頁面文件。
2. 添加OutputCache指令。
3. 從新發布頁面。
4. 簽入文件(若是遇到多分支並行,還可能須要合併操做)。
以上這些源代碼管理制度會讓一個簡單的事情複雜化,那麼,有沒一種更簡單的方法能解決這個問題呢?
接下來,本文將介紹一種方法,它利用ASP.NET自身的擴展性,以配置文件的方式爲頁面設置OutputCache參數。配置文件其它就是一個XML文件,內容以下:
<?xml version="1.0" encoding="utf-8"?> <OutputCache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Settings> <Setting Duration="3" FilePath="/Pages/a3.aspx" /> <Setting Duration="10" FilePath="/Pages/a5.aspx" /> </Settings> </OutputCache>
看了這段配置,我想您應該也能猜到它能有什麼做用。
每一行配置參數爲一個頁面指定OutputCache所須要的參數,示例文件爲了簡單隻使用二個參數,其它能夠支持的參數請參考OutputCache指令。
爲了能讓這個配置文件有效,須要在web.config中配置如下內容(適用於IIS7):
<system.webServer> <modules> <add name="SetOutputCacheModule" type="WebSiteOptimize.SetOutputCacheModule,WebSiteOptimize" /> </modules> </system.webServer>
在這裏,我註冊了一個HttpModule,他的所有代碼以下:
public class SetOutputCacheModule : IHttpModule { static SetOutputCacheModule() { // 加載配置文件 string xmlFilePath = Path.Combine (HttpRuntime.AppDomainAppPath, "OutputCache.config");
ConfigManager.LoadConfig(xmlFilePath); } public void Init(HttpApplication app) { app.PreRequestHandlerExecute += new EventHandler(app_PreRequestHandlerExecute); } void app_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; Dictionary<string, OutputCacheSetting> settings = ConfigManager.Settings; if( settings == null ) throw new ConfigurationErrorsException("SetOutputCacheModule加載配置文件失敗。"); // 實現方法: // 查找配置參數,若是找到匹配的請求,就設置OutputCache OutputCacheSetting setting = null; if( settings.TryGetValue(app.Request.FilePath, out setting) ) { setting.SetResponseCache(app.Context); } }
ConfigManager類用於讀取配置文件,並啓用了文件依賴技術,當配置文件更新後,程序會自動從新加載:
1 internal static class ConfigManager
{
private static readonly string CacheKey = Guid.NewGuid().ToString();
private static Exception s_loadConfigException;
private static Dictionary<string, OutputCacheSetting> s_settings;
public static Dictionary<string, OutputCacheSetting> Settings
{
get{
Exception exceptin = s_loadConfigException;
if( exceptin != null )
throw exceptin;
return s_settings;
}
}
public static void LoadConfig(string xmlFilePath)
{
Dictionary<string, OutputCacheSetting> dict = null;
try
{
OutputCacheConfig config = XmlHelper.XmlDeserializeFromFile<OutputCacheConfig>(xmlFilePath, Encoding.UTF8);
dict = config.Settings.ToDictionary(x => x.FilePath, StringComparer.OrdinalIgnoreCase);
}
catch( Exception ex )
{
s_loadConfigException = new System.Configuration.ConfigurationException("初始化SetOutputCacheModule時發生異常,請檢查" + xmlFilePath + "文件是否配置正確。", ex);
}
if( dict != null )
{
// 註冊緩存移除通知,以便在用戶修改了配置文件後自動從新加載。
// 參考:細說 ASP.NET Cache 及其高級用法
// http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html
CacheDependency dep =new CacheDependency(xmlFilePath);
HttpRuntime.Cache.Insert(CacheKey, xmlFilePath, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, CacheRemovedCallback);
}
s_settings = dict;
}
private static void CacheRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
string xmlFilePath = (string)value;
// 因爲事件發生時,文件可能尚未徹底關閉,因此只好讓程序稍等。
System.Threading.Thread.Sleep(3000);
// 從新加載配置文件
LoadConfig(xmlFilePath);
}
}
有了AutoSetOutputCacheModule,咱們就能夠直接使用配置文件爲頁面設置OutputCache參數,而不須要修改任何頁面,是否是很容易使用?
說明:MyMVC框架已支持這種功能,全部相關的能夠從MyMVC框架的源碼中獲取。
建議:對於一些不多改變的頁面,緩存頁是一種頗有效的優化方法。
啓用內容過時
每一個網站都會有一些資源文件(圖片,JS,CSS),這些文件相對於ASPX頁面來講,它們的輸出內容極有可能在一段長時間以內不會有變化,而IIS在響應這類資源文件時不會生成Cache-Control響應頭。在這種狀況下,瀏覽器或許會緩存它們,也許會再次發起請求(好比重啓後),總之就是緩存行爲不受控制且緩存時間不夠長久。
有沒有想過能夠把它們在瀏覽器中長久緩存起來呢?
爲了告訴瀏覽器將這些文件長久緩存起來,減小一些無心義的請求(提升頁面呈現速度),咱們能夠在IIS中啓用內容過時,這樣設置後,IIS就能生成Cache-Control響應頭,明確告訴瀏覽器將文件緩存多久。
iis6中這個參數很好找到。
然而,在IIS7中,這個參數不容易被發現,須要如下操做才能找到:
選擇網站(或者網站子目錄)節點,雙擊【HTTP響應標頭】
再點擊右邊的【設置經常使用標頭】連接
此時將會顯示:
說明:【啓用內容過時】這個設置能夠基於整個網站,也能夠針對子目錄,或者一個具體的文件。
注意:若是您在IIS7中針對某個子目錄或者文件設置【啓用內容過時】,前面的對話框看起來是如出一轍的,
然而,在IIS6中,咱們能夠清楚地從對話框的標題欄中知道咱們在作什麼:
有時真感受IIS7的界面在退步!
最後我想說一句:能夠直接爲整個網站啓用內容過時,ASPX頁面是不會被緩存的!
說到這裏可能有人會想:這個過時時間我該設置多久呢?
十分鐘,2個小時,一天,仍是一個月?
在我看來,這個時間越久越好。
可能有人又會說了:萬一我要升級某個JS文件怎麼辦,時間設置久了,用戶怎麼更新呢?
若是你問我這個問題,我也只能說是你的代碼不合理(畢竟你解決不了升級問題),想知道緣由的話,請繼續閱讀。
解決資源文件升級問題
對於一些規模不大的網站來講,一般會將資源文件與程序文件一塊兒部署到一個網站中。
這時可能會採用下面的方式來引用JS或者CSS文件:
<link type="text/css" href="aaaa.css" rel="Stylesheet" /> <script type="text/javascript" src="bbb.js"></script>
在這種狀況下,若是使用了前面所說的【啓用內容過時】方法,那麼當有JS,CSS文件須要升級時,因爲瀏覽器的緩存尚未過時,因此就不會請求服務器,此時會使用已緩存的版本,所以可能會出現各類奇怪的BUG
對於前面談到的BUG,我認爲根源在於引用JS,CSS文件的方式有缺陷,那種方法徹底沒有考慮到版本升級問題,正確的方法有二種:
1. 給文件名添加版本號,像jquery那樣,每一個版本一個文件(jquery-1.4.4.min.js)。
2. 在URL後面添加一個版本號,讓原先的URL失效。
第一種方法因爲每次升級都產生了一個新文件,因此不存在緩存問題,可是,維護一大堆文件的成本可能會比較大,所以我建議採用第二種方法來解決。
在MyMVC的示例代碼中,我使用了下面的方法來引用這些資源文件:
<%= HtmlExtension.RefCssFileHtml("/css/StyleSheet.css")%> <%= HtmlExtension.RefJsFileHtml("/js/MyPage/fish.js")%>
在頁面運行時,會產生以下的輸出結果:
<link type="text/css" rel="Stylesheet" href="/css/StyleSheet.css?_t=634642185820000000" /> <script type="text/javascript" src="/js/MyPage/fish.js?_t=634642154020000000"></script>
這二個工具方法的實現代碼以下(在MyMVC的示例代碼中):
private static readonly string s_root = HttpRuntime.AppDomainAppPath.TrimEnd('\\'); public static string RefJsFileHtml(string path) { string filePath = s_root + path.Replace("/", "\\"); string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString(); return string.Format("<script type=\"text/javascript\" src=\"{0}?_t={1}\"></script>\r\n", path, version); } public static string RefCssFileHtml(string path) { string filePath = s_root + path.Replace("/", "\\"); string version = File.GetLastWriteTimeUtc(filePath).Ticks.ToString();
return string.Format("<link type=\"text/css\" rel=\"Stylesheet\" href=\"{0}?_t={1}\" />\r\n", path, version); }
上面這種獲取文件版本號的方法,是一種比較簡單的解決方案。每一個引用的地方在生成HTML代碼時,都會訪問文件的最後修改時間,這會給磁盤帶來一點讀的開銷,若是您擔憂這種實現方式可能會給性能帶來影響,那麼也能夠增長一個配置文件的方式來解決(請自行實現),例如如下結構:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfFileVersion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=http://www.w3.org/2001/XMLSchema> <FileVersion FilePath="/js/JScript.js" Version="255324" /> <FileVersion FilePath="/css/StyleSheet.css" Version="2324235" />
</ArrayOfFileVersion>
若是您認爲這種配置文件須要手工維護,不夠自動化,還能夠採用程序的方式自動在運行時維護一個列表,總之,直接引用資源文件的方法是一種直接耦合,會給文件升級帶來麻煩,咱們能夠經過一個外部方法來解開這個直接耦合(給FileVersion增長一個屬性還還能夠將內部地址改爲一個CDN地址)。
啓用壓縮
壓縮響應結果也是經常使用的網站優化方法,因爲如今的瀏覽器都已支持壓縮功能,所以,若是在服務端能壓縮響應結果,對於網速較慢的用戶來講,會減小不少網絡傳輸時間,最終的體驗就是網頁顯示速度變快了!
IIS6雖然提供壓縮的設置界面,然而配置是基於服務器級別的:
注意:這裏的【應用程序文件】不包括aspx,若是須要壓縮aspx的響應,須要手工修改x:\WINDOWS\system32\inetsrv\MetaBase.xml文件(參考加大字號部分):
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip"
HcCompressionDll="%windir%\system32\inetsrv\gzip.dll" HcCreateFlags="1" HcDoDynamicCompression="TRUE"
HcDoOnDemandCompression="TRUE"
HcDoStaticCompression="TRUE" HcDynamicCompressionLevel="9" HcFileExtensions="htm html txt js css htc" HcOnDemandCompLevel="10" HcPriority="1" HcScriptFileExtensions="asp exe aspx axd" >
說明:要修改MetaBase.xml,須要中止IIS Admin Service服務。
在IIS7中,咱們能夠在服務器級別配置壓縮參數:
而後在每一個網站中開啓或者關閉壓縮功能:
說明:IIS7中已經再也不使用MetaBase.xml,因此咱們找不到IIS6的那些設置了。 IIS7壓縮的過濾條件再也不針對擴展名,而是採用了mimeType規則(保存在applicationHost.config)。根據IIS7的壓縮規則,當咱們啓用動態壓縮後,會壓縮aspx的響應結果。
二種壓縮方法的差異:
1. 靜態內容壓縮:當服務器在第一次響應某個靜態文件時,會生成一個壓縮後的結果,並保存到磁盤中,以便重用。
2. 動態內容壓縮:【每次】在響應客戶端以前,壓縮響應結果,在內存中完成,所以會給CPU帶來一些負擔。
注意:要不要【啓用動態內容壓縮】這個參數,須要評估服務器的CPU是否能以承受(觀察任務管理器或者查看性能計數器)。
在配置文件中,還能夠刪除無用的HttpModule來進行優化
對一個網站來講,ASP.NET提供的有些HttpMoudle可能並非須要的,然而,若是你不去手工禁用它們,它們其實會一直運行。 好比 我 會禁用下面這些HttpMoudle:
<httpModules> <remove name="Session"/> <remove name="RoleManager"/> <remove name="PassportAuthentication"/> <remove name="Profile"/> <remove name="ServiceModel"/> </httpModules>
對於使用Forms身份認證的網站的來講,下面這些HttpModule也是能夠禁用的:
<httpModules> <remove name="WindowsAuthentication"/> <remove name="FileAuthorization"/> </httpModules>
一、調整數據結構的設計。這一部分在開發信息系統以前完成,程序員須要考慮是否使用ORACLE數據庫的分區功能,對於常常訪問的數據庫表是否須要創建索引等。
二、調整應用程序結構設計。這一部分也是在開發信息系統以前完成,程序員在這一步須要考慮應用程序使用什麼樣的體系結構,是使用傳統的Client/Server兩層體系結構,仍是使用Browser/Web/Database的三層體系結構。不一樣的應用程序體系結構要求的數據庫資源是不一樣的。
三、調整數據庫SQL語句。應用程序的執行最終將歸結爲數據庫中的SQL語句執行,所以SQL語句的執行效率最終決定了ORACLE數據庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。
四、調整服務器內存分配。內存分配是在信息系統運行過程當中優化配置的,數據庫管理員能夠根據數據庫運行情況調整數據庫系統全局區(SGA區)的數據緩衝區、日誌緩衝區和共享池的大小;還能夠調整程序全局區(PGA區)的大小。須要注意的是,SGA區不是越大越好,SGA區過大會佔用操做系統使用的內存而引發虛擬內存的頁面交換,這樣反而會下降系統。
五、調整硬盤I/O,這一步是在信息系統開發以前完成的。數據庫管理員能夠將組成同一個表空間的數據文件放在不一樣的硬盤上,作到硬盤之間I/O負載均衡。
六、調整操做系統參數,例如:運行在UNIX操做系統上的ORACLE數據庫,能夠調整UNIX數據緩衝池的大小,每一個進程所能使用的內存大小等參數。
實際上,上述數據庫優化措施之間是相互聯繫的。ORACLE數據庫性能惡化表現基本上都是用戶響應時間比較長,須要用戶長時間的等待。但性能惡化的緣由倒是多種多樣的,有時是多個因素共同形成了性能惡化的結果,這就須要數據庫管理員有比較全面的計算機知識,可以敏感地察覺到影響數據庫性能的主要緣由所在。
數據庫的優化最簡單直接的就是sql語句的優化,那麼sql語句具體怎麼優化,小編我列出下面幾條:
一、儘可能使用索引。試比較下面兩條SQL語句:
語句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp);
語句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
這兩條查詢語句實現的結果是相同的,可是執行語句A的時候,ORACLE會對整個emp表進行掃描,沒有使用創建在emp表上的deptno索引,執行語句B的時候,因爲在子查詢中使用了聯合查詢,ORACLE只是對emp表進行的部分數據掃描,並利用了deptno列的索引,因此語句B的效率要比語句A的效率高一些。
二、選擇聯合查詢的聯合次序。考慮下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2;
這個SQL例子中,程序員首先須要選擇要查詢的主表,由於主表要進行整個表數據的掃描,因此主表應該數據量最小,因此例子中表A的acol列的範圍應該比表B和表C相應列的範圍小。
三、在子查詢中慎重使用IN或者NOT IN語句,使用where (NOT) exists的效果要好的多。
四、慎重使用視圖的聯合查詢,尤爲是比較複雜的視圖之間的聯合查詢。通常對視圖的查詢最好都分解爲對數據表的直接查詢效果要好一些。
五、能夠在參數文件中設置SHARED_POOL_RESERVED_SIZE參數,這個參數在SGA共享池中保留一個連續的內存空間,連續的內存空間有益於存放大的SQL程序包。
六、ORACLE公司提供的DBMS_SHARED_POOL程序能夠幫助程序員將某些常用的存儲過程「釘」在SQL區中而不被換出內存,程序員對於常用而且佔用內存不少的存儲過程「釘」到內存中有利於提升最終用戶的響應時間。
其它優化選項
優化ASP.NET網站是一個大的話題,除了博客中介紹的這些方法以外,還有如下方法也是能夠參考的:
1. 升級服務器硬件配置。
2. 使用Windows Server 2008以上版本操做系統(網絡性能比2003要好)。
3. 優化操做系統配置(例如禁用不須要的服務)。
4. 禁用調試模式。
5. 網站使用專用應用程序池。
另外,在若是項目後期須要對程序就行優化,升級,首先考慮的是如何進行優化達到咱們須要的效果,在結合時間,效率,費用,人力資源等各類狀況下選擇一種最簡單的優化方案。很顯然,最簡單的優化方案並非程序代碼的優化。
好了,今天就介紹到這裏,這是我搜集整理出來的一些資料,若是有什麼不對的地方,還請你們指出。