我有一个非常大的数据库,其中的表具有超过1亿条记录。所有字段都是整数。因为我会自动从其他来源导入数据,所以我保证记录是根据某些字段排序的。
在某些我想加速进程的SQL语句中,是否有任何方法可以强制访问以使用二进制搜索?
答案 0 :(得分:2)
我怀疑二进制搜索的速度是否会比SQL数据引擎可以为您执行的速度更快。但是,您将需要在该列上建立索引。
即使有1亿行,对一行的检索也应该相当快。如果您不得不一遍又一遍地重新运行或重新拉动“许多”行,那将不会发生。因此,尚不清楚您如何提取此数据。
但是,如果您有某种类型的循环代码每次需要上一行,那么您可以绕过SQL引擎并在该索引上使用seek()命令–与使用相比,这将产生更快的结果SQL语句将其拉到那一行。
请注意,seek()不适用于链接表,但是您可以通过创建数据库对象的实例来解决此限制,因此,即使链接表也可以使用seek。
以上假设此处是jet / ace表,而不是sql server。
因此,绕过sql语句,并使用seek()命令(带有索引)将在此处产生最佳性能-可能=与您构建的任何自定义函数方法的性能相同。
====编辑====
编辑:
发布者还要求提供一个大于一个键值的seek()。
因此,假设我们需要对HotelName和city进行seek()。
并且我们要绕过直接使用索引的sql。
因此,我们需要HotelName和City,并希望在这两个键值上进行seek()。
您必须创建一个多键索引才能使其正常工作。 (不要与基于多于一列的复合键索引相混淆,这也是可能的!!)。
因此,您要在表的设计中进行此操作-单击索引图标。
然后在索引对话框中,您可以为单索引输入“不止一个”列(这对于正常工作至关重要)。
对话框将如下所示:
所以在上面我们有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倍。它起泡很快。