2012-01-11 86 views
0

我在Access中有一个名为HostName的字段,它是一个文本字段,最大为100个字符。我用它来存储DNS主机名。该字段被设置为主键。如果我下面的查询返回预期的结果,但需要约8秒至1万条记录在表上填写:访问查询不使用索引

SELECT TOP 1 HostsRev.HostName FROM HostsRev WHERE(((HostsRev.HostName)> =“test”)) ORDER BY HostsRev.HostName;

如果我删除了“ORDER BY”部分,它会在不到1秒的时间内返回,但并不总是返回我期望的结果 - 而不是第一条记录> =“test”。

我正在通过ADO从C++应用程序进行查询,但我也在Access中进行了测试,通过创建查询并获得相同的结果。

我需要的是快速找到第一个记录,如果有的话,以给定的字符串开头。我也尝试使用LIKE查询,但结果相同。我需要这样做,因为如果我在images.google.com上搜索,我需要知道该列表是否包含google.com,但不包含images.google.com(我实际上是以反向字符串顺序存储主机名以使其正常工作,并在查找之前反转字符串)。

回答

1

的问题是,在它自己的TOP命令不适用于排序的数据,所以没有ORDER BY会以不同的顺序返回,从而得出不同的结果,你可以尝试,而不是执行以下操作:

SELECT Min(HostName) FROM HostsRev WHERE HostName >= "test" 

不知道这是否会虽然给任何更好的性能,但值得一去:)

+0

这是问题所在,我刚刚解决了这个问题。由于我的主机名称使用已知格式,因此我添加了像WHERE HostName> =“test”和HostName <=“.test”之类的内容,最初的过滤仅记录了几条记录,然后选择顶端1仍然可以很快。 – eselk 2012-01-19 16:02:18

0

我不知道您是否可以从C++做到这一点,而不是作为一个C++程序员,但ADO支持属性的.index到允许您设置您想要使用的索引和.seek方法来搜索该索引。这里有一些代码在VB中是值得的。

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 

Set conn = New ADODB.Connection 
conn.Open ConnectionString 

rs.Open "mytable", conn 
rs.Index = "primarykey" 
rs.Seek "test", adSeekAfterEQ 
If rs.EOF Then ' record not found