顯示具有 Database 標籤的文章。 顯示所有文章
顯示具有 Database 標籤的文章。 顯示所有文章

星期一, 九月 22, 2008

OLEDB比ODBC快呀!

看了李維回覆RURU有關ODBC, OLEDB, ADO和dbExpress的問題,想起VB超人告訴過我OLEDB比較快,因為ODBC多了一層呼叫。

雖然李維很強(是高手中的高手呀),但他對微軟資料庫的歷史似乎不是完全正確,記得微軟最早提出RDO,後來才有ADO的出現,而ADO裏再分OLEDB與ODBC。

以前有別人測過,但以讀取為主。(請看

所以在下敝人小弟我,用VB6寫了一個很破的測試程式,為避免cache,就只寫不讀取,完全避開Server的Cache機制,不然比較晚讀取的連線一定比較快呀!

測試方法簡述如下:兩個程式架構完全相同,對同一個DB寫入十萬次,執行前先truncate table。

兩次測試結果相同:OLEDB花了1分16秒,ODBC花了1分21秒。

結論:其他Database不敢說,但在MS SQLServer的情況下,OLEDB比ODBC快!

Update:一樣的程式,原測試環境在Win2000 VM,剛才心血來潮在Vista 64上執行,居然差不多。微軟在不同OS上可能有許多不同的tuning與cache;所以對於這種非程式技巧的效能,還是別研究了:P

原始碼:
Private Sub OleDBTest()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim before As Date
Dim after As Date
Dim duration As Date
Dim connstr As String
connstr = "Provider=SQLOLEDB;" & _
"Data Source=MySQLServer;" & _
"Initial Catalog=TestDB;" & _
"User ID=sa;" & _
"Password=sa;"
before = DateTime.Now
Set conn = New ADODB.Connection
conn.Open (connstr)
Dim i As Long
For i = 1 To 100000
sql = "INSERT INTO TestTable Values('" & CStr(i) & "')"
conn.Execute (sql)
Next i
after = DateTime.Now

conn.Close
Set conn = Nothing
duration = after - before
Label1.Caption = ""
Label1.Caption = "before:" & CStr(before) & _
vbCrLf & _
"after:" & CStr(after) & _
vbCrLf & _
"duration:" & CStr(duration)
End Sub

Private Sub ODBCTest()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim before As Date
Dim after As Date
Dim duration As Date
Dim connstr As String

connstr = "Driver={SQL Server};" & _
"Server=MySQLServer;" & _
"Database=TestDB;" & _
"UID=sa;" & _
"PWD=sa;"

before = DateTime.Now
Set conn = New ADODB.Connection
conn.Open (connstr)
Dim i As Long
For i = 1 To 100000
sql = "INSERT INTO TestTable Values('" & CStr(i) & "')"
conn.Execute (sql)
Next i
after = DateTime.Now

conn.Close
Set conn = Nothing
duration = after - before
Label1.Caption = ""
Label1.Caption = "before:" & CStr(before) & _
vbCrLf & _
"after:" & CStr(after) & _
vbCrLf & _
"duration:" & CStr(duration)
End Sub


最後Update:VB超人最近接某個案子剛好在Oracle 11g轉檔,他表示Oracle odbc 插入一萬筆要51秒,而OleDB只要14秒,用Oracle donet client 只要八秒,在XP下作業。請看VB超人提供的測試結果圖:(測試案例稍有不同)

星期日, 八月 26, 2007

3rd Party database Provider for Windows

Postgresql .Net data provider (Npgsql)
PostgreSQL OLE DB Provider (PgOleDb)
PostgreSQL ODBC Driver (psqlODBC)
PostgreSQL JDBC Driver

MySQL ADO.Net provider
unofficial: MySQL OLE DB Provider another: MyOleDB
MySQL Connector/ODBC
MySQL JDBC Driver
MySQL Visual Studio Plugin

ADO.NET 2.0 Provider for SQLite (System.Data.SQLite)
SQLite OLE DB Provider
SQLite ODBC Driver
SQLite JDBC Driver

Oracle Data Provider for .NET
Oracle Providers for ASP.NET
Oracle OLE DB Provider
Oracle ODBC Drivers for Windows
Oracle SQLJ/JDBC

星期日, 六月 24, 2007

PostgreSQL的 table partitioning

ingramchen老大寫了篇Database Index 筆記,特別厚著臉皮請他寫再寫一篇partitioning的文章。可惜他客氣表示對DB外行,在下更是外行,連"SQL的奧秘"這本書都沒讀完。

剛才去查了一下,PostgreSQL supports basic table partitioning.這裏有文件。
MySQL也有Partitioning,在這裏有文件。
SQL Server 2005開始有Partitioning,SQL Server 2005 Features Comparison說要Enterprise以上才有。
Oracle當然早就有partition,因為我沒有用也不會,請自己找。

Partitioning主要的好處就是快!假設你的網站有百萬會員,所以table有百萬筆資料時,光是查詢就得花不少時間,就算加再多的key也是一樣。鳥毅以前待的網路公司有幸遇到這種問題,當時採用分散式處理會員資料,先做一個table的index table,再把不同字母開頭的會員放在不同的table。但問題也來了,要合併查詢時得做不少的暫存table,所以這種問題的正解應該是table partitioning。



(未完)

星期四, 四月 19, 2007

Rainbow Portal 2005改用SQL2005的相容性問題

Rainbow Portal 2005改用SQL2005後,若將相容性層級(Compatibility Level)設定為SQL Server 2005 (90),則會造成錯誤,問題發生在 rb_GetModulesSinglePortal 這支Stored Procedure,修改方法如下:
ALTER PROCEDURE [dbo].[rb_GetModulesSinglePortal]
(
@PortalID int
)
AS
SELECT 0 AS ModuleID, 'NO_MODULE' AS ModuleTitle, -1 AS TabOrder
UNION
SELECT rb_Modules.ModuleID, rb_Tabs.TabName + '/' + rb_Modules.ModuleTitle + ' (' + rb_GeneralModuleDefinitions.FriendlyName + ')' AS ModTitle, rb_Tabs.TabOrder
FROM rb_Modules INNER JOIN
rb_Tabs ON rb_Modules.TabID = rb_Tabs.TabID INNER JOIN
rb_ModuleDefinitions ON rb_Modules.ModuleDefID = rb_ModuleDefinitions.ModuleDefID INNER JOIN
rb_GeneralModuleDefinitions ON rb_ModuleDefinitions.GeneralModDefID = rb_GeneralModuleDefinitions.GeneralModDefID
WHERE (rb_Tabs.PortalID = @PortalID) AND (rb_GeneralModuleDefinitions.GeneralModDefID <> 'F9F9C3A4-6E16-43b4-B540-984DDB5F1CD2' AND
rb_GeneralModuleDefinitions.GeneralModDefID <> 'F9F9C3A4-6E16-43b4-B540-984DDB5F1CD0')
ORDER BY TabOrder, rb_Modules.ModuleTitle
把刪除線那裏的 rb_Modules. 刪掉即可。

星期五, 三月 09, 2007

SQLite的.Net Provider

今天看到簡介SQLiteSQLite使用教學後向朋友推薦SQLite,他問為什麼要不用SQLExpress。可能是他大部份在開發Web AP,像我這種苦命小工程師,偶爾得替使用者寫點小程式,就很需要。以前在Windows下通常用Access格式的mdb檔處理小型資料庫,現在改用SQLite不但是能跨平台的資料庫,還可能做出跨平台的AP,處理速度也可能變快。

有位同事要用VB6呼叫,但找到的OLEDB Provider要錢 :( 所以就不考慮,只好改用 SQLite ODBC Driver

SQLiteJDBC 有完整範例,也有native driver。

對我朋友最近都改用.Net寫程式,所以需要 ADO.NET 2.0 Provider for SQLite 可惜文件很爛,Compact和標準混在一起,沒有好的範例。 幸好有孤狗,看過 SQLite for C# 測試 就知道該怎麼寫。另外可參考 Nhibernate+SQLite 實例指南(1)

星期二, 一月 09, 2007

再次推薦PostgreSQL

剛在寢飾店老板那看到PostgreSQL vs MySQL (比較),看來還是和我印象中相同:PostgreSQL在SMP下的表現遠比MySQL好。個人猜測一顆單核心CPU時應該差異不大,這得測試才知結果。我還是最欣賞PostgreSQL功能完整及不易損毀的特性。

星期一, 三月 27, 2006

Data Mining

前兩天去參加微軟的Data Mining短期課程,有80%都是Statistics,我唯一比較熟的是Neural Network和Linear Regression。大部份都是大學教授在講理論,所以算頗有深度;參與的學生似乎以中階主管居多,而且大部份都有Data Mining經驗。

雖然我對微軟不太滿意,但SQL2005的Data Mining做得真好用,實在厲害!不過bug也不少,April就要出SP1,真是MS風格呀!

上課心得:
1. SpamAssassin用的Bayes是蠻爛的方法,錯誤率頗高。
2. Data Mining不求精準,只求增加判斷率,能賺錢就好。
3. 資料採礦是需要許多背景知識、Domain Know How與經驗。
4. 其實微軟的軟體真的不算貴,唔,讓我想起當年的Unix工作站和PC的價差。(現在我用的Mac Mini市價13500,A牌的PC要20000,變成Unix工作站比Win PC便宜)