http://blog.csdn.net/weikaifenglove/article/details/4059258 昨天在做測(cè)試的時(shí)候發(fā)現(xiàn)一個(gè)非常奇怪的問(wèn)題:在程序的查詢模塊中做查詢的時(shí)候,開(kāi)始速度很快,但是過(guò)了一段時(shí)間以后速度就變慢,最后干脆就報(bào)錯(cuò),不工作了。在排錯(cuò)的過(guò)程中,發(fā)現(xiàn)Oracle臨時(shí)表空間暴漲,達(dá)到了幾十個(gè)GB,在Oracle中對(duì)Session進(jìn)行跟蹤,發(fā)現(xiàn)磁盤(pán)空間還在不停的消耗,幾乎是每隔5s,臨時(shí)表空間就會(huì)增長(zhǎng)500MB左右,最后報(bào)錯(cuò)的原因應(yīng)該是因?yàn)闆](méi)有磁盤(pán)空間可以分配造成的。這是一件十分恐怖的事情。
我們知道Oracle臨時(shí)表空間主要是用來(lái)做查詢和存放一些緩存的數(shù)據(jù)的,磁盤(pán)消耗的一個(gè)主要原因是需要對(duì)查詢的結(jié)果進(jìn)行排序,如果沒(méi)有猜錯(cuò)的話,在磁盤(pán)空間的(內(nèi)存)的分配上,Oracle使用的是貪心算法,如果上次磁盤(pán)空間消耗達(dá)到1GB,那么臨時(shí)表空間就是1GB,如果還有增長(zhǎng),那么依此類(lèi)推,臨時(shí)表空間始終保持在一個(gè)最大的上限。像上文提到的恐怖現(xiàn)象經(jīng)過(guò)分析可能是以下幾個(gè)方面的原因造成的。
1. 沒(méi)有為臨時(shí)表空間設(shè)置上限,而是允許無(wú)限增長(zhǎng)。但是如果設(shè)置了一個(gè)上限,最后可能還是會(huì)面臨因?yàn)榭臻g不夠而出錯(cuò)的問(wèn)題,臨時(shí)表空間設(shè)置太小會(huì)影響性能,臨時(shí)表空間過(guò)大同樣會(huì)影響性能,至于需要設(shè)置為多大需要仔細(xì)的測(cè)試。
2.查詢的時(shí)候連表查詢中使用的表過(guò)多造成的。我們知道在連表查詢的時(shí)候,根據(jù)查詢的字段和表的個(gè)數(shù)會(huì)生成一個(gè)迪斯卡爾積,這個(gè)迪斯卡爾積的大小就是一次查詢需要的臨時(shí)空間的大小,如果查詢的字段過(guò)多和數(shù)據(jù)過(guò)大,那么就會(huì)消耗非常大的臨時(shí)表空間。
3.對(duì)查詢的某些字段沒(méi)有建立索引。Oracle中,如果表沒(méi)有索引,那么會(huì)將所有的數(shù)據(jù)都復(fù)制到臨時(shí)表空間,而如果有索引的話,一般只是將索引的數(shù)據(jù)復(fù)制到臨時(shí)表空間中。
針對(duì)以上的分析,對(duì)查詢的語(yǔ)句和索引進(jìn)行了優(yōu)化,情況得到緩解,但是需要進(jìn)一步測(cè)試。
總結(jié):
1.SQL語(yǔ)句是會(huì)影響到磁盤(pán)的消耗的,不當(dāng)?shù)恼Z(yǔ)句會(huì)造成磁盤(pán)暴漲。
2.對(duì)查詢語(yǔ)句需要仔細(xì)的規(guī)劃,不要想當(dāng)然的去定義一個(gè)查詢語(yǔ)句,特別是在可以提供用戶自定義查詢的軟件中。
3.仔細(xì)規(guī)劃表索引。
臨時(shí)表空間使用注意:
1.臨時(shí)表空間 是用于在進(jìn)行排序操作(如大型查詢,創(chuàng)建索引和聯(lián)合查詢期間存儲(chǔ)臨時(shí)數(shù)據(jù))
每個(gè)用戶都有一個(gè)臨時(shí)表空間
2.對(duì)于大型操作頻繁,(大型查詢,大型分類(lèi)查詢,大型統(tǒng)計(jì)分析等),應(yīng)指定單獨(dú)的臨時(shí)表空間,以方便管理
3.分配用戶單獨(dú)臨時(shí)表空間,一般是針對(duì) 大型產(chǎn)品數(shù)據(jù)庫(kù),OLTP數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)倉(cāng)庫(kù)
對(duì)于小型產(chǎn)品不需要單獨(dú)制定臨時(shí)表空間,使用默認(rèn)臨時(shí)表空間
原文鏈接:http://blog.csdn.net/weikaifenglove/article/details/4059258
本文介紹的是C#編寫(xiě)的winform程序脫離.net框架的方法。【也支持VB.NET和C++.NET】
原文地址:http://hi.baidu.com/44498/blog/item/dabd37166a11bd10962b437d.html
很多朋友會(huì)問(wèn),為何選擇C# ?其實(shí)原因很簡(jiǎn)單,因?yàn)樗哂衅渌魏握Z(yǔ)言都不具備的生產(chǎn)力。
軟件工程的發(fā)展,主要目的也就是提高生產(chǎn)力,這個(gè)核心不變,我們的學(xué)習(xí)方向也就不變。
本文代碼示例支持.NET FRAMEWORK 2.0 ,3.0 , 3.5 ,LINQ等先進(jìn)的解決方案。
一看就懂,一學(xué)就會(huì),一目了然。。。
以下所有例子,均經(jīng)過(guò)測(cè)試,在2k,xp,2003,vista,2008,Win7下都是可以運(yùn)行的。也包括X86和X64平臺(tái)。
聲明:本文講解的是解決方案,并不提供下載【主要是沒(méi)有穩(wěn)定的網(wǎng)盤(pán)】,
---------------------------------------------------------
1, .Net Linker :中國(guó)移動(dòng)的飛信就利用了它的核心。飛信是使用C#在.NET上開(kāi)發(fā)的。貴,最便宜的版本要1000多美金。【傻瓜式操作,這里不做介紹】
2,用飛信的虛擬機(jī)來(lái)引導(dǎo)自己開(kāi)發(fā)的.NET程序。
3,使用mono來(lái)達(dá)到脫離.NET框架的效果,可以跨平臺(tái)。【完美支持.net2.0,以及絕大多數(shù).NET3.5,目前已經(jīng)支持WPF系列新技術(shù)了】
///////////////////////實(shí)驗(yàn)過(guò)程/////////////////////////
例子1:先說(shuō)最簡(jiǎn)單的,使用飛信虛擬機(jī)來(lái)試驗(yàn)吧。
【不要引用VB編寫(xiě)的控件或者是類(lèi)庫(kù),因?yàn)轱w信的虛擬機(jī)功能很少】
先安裝"飛信2008 3.5版",然后打開(kāi)安裝目錄,里面有個(gè)VMDotNet文件夾,里面就是.NET虛擬環(huán)境相關(guān)文件了,找到飛信安裝目錄下的"VMDotNet\v2.0.50727\FetionVM.exe"來(lái)啟動(dòng)運(yùn)行我們的.NET WinForm程序:
【可以使用命令行來(lái)傳值也可以用其他方式,都是一樣的】例如:
WinExec("FetionVM.exe 我的程序.exe", SW_SHOW); //C++ code
為了方便,我們可以編寫(xiě)一個(gè)檢測(cè).net框架版本的程序作為引導(dǎo)程序,如果已經(jīng)安裝了.net框架就不用虛擬機(jī),如果沒(méi)有安裝,調(diào)用虛擬器來(lái)啟動(dòng)程序。【請(qǐng)不要使用C#或者其他托管類(lèi)型的語(yǔ)言來(lái)編寫(xiě)這個(gè)引導(dǎo)程序,否則失去了意義】。
很容易吧?但是有個(gè)弊端,你的.NET程序如果要操作類(lèi)似于SQL SERVER2000,2005,2008 或者是MYSQL,Oracle,DB2等數(shù)據(jù)庫(kù),用這個(gè)飛信自帶的虛擬機(jī)實(shí)現(xiàn)就比較麻煩,所以這個(gè)飛信的虛擬機(jī)只能做簡(jiǎn)單的程序應(yīng)用。還有一點(diǎn)大家要注意,使用飛信的虛擬機(jī),涉及到的還有版權(quán)問(wèn)題。測(cè)試一下,壓縮以后文件大概是6,7M左右,還行。
例子2:使用MONO來(lái)脫離框架并且跨平臺(tái)。注:測(cè)試結(jié)果顯示,使用MONO啟動(dòng).NET程序速度是最快的。
首先到MONO的官方網(wǎng)站下載源代碼或者最新版本,然后安裝,我用的是2.2版本【目前已經(jīng)有2.4版本了,比較新,支持的更多】。
為了方便各位朋友試驗(yàn),我提供我本次試驗(yàn)的MONO版本2.2 :
下載地址:
安裝完畢,打開(kāi)目錄,找到兩個(gè)子目錄,名字分別是bin,lib ,然后復(fù)制到另外一個(gè)目錄里面去【因?yàn)榘惭b的時(shí)候默認(rèn)安裝在C盤(pán)的】然后把你的.net開(kāi)發(fā)的程序也復(fù)制到這個(gè)目錄里面去;假設(shè)這個(gè)目錄名字叫做VM,那么你的這個(gè)文件夾里應(yīng)該有個(gè)最少三個(gè)文件,一個(gè)是bin文件夾,一個(gè)是lib文件夾,還有一個(gè)就是你寫(xiě)的.net程序了。
然后可以用C++編寫(xiě)一個(gè)引導(dǎo)程序用來(lái)調(diào)用你的.NET程序;貼個(gè)簡(jiǎn)單的代碼吧:
int main()
{
WinExec("bin\\mono.exe 你的應(yīng)用程序.exe",SW_SHOWNORMAL);
return 0;
}
當(dāng)然,為了方便,你可以自己在邏輯里面判斷一下,機(jī)器里安裝的是.NET的哪個(gè)版本?如果版本低了,就調(diào)用MONO來(lái)執(zhí)行,如果匹配,就不調(diào)用MONO了。
【這個(gè)例子只是支持簡(jiǎn)單的WINFORM和數(shù)據(jù)庫(kù)訪問(wèn),WEBSERVICE的,在文章末尾】
如果按照我說(shuō)的一路操作,肯定是可以運(yùn)行的了,但是你會(huì)發(fā)現(xiàn),現(xiàn)在你的.NET程序是一個(gè)綠色軟件,但是他所在的目錄下lib,或者是bin文件夾的大小是非常恐怖的。。。有300M以上的大小,這豈不是和我們的想法沖突了?當(dāng)然不是;我們來(lái)精簡(jiǎn)目錄吧:
在bin目錄下,保留以下文件,其他的刪除即可

然后打開(kāi)lib文件夾,在2.0文件夾下保留Accessibility.dll,mscorlib.dll,mscorlib.dll.mdb,然后在GAC文件夾里面保留以下文件夾【下圖中的類(lèi)庫(kù)全部保留,最好不要?jiǎng)h除】:
這樣,整個(gè)目錄就精簡(jiǎn)的差不多了,當(dāng)然,你可以根據(jù)自己的需要定制需要的各種類(lèi)庫(kù)。然后打包即可,以我本人機(jī)器為例,壓縮后的文件是9.8M,比.NET 2.0的框架小了很多,但是比飛信的那個(gè)虛擬機(jī)還是大了一些;換個(gè)角度來(lái)看,用mono不涉及版權(quán)問(wèn)題,也可以調(diào)用各種數(shù)據(jù)庫(kù),我本機(jī)測(cè)試操作的是SQL SERVER 2005數(shù)據(jù)庫(kù),一切正常。讓你的.NET程序也跨平臺(tái)吧!只有MONO能做到這一點(diǎn)。
本文原創(chuàng),抄襲的別太過(guò)分哦,最起碼也專(zhuān)業(yè)點(diǎn),別圖片都不貼就發(fā)布,
耽誤別人學(xué)習(xí),那才是最大的犯罪。。。
例子3:使用.Net Linker 的一個(gè)老版本來(lái)測(cè)試的
通過(guò)命令行來(lái)提取.net環(huán)境的一些類(lèi)庫(kù)文件,然后模擬,不知道飛信用的是哪個(gè)版本,反正我這個(gè)老版本是不太好用,要手動(dòng)精簡(jiǎn)目錄的。
但是唯一的好處就是兼容性比較好,而且不限制數(shù)據(jù)庫(kù)的使用。這個(gè)也涉及到版權(quán)問(wèn)題,就不啰嗦了。
精簡(jiǎn)后的文件大小是8.66M,一般的應(yīng)用都可以滿足了,呵呵。
好了,時(shí)間不早了,睡覺(jué)了。歡迎大家留言,提出各種不同的見(jiàn)解。
更新:2009年3月30日
抽空拿到了.Net Linker 的破解版,用了一下還是不錯(cuò)的,穩(wěn)定性很好,兼容多種數(shù)據(jù)庫(kù)。美中不足的是有了MONO的比較,用.net linker虛擬機(jī)以后,程序啟動(dòng)的時(shí)候速度稍微慢了一點(diǎn),和飛信的啟動(dòng)速度一樣。。。不過(guò)這也沒(méi)辦法,忍了。
更新:2009年4月14日 支持web service
今天看到一個(gè)朋友咨詢MONO平臺(tái)上調(diào)用webservice的問(wèn)題;事實(shí)上,MONO是完全支持web service的 ;我這里也做個(gè)示例吧。
新建一個(gè)項(xiàng)目,winform的,版本是.net2.0;然后添加一個(gè)引用,引用我們準(zhǔn)備好的web服務(wù)。
引用的url:http://www.ayandy.com/, 這個(gè)web服務(wù)的功能是天氣預(yù)報(bào)那種的,包括國(guó)內(nèi)外400多個(gè)主要城市。【如果圖片不清晰,可以保存到本地然后查看。】

然后,引用好了,就調(diào)用吧~ 我這里例子顯示的是北京當(dāng)天的天氣。
然后運(yùn)行程序:

我的機(jī)器上有.net 3.5,當(dāng)然沒(méi)問(wèn)題,但是我們要是在其他機(jī)器上呢?
切換到虛擬機(jī)里,虛擬機(jī)是xp sp2,沒(méi)有安裝.NET任何版本的框架;
把程序復(fù)制到mono的目錄中,運(yùn)行之。。。

可以看到,沒(méi)有任何問(wèn)題。。。這里用的MONO版本是2.2,支持的很好。
大家可以看到,整個(gè)winform程序的按鈕,字體樣式都做了改變,
因?yàn)镸ONO是在LINUX上的解決方案,沒(méi)有使用微軟默認(rèn)的字體和樣式。
本文偶爾更新,更新時(shí)間不確定。感謝大家的關(guān)注。。。
有問(wèn)題可以留言。。。下一篇日志《使用托管C++【c++.net】脫離.NET框架實(shí)戰(zhàn)》
2009.04.23 更新:
關(guān)于有些朋友提出,MONO到底支持多少種數(shù)據(jù)庫(kù)的問(wèn)題,其實(shí)MONO支持的數(shù)據(jù)庫(kù)絕對(duì)比我們想象的多,幾乎是很多我們都沒(méi)有用過(guò)的。。。好了,我給個(gè)清單,讓大家心里有數(shù)。最近上網(wǎng)少,資料也沒(méi)怎么查,就先拿個(gè)05年的文章參考一下吧。
Mono Supported Database Access- -
Mono has many ADO.NET Data Providers to get you connected.
Providers for Open Source databases:
PostgreSQL: Npgsql is fully managed provider for PostgreSQL and is actively maintained
SQL Lite: actively maintained. Requires sqlite library.
Firebird Interbase: fully managed provider for Firebird and is actively maintained.
MySQL: use the MySQL Connector/Net from MySQL AB which is fully managed and actively maintained by MySQL AB, but it is not included with Mono. There is the ByteFX.Data.MySqlClient provider which is not actively maintained, but it is included with Mono.
Providers for commercial databases:
IBM DB2 Universal Database Requires DB2 client software
ODBC requires ODBC software which is available for Unix and Windows
Oracle requires client software including Oracle Call Interface
OLE DB Requires libgda (http://www.gnome-db.org/) System.Data.OleDb is not actively maintained plus it only works on Linux with GNOME 2.x
Microsoft SQL Server fully managed provider which is actively maintained for Microsoft SQL Server 7.0/2000/2005 databases
Sybase fully managed provider for Sybase 12.x databases and is actively maintained
Older Microsoft SQL Server and Sybase databases Not actively maintained.
Alternative to ADO.NET is GdaSharp (Gnome Data Access)
Gnome Data Access (http://www.gnome-db.org/) GdaSharp is C# bindings to GDA (GNOME Data Access) and is included with GtkSharp (http://www.mono-project.com/GtkSharp), but it requires libgda be installed. Works only on Linux with GNOME 2.x installed.
External Projects that have created ADO.NET Providers that work on Mono:
MySQL Connector/Net from MySQL AB (http://dev.mysql.com/downloads/connector/net/) is the .NET and Mono data provider for MySQL
ByteFX.Data.MySqlClient (http://sourceforge.net/projects/mysqlnet/) is a MySQL Managed data provider. ByteFX.Data is no longer actively developed, but it is included with Mono. Please use the MySQL Connector/Net provider from MySQL AB instead.
NPgsql (http://gborg.postgresql.org/project/npgsql/projdisplay.php) is a fully managed provider for PostgreSQL and is included with Mono.
Firebird (http://sourceforge.net/projects/firebird/) fully managed provider for Firebird databases and is included with Mono.
Advanced Data Provider (http://advanced-ado.sourceforge.net/) ADP, is a transparent factory for ADO.NET which loads providers dynamically.
Other Projects
DB40 (http://www.mono-project.com/DB4O) Open source object database for C#
2009.05.27 更新
要注意的是,在X86下編譯的程序,如果選擇ANYCPU,那么提取后的程序可以在X64下運(yùn)行。
但是,如果是編譯的時(shí)候選擇X64,那就無(wú)法通過(guò)LINKER提取。