Запрос доступа не использует индекс - PullRequest
0 голосов
/ 11 января 2012

У меня есть таблица в Access с 1 полем с именем HostName, это текстовое поле, максимум 100 символов. Я использую его для хранения имен хостов DNS. Поле настроено как первичный ключ. Если я выполняю следующий запрос, он возвращает ожидаемые результаты, но занимает около 8 секунд для таблицы с 1 миллионом записей:

ВЫБРАТЬ ТОП 1 HostsRev.HostName ОТ HostsRev ГДЕ (((HostsRev.HostName)> = "тест")) ЗАКАЗАТЬ HostsRev.HostName;

Если я удаляю часть "ORDER BY", она возвращается менее чем за 1 секунду, но не всегда возвращает то, что я ожидаю, - не первая запись, которая> = "to".

Я делаю запрос через ADO из приложения C ++, но я также проверил в Access, создав запрос и получив те же результаты.

Мне нужно быстро найти первую запись, если она есть, которая начинается с заданной строки. Я также пытался использовать LIKE-запрос, но тот же результат. Мне нужно это сделать, потому что, если я выполняю поиск на images.google.com, мне нужно знать, содержит ли список google.com, но не images.google.com (я действительно храню имена хостов в обратном порядке, чтобы это работало правильно и поверните строки перед поиском).

Ответы [ 2 ]

1 голос
/ 11 января 2012

Проблема в том, что команда TOP сама по себе не применяет сортировку к данным, поэтому без ORDER BY она будет возвращаться в другом порядке и, следовательно, давать другие результаты, вместо этого можно попробовать следующее:

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

Не уверен, что это даст какую-то лучшую производительность, но стоит попробовать:)

0 голосов
/ 13 января 2012

Я не уверен, что вы можете сделать это из 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
...