database - 从 Delphi XE2 高效访问各种 DBMS

标签 database performance delphi c++builder hana

我的需求

我使用 Delphi/C++Builder XE2。

我至少需要访问这些DBMS:

  • Firebird
  • DB2/400
  • SQL Server
  • SAP HANA(一种新的内存数据库,可用接口(interface):JDBC、ODBC、ODBO、SQLDBC)

我需要在数据感知可视控件中显示和编辑数据。 数据可以驻留在这些 DBMS 中的任何一个上,我将在外部文本文件上配置连接属性和 SQL 语句。

所以我正在寻找一组用于数据库访问的组件,它支持此类 DBMS 并且具有良好的性能,类似于旧的 Paradox 表。

我的猜测

  1. 使用 ODBC 性能会比使用 native 驱动程序差。如果属实,我该如何解决这个问题?
  2. 即使通过 ODBC,HANA 内存数据库的性能也会很好(我现在无法测试)。

到目前为止我发现了什么

  • BDE (Borland 数据库引擎) (TDatabase, TTable...)

    已弃用。

  • DBX(Embarcadero dbExpress)(TSQLConnectionTSQLTable...)

    替换 BDE,单向数据集(光标只向前移动;不在内存中缓冲数据,这样的数据集不能在 DBGrid 中显示;要使用 dbExpress 构建用户界面,您将需要使用另外两个组件:TDataSetProviderTClientDataSet)

    使用 native 驱动程序(HANA 没有)或 ODBC。

  • FireDAC (Embarcadero Fire 数据访问组件)(TADConnectionTADTable...)

    这是AnyDAC的延续;使用 native 驱动程序(HANA 没有)或 ODBC 或 dbExpress。

  • UniDAC (Devart 通用数据访问组件)

    不是免费的;使用 native 驱动程序(HANA 没有)或 ODBC 或“数据库客户端”。

  • DA(RemObjects Data Abstract 用于 Delphi)

    不是免费的。

  • ZDBC (Zeos 数据库连接接口(interface))(TZConnectionTZQuery...)

    开源;开始作为 JDBC 到 Object Pascal 的端口;不提供与数据感知可视化控件的绑定(bind)。

  • dbGo (Embarcadero dbGo) (TADOConnection, TADOTable...)

    实现 ADO(因此在 OLE DB 和 ODBC 之上)。有许多怪癖,例如在查询中重复使用同名参数。

  • Jv BDE (TJvQuery, TJvBDESQLScript...)

    相应标准库的增强。

  • Jv 数据访问(TJvADODatasetTJvADOQuery...)

    相应标准库的增强。

(随意增强此列表)

所以我的选择是:

  • dbExpress 还是 FireDAC: future Embarcadero 将何去何从?
  • dbGo:ADO 是个不错的选择吗?好像是依赖ODBC,那么性能呢?
  • 像 UniDAC 或 Data Abstract 这样的商业产品:有必要吗?会更好吗?

最佳答案

我决定进行一些性能研究:UniDAC (5.0.1) 与 FireDAC (8.0.1),在 Delphi XE3 上。数据库:Firebird、MySQL 和 SQL Server。

这里是 150k 记录的抓取结果(内存使用被认为是抓取前后的差异)。

Firebird :

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  TIMESTAMP
)

UniDAC - 0,909 秒,占用 12 324 044 内存

FireDAC - 0,967 秒,占用了 282 179 668 内存(我很震惊)

MySQL:

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  DATETIME
)

UniDAC - 0,363 秒和 11 552 604 内存

FireDAC - 0,713 秒和 49 375 108 内存

SQL服务器:

CREATE TABLE TEST_PERF (
    ID  INTEGER PRIMARY KEY,
    VC  VARCHAR(200),
    NM  NUMERIC(18,2),
    DT  DATETIME
)

UniDAC - 0,391 秒和 14 155 576 内存

FireDAC - 0,324 秒和 51 775 844 内存

一切都经过简单测量:

function MemoryUsed: Cardinal;
var
  st: TMemoryManagerState;
  sb: TSmallBlockTypeState;
begin
  GetMemoryManagerState(st);
  Result := st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;
  for sb in st.SmallBlockTypeStates do
    Result := Result + sb.UseableBlockSize * sb.AllocatedBlockCount;
end;

  UniQuery1.SQL.Text := 'select * from test_perf';
  UniQuery1.SpecificOptions.Values['FetchAll'] := 'True';
  mem := MemoryUsed;
  tc := Now;
  UniQuery1.Open;
  UniQuery1.Last;
  tc := Now - tc;
  mem := MemoryUsed - mem;
  Memo1.Lines.Add('UniDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));

  ADQuery1.SQL.Text := 'select * from test_perf';
  ADQuery1.FetchOptions.Mode := fmAll;
  mem := MemoryUsed;
  tc := Now;
  ADQuery1.Open;
  ADQuery1.Last;
  tc := Now - tc;
  mem := MemoryUsed - mem;
  Memo1.Lines.Add('FireDAC Firebird: Time: ' + FloatToStr(tc * 24 * 60 * 60) + ' sec; Memory used: ' + IntToStr(mem));

如果有人感兴趣,这里是test application ,您可以在其中添加 ADO、dbExpress、ZeosLib 和您感兴趣的其他软件的性能比较。

关于database - 从 Delphi XE2 高效访问各种 DBMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16016700/

相关文章:

PHP PDO插入数据库函数问题

delphi - 需要一种按小时许可应用程序的方法

java - 简单独立应用程序的序列化与嵌入式数据库

java - JPA OneToMany 急切获取不起作用

c# - 在处理共享内存和字符串时提高性能

arrays - arrayfun 可能比 matlab 中的显式循环慢得多。为什么?

sql - 大对象类型的奇怪行为

delphi - 将 float 格式化为###.##(两位小数)

delphi - NIL 可以用于 Sender 对象吗?

mysql - 在 iOS 中直接连接到远程 MySQL 数据库