访问查询不使用索引

时间:2012-01-11 15:23:35

标签: database ms-access indexing ado

我在Access中有一个名为HostName的字段,它是一个文本字段,最多100个字符。我用它来存储DNS主机名。该字段设置为主键。如果我执行以下查询,它将返回预期结果,但在包含100万条记录的表上完成大约需要8秒钟:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

问题在于它自己的TOP命令不对数据应用排序,因此如果没有ORDER BY它将以不同的顺序返回并因此给出不同的结果,您可以尝试以下代码:

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

不确定这是否会提供更好的性能,但值得一试:)

答案 1 :(得分: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