2012-01-11 58 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