【问题标题】:How to force an access query to use a binary search如何强制访问查询使用二分搜索
【发布时间】:2018-10-08 09:47:58
【问题描述】:

我有一个非常大的数据库,其中包含一个包含超过 1 亿条记录的表。所有字段都是整数。因为我自动从其他来源导入数据,所以我保证记录是根据某些字段排序的。

有什么方法可以强制访问在我想加快进程的某些 SQL 语句中使用二进制搜索?

【问题讨论】:

  • 这些字段是否已编入索引?
  • 是的。我的表有 6 个字段,1 个是主键,4 个是另一个表的索引,第 6 个是双精度值。

标签: sql vba ms-access


【解决方案1】:

我怀疑二进制搜索会比 SQL 数据引擎为您做的更快。但是,您将需要该列上的索引。

即使有 1 亿行,检索一行也应该很快。如果您必须一遍又一遍地重新运行或重新拉出“许多”行,则不会发生这种情况。所以不清楚你是如何提取这些数据的。

但是,如果您有某种类型的循环代码需要每次拉出一行,那么您可以绕过 SQL 引擎并在该索引上使用 seek() 命令 - 这应该会产生比使用更快的结果SQL 语句来拉出那一行。

请注意,seek() 不适用于链接表,但您可以通过创建数据库对象的实例来绕过此限制,因此即使链接表也可以使用 seek。

以上假设这里是 jet/ace 表,而不是 sql server。

因此,绕过 sql 语句并使用 seek() 命令(带有索引)将在此处产生最佳性能 - 可能 = 您构建的任何自定义函数方法的性能。

==== 编辑 ====

编辑:

发帖人还要求有多个键值的 seek()。

因此,假设我们需要在 HotelName 和城市上使用 seek()。

我们要绕过 sql 直接使用索引。

所以,我们需要 HotelName 和 City,并希望在这两个键值上使用 seek()。

您必须创建一个多键索引才能使其工作。 (不要与基于多于一列的复合键索引相混淆,这也是可能的!!!)。

因此,您执行此操作的方式是为表格设计 - 单击索引图标。

然后,在索引对话框中,您可以为 SINGLE 索引输入多于一列(这对于它的工作至关重要)。

因此对话框将如下所示:

所以在上面我们有 5 个索引。但是,请注意名为 HotelSearch 的索引。请注意我们如何为索引输入更多而不是一列。

您可以通过将索引框名称留在“空”下方来做到这一点

另外,上面是一个例子。我强烈建议您转储任何不需要的索引(这是由于如此高的行数 - 这些索引占用了大量空间 - 并且您可能已经达到接近 2 gig 的最大数据文件大小)。

所以请注意 ONE 索引的两列!我们当然可以向该索引添加更多列(键值)。确保考虑到列的“顺序”,因为您只能将额外的列作为搜索的可选列,不允许跳过先前的键值(因此您只能提供第一个索引列,或者之后的几个列随心所欲 - 但不允许跳过)。

因此,只需将索引名称列框留空——这意味着索引“键”将应用于 seek() 的 ONE 索引。

这意味着这两个索引现在属于一个索引名称。

因此,您必须在这里计划一下您要看到的关键索引“组”是什么(并记住顺序)。

好的,现在我们创建了具有多个键的索引名称,现在我们可以查找两个键值。我们的代码将如下所示:

Sub SeekTest()

   Dim rst     As DAO.Recordset

   Set rst = CurrentDb.OpenRecordset("dbo_tblHotels2")

   With rst
      .Index = "HotelSearch"
      .Seek "=", "Holiday Inn", "Vancouver"

      If .NoMatch = False Then
         Debug.Print "found"
         ' got one!!!
      End If
   End With   

End Sub

请记住,这种方法是对高速索引的原始使用——它将以您的处理器“汇编器”速度运行。

它将比使用 SQL 查询快 100 到 1000 倍。起泡很快。

【讨论】:

  • 以前从未使用过搜索...谢谢! Link
  • 谢谢艾伯特。我会试试看。但我不需要一个字段,而是一组数据。
  • 查看我的编辑并在我的回答中跟进更多信息 - 我展示了如何使用双键值进行搜索 - 您需要这些信息。
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2013-06-30
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多