_ Visual Studio 2008 Express Edition と一緒にインストールされた SQL Server Compact 3.5 がなかなか面白いので, Ruby で遊んでみた。
_ 全行フェッチでは負けることがあるようだが, ほとんどの場合で Jet 4.0 より性能がいいみたいだ。
#! ruby -KS
require 'win32ole'
if true
## SQL Server Compact 3.5
PROVIDER = "Microsoft.SQLSERVER.CE.OLEDB.3.5"
DB = "test.sdf"
CONSTR = "Provider=" + PROVIDER + ";Data Source=" + DB
else
## Jet 4.0
PROVIDER = "Microsoft.Jet.OLEDB.4.0"
DB = "test.mdb"
ETYPE = "5"
CONSTR = "Provider=" + PROVIDER + ";Data Source=" + DB + ";Jet OLEDB:Engine Type=" + ETYPE
end
DATA_NUM = 50000
## remove DB file
File.delete(DB) if File.exists?(DB)
## create DB file
adox = WIN32OLE.new("ADOX.Catalog")
adox.Create(CONSTR)
## open DB
con = WIN32OLE.new("ADODB.Connection")
con.Open(CONSTR)
## create tables
con.Execute("CREATE TABLE [Table1] ([col1] integer PRIMARY KEY," +
" [col2] nvarchar(100))")
con.Execute("CREATE TABLE [Table2] ([col1] integer PRIMARY KEY," +
" [col2] nvarchar(100))")
## insert data
cmd1 = WIN32OLE.new("ADODB.Command")
cmd2 = WIN32OLE.new("ADODB.Command")
cmd1.CommandText = "INSERT INTO [Table1] ([col1], [col2]) " +
" VALUES (?, ?)"
cmd1.CommandType = 1
cmd1.ActiveConnection = con
cmd1.Parameters.Refresh
cmd1.Prepared = true
cmd2.CommandText = "INSERT INTO [Table2] ([col1], [col2]) " +
" VALUES (?, ?)"
cmd2.CommandType = 1
cmd2.ActiveConnection = con
cmd2.Parameters.Refresh
cmd2.Prepared = true
start = Time.new.to_f
con.BeginTrans
0.upto(DATA_NUM - 1) do |i|
cmd1.Parameters.Item(0).Value = i
cmd1.Parameters.Item(1).Value = i.to_s
cmd1.Execute
cmd2.Parameters.Item(0).Value = i
cmd2.Parameters.Item(1).Value = i.to_s + ":" + i.to_s
cmd2.Execute
end
con.CommitTrans
puts Time.new.to_f - start
## query
cmd3 = WIN32OLE.new("ADODB.Command")
cmd3.CommandText = "SELECT [Table1].[col1]," +
" [Table1].[col2]," +
" [Table2].[col2] " +
" FROM [Table1],[Table2] " +
" WHERE [Table1].[col1] = [Table2].[col1] AND " +
" [Table1].[col1] = ? "
cmd3.CommandType = 1
cmd3.ActiveConnection = con
cmd3.Parameters.Refresh
cmd3.Prepared = true
start = Time.new.to_f
0.upto(DATA_NUM - 1) do |j|
cmd3.Parameters.Item(0).Value = j
rs = cmd3.Execute
while !rs.Eof
=begin
line = ""
rs.Fields.each do |r|
if r.Value
line += '"' + r.Value.to_s + '" '
else
line += "NULL "
end
end
puts line
=end
rs.MoveNext
end
rs.Close
end
puts Time.new.to_f - start
con.Close_ Email.Phishing.RB-2374 が 4 通, Email.Phishing.RB-2342 が 4 通, SomeFool.P が 3 通, Email.Phishing.RB-2370 が 3 通, Email.Phishing.RB-2356 が 3 通, Email.Phishing.RB-2376 が 2 通, Email.Phishing.RB-2375 が 2 通, Email.Phishing.RB-2347 が 2 通, Exploit.HTML.IFrame が 1 通, Email.Phishing.RB-2371 が 1 通, Email.Phishing.RB-2359 が 1 通, Email.Phishing.RB-2358 が 1 通, Email.Phishing.RB-2346 が 1 通, Email.Phishing.RB-2339 が 1 通, Email.Phishing.RB-2338 が 1 通。