如何强制访问查询使用二进制搜索

时间:2018-10-08 09:47:58

标签: sql vba ms-access

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

在某些我想加速进程的SQL语句中,是否有任何方法可以强制访问以使用二进制搜索?

1 个答案:

答案 0 :(得分:2)

我怀疑二进制搜索的速度是否会比SQL数据引擎可以为您执行的速度更快。但是,您将需要在该列上建立索引。

即使有1亿行,对一行的检索也应该相当快。如果您不得不一遍又一遍地重新运行或重新拉动“许多”行,那将不会发生。因此,尚不清楚您如何提取此数据。

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

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

以上假设此处是jet / ace表,而不是sql server。

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

====编辑====

编辑:

发布者还要求提供一个大于一个键值的seek()。

因此,假设我们需要对HotelName和city进行seek()。

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

因此,我们需要HotelName和City,并希望在这两个键值上进行seek()。

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

因此,您要在表的设计中进行此操作-单击索引图标。

然后在索引对话框中,您可以为单索引输入“不止一个”列(这对于正常工作至关重要)。

对话框将如下所示:

enter image description here

所以在上面我们有5个索引。但是,请注意称为HotelSearch的索引。请注意,我们如何输入MORE,然后再输入一个列作为索引。

您可以通过将索引框名称保留在“空”下方来实现此目的

此外,以上是示例。我会强烈建议您转储任何不需要的索引(这是由于行数如此之高–这些索引占用了大量空间–您可能已经达到了2 gig的最大数据文件大小)。

因此请注意ONE索引的两列!我们当然可以向该索引添加更多列(键值)。确保考虑到列的“顺序”,因为您只能将额外的列作为可选项进行搜索,因此不允许跳过先前的键值(因此,您只能提供第一个索引列,也可以仅提供几个索引列)根据您的需要-但不允许跳过)。

因此,只需将索引名称列框保留为空白–这意味着索引“键”将应用于seek()的一个索引。

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

因此,您必须在这里对要查看的关键索引“组”进行一些计划(也要牢记顺序)。

好吧,现在我们使用多个键创建了该索引名称,现在我们可以搜索两个键值。我们的代码将如下所示:

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倍。它起泡很快。