他データセットとの比較


ここでは他のデータセット(ADO,BDE,DBX)との比較を行います。

データ型別の比較


 以下に データ型別にTField へのマップで差異があるものを示します。
BDE ADO dbExpress ODBC access
NCHAR, NVARCHAR この型を認識できません。 NCHAR(10) には2バイト文字が5文字しか入力できません。 NCHAR(10) には2バイト文字が5文字しか入力できません。 NCHAR(10) に2バイト文字を10文字入力できます。
NUMERIC, DECIMAL Currency が使用されます。最大精度は (14,4) です。 EnableBCD により BCD が使用されます。最大精度は (18,4) です。 FMTBcd が使用されます。 EnableBCD により BCD が使用されます。最大精度は (18,4) です。
精度が14 以上か Scale が 4 以上の場合 FMTBcd を使用します。最大精度は (32,n) です。(D6以降)
金額属性を自動設定します。(*1)
REAL Float が使用されます。 Float が使用されます。 Float が使用されます。 Float が使用されます。有効桁数以下を丸めます。
STINYINT SmallInt が使用されます。 SmallInt が使用されます。 SmallInt が使用されます。 SamllInt が使用されます。入力可能値(-128..127)が自動設定されます。(*1)
UTINYINT SmallInt が使用されます。 Word が使用されます。 SmallInt が使用されます。 Word が使用されます。
BIGINT Double が使用されます。最大精度は14桁です。 LargeInt が使用されますが、負符号が欠落する場合があります。 FMTBcd が使用されます。 LargeInt が使用されます。最大精度は19桁です。
TIMESTAMP DateTime が使用されます。 DateTime が使用されます。 SQLTimeStamp が使用されます。 DateTime が使用されます。
EnableTimeStamp により SQLTimeStamp が使用されます。(D6以降)
GUID この型を認識できません。 正しく認識します。 正しく認識します。 正しく認識します。

*1 これらは動的項目使用時に限られます。設計時に項目の追加で静的項目を生成した場合には適用されません。


 以下は ODBC access とBDEでの数値精度の比較です。

C1 C2 C3 C4 C5
データ型 Integer Numeric(20,4) Numeric(31,0) TimeStamp BigInt



パフォーマンスの比較


BDE 接続 Database + Query
ADO 接続 ADOConnection + ADOQuery(CursorLocation = clUseServer)
ODBC 接続 CloneODBC + DBQueryODBC

各テストは下記のコードで時間を計測しました。
uses
  MMSystem;

// ADO
procedure TForm1.Button1Click(Sender: TObject);
var
TickTock1 : Longword;
S : String;
begin
  TickTock1 := timeGetTime;
  ADOQuery1.Open;
  while not ADOQuery1.Eof do
  begin
    S := ADOQuery1.FieldByName('Col3').AsString;
    ADOQuery1.Next;
  end;
  LabelFetch.Caption := IntToStr(timeGetTime - TickTock1);
end;

// ODBC 
procedure TForm1.Button2Click(Sender: TObject);
var
TickTock1 : Longword;
S : String;
begin
  TickTock1 := timeGetTime;
  DBQueryODBC1.DefaultQuery.SQLWaitCursor := False;
  DBQueryODBC1.Open;
  while not DBQueryODBC1.Eof do
  begin
    S := DBQueryODBC1.FieldByName('Col3').AsString;
    DBQueryODBC1.Next;
  end;
  LabelFetch.Caption := IntToStr(timeGetTime - TickTock1);
end;

Test1=各種データ型を含む13列のテーブル。FieldByName では VARCHAR フィールドデータを収得
Test2=Test1 に LONGVARCHAR(Memo) データを追加。FieldByName では LONGVARCHAR フィールドデータを収得


Access MDB のデータを使用
 30万件(36MB)のデータをオープンし EOF になるまで Next メソッドを繰り返す。

単位:秒

BDE(MSACCESS) ADO(Jet.OLEDB.4.0) ODBC(Access Driver 4.0)
Test1 38 16 13
Test2 135 21 61

 LONG データを含む Test2 では ADO より遅かった。但し、DBQueryODBC の LongVarCharLen を 1024 にしたら 19秒になり ADO より早くなった。


SQL Server サーバーのデータを使用
 10万件のデータをオープンし EOF になるまで Next メソッドを繰り返す。

単位:秒

ADO(SQLOLEDB) ODBC(SQL Server Driver)
Test1 225 32
Test2 501 57

 圧勝。


DB2 サーバーのデータを使用
 10万件のデータをオープンし EOF になるまで Next メソッドを繰り返す。

単位:秒

ADO(MSDASQL) ADO(IBMDADB2) ODBC(IBM DB2 Driver)
Test1 276 37 30
Test2 315 68 56

ADOではクライアントCPU が約80%であったのに対してODBC経由では約40%であった。



Back