【问题标题】:Fast positioning in a database table在数据库表中快速定位
【发布时间】:2016-12-16 19:26:19
【问题描述】:

我有一个大约 50000 行和 16 列的数据库(至少现在是这样)。当在应用程序的主窗体中按下按钮时,程序会进行一些计算,从中计算出结果。我需要将表的当前记录定位为计算结果。

例子:我的结果是35500。我需要将位置设置为表中的记录号35500。我怎样才能快速做到这一点? 我使用 ADO(无 SQL),我尝试过类似的指令

table.First;
table.MoveBy(35500);

但在这种情况下它们非常慢。我还必须提到,定位是在没有任何组件(如 TDBGrid 或其他任何组件)中完成的,因此它必须是一种更快的方式

【问题讨论】:

  • 可能是因为您要求 Microsoft ADO 驱动程序一个接一个地执行 35500 次“移动下一条记录”操作。如果你真的需要 ISAM 操作而不是 SQL(但为什么???)也许你会更幸运地使用一些 Delphi-native 引擎(tdbf.sf.net、nexusDB 或 Torry.net 中的任何东西),你可以做类似DataSetObject.RecNo := 12345; 的事情?
  • 使用客户端数据集
  • @FLICKER:实际上,对于数据库服务器上 OP 提到的大小的表,ADO 比 TClientDataSet 快得多,尤其是在检索阶段。
  • 不需要在你的问题标题中重复你的标签。标签系统在这里工作得非常好 - 请停止尝试帮助它。它不需要帮助。
  • @KenWhite 好的,我会记住的

标签: database delphi position


【解决方案1】:

我知道您说没有连接到您的数据集的 db-aware 控件,但是您是否尝试过比较在调用 .DisableControls.EnableControls 的情况下执行 MoveBy(50000) 的时间?您可能认为没有任何 db-aware 组件,使用 .DisableControls.EnableControls 没有区别,但实际上确实如此。

在我的系统上,针对 Sql Server (2014) 执行 MoveBy(50000) 需要 19+ 没有.DisableControls.EnableControls 的秒数和有0.2 秒的秒数,差别很大。

我认为我对前一个问题的回答可能是相关的:Why does scrolling through ADOTable get slower and slower?

顺便说一句,MoveBy() 主要是在通过Distance 参数表示您想要的行的最佳方式时有用。正如 Christine Ross 在评论中指出的那样,如果您知道要移动到的行中一个或多个字段的值,则使用布尔 Locate 函数会更快,如

if AdoQuery1.Locate('CountryCode', 'US', [])  then

Locate 允许你指定几个字段来匹配

if AdoQuery1.Locate('CountryCode;Surname', VarArrayOf(['US', 'Smith']), []) then

【讨论】:

  • 当你知道字段和内容时,你可以使用“定位”,它使用索引
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多